diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000000000000000000000000000000000000..6170c8013c933a35d541f11bcf8f824df42addbe
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,312 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    cwmp is GPLv2 licensed cwmp implementation
+    Copyright (C) 2011-2012 Luka Perkov
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+    cwmp Copyright (C) 2011-2012 Luka Perkov
+    This program comes with ABSOLUTELY NO WARRANTY.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..1c5d6ee106490dbc48cffbf75d3eaa984f0bbe8b
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,3 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS = bin
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/README b/README
new file mode 100644
index 0000000000000000000000000000000000000000..3cd720de68a20e78164c46d938ac34a96570a9de
--- /dev/null
+++ b/README
@@ -0,0 +1,29 @@
+configure autotools
+===================
+
+$ autoreconf -if
+
+clean it all up
+===============
+
+$ make distclean
+
+or 
+
+$ git clean -df
+
+development environment
+=======================
+
+Make sure you have all the packages installed from packages-arch-tr069 git
+repository.
+
+$ ln -sf `pwd`/scripts/defaults /usr/share/icwmp/defaults
+
+
+run icwmpd
+=============
+
+$ export UCI_CONFIG_DIR="`pwd`/config/" 
+$ export UBUS_SOCKET="/tmp/ubus.sock"
+$ ./bin/icwmpd -f
diff --git a/bin/Makefile.am b/bin/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..70270c95a82869c1cf3d36ef528097189efe3338
--- /dev/null
+++ b/bin/Makefile.am
@@ -0,0 +1,109 @@
+CWMP_VERSION = 3.0.0
+LIB_BBFDM_VERSION = 3:0:0
+
+lib_LTLIBRARIES = libbbfdm.la
+
+libbbfdm_la_SOURCES =	\
+	../md5.c			\
+	../dmcwmp.c			\
+	../dmentry.c		\
+	../dmmem.c			\
+	../dmubus.c			\
+	../dmjson.c			\
+	../dmuci.c			\
+	../dmcommon.c		\
+	../dmoperate.c		\
+	../dmdiagnostics.c		\
+	../wepkey.c
+
+if BBF_TR181
+libbbfdm_la_SOURCES +=							\
+	../dmtree/tr181/device.c					\
+	../dmtree/tr181/deviceinfo.c				\
+	../dmtree/tr181/managementserver.c			\
+	../dmtree/tr181/softwaremodules.c			\
+	../dmtree/tr181/times.c						\
+	../dmtree/tr181/upnp.c						\
+	../dmtree/tr181/x_iopsys_eu_ice.c 			\
+	../dmtree/tr181/x_iopsys_eu_igmp.c 			\
+	../dmtree/tr181/x_iopsys_eu_ipacccfg.c		\
+	../dmtree/tr181/x_iopsys_eu_logincfg.c		\
+	../dmtree/tr181/x_iopsys_eu_power_mgmt.c	\
+	../dmtree/tr181/x_iopsys_eu_syslog.c		\
+	../dmtree/tr181/x_iopsys_eu_dropbear.c		\
+	../dmtree/tr181/x_iopsys_eu_owsd.c			\
+	../dmtree/tr181/x_iopsys_eu_buttons.c		\
+	../dmtree/tr181/x_iopsys_eu_wifilife.c		\
+	../dmtree/tr181/xmpp.c 						\
+	../dmtree/tr181/wifi.c						\
+	../dmtree/tr181/ethernet.c					\
+	../dmtree/tr181/atm.c						\
+	../dmtree/tr181/ptm.c						\
+	../dmtree/tr181/bridging.c					\
+	../dmtree/tr181/hosts.c						\
+	../dmtree/tr181/dhcpv4.c					\
+	../dmtree/tr181/ip.c						\
+	../dmtree/tr181/ppp.c						\
+	../dmtree/tr181/nat.c						\
+	../dmtree/tr181/routing.c					\
+	../dmtree/tr181/userinterface.c				\
+	../dmtree/tr181/firewall.c					\
+	../dmtree/tr181/dns.c						\
+	../dmtree/tr181/users.c						\
+	../dmtree/tr181/dhcpv6.c					\
+	../dmtree/tr181/dsl.c						\
+	../dmtree/tr181/interfacestack.c			\	
+	../dmtree/tr181/qos.c
+endif
+
+if BBF_TR104
+libbbfdm_la_SOURCES +=							\
+	../dmtree/tr104/voice_services.c
+endif
+
+if BBF_TR143
+libbbfdm_la_SOURCES +=							\
+	../dmtree/tr143/diagnostics.c
+endif
+
+if BBF_TR064
+libbbfdm_la_SOURCES +=							\
+	../dmtree/tr064/upnp_device.c 				\
+	../dmtree/tr064/upnp_deviceinfo.c	        \
+	../dmtree/tr064/upnp_configuration.c		\
+	../dmtree/tr064/upnp_monitoring.c			\
+	../dmtree/tr064/upnp_common.c
+endif
+
+libbbfdm_la_CFLAGS =		\
+	$(AM_CFLAGS)			\
+	$(LIBUCI_CFLAGS)		\
+	$(LIBUBOX_CFLAGS)		\
+	$(LIBUBUS_CFLAGS)
+
+libbbfdm_la_LDFLAGS = 		\
+	$(AM_LDFLAGS)			\
+	$(LIBUCI_LDFLAGS)		\
+	$(LIBUBOX_LDFLAGS)		\
+	$(LIBUBUS_LDFLAGS)		\
+	-share					\
+	-version-info $(LIB_BBFDM_VERSION)
+
+libbbfdm_la_LIBADD =		\
+	$(AM_LIBS)				\
+	$(LIBUCI_LIBS)			\
+	$(LIBUBOX_LIBS)			\
+	$(LIBUBUS_LIBS)			\
+	$(LIBJSON_LIBS)			\
+	$(LIBTRACE_LIBS)		\
+	$(LBLOBMSG_LIBS)
+
+libbbfdm_la_CFLAGS+=-DCWMP_VERSION=\"$(CWMP_VERSION)\"
+libbbfdm_la_LDFLAGS+=-DCWMP_VERSION=\"$(CWMP_VERSION)\"
+
+libbbfdm_la_CFLAGS+=-I../
+libbbfdm_la_CFLAGS+=-I../dmtree/
+libbbfdm_la_CFLAGS+=-I../dmtree/tr181
+libbbfdm_la_CFLAGS+=-I../dmtree/tr104
+libbbfdm_la_CFLAGS+=-I../dmtree/tr143
+libbbfdm_la_CFLAGS+=-I../dmtree/tr064
\ No newline at end of file
diff --git a/config/dmmap b/config/dmmap
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000000000000000000000000000000000000..bb82bb6d8e8094f42be95f3142992721cf493b99
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,84 @@
+AC_INIT([libbbfdm], [0.1], [mohamed.kallel@pivasoftware.com])
+AM_INIT_AUTOMAKE
+
+AM_INIT_AUTOMAKE([subdir-objects])
+
+AC_ARG_ENABLE(tr181, [AS_HELP_STRING([--enable-tr181], [enable tr181 device feature])], AC_DEFINE(BBF_TR181),)
+AM_CONDITIONAL([BBF_TR181],[test "x$enable_tr181" = "xyes"])
+
+AC_ARG_ENABLE(tr104, [AS_HELP_STRING([--enable-tr104], [enable tr104 voice feature])], AC_DEFINE(BBF_TR104),)
+AM_CONDITIONAL([BBF_TR104],[test "x$enable_tr104" = "xyes"])
+
+AC_ARG_ENABLE(tr143, [AS_HELP_STRING([--enable-tr143], [enable tr143 diagnostics feature])], AC_DEFINE(BBF_TR143),)
+AM_CONDITIONAL([BBF_TR143],[test "x$enable_tr143" = "xyes"])
+
+AC_ARG_ENABLE(tr064, [AS_HELP_STRING([--enable-tr064], [enable tr064 upnp feature])], AC_DEFINE(BBF_TR064),)
+AM_CONDITIONAL([BBF_TR064],[test "x$enable_tr064" = "xyes"])
+
+# checks for programs
+AC_PROG_CC
+AM_PROG_CC_C_O
+LT_INIT
+AC_ENABLE_SHARED
+
+LIBJSON_LIBS='-ljson-c'
+AC_SUBST([LIBJSON_LIBS])
+
+AC_ARG_WITH([uci-include-path],
+  [AS_HELP_STRING([--with-uci-include-path],
+    [location of the uci library headers])],
+  [LIBUCI_CFLAGS="-I$withval"])
+AC_SUBST([LIBUCI_CFLAGS])
+
+AC_ARG_WITH([uci-lib-path],
+  [AS_HELP_STRING([--with-uci-lib-path], [location of the uci library])], [LIBUCI_LDFLAGS="-L$withval"])
+AC_SUBST([LIBUCI_LDFLAGS])
+
+LIBUCI_LIBS='-luci'
+AC_SUBST([LIBUCI_LIBS])
+
+LIBTRACE_LIBS='-ltrace'
+AC_SUBST([LIBTRACE_LIBS])
+
+AC_ARG_WITH([libubox-include-path],
+  [AS_HELP_STRING([--with-libubox-include-path],
+    [location of the libubox library headers])],
+  [LIBUBOX_CFLAGS="-I$withval"])
+AC_SUBST([LIBUBOX_CFLAGS])
+
+AC_ARG_WITH([libubox-lib-path],
+  [AS_HELP_STRING([--with-libubox-lib-path], [location of the libubox library])], [LIBUBOX_LDFLAGS="-L$withval"])
+AC_SUBST([LIBUBOX_LDFLAGS])
+
+LIBUBOX_LIBS='-lubox'
+AC_SUBST([LIBUBOX_LIBS])
+
+AC_ARG_WITH([libubus-include-path],
+  [AS_HELP_STRING([--with-libubus-include-path],
+    [location of the libubus library headers])],
+  [LIBUBUS_CFLAGS="-I$withval"])
+AC_SUBST([LIBUBUS_CFLAGS])
+
+AC_ARG_WITH([libubus-lib-path],
+  [AS_HELP_STRING([--with-libubus-lib-path], [location of the libubus library])], [LIBUBOX_LDFLAGS="-L$withval"])
+AC_SUBST([LIBUBUS_LDFLAGS])
+
+LIBUBUS_LIBS='-lubus'
+AC_SUBST([LIBUBUS_LIBS])
+
+LBLOBMSG_LIBS='-lblobmsg_json'
+AC_SUBST([LBLOBMSG_LIBS])
+
+# checks for header files
+AC_CHECK_HEADERS([stdlib.h string.h])
+
+# checks for typedefs, structures, and compiler characteristics
+AC_TYPE_UINT8_T
+
+# Makefiles
+AC_CONFIG_FILES([
+Makefile
+bin/Makefile
+])
+
+AC_OUTPUT
diff --git a/dmcommon.c b/dmcommon.c
new file mode 100644
index 0000000000000000000000000000000000000000..a50eea48d87f24eb7f774b1b08119b5214b5dee4
--- /dev/null
+++ b/dmcommon.c
@@ -0,0 +1,1715 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2012-2014 PIVA SOFTWARE (www.pivasoftware.com)
+ *		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *		Author: Feten Besbes <feten.besbes@pivasoftware.com>
+ *		Author: Omar Kallel <omar.kallel@pivasoftware.com>
+ */
+
+#include <arpa/inet.h>
+#include <glob.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <dirent.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <uci.h>
+#include <ctype.h>
+#include <netdb.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <net/if_arp.h>
+
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "dmjson.h"
+
+char *array_notifcation_char[__MAX_notification] = {
+	[notification_none] = "0",
+	[notification_passive] = "1",
+	[notification_active] = "2",
+	[notification_passive_lw] = "3",
+	[notification_ppassive_passive_lw] = "4",
+	[notification_aactive_lw] = "5",
+	[notification_passive_active_lw] = "6",
+};
+
+int set_uci_dhcpserver_option(struct dmctx *ctx, struct uci_section *s, char *option, char *value)
+{
+	struct uci_list *v;
+	struct uci_element *e, *tmp;
+	char *pch, *spch, bufopt[8];
+	int len = 0;
+	if (value == NULL)
+		return -1;
+
+	dmuci_get_value_by_section_list(s, "dhcp_option", &v);
+	if (v != NULL) {
+		uci_foreach_element(v, e) {
+			pch = strchr(e->name, ',');
+			if (pch) {
+				len = pch - e->name;
+				strncpy(bufopt, e->name, len);
+				bufopt[len] = '\0';
+				if (strcmp(bufopt, option) == 0) {
+					dmuci_del_list_value_by_section(s, "dhcp_option", e->name);
+					break;
+				}
+			}
+		}
+	}
+	if (value[0] != '\0') {
+		dmasprintf(&spch, "%s,%s", option, value);
+		dmuci_add_list_value_by_section(s, "dhcp_option", spch);
+	}
+	return 0;
+}
+
+int update_uci_dhcpserver_option(struct dmctx *ctx, struct uci_section *s, char *option, char *new_option, char *value)
+{
+	struct uci_list *v;
+	struct uci_element *e, *tmp;
+	char *pch, *spch, bufopt[8];
+	int len = 0;
+	if (value == NULL)
+		return -1;
+
+	dmuci_get_value_by_section_list(s, "dhcp_option", &v);
+	if (v != NULL) {
+		uci_foreach_element(v, e) {
+			pch = strchr(e->name, ',');
+			if (pch[0] != '\0' && strcmp(++pch, value) == 0) {
+				len = pch - e->name - 1;
+				strncpy(bufopt, e->name, len);
+				bufopt[len] = '\0';
+				if (strcmp(bufopt, option) == 0) {
+					dmuci_del_list_value_by_section(s, "dhcp_option", e->name);
+					break;
+				}
+			}
+		}
+	}
+	if (value[0] != '\0') {
+		dmasprintf(&spch, "%s,%s", new_option, value);
+		dmuci_add_list_value_by_section(s, "dhcp_option", spch);
+	}
+	return 0;
+}
+
+void compress_spaces(char *str)
+{
+	char *dst = str;
+	for (; *str; ++str) {
+		*dst++ = *str;
+		if (isspace(*str)) {
+			do ++str;
+			while (isspace(*str));
+			--str;
+		}
+	}
+	*dst = '\0';
+}
+char *cut_fx(char *str, char *delimiter, int occurence)
+{
+	int i = 1;
+	char *pch, *spch;
+	pch = strtok_r(str, delimiter, &spch);
+	while (pch != NULL && i<occurence) {
+		i++;
+		pch = strtok_r(NULL, delimiter, &spch);
+	}
+	return pch;
+}
+
+unsigned char dmisnumeric(char *nbr)
+{
+	if (*nbr == '\0')
+		return 0;
+	while (*nbr <= '9' && *nbr >= '0') {
+		nbr++;
+	}
+	return ((*nbr) ? 0 : 1);
+}
+
+/* int strstructered(char *str1, char *str2)
+ * Return:
+ * STRUCTERED_SAME: if str1 is same of str2 (with # match any number)
+ * STRUCTERED_PART: if str2 is part of str1 (with # match any number)
+ * STRUCTERED_NULL: if str2 is not part of str1 (with # match any number)
+ *
+ */
+int strstructered(char *str1, char *str2)
+{
+	char buf[16];
+	int i = 0;
+	for (; *str1 && *str2; str1++, str2++) {
+		if (*str1 == *str2)
+			continue;
+		if (*str2 == '#') {
+			i = 0;
+			do {
+				buf[i++] = *str1;
+			} while (*(str1+1) && *(str1+1) != dm_delim && str1++);
+			buf[i] = '\0';
+			if (dmisnumeric(buf))
+				continue;
+		}
+		else if (*str1 == '#') {
+			i = 0;
+			do {
+				buf[i++] = *str2;
+			} while (*(str2+1) && *(str2+1) != dm_delim && str2++);
+			buf[i] = '\0';
+			if (dmisnumeric(buf))
+				continue;
+		}
+		return STRUCTERED_NULL;
+	}
+	if (*str1 == '\0' && *str2 == '\0')
+		return STRUCTERED_SAME;
+	else if (*str2 == '\0')
+		return STRUCTERED_PART;
+	return STRUCTERED_NULL;
+}
+
+
+pid_t get_pid(char *pname)
+{
+	DIR* dir;
+	struct dirent* ent;
+	char* endptr;
+	char buf[512];
+
+	if (!(dir = opendir("/proc"))) {
+		return -1;
+	}
+	while((ent = readdir(dir)) != NULL) {
+		long lpid = strtol(ent->d_name, &endptr, 10);
+		if (*endptr != '\0') {
+			continue;
+		}
+		snprintf(buf, sizeof(buf), "/proc/%ld/cmdline", lpid);
+		FILE* fp = fopen(buf, "r");
+		if (fp) {
+			if (fgets(buf, sizeof(buf), fp) != NULL) {
+				char* first = strtok(buf, " ");
+				if (strstr(first, pname)) {
+					fclose(fp);
+					closedir(dir);
+					return (pid_t)lpid;
+				}
+			}
+			fclose(fp);
+		}
+	}
+	closedir(dir);
+	return -1;
+}
+
+int check_file(char *path) 
+{
+	glob_t globbuf;
+	if(glob(path, 0, NULL, &globbuf) == 0) {
+		globfree(&globbuf);
+		return 1;
+	}
+	return 0;
+}
+
+char *cidr2netmask(int bits)
+{
+	uint32_t mask;
+	struct in_addr ip_addr;
+	uint8_t u_bits = (uint8_t)bits;
+	char *netmask;
+	char tmp[32] = {0};
+
+	mask = ((0xFFFFFFFFUL << (32 - u_bits)) & 0xFFFFFFFFUL);
+	mask = htonl(mask);
+	ip_addr.s_addr = mask;
+	return inet_ntoa(ip_addr);
+}
+
+void remove_substring(char *s, const char *str_remove)
+{
+	int len = strlen(str_remove);
+	while (s = strstr(s, str_remove)) {
+		memmove(s, s+len, 1+strlen(s+len));
+    }
+}
+
+bool is_strword_in_optionvalue(char *optionvalue, char *str)
+{
+	int len;
+	char *s = optionvalue;
+	while ((s = strstr(s, str))) {
+		len = strlen(str); //should be inside while, optimization reason
+		if(s[len] == '\0' || s[len] == ' ')
+			return true;
+		s++;
+	}
+	return false;
+}
+
+int get_interface_enable_ubus(char *iface, char *refparam, struct dmctx *ctx, char **value)
+{
+	json_object *res;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", iface, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 1, "up");
+	return 0;
+}
+
+int set_interface_enable_ubus(char *iface, char *refparam, struct dmctx *ctx, int action, char *value)
+{
+	bool b;
+	char *ubus_object;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmastrcat(&ubus_object, "network.interface.", iface);
+			if(b) {
+				dmubus_call_set(ubus_object, "up", UBUS_ARGS{}, 0);
+			}
+			else
+				dmubus_call_set(ubus_object, "down", UBUS_ARGS{}, 0);
+			dmfree(ubus_object);
+			return 0;
+	}
+	return 0;
+}
+
+int get_interface_firewall_enabled(char *iface, char *refparam, struct dmctx *ctx, char **value)
+{
+	char *input = "", *forward = "";
+	struct uci_section *s = NULL;
+
+	uci_foreach_option_cont("firewall", "zone", "network", iface, s) {
+		dmuci_get_value_by_section_string(s, "input", &input);
+		dmuci_get_value_by_section_string(s, "forward", &forward);
+		if (strcmp(input, "ACCEPT") !=0 && strcmp(forward, "ACCEPT") !=0) {
+			*value = "1";
+			return 0;
+		}
+	}
+	*value = "0";
+	return 0;
+}
+
+struct uci_section *create_firewall_zone_config(char *fwl, char *iface, char *input, char *forward, char *output)
+{
+	struct uci_section *s;
+	char *value, *name;
+	
+	dmuci_add_section_and_rename("firewall", "zone", &s, &value);
+	dmasprintf(&name, "%s_%s", fwl, iface);
+	dmuci_set_value_by_section(s, "name", name);
+	dmuci_set_value_by_section(s, "input", input);
+	dmuci_set_value_by_section(s, "forward", forward);
+	dmuci_set_value_by_section(s, "output", output);
+	dmuci_set_value_by_section(s, "network", iface);
+	dmfree(name);
+	return s;
+}
+
+int set_interface_firewall_enabled(char *iface, char *refparam, struct dmctx *ctx, int action, char *value)
+{
+	bool b;
+	int cnt = 0;
+	struct uci_section *s = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				value = "DROP";
+			else
+				value = "ACCEPT";
+			uci_foreach_option_cont("firewall", "zone", "network", iface, s) {
+				dmuci_set_value_by_section(s, "input", value);
+				dmuci_set_value_by_section(s, "forward", value);
+				cnt++;
+			}
+			if (cnt == 0 && b)
+				create_firewall_zone_config("fwl", iface, "DROP", "DROP", "ACCEPT");
+			return 0;
+	}
+	return 0;
+}
+
+int dmcmd(char *cmd, int n, ...)
+{
+	va_list arg;
+	int i, pid;
+	static int dmcmd_pfds[2];
+	char *argv[n+2];
+
+	argv[0] = cmd;
+
+	va_start(arg,n);
+	for (i=0; i<n; i++)
+	{
+		argv[i+1] = va_arg(arg, char*);
+	}
+	va_end(arg);
+
+	argv[n+1] = NULL;
+
+	if (pipe(dmcmd_pfds) < 0)
+		return -1;
+
+	if ((pid = fork()) == -1)
+		return -1;
+
+	if (pid == 0) {
+		/* child */
+		close(dmcmd_pfds[0]);
+		dup2(dmcmd_pfds[1], 1);
+		close(dmcmd_pfds[1]);
+
+		execvp(argv[0], (char **) argv);
+		exit(ESRCH);
+	} else if (pid < 0)
+		return -1;
+
+	/* parent */
+	close(dmcmd_pfds[1]);
+
+	int status;
+	while (waitpid(pid, &status, 0) != pid)
+	{
+		kill(pid, 0);
+		if (errno == ESRCH) {
+			return dmcmd_pfds[0];
+		}
+	}
+
+	return dmcmd_pfds[0];
+}
+
+int dmcmd_no_wait(char *cmd, int n, ...)
+{
+	va_list arg;
+	int i, pid;
+	static int dmcmd_pfds[2];
+	char *argv[n+2];
+	static char sargv[4][128];
+	argv[0] = cmd;
+	va_start(arg,n);
+	for (i=0; i<n; i++)
+	{
+		strcpy(sargv[i], va_arg(arg, char*));
+		argv[i+1] = sargv[i];
+	}
+	va_end(arg);
+
+	argv[n+1] = NULL;
+
+	if ((pid = fork()) == -1)
+		return -1;
+
+	if (pid == 0) {
+		execvp(argv[0], (char **) argv);
+		exit(ESRCH);
+	} else if (pid < 0)
+		return -1;
+	return 0;
+}
+
+void dmcmd_read_alloc(int pipe, char **value)
+{
+	char *c = NULL;
+	char buffer[64];
+	ssize_t rxed;
+	int t, len = 1;
+
+	*value = NULL;
+	while ((rxed = read(pipe, buffer, sizeof(buffer) - 1)) > 0) {
+		t = len;
+		len += rxed;
+		*value = dmrealloc(*value, len);
+		memcpy(*value + t - 1, buffer, rxed);
+		*(*value + len -1) = '\0';
+	}
+	if (*value == NULL)
+		*value = dmstrdup("");
+}
+
+int dmcmd_read(int pipe, char *buffer, int size)
+{
+	int rd;
+	if (size < 2) return -1;
+	if ((rd = read(pipe, buffer, (size-1))) > 0) {
+		buffer[rd] = '\0';
+		return (rd + 1);
+	}
+	else {
+		buffer[0] = '\0';
+		return -1;
+	}
+	return -1;
+}
+
+int ipcalc(char *ip_str, char *mask_str, char *start_str, char *end_str, char *ipstart_str, char *ipend_str)
+{
+//TODO test it in accordance with inteno issue #7467
+	struct in_addr ip;
+	struct in_addr mask;
+	struct in_addr ups;
+	struct in_addr upe;
+	int start, end;
+	unsigned int umask;
+	unsigned int addr;
+
+	inet_aton(ip_str, &ip);
+	inet_aton(mask_str, &mask);
+
+	start = atoi(start_str);
+
+	ups.s_addr = htonl(ntohl(ip.s_addr & mask.s_addr) + start);
+	strcpy(ipstart_str, inet_ntoa(ups));
+
+	if (end_str) {
+		end = atoi(end_str);
+		upe.s_addr = htonl(ntohl(ups.s_addr) + end);
+		strcpy(ipend_str, inet_ntoa(upe));
+	}
+	return 0;
+}
+
+int ipcalc_rev_start(char *ip_str, char *mask_str, char *ipstart_str, char *start_str)
+{
+//TODO test it in accordance with inteno issue #7467
+	struct in_addr ip;
+	struct in_addr mask;
+	struct in_addr ups;
+	struct in_addr upe;
+	int start;
+	unsigned int umask;
+	unsigned int addr;
+
+	inet_aton(ip_str, &ip);
+	inet_aton(mask_str, &mask);
+	inet_aton(ipstart_str, &ups);
+
+	start = ntohl(ups.s_addr) - ntohl(ip.s_addr & mask.s_addr);
+	sprintf(start_str, "%d", start);
+	return 0;
+}
+
+int ipcalc_rev_end(char *ip_str, char *mask_str, char *start_str, char *ipend_str, char *end_str)
+{
+//TODO test it in accordance with inteno issue #7467
+	struct in_addr ip;
+	struct in_addr mask;
+	struct in_addr upe;
+	int end;
+
+	inet_aton(ip_str, &ip);
+	inet_aton(mask_str, &mask);
+	inet_aton(ipend_str, &upe);
+
+	end = ntohl(upe.s_addr) - ntohl(ip.s_addr & mask.s_addr) - atoi(start_str);
+	sprintf(end_str, "%d", end);
+	return 0;
+}
+
+int network_get_ipaddr(char **value, char *iface)
+{
+	json_object *res, *jobj;
+	char *ipv6_value = "";
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", iface, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
+	*value = dm_ubus_get_value(jobj, 1, "address");
+	jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv6-address");
+	ipv6_value = dm_ubus_get_value(jobj, 1, "address");
+
+	if((*value)[0] == '\0' || ipv6_value[0] == '\0') {
+		if ((*value)[0] == '\0')
+			*value = ipv6_value;
+	}
+	else if (ip_version == 6) {
+		*value = ipv6_value;
+		return 0;
+	}
+	return 0;
+}
+
+void remove_vid_interfaces_from_ifname(char *vid, char *ifname, char *new_ifname)
+{
+	char *sv, *pch, *p = new_ifname, *spch;
+	new_ifname[0] = '\0';
+	bool append;
+
+	ifname = dmstrdup(ifname);
+	pch = strtok_r(ifname, " ", &spch);
+	while (pch != NULL) {
+		append = false;
+		char *sv = strchr(pch, '.');
+		if (sv) {
+			sv++;
+			if (strcmp(sv, vid) != 0) {
+				append = true;
+			}
+		}
+		else {
+			append = true;
+		}
+		if (append) {
+			if (p == new_ifname) {
+				dmstrappendstr(p, pch);
+			}
+			else {
+				dmstrappendchr(p, ' ');
+				dmstrappendstr(p, pch);
+			}
+		}
+		pch = strtok_r(NULL, " ", &spch);
+	}
+	dmstrappendend(p);
+	dmfree(ifname);
+}
+
+void update_section_option_list(char *config, char *section, char *option, char *option_2,char *val, char *val_2, char *name)
+{
+	char *add_value;
+	int i = 0;
+	char *baseifname;
+	struct uci_section *prev_s= NULL, *s;
+	char *instance = NULL, *last_instance  = NULL, *value;
+	bool add_sec = true;
+
+	if (name[0] == '\0') {
+		add_sec = false;
+	}
+		if (config == DMMAP)
+	{
+		uci_path_foreach_option_eq(icwmpd, config, section, option_2, val_2, s) {
+			dmuci_get_value_by_section_string(s, option, &baseifname);
+			if (!strstr(name, baseifname))
+			{
+				//delete section if baseifname  does not belong to ifname
+				if (prev_s) {
+					DMUCI_DELETE_BY_SECTION(icwmpd, prev_s, NULL, NULL);
+				}
+				prev_s = s;
+			} else if (strstr(name, baseifname) && (strcmp(baseifname,val) ==0)) {
+				//do not add baseifname if exist
+				add_sec = false;
+			}
+		}
+		if (prev_s) {
+			DMUCI_DELETE_BY_SECTION(icwmpd, prev_s, NULL, NULL);
+		}
+		if (add_sec) {
+			DMUCI_ADD_SECTION(icwmpd, config, section, &s, &add_value);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, option, val);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, option_2, val_2);
+		}
+	}
+	else
+	{
+		uci_foreach_option_eq(config, section, option_2, val_2, s) {
+			dmuci_get_value_by_section_string(s, option, &baseifname);
+			if (!strstr(name, baseifname))
+			{
+				//delete section if baseifname  does not belong to ifname
+				if (prev_s) {
+					dmuci_delete_by_section(prev_s, NULL, NULL);
+				}
+				prev_s = s;
+			} else if (strstr(name, baseifname) && (strcmp(baseifname,val) ==0)) {
+				//do not add baseifname if exist
+				add_sec = false;
+			}
+		}
+		if (prev_s) {
+			dmuci_delete_by_section(prev_s, NULL, NULL);
+		}
+		if (add_sec) {
+			dmuci_add_section_and_rename(config, section, &s, &add_value);
+			dmuci_set_value_by_section(s, option, val);
+			dmuci_set_value_by_section(s, option_2, val_2);
+		}
+	}
+}
+
+void update_section_list_icwmpd(char *config, char *section, char *option, int number, char *filter, char *option1, char *val1,  char *option2, char *val2)
+{
+	char *add_value;
+	struct uci_section *s = NULL;
+	int i = 0;
+
+	if (option) {
+		uci_path_foreach_option_eq(icwmpd, config, section, option, filter, s) {
+			return;
+		}
+	} else {
+		uci_path_foreach_sections(icwmpd, config, section, s) {
+			return;
+		}
+	}
+	while (i < number) {
+		DMUCI_ADD_SECTION(icwmpd, config, section, &s, &add_value);
+		if (option)DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, option, filter);
+		if (option1)DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, option1, val1);
+		if (option2)DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, option2, val2);
+		i++;
+	}
+}
+
+void update_section_list(char *config, char *section, char *option, int number, char *filter, char *option1, char *val1,  char *option2, char *val2)
+{
+	char *add_value;
+	struct uci_section *s = NULL;
+	int i = 0;
+
+	if (config == DMMAP)
+	{
+		if (option) {
+			uci_path_foreach_option_eq(icwmpd, config, section, option, filter, s) {
+				return;
+			}
+		} else {
+			uci_path_foreach_sections(icwmpd, config, section, s) {
+				return;
+			}
+		}
+		while (i < number) {
+			DMUCI_ADD_SECTION(icwmpd, config, section, &s, &add_value);
+			if (option)DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, option, filter);
+			if (option1)DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, option1, val1);
+			if (option2)DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, option2, val2);
+			i++;
+		}
+	}
+	else
+	{
+		if (option) {
+			uci_foreach_option_eq(config, section, option, filter, s) {
+				return;
+			}
+		} else {
+			uci_foreach_sections(config, section, s) {
+				return;
+			}
+		}
+		while (i < number) {
+			dmuci_add_section_and_rename(config, section, &s, &add_value);
+			if (option)dmuci_set_value_by_section(s, option, filter);
+			if (option1)dmuci_set_value_by_section(s, option1, val1);
+			if (option2)dmuci_set_value_by_section(s, option2, val2);
+			i++;
+		}
+	}
+}
+
+char *get_nvram_wpakey() {
+	json_object *res;
+	char *wpakey = "";
+	dmubus_call("router.system", "info", UBUS_ARGS{{}}, 0, &res);
+	if (res)
+		wpakey = dmjson_get_value(res, 2, "keys", "wpa");
+	return dmstrdup(wpakey);
+}
+
+int reset_wlan(struct uci_section *s)
+{
+	dmuci_delete_by_section(s, "gtk_rekey", NULL);
+	dmuci_delete_by_section(s, "cipher", NULL);
+	dmuci_delete_by_section(s, "wps", NULL);
+	dmuci_delete_by_section(s, "key", NULL);
+	dmuci_delete_by_section(s, "key1", NULL);
+	dmuci_delete_by_section(s, "key2", NULL);
+	dmuci_delete_by_section(s, "key3", NULL);
+	dmuci_delete_by_section(s, "key4", NULL);
+	dmuci_delete_by_section(s, "radius_server", NULL);
+	dmuci_delete_by_section(s, "radius_port", NULL);
+	dmuci_delete_by_section(s, "radius_secret", NULL);
+	return 0;
+}
+
+int get_cfg_layer2idx(char *pack, char *section_type, char *option, int shift)
+{
+	char *si, *value;
+	int idx = 0, max = -1;
+	struct uci_section *s = NULL;
+
+	uci_foreach_sections(pack, section_type, s) {
+		dmuci_get_value_by_section_string(s, option, &value);
+		si = value + shift;
+		idx = atoi(si);
+		if (idx > max)
+			max = idx;
+	}
+	return (max + 1);
+}
+
+int wan_remove_dev_interface(struct uci_section *interface_setion, char *dev)
+{
+	char *ifname, new_ifname[64], *p, *pch, *spch;
+	new_ifname[0] = '\0';
+	p = new_ifname;
+	dmuci_get_value_by_section_string(interface_setion, "ifname", &ifname);
+	ifname = dmstrdup(ifname);
+	for (pch = strtok_r(ifname, " ", &spch); pch; pch = strtok_r(NULL, " ", &spch)) {
+		if (!strstr(pch, dev)) {
+			if (new_ifname[0] != '\0') {
+				dmstrappendchr(p, ' ');
+			}
+			dmstrappendstr(p, pch);
+		}
+	}
+	dmstrappendend(p);
+	dmfree(ifname);
+	if (new_ifname[0] == '\0') {
+		dmuci_delete_by_section(interface_setion, NULL, NULL);
+	}
+	else {
+		dmuci_set_value_by_section(interface_setion, "ifname", new_ifname);
+	}
+	return 0;
+}
+
+int filter_lan_device_interface(struct uci_section *s)
+{
+	char *ifname = NULL;
+	char *phy_itf = NULL, *phy_itf_local;
+	char *pch, *spch, *ftype, *islan;
+
+	dmuci_get_value_by_section_string(s, "type", &ftype);
+	if (strcmp(ftype, "alias") != 0) {
+		dmuci_get_value_by_section_string(s, "is_lan", &islan);
+		if (islan[0] == '1' && strcmp(section_name(s), "loopback") != 0 )
+			return 0;
+		dmuci_get_value_by_section_string(s, "ifname", &ifname);
+		db_get_value_string("hw", "board", "ethernetLanPorts", &phy_itf);
+		phy_itf_local = dmstrdup(phy_itf);
+		for (pch = strtok_r(phy_itf_local, " ", &spch); pch != NULL; pch = strtok_r(NULL, " ", &spch)) {
+			if (strstr(ifname, pch)) {
+				dmfree(phy_itf_local);
+				return 0;
+			}
+		}
+		dmfree(phy_itf_local);
+	}
+	return -1;
+}
+
+void update_remove_vlan_from_bridge_interface(char *bridge_key, struct uci_section *vb)
+{
+	char *ifname,*vid;
+	char new_ifname[128];
+	struct uci_section *s;
+
+	uci_foreach_option_eq("network", "interface", "bridge_instance", bridge_key, s)
+	{
+		break;
+	}
+	if (!s) return;
+	dmuci_get_value_by_section_string(vb, "vid", &vid);
+	dmuci_get_value_by_section_string(s, "ifname", &ifname);
+	remove_vid_interfaces_from_ifname(vid, ifname, new_ifname);
+	dmuci_set_value_by_section(s, "ifname", new_ifname);
+}
+
+int filter_lan_ip_interface(struct uci_section *ss, void *v)
+{
+	struct uci_section *lds = (struct uci_section *)v;
+	char *value, *type;
+	dmuci_get_value_by_section_string(ss, "type", &type);
+	if (ss == lds) {
+		return 0;
+	}
+	else if (strcmp(type, "alias") == 0) {
+		dmuci_get_value_by_section_string(ss, "ifname", &value);
+		if(strncmp(value, "br-", 3) == 0)
+			value += 3;
+		if (strcmp(value, section_name(lds)) == 0)
+			return 0;
+	}
+	return -1;
+}
+
+void remove_interface_from_ifname(char *iface, char *ifname, char *new_ifname)
+{
+	char *pch, *spch, *p = new_ifname;
+	new_ifname[0] = '\0';
+
+	ifname = dmstrdup(ifname);
+	pch = strtok_r(ifname, " ", &spch);
+	while (pch != NULL) {
+		if (strcmp(pch, iface) != 0) {
+			if (p == new_ifname) {
+				dmstrappendstr(p, pch);
+			}
+			else {
+				dmstrappendchr(p, ' ');
+				dmstrappendstr(p, pch);
+			}
+		}
+		pch = strtok_r(NULL, " ", &spch);
+	}
+	dmstrappendend(p);
+	dmfree(ifname);
+}
+
+int max_array(int a[], int size)
+{
+	int i, max = 0;
+	for (i = 0; i< size; i++)
+	{
+		if(a[i] > max )
+		max = a[i];
+	}
+	return max;
+}
+
+int check_ifname_is_vlan(char *ifname)
+{
+	struct uci_section *s;
+	char *type;
+
+	uci_foreach_option_eq("network", "device", "name", ifname, s) {
+		dmuci_get_value_by_section_string(s, "type", &type);
+		if(strcasecmp(type, "untagged") != 0)
+			return 1;
+	}
+	return 0;
+}
+
+int dmcommon_check_notification_value(char *value)
+{
+	int i;
+	for (i = 0; i< __MAX_notification; i++) {
+		if (strcmp(value, array_notifcation_char[i]) == 0)
+			return 0;
+	}
+	return -1;
+}
+
+char *print_bin(unsigned int n, char *buf, int sep)
+{
+	int i = 0, j;
+	for (j = 0; j < 32;  j++) {
+		if (j % sep == 0)
+			buf[i++] = ' ';
+		buf[i++] = (n & (1<<j)) ? '1' : '0';
+	}
+	buf[i] = '\0';
+	return buf;
+}
+
+void parse_proc_route_line(char *line, struct proc_routing *proute)
+{
+	char *pch, *spch;
+
+	proute->iface = strtok_r(line, " \t", &spch);
+	pch = strtok_r(NULL, " \t", &spch);
+	hex_to_ip(pch, proute->destination);
+	pch = strtok_r(NULL, " \t", &spch);
+	hex_to_ip(pch, proute->gateway);
+	proute->flags = strtok_r(NULL, " \t", &spch);
+	proute->refcnt = strtok_r(NULL, " \t", &spch);
+	proute->use = strtok_r(NULL, " \t", &spch);
+	proute->metric = strtok_r(NULL, " \t", &spch);
+	pch = strtok_r(NULL, " \t", &spch);
+	hex_to_ip(pch, proute->mask);
+	proute->mtu = strtok_r(NULL, " \t", &spch);
+	proute->window = strtok_r(NULL, " \t", &spch);
+	proute->irtt = strtok_r(NULL, " \t\n\r", &spch);
+}
+
+void hex_to_ip(char *address, char *ret)
+{
+	int ip[4] = {0};
+
+	sscanf(address, "%2x%2x%2x%2x", &(ip[0]), &(ip[1]), &(ip[2]), &(ip[3]));
+	if (htonl(13) == 13) {
+		sprintf(ret, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
+	} else {
+		sprintf(ret, "%d.%d.%d.%d", ip[3], ip[2], ip[1], ip[0]);
+	}
+}
+
+void ip_to_hex(char *address, char *ret)
+{
+	int ip[4] = {0};
+
+	sscanf(address, "%d.%d.%d.%d", &(ip[0]), &(ip[1]), &(ip[2]), &(ip[3]));
+	sprintf(ret, "%02X%02X%02X%02X", ip[0], ip[1], ip[2], ip[3]);
+}
+
+/*
+ * dmmap_config sections list manipulation
+ */
+void add_sectons_list_paramameter(struct list_head *dup_list, struct uci_section *config_section, struct uci_section *dmmap_section, void* additional_attribute)
+{
+	struct dmmap_dup *dmmap_config;
+	struct list_head *ilist;
+
+	dmmap_config = dmcalloc(1, sizeof(struct dmmap_dup));
+	list_add_tail(&dmmap_config->list, dup_list);
+	dmmap_config->config_section = config_section;
+	dmmap_config->dmmap_section = dmmap_section;
+	dmmap_config->additional_attribute = additional_attribute;
+}
+
+
+void dmmap_config_dup_delete(struct dmmap_dup *dmmap_config)
+{
+	list_del(&dmmap_config->list);
+}
+
+void free_dmmap_config_dup_list(struct list_head *dup_list)
+{
+	struct dmmap_dup *dmmap_config;
+	while (dup_list->next != dup_list) {
+		dmmap_config = list_entry(dup_list->next, struct dmmap_dup, list);
+		dmmap_config_dup_delete(dmmap_config);
+	}
+}
+
+/*
+ * Function allows to synchronize config section with dmmap config
+ */
+
+struct uci_section *get_origin_section_from_config(char *package, char *section_type, char *orig_section_name)
+{
+	struct uci_section *s;
+
+	uci_foreach_sections(package, section_type, s) {
+		if (strcmp(section_name(s), orig_section_name) == 0){
+			return s;
+		}
+	}
+	return NULL;
+}
+
+struct uci_section *get_dup_section_in_dmmap(char *dmmap_package, char *section_type, char *orig_section_name)
+{
+	struct uci_section *s;
+
+	uci_path_foreach_option_eq(icwmpd, dmmap_package, section_type, "section_name", orig_section_name, s)
+	{
+		return s;
+	}
+
+	return NULL;
+}
+
+struct uci_section *get_dup_section_in_dmmap_eq(char *dmmap_package, char* section_type, char*sect_name, char *opt_name, char* opt_value)
+{
+	struct uci_section *s;
+	char *v;
+
+	uci_path_foreach_option_eq(icwmpd, dmmap_package, section_type, "section_name", sect_name, s) {
+		dmuci_get_value_by_section_string(s, opt_name, &v);
+		if(strcmp(v, opt_value)== 0)
+			return s;
+	}
+	return NULL;
+}
+
+void synchronize_specific_config_sections_with_dmmap(char *package, char *section_type, char *dmmap_package, struct list_head *dup_list)
+{
+	struct uci_section *s, *stmp, *dmmap_sect;
+	FILE *fp;
+	char *v, *dmmap_file_path;
+
+	dmasprintf(&dmmap_file_path, "/etc/icwmpd/%s", dmmap_package);
+	if (access(dmmap_file_path, F_OK)) {
+		/*
+		 *File does not exist
+		 **/
+		fp = fopen(dmmap_file_path, "w"); // new empty file
+		fclose(fp);
+	}
+	uci_foreach_sections(package, section_type, s) {
+		/*
+		 * create/update corresponding dmmap section that have same config_section link and using param_value_array
+		 */
+		if ((dmmap_sect = get_dup_section_in_dmmap(dmmap_package, section_type, section_name(s))) == NULL) {
+			dmuci_add_section_icwmpd(dmmap_package, section_type, &dmmap_sect, &v);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section_name", section_name(s));
+		}
+
+		/*
+		 * Add system and dmmap sections to the list
+		 */
+		add_sectons_list_paramameter(dup_list, s, dmmap_sect, NULL);
+	}
+
+	/*
+	 * Delete unused dmmap sections
+	 */
+	uci_path_foreach_sections_safe(icwmpd, dmmap_package, section_type, stmp, s) {
+		dmuci_get_value_by_section_string(s, "section_name", &v);
+		if(get_origin_section_from_config(package, section_type, v) == NULL){
+			dmuci_delete_by_section_unnamed_icwmpd(s, NULL, NULL);
+		}
+	}
+}
+
+void synchronize_specific_config_sections_with_dmmap_eq(char *package, char *section_type, char *dmmap_package,char* option_name, char* option_value, struct list_head *dup_list)
+{
+	struct uci_section *s, *stmp, *dmmap_sect;
+	FILE *fp;
+	char *v, *dmmap_file_path;
+
+	dmasprintf(&dmmap_file_path, "/etc/icwmpd/%s", dmmap_package);
+	if (access(dmmap_file_path, F_OK)) {
+		/*
+		 *File does not exist
+		 **/
+		fp = fopen(dmmap_file_path, "w"); // new empty file
+		fclose(fp);
+	}
+	uci_foreach_option_eq(package, section_type, option_name, option_value, s) {
+		/*
+		 * create/update corresponding dmmap section that have same config_section link and using param_value_array
+		 */
+		if ((dmmap_sect = get_dup_section_in_dmmap(dmmap_package, section_type, section_name(s))) == NULL) {
+			dmuci_add_section_icwmpd(dmmap_package, section_type, &dmmap_sect, &v);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section_name", section_name(s));
+		}
+
+		/*
+		 * Add system and dmmap sections to the list
+		 */
+		add_sectons_list_paramameter(dup_list, s, dmmap_sect, NULL);
+	}
+
+	/*
+	 * Delete unused dmmap sections
+	 */
+	uci_path_foreach_sections_safe(icwmpd, dmmap_package, section_type, stmp, s) {
+		dmuci_get_value_by_section_string(s, "section_name", &v);
+		if(get_origin_section_from_config(package, section_type, v) == NULL){
+			dmuci_delete_by_section(s, NULL, NULL);
+		}
+	}
+}
+
+void synchronize_specific_config_sections_with_dmmap_eq_no_delete(char *package, char *section_type, char *dmmap_package, char* option_name, char* option_value, struct list_head *dup_list)
+{
+	struct uci_section *s, *dmmap_sect;
+	FILE *fp;
+	char *v, *dmmap_file_path;
+
+	dmasprintf(&dmmap_file_path, "/etc/icwmpd/%s", dmmap_package);
+	if (access(dmmap_file_path, F_OK)) {
+		/*
+		 *File does not exist
+		 **/
+		fp = fopen(dmmap_file_path, "w"); // new empty file
+		fclose(fp);
+	}
+	uci_foreach_option_eq(package, section_type, option_name, option_value, s) {
+		/*
+		 * create/update corresponding dmmap section that have same config_section link and using param_value_array
+		 */
+		if ((dmmap_sect = get_dup_section_in_dmmap(dmmap_package, section_type, section_name(s))) == NULL) {
+			dmuci_add_section_icwmpd(dmmap_package, section_type, &dmmap_sect, &v);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section_name", section_name(s));
+		}
+	}
+
+	dmmap_sect= NULL;
+	s= NULL;
+	uci_path_foreach_sections(icwmpd, dmmap_package, section_type, dmmap_sect) {
+		dmuci_get_value_by_section_string(dmmap_sect, "section_name", &v);
+		get_config_section_of_dmmap_section("network", "interface", v, &s);
+		add_sectons_list_paramameter(dup_list, s, dmmap_sect, NULL);
+	}
+}
+
+void synchronize_specific_config_sections_with_dmmap_cont(char *package, char *section_type, char *dmmap_package,char* option_name, char* option_value, struct list_head *dup_list)
+{
+	struct uci_section *s, *stmp, *dmmap_sect;
+	FILE *fp;
+	char *v, *dmmap_file_path;
+
+	dmasprintf(&dmmap_file_path, "/etc/icwmpd/%s", dmmap_package);
+	if (access(dmmap_file_path, F_OK)) {
+		/*
+		 *File does not exist
+		 **/
+		fp = fopen(dmmap_file_path, "w"); // new empty file
+		fclose(fp);
+	}
+	uci_foreach_option_cont(package, section_type, option_name, option_value, s) {
+		/*
+		 * create/update corresponding dmmap section that have same config_section link and using param_value_array
+		 */
+		if ((dmmap_sect = get_dup_section_in_dmmap(dmmap_package, section_type, section_name(s))) == NULL) {
+			dmuci_add_section_icwmpd(dmmap_package, section_type, &dmmap_sect, &v);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section_name", section_name(s));
+		}
+
+		/*
+		 * Add system and dmmap sections to the list
+		 */
+		add_sectons_list_paramameter(dup_list, s, dmmap_sect, NULL);
+	}
+
+	/*
+	 * Delete unused dmmap sections
+	 */
+	uci_path_foreach_sections_safe(icwmpd, dmmap_package, section_type, stmp, s) {
+		dmuci_get_value_by_section_string(s, "section_name", &v);
+
+		if(get_origin_section_from_config(package, section_type, v) == NULL){
+			dmuci_delete_by_section(s, NULL, NULL);
+		}
+	}
+}
+
+bool synchronize_multi_config_sections_with_dmmap_eq(char *package, char *section_type, char *dmmap_package, char* dmmap_section, char* option_name, char* option_value, void* additional_attribute, struct list_head *dup_list)
+{
+	struct uci_section *s, *stmp, *dmmap_sect;
+	FILE *fp;
+	char *v, *dmmap_file_path, *pack, *sect;
+	bool found = false;
+
+	dmasprintf(&dmmap_file_path, "/etc/icwmpd/%s", dmmap_package);
+	if (access(dmmap_file_path, F_OK)) {
+		/*
+		 *File does not exist
+		 **/
+		fp = fopen(dmmap_file_path, "w"); // new empty file
+		fclose(fp);
+	}
+
+	uci_foreach_option_eq(package, section_type, option_name, option_value, s) {
+		found = true;
+		/*
+		 * create/update corresponding dmmap section that have same config_section link and using param_value_array
+		 */
+		if ((dmmap_sect = get_dup_section_in_dmmap(dmmap_package, dmmap_section, section_name(s))) == NULL) {
+			dmuci_add_section_icwmpd(dmmap_package, dmmap_section, &dmmap_sect, &v);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section_name", section_name(s));
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "package", package);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section", section_type);
+		}
+
+		/*
+		 * Add system and dmmap sections to the list
+		 */
+		add_sectons_list_paramameter(dup_list, s, dmmap_sect, additional_attribute);
+	}
+
+	/*
+	 * Delete unused dmmap sections
+	 */
+	uci_path_foreach_sections_safe(icwmpd, dmmap_package, dmmap_section, stmp, s) {
+		dmuci_get_value_by_section_string(s, "section_name", &v);
+		dmuci_get_value_by_section_string(s, "package", &pack);
+		dmuci_get_value_by_section_string(s, "section", &sect);
+		if(v!=NULL && strlen(v)>0 && strcmp(package, pack)==0 && strcmp(section_type, sect)== 0){
+			if(get_origin_section_from_config(package, section_type, v) == NULL){
+				dmuci_delete_by_section(s, NULL, NULL);
+			}
+		}
+	}
+
+	return found;
+}
+
+bool synchronize_multi_config_sections_with_dmmap_eq_diff(char *package, char *section_type, char *dmmap_package, char* dmmap_section, char* option_name, char* option_value, char* opt_diff_name, char* opt_diff_value, void* additional_attribute, struct list_head *dup_list)
+{
+	struct uci_section *s, *stmp, *dmmap_sect;
+	FILE *fp;
+	char *v, *dmmap_file_path, *pack, *sect, *optval;
+	bool found= false;
+
+	dmasprintf(&dmmap_file_path, "/etc/icwmpd/%s", dmmap_package);
+	if (access(dmmap_file_path, F_OK)) {
+		/*
+		 *File does not exist
+		 **/
+		fp = fopen(dmmap_file_path, "w"); // new empty file
+		fclose(fp);
+	}
+
+	uci_foreach_option_eq(package, section_type, option_name, option_value, s) {
+		found = true;
+		dmuci_get_value_by_section_string(s, opt_diff_name, &optval);
+		if (strcmp(optval, opt_diff_value) != 0) {
+			/*
+			 * create/update corresponding dmmap section that have same config_section link and using param_value_array
+			 */
+			if ((dmmap_sect = get_dup_section_in_dmmap(dmmap_package, dmmap_section, section_name(s))) == NULL) {
+				dmuci_add_section_icwmpd(dmmap_package, dmmap_section, &dmmap_sect, &v);
+				DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section_name", section_name(s));
+				DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "package", package);
+				DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section", section_type);
+			}
+
+			/*
+			 * Add system and dmmap sections to the list
+			 */
+			add_sectons_list_paramameter(dup_list, s, dmmap_sect, additional_attribute);
+		}
+	}
+
+	/*
+	 * Delete unused dmmap sections
+	 */
+	uci_path_foreach_sections_safe(icwmpd, dmmap_package, dmmap_section, stmp, s) {
+		dmuci_get_value_by_section_string(s, "section_name", &v);
+		dmuci_get_value_by_section_string(s, "package", &pack);
+		dmuci_get_value_by_section_string(s, "section", &sect);
+		if(v!=NULL && strlen(v)>0 && strcmp(package, pack)==0 && strcmp(section_type, sect)== 0){
+			if(get_origin_section_from_config(package, section_type, v) == NULL){
+				dmuci_delete_by_section(s, NULL, NULL);
+			}
+		}
+	}
+
+	return found;
+}
+
+void get_dmmap_section_of_config_section(char* dmmap_package, char* section_type, char *section_name, struct uci_section **dmmap_section)
+{
+	struct uci_section* s;
+
+	uci_path_foreach_option_eq(icwmpd, dmmap_package, section_type, "section_name", section_name, s){
+		*dmmap_section= s;
+		return;
+	}
+	*dmmap_section= NULL;
+}
+
+void get_dmmap_section_of_config_section_eq(char* dmmap_package, char* section_type, char *opt, char* value, struct uci_section **dmmap_section)
+{
+	struct uci_section* s;
+
+	uci_path_foreach_option_eq(icwmpd, dmmap_package, section_type, opt, value, s){
+		*dmmap_section= s;
+		return;
+	}
+	*dmmap_section= NULL;
+}
+
+void get_config_section_of_dmmap_section(char* package, char* section_type, char *section_name, struct uci_section **config_section)
+{
+	struct uci_section* s;
+
+	uci_foreach_sections(package, section_type, s){
+		if(strcmp(section_name(s), section_name)==0){
+			*config_section= s;
+			return;
+		}
+	}
+	*config_section= NULL;
+}
+
+void check_create_dmmap_package(char *dmmap_package)
+{
+	FILE *fp;
+	char *dmmap_file_path;
+
+	dmasprintf(&dmmap_file_path, "/etc/icwmpd/%s", dmmap_package);
+	if (access(dmmap_file_path, F_OK)) {
+		/*
+		 *File does not exist
+		 **/
+		fp = fopen(dmmap_file_path, "w"); // new empty file
+		fclose(fp);
+	}
+	dmfree(dmmap_file_path);
+}
+
+int is_section_unnamed(char *section_name)
+{
+        int i;
+
+        if(strlen(section_name)!=9)
+                return 0;
+        if(strstr(section_name, "cfg") != section_name)
+                return 0;
+        for(i=3; i<9; i++){
+                if(!isxdigit(section_name[i]))
+                        return 0;
+        }
+        return 1;
+}
+
+
+void add_dmmap_list_section(struct list_head *dup_list, char* section_name, char* instance)
+{
+	struct dmmap_sect *dmsect;
+
+	dmsect = dmcalloc(1, sizeof(struct dmmap_sect));
+	list_add_tail(&dmsect->list, dup_list);
+	dmasprintf(&dmsect->section_name, "%s", section_name);
+	dmasprintf(&dmsect->instance, "%s", instance);
+}
+
+void delete_sections_save_next_sections(char* dmmap_package, char *section_type, char *instancename, char *section_name, int instance, struct list_head *dup_list) 
+{
+	struct uci_section *s, *stmp;
+	char *v=NULL, *lsectname= NULL, *tmp= NULL;
+	int inst;
+
+	asprintf(&lsectname, "%s", section_name);
+
+	uci_path_foreach_sections(icwmpd, dmmap_package, section_type, s) {
+		dmuci_get_value_by_section_string(s, instancename, &v);
+		inst= atoi(v);
+		if(inst>instance){
+			dmuci_get_value_by_section_string(s, "section_name", &tmp);
+			add_dmmap_list_section(dup_list, lsectname, v);
+			free(lsectname);
+			lsectname= NULL;
+			asprintf(&lsectname, "%s", tmp);
+			free(tmp);
+			tmp= NULL;
+		}
+	}
+
+	if(lsectname != NULL) free(lsectname);
+
+
+	uci_path_foreach_sections_safe(icwmpd, dmmap_package, section_type, stmp, s) {
+		dmuci_get_value_by_section_string(s, instancename, &v);
+		inst= atoi(v);
+		if(inst>=instance)
+			dmuci_delete_by_section_unnamed_icwmpd(s, NULL, NULL);
+	}
+}
+
+void update_dmmap_sections(struct list_head *dup_list, char *instancename, char* dmmap_package, char *section_type)
+{
+	struct uci_section *dm_sect;
+	char *v;
+	struct dmmap_sect *p;
+
+	list_for_each_entry(p, dup_list, list) {
+		dmuci_add_section_icwmpd(dmmap_package, section_type, &dm_sect, &v);
+		dmuci_set_value_by_section(dm_sect, "section_name", p->section_name);
+		dmuci_set_value_by_section(dm_sect, instancename, p->instance);
+	}
+}
+
+struct uci_section *is_dmmap_section_exist(char* package, char* section)
+{
+	struct uci_section *s;
+
+	uci_path_foreach_sections(icwmpd, package, section, s) {
+		return s;
+	}
+	return NULL;
+}
+
+struct uci_section *is_dmmap_section_exist_eq(char* package, char* section, char* opt, char* value)
+{
+	struct uci_section *s;
+
+	uci_path_foreach_option_eq(icwmpd, package, section, opt, value, s) {
+		return s;
+	}
+	return NULL;
+}
+
+unsigned char isdigit_str(char *str)
+{
+	if (!(*str)) return 0;
+	while(isdigit(*str++));
+	return ((*(str-1)) ? 0 : 1);
+}
+
+static inline int isword_delim(char c)
+{
+	if (c == ' ' ||
+		c == ',' ||
+		c == '\t' ||
+		c == '\v' ||
+		c == '\r' ||
+		c == '\n' ||
+		c == '\0')
+		return 1;
+	return 0;
+}
+
+char *dm_strword(char *src, char *str)
+{
+	char *ret = src;
+	int len;
+	if (src[0] == '\0')
+		return NULL;
+	len = strlen(str);
+	while ((ret = strstr(ret, str)) != NULL) {
+		if ((ret == src && isword_delim(ret[len])) ||
+			(ret != src && isword_delim(ret[len]) && isword_delim(*(ret - 1))))
+			return ret;
+		ret++;
+	}
+	return NULL;
+}
+
+char **strsplit(const char* str, const char* delim, size_t* numtokens)
+{
+    // copy the original string so that we don't overwrite parts of it
+    // (don't do this if you don't need to keep the old line,
+    // as this is less efficient)
+    char *s = strdup(str);
+    // these three variables are part of a very common idiom to
+    // implement a dynamically-growing array
+    size_t tokens_alloc = 1;
+    size_t tokens_used = 0;
+    char **tokens = calloc(tokens_alloc, sizeof(char*));
+    char *token, *strtok_ctx;
+    for (token = strtok_r(s, delim, &strtok_ctx);
+            token != NULL;
+            token = strtok_r(NULL, delim, &strtok_ctx)) {
+        // check if we need to allocate more space for tokens
+        if (tokens_used == tokens_alloc) {
+            tokens_alloc *= 2;
+            tokens = realloc(tokens, tokens_alloc * sizeof(char*));
+        }
+        tokens[tokens_used++] = strdup(token);
+    }
+    // cleanup
+    if (tokens_used == 0) {
+        free(tokens);
+        tokens = NULL;
+    } else {
+        tokens = realloc(tokens, tokens_used * sizeof(char*));
+    }
+    *numtokens = tokens_used;
+    free(s);
+    return tokens;
+}
+
+char *get_macaddr(char *interface_name)
+{
+	json_object *res;
+	char *device, *mac = "";
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", interface_name, String}}, 1, &res);
+	device = dmjson_get_value(res, 1, "device");
+	if(device[0] == '\0')
+		return "";
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", device, String}}, 1, &res);
+	mac = dmjson_get_value(res, 1, "macaddr");
+	return mac;
+}
+
+char *get_device(char *interface_name)
+{
+	json_object *res;
+	char *device = "";
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", interface_name, String}}, 1, &res);
+	device = dmjson_get_value(res, 1, "device");
+	return device;
+}
+
+/*
+ * Manage string lists
+ */
+
+int is_elt_exit_in_str_list(char *str_list, char *elt)
+{
+	char *pch, *spch, *list;
+	list= dmstrdup(str_list);
+	for (pch = strtok_r(list, " ", &spch); pch != NULL; pch = strtok_r(NULL, " ", &spch)) {
+		if(strcmp(pch, elt) == 0)
+			return 1;
+	}
+	return 0;
+}
+
+void add_elt_to_str_list(char **str_list, char *elt)
+{
+	char *list= NULL;
+	if(*str_list == NULL || strlen(*str_list) == 0){
+		dmasprintf(str_list, "%s", elt);
+		return;
+	}
+	list= dmstrdup(*str_list);
+	dmfree(*str_list);
+	*str_list= NULL;
+	dmasprintf(str_list, "%s %s", list, elt);
+}
+
+void remove_elt_from_str_list(char **iface_list, char *ifname)
+{
+	char *list= NULL, *tmp=NULL;
+	char *pch, *spch;
+	if (*iface_list == NULL || strlen(*iface_list) == 0)
+		return;
+	list= dmstrdup(*iface_list);
+	dmfree(*iface_list);
+	*iface_list= NULL;
+	for (pch = strtok_r(list, " ", &spch); pch != NULL; pch = strtok_r(NULL, " ", &spch)) {
+		if(strcmp(pch, ifname) == 0)
+			continue;
+		if(tmp == NULL)
+			dmasprintf(iface_list, "%s", pch);
+		else
+			dmasprintf(iface_list, "%s %s", tmp, pch);
+		if(tmp){
+			dmfree(tmp);
+			tmp= NULL;
+		}
+		if(*iface_list){
+			tmp= dmstrdup(*iface_list);
+			dmfree(*iface_list);
+			*iface_list= NULL;
+		}
+	}
+	dmasprintf(iface_list, "%s", tmp);
+}
+
+int is_array_elt_exist(char **str_array, char *str, int length)
+{
+	int i;
+
+	for(i=0; i<length; i++){
+		if(strcmp(str_array[i], str) == 0)
+			return 1;
+	}
+	return 0;
+}
+
+int get_shift_time_time(int shift_time, char *local_time, int size)
+{
+	time_t t_time;
+	struct tm *t_tm;
+
+	t_time = time(NULL) + shift_time;
+	t_tm = localtime(&t_time);
+	if (t_tm == NULL)
+		return -1;
+
+	if(strftime(local_time, size, "%FT%T%z", t_tm) == 0)
+		return -1;
+
+	local_time[25] = local_time[24];
+	local_time[24] = local_time[23];
+	local_time[22] = ':';
+	local_time[26] = '\0';
+
+	return 0;
+}
+
+int get_shift_time_shift(char *local_time, char *shift)
+{
+	struct tm tm = {0};
+
+	strptime(local_time,"%FT%T", &tm);
+	sprintf(shift, "%u", (unsigned int)(mktime(&tm) - time(NULL)));
+
+	return 0;
+}
+
+int get_stats_from_ifconfig_command(char *device, char *direction, char *option)
+{
+	char buf[1024], *pch, *pchr, *ret;
+	int pp, r, stats = 0;
+
+	pp = dmcmd("ifconfig", 1, device);
+	if (pp) {
+		r = dmcmd_read(pp, buf, 1024);
+		for(pch = strtok_r(buf, "\n", &pchr); pch != NULL; pch = strtok_r(NULL, "\n", &pchr)) {
+			if(!strstr(pch, direction))
+				continue;
+			ret = strstr(pch, option);
+			if(ret) {
+				strtok_r(ret, ":", &ret);
+				sscanf(ret, "%d", &stats);
+				break;
+			}
+		}
+		close(pp);
+	}
+	return stats;
+}
+
+int command_exec_output_to_array(char *cmd, char **output, int *length)
+{
+	FILE *fp;
+	char out[1035];
+	int i = 0;
+
+	/* Open the command for reading. */
+	fp = popen(cmd, "r");
+	if (fp == NULL)
+		return 0;
+
+	/* Read the output line by line and store it in output array. */
+	while (fgets(out, sizeof(out)-1, fp) != NULL)
+		asprintf(&output[i++], "%s", out);
+
+	*length = i;
+
+	/* close */
+	pclose(fp);
+
+	return 0;
+}
+
+char* int_period_to_date_time_format(int time)
+{
+	char *datetime;
+	int seconds, minutes, hours, days;
+	minutes= time/60;
+	seconds= time%60;
+	hours= minutes/60;
+	minutes= minutes%60;
+    days= hours/24;
+    hours= hours%24;
+    dmasprintf(&datetime, "%dT%d:%d:%d", days, hours, minutes, seconds);
+	return datetime;
+}
+
+
+int copy_temporary_file_to_original_file(char *f1, char *f2)
+{
+	FILE *fp, *ftmp;
+	char buf[512];
+
+	ftmp = fopen(f2, "r");
+	if (ftmp == NULL)
+		return 0;
+
+	fp = fopen(f1, "w");
+	if (fp == NULL) {
+	  fclose(ftmp);
+	  return 0;
+	}
+
+	while( fgets(buf, 512, ftmp) !=NULL )
+	{
+		fprintf(fp, "%s", buf);
+	}
+	fclose(ftmp);
+	fclose(fp);
+	return 1;
+}
diff --git a/dmcommon.h b/dmcommon.h
new file mode 100644
index 0000000000000000000000000000000000000000..3c714340d1d97af00fd7d9f896e3f7e910bf54ba
--- /dev/null
+++ b/dmcommon.h
@@ -0,0 +1,213 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 PIVA SOFTWARE (www.pivasoftware.com)
+ *		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *		Author: Feten Besbes <feten.besbes@pivasoftware.com>
+ */
+
+#ifndef __DM_COMMON_H
+#define __DM_COMMON_H
+#include <sys/types.h>
+#include <libubox/blobmsg_json.h>
+#include <json-c/json.h>
+#include <unistd.h>
+#include "dmcwmp.h"
+#define NVRAM_FILE "/proc/nvram/WpaKey"
+#define MAX_DHCP_LEASES 256
+#define MAX_PROC_ROUTING 256
+#define ROUTING_FILE "/proc/net/route"
+#define ARP_FILE "/proc/net/arp"
+#define DHCP_LEASES_FILE "/tmp/dhcp.leases"
+#define DMMAP "dmmap"
+#define DHCPSTATICADDRESS_DISABLED_CHADDR "00:00:00:00:00:01"
+#define DM_ASSERT(X, Y) \
+do { \
+	if(!(X)) { \
+		Y; \
+		return -1; \
+	} \
+} while(0)
+
+#define dmstrappendstr(dest, src) \
+do { \
+	int len = strlen(src); \
+	memcpy(dest, src, len); \
+	dest += len; \
+} while(0)
+
+#define dmstrappendchr(dest, c) \
+do { \
+	*dest = c; \
+	dest += 1; \
+} while(0)
+
+#define dmstrappendend(dest) \
+do { \
+	*dest = '\0'; \
+} while(0)
+
+
+#define DMCMD(CMD, N, ...) \
+do { \
+	int mpp = dmcmd(CMD, N, ## __VA_ARGS__); \
+	if (mpp) close (mpp); \
+} while (0)
+
+#define IPPING_PATH "/usr/share/icwmp/functions/ipping_launch"
+#define IPPING_STOP DMCMD("/bin/sh", 2, IPPING_PATH, "stop");
+#define DOWNLOAD_DIAGNOSTIC_PATH "/usr/share/icwmp/functions/download_launch"
+#define DOWNLOAD_DUMP_FILE "/tmp/download_dump"
+#define DOWNLOAD_DIAGNOSTIC_STOP DMCMD("/bin/sh", 2, DOWNLOAD_DIAGNOSTIC_PATH, "stop");
+#define UPLOAD_DIAGNOSTIC_PATH "/usr/share/icwmp/functions/upload_launch"
+#define UPLOAD_DUMP_FILE "/tmp/upload_dump"
+#define UPLOAD_DIAGNOSTIC_STOP DMCMD("/bin/sh", 2, UPLOAD_DIAGNOSTIC_PATH, "stop");
+#define NSLOOKUP_PATH "/usr/share/icwmp/functions/nslookup_launch"
+#define NSLOOKUP_LOG_FILE "/tmp/nslookup.log"
+#define NSLOOKUP_STOP DMCMD("/bin/sh", 2, NSLOOKUP_PATH, "stop");
+#define TRACEROUTE_PATH "/usr/share/icwmp/functions/traceroute_launch"
+#define TRACEROUTE_STOP DMCMD("/bin/sh", 2, TRACEROUTE_PATH, "stop");
+#define UDPECHO_PATH "/usr/share/icwmp/functions/udpecho_launch"
+#define UDPECHO_STOP DMCMD("/bin/sh", 2, UDPECHO_PATH, "stop");
+#define SERVERSELECTION_PATH "/usr/share/icwmp/functions/serverselection_launch"
+#define SERVERSELECTION_STOP DMCMD("/bin/sh", 2, SERVERSELECTION_PATH, "stop");
+
+enum notification_enum {
+	notification_none,
+	notification_passive,
+	notification_active,
+	notification_passive_lw,
+	notification_ppassive_passive_lw,
+	notification_aactive_lw,
+	notification_passive_active_lw,
+	__MAX_notification
+};
+
+enum strstructered_enum {
+	STRUCTERED_SAME,
+	STRUCTERED_PART,
+	STRUCTERED_NULL
+};
+
+struct proc_routing {
+	char *iface;
+	char *flags;
+	char *refcnt;
+	char *use;
+	char *metric;
+	char *mtu;
+	char *window;
+	char *irtt;
+	char destination[16];
+	char gateway[16];
+	char mask[16];
+};
+
+struct routingfwdargs
+{
+	char *permission;
+	struct uci_section *routefwdsection;
+	struct proc_routing *proute;
+	int type;
+};
+
+struct dmmap_dup
+{
+	struct list_head list;
+	struct uci_section *config_section;
+	struct uci_section *dmmap_section;
+	void* additional_attribute;
+};
+
+struct dmmap_sect {
+	struct list_head list;
+	char *section_name;
+	char *instance;
+};
+
+struct dm_args
+{
+	struct uci_section *section;
+	struct uci_section *dmmap_section;
+	char *name;
+};
+
+void compress_spaces(char *str);
+char *cut_fx(char *str, char *delimiter, int occurence);
+pid_t get_pid(char *pname);
+int check_file(char *path);
+char *cidr2netmask(int bits);
+void remove_substring(char *s, const char *str_remove);
+bool is_strword_in_optionvalue(char *optionvalue, char *str);
+int get_interface_enable_ubus(char *iface, char *refparam, struct dmctx *ctx, char **value);
+int set_interface_enable_ubus(char *iface, char *refparam, struct dmctx *ctx, int action, char *value);
+int get_interface_firewall_enabled(char *iface, char *refparam, struct dmctx *ctx, char **value);
+struct uci_section *create_firewall_zone_config(char *fwl, char *iface, char *input, char *forward, char *output);
+int set_interface_firewall_enabled(char *iface, char *refparam, struct dmctx *ctx, int action, char *value);
+int dmcmd(char *cmd, int n, ...);
+int dmcmd_read(int pipe, char *buffer, int size);
+void dmcmd_read_alloc(int pipe, char **value);
+int dmcmd_no_wait(char *cmd, int n, ...);
+int ipcalc(char *ip_str, char *mask_str, char *start_str, char *end_str, char *ipstart_str, char *ipend_str);
+int ipcalc_rev_start(char *ip_str, char *mask_str, char *ipstart_str, char *start_str);
+int ipcalc_rev_end(char *ip_str, char *mask_str, char *start_str, char *ipend_str, char *end_str);
+int network_get_ipaddr(char **value, char *iface);
+void remove_vid_interfaces_from_ifname(char *vid, char *ifname, char *new_ifname);
+void update_section_option_list(char *config, char *section, char *option, char *option_2,char *val, char *val_2, char *name);
+void update_section_list_icwmpd(char *config, char *section, char *option, int number, char *filter, char *option1, char *val1,  char *option2, char *val2);
+void update_section_list(char *config, char *section, char *option, int number, char *filter, char *option1, char *val1,  char *option2, char *val2);
+char *get_nvram_wpakey();
+int reset_wlan(struct uci_section *s);
+int get_cfg_layer2idx(char *pack, char *section_type, char *option, int shift);
+int wan_remove_dev_interface(struct uci_section *interface_setion, char *dev);
+int filter_lan_device_interface(struct uci_section *s);
+void remove_vlan_from_bridge_interface(char *bridge_key, struct uci_section *vb);
+void update_remove_vlan_from_bridge_interface(char *bridge_key, struct uci_section *vb);
+int filter_lan_ip_interface(struct uci_section *ss, void *v);
+void remove_interface_from_ifname(char *iface, char *ifname, char *new_ifname);
+int max_array(int a[], int size);
+int check_ifname_is_vlan(char *ifname);
+int set_uci_dhcpserver_option(struct dmctx *ctx, struct uci_section *s, char *option, char *value);
+int update_uci_dhcpserver_option(struct dmctx *ctx, struct uci_section *s, char *option, char * new_option, char *value);
+void parse_proc_route_line(char *line, struct proc_routing *proute);
+int strstructered(char *str1, char *str2);
+int dmcommon_check_notification_value(char *value);
+void hex_to_ip(char *address, char *ret);
+void ip_to_hex(char *address, char *ret);
+void free_dmmap_config_dup_list(struct list_head *dup_list);
+void synchronize_specific_config_sections_with_dmmap(char *package, char *section_type, char *dmmap_package, struct list_head *dup_list);
+void synchronize_specific_config_sections_with_dmmap_eq(char *package, char *section_type, char *dmmap_package,char* option_name, char* option_value, struct list_head *dup_list);
+void synchronize_specific_config_sections_with_dmmap_eq_no_delete(char *package, char *section_type, char *dmmap_package,char* option_name, char* option_value, struct list_head *dup_list);
+void synchronize_specific_config_sections_with_dmmap_cont(char *package, char *section_type, char *dmmap_package,char* option_name, char* option_value, struct list_head *dup_list);
+bool synchronize_multi_config_sections_with_dmmap_eq(char *package, char *section_type, char *dmmap_package, char* dmmap_section, char* option_name, char* option_value, void* additional_attribute, struct list_head *dup_list);
+bool synchronize_multi_config_sections_with_dmmap_eq_diff(char *package, char *section_type, char *dmmap_package, char* dmmap_section, char* option_name, char* option_value, char* opt_diff_name, char* opt_diff_value, void* additional_attribute, struct list_head *dup_list);
+void get_dmmap_section_of_config_section(char* dmmap_package, char* section_type, char *section_name, struct uci_section **dmmap_section);
+void get_dmmap_section_of_config_section_eq(char* dmmap_package, char* section_type, char *opt, char* value, struct uci_section **dmmap_section);
+void get_config_section_of_dmmap_section(char* package, char* section_type, char *section_name, struct uci_section **config_section);
+void check_create_dmmap_package(char *dmmap_package);
+int is_section_unnamed(char *section_name);
+void delete_sections_save_next_sections(char* dmmap_package, char *section_type, char *instancename, char *section_name, int instance, struct list_head *dup_list);
+void update_dmmap_sections(struct list_head *dup_list, char *instancename, char* dmmap_package, char *section_type);
+unsigned char isdigit_str(char *str);
+char *dm_strword(char *src, char *str);
+char **strsplit(const char* str, const char* delim, size_t* numtokens);
+char *get_macaddr(char *ifname);
+char *get_device(char *ifname);
+int is_elt_exit_in_str_list(char *str_list, char *elt);
+void add_elt_to_str_list(char **str_list, char *elt);
+void remove_elt_from_str_list(char **iface_list, char *ifname);
+struct uci_section *get_dup_section_in_dmmap_eq(char *dmmap_package, char* section_type, char*sect_name, char *opt_name, char* opt_value);
+int is_array_elt_exist(char **str_array, char *str, int length);
+int get_shift_time_time(int shift_time, char *local_time, int size);
+int get_shift_time_shift(char *local_time, char *shift);
+int get_stats_from_ifconfig_command(char *device, char *direction, char *option);
+int command_exec_output_to_array(char *cmd, char **output, int *length);
+char* int_period_to_date_time_format(int time);
+int copy_temporary_file_to_original_file(char *f1, char *f2);
+struct uci_section *is_dmmap_section_exist(char* package, char* section);
+struct uci_section *is_dmmap_section_exist_eq(char* package, char* section, char* opt, char* value);
+
+#endif
diff --git a/dmcwmp.c b/dmcwmp.c
new file mode 100644
index 0000000000000000000000000000000000000000..3a1fe1da851568aac7145a071d20a799f608391d
--- /dev/null
+++ b/dmcwmp.c
@@ -0,0 +1,3169 @@
+/*
+ *	
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author MOHAMED Kallel <mohamed.kallel@pivasoftware.com>
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *	  Author Feten Besbes <feten.besbes@pivasoftware.com>
+ *	  Author Omar Kallel <omar.kallel@pivasoftware.com>
+ *
+ */
+
+#include <stdarg.h>
+#include <time.h>
+#include <uci.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmcwmp.h"
+#include "dmmem.h"
+#include "device.h"
+#include "times.h"
+#include "upnp.h"
+#include "deviceinfo.h"
+#include "managementserver.h"
+#include "x_iopsys_eu_igmp.h"
+#include "x_iopsys_eu_ice.h"
+#include "x_iopsys_eu_power_mgmt.h"
+#include "x_iopsys_eu_ipacccfg.h"
+#include "x_iopsys_eu_logincfg.h"
+#include "x_iopsys_eu_syslog.h"
+#include "dmcommon.h"
+#include "wifi.h"
+#include "ethernet.h"
+#include "atm.h"
+#include "ptm.h"
+#include "bridging.h"
+#include "hosts.h"
+#include "dhcpv4.h"
+#include "ip.h"
+#include "ppp.h"
+#include "softwaremodules.h"
+#include "routing.h"
+#include "nat.h"
+#include "xmpp.h"
+#include "dmcwmp.h"
+#include "dmjson.h"
+#ifdef BBF_TR104
+#include "voice_services.h"
+#endif
+
+static char *get_parameter_notification(struct dmctx *ctx, char *param);
+static int remove_parameter_notification(char *param);
+static int set_parameter_notification(struct dmctx *ctx, char *param,char *value);
+static int get_value_obj(DMOBJECT_ARGS);
+static int get_value_param(DMPARAM_ARGS);
+static int mobj_get_value_in_param(DMOBJECT_ARGS);
+static int mparam_get_value_in_param(DMPARAM_ARGS);
+static int mparam_get_name(DMPARAM_ARGS);
+static int mobj_get_name(DMOBJECT_ARGS);
+static int mparam_get_name_in_param(DMPARAM_ARGS);
+static int mobj_get_name_in_param(DMOBJECT_ARGS);
+static int mparam_get_name_in_obj(DMPARAM_ARGS);
+static int mobj_get_name_in_obj(DMOBJECT_ARGS);
+static int inform_check_obj(DMOBJECT_ARGS);
+static int inform_check_param(DMPARAM_ARGS);
+static int mparam_add_object(DMPARAM_ARGS);
+static int mobj_add_object(DMOBJECT_ARGS);
+static int delete_object_obj(DMOBJECT_ARGS);
+static int delete_object_param(DMPARAM_ARGS);
+static int mobj_set_value(DMOBJECT_ARGS);
+static int mparam_set_value(DMPARAM_ARGS);
+static int mobj_get_notification_in_param(DMOBJECT_ARGS);
+static int mobj_get_notification(DMOBJECT_ARGS);
+static int mparam_get_notification(DMPARAM_ARGS);
+static int mparam_get_notification_in_param(DMPARAM_ARGS);
+static int mparam_set_notification_in_obj(DMPARAM_ARGS);
+static int mobj_set_notification_in_param(DMOBJECT_ARGS);
+static int mparam_set_notification_in_param(DMPARAM_ARGS);
+static int mobj_set_notification_in_obj(DMOBJECT_ARGS);
+#ifdef BBF_TR064
+static int mparam_upnp_get_instances(DMPARAM_ARGS);
+static int mobj_upnp_get_instances(DMOBJECT_ARGS);
+static int mparam_upnp_structured_get_value_in_param(DMPARAM_ARGS);
+static int mparam_upnp_get_supportedparams(DMPARAM_ARGS);
+static int mparam_upnp_set_attributes(DMPARAM_ARGS);
+static int mobj_upnp_set_attributes(DMOBJECT_ARGS);
+static int mobj_upnp_get_supportedparams(DMOBJECT_ARGS);
+static int mparam_upnp_get_attributes(DMPARAM_ARGS);
+static int mobj_upnp_get_attributes(DMOBJECT_ARGS);
+static int upnp_get_value_obj(DMOBJECT_ARGS);
+static int upnp_get_value_param(DMPARAM_ARGS);
+static int mobj_upnp_get_value_in_param(DMOBJECT_ARGS);
+static int mparam_upnp_get_value_in_param(DMPARAM_ARGS);
+static int mobj_upnp_set_value(DMOBJECT_ARGS);
+static int mparam_upnp_set_value(DMPARAM_ARGS);
+static int upnp_delete_instance_param(DMPARAM_ARGS);
+static int upnp_delete_instance_obj(DMOBJECT_ARGS);
+static int mparam_upnp_add_instance(DMPARAM_ARGS);
+static int mobj_upnp_add_instance(DMOBJECT_ARGS);
+static int mparam_upnp_get_acldata(DMPARAM_ARGS);
+static int mobj_upnp_get_acldata(DMOBJECT_ARGS);
+static int mparam_upnp_get_instance_numbers(DMPARAM_ARGS);
+static int mobj_upnp_get_instance_numbers(DMOBJECT_ARGS);
+static int enabled_tracked_param_check_obj(DMOBJECT_ARGS);
+static int enabled_tracked_param_check_param(DMPARAM_ARGS);
+#endif
+static int enabled_notify_check_obj(DMOBJECT_ARGS);
+static int enabled_notify_check_param(DMPARAM_ARGS);
+static int enabled_notify_check_value_change_param(DMPARAM_ARGS);
+static int enabled_notify_check_value_change_obj(DMOBJECT_ARGS);
+static int get_linker_check_obj(DMOBJECT_ARGS);
+static int get_linker_check_param(DMPARAM_ARGS);
+static int get_linker_value_check_obj(DMOBJECT_ARGS);
+static int get_linker_value_check_param(DMPARAM_ARGS);
+
+
+LIST_HEAD(list_enabled_notify);
+LIST_HEAD(list_enabled_lw_notify);
+#ifdef BBF_TR064
+LIST_HEAD(list_upnp_enabled_onevent);
+LIST_HEAD(list_upnp_enabled_onalarm);
+LIST_HEAD(list_upnp_enabled_version);
+LIST_HEAD(list_upnp_changed_onevent);
+LIST_HEAD(list_upnp_changed_onalarm);
+LIST_HEAD(list_upnp_changed_version);
+#endif
+
+LIST_HEAD(list_execute_end_session);
+int end_session_flag = 0;
+int ip_version = 4;
+char dm_delim = DMDELIM_CWMP;
+char dmroot[64] = "Device";
+int bbfdatamodel_type = BBFDM_BOTH;
+unsigned int upnp_in_user_mask = DM_SUPERADMIN_MASK;
+
+
+struct notification notifications[] = {
+	[0] = {"0", "disabled"},
+	[1] = {"1", "passive"},
+	[2] = {"2", "active"},
+	[3] = {"3", "passive_lw"},
+	[4] = {"4", "passive_passive_lw"},
+	[5] = {"5", "active_lw"},
+	[6] = {"6", "passive_active_lw"}
+};
+
+struct dm_acl dm_acl[] = {
+	[0] = {DM_PUBLIC_LIST, "public_list"},
+	[1] = {DM_PUBLIC_READ, "public_read"},
+	[2] = {DM_PUBLIC_WRITE, "public_write"},
+	[3] = {DM_BASIC_LIST, "basic_list"},
+	[4] = {DM_BASIC_READ, "basic_read"},
+	[5] = {DM_BASIC_WRITE, "basic_write"},
+	[6] = {DM_XXXADMIN_LIST, "xxxadmin_list"},
+	[7] = {DM_XXXADMIN_READ, "xxxadmin_read"},
+	[8] = {DM_XXXADMIN_WRITE, "xxxadmin_write"},
+};
+
+char *DMT_TYPE[] = {
+[DMT_STRING] = "xsd:string",
+[DMT_UNINT] = "xsd:unsignedInt",
+[DMT_INT] = "xsd:int",
+[DMT_LONG] = "xsd:long",
+[DMT_BOOL] = "xsd:boolean",
+[DMT_TIME] = "xsd:dateTime",
+[DMT_HEXBIN] = "xsd:hexbin",
+};
+
+#ifdef BBF_TR064
+unsigned int UPNP_DMT_TYPE[] = {
+[DMT_STRING] = NODE_DATA_ATTRIBUTE_TYPESTRING,
+[DMT_UNINT] = NODE_DATA_ATTRIBUTE_TYPEINT,
+[DMT_INT] = NODE_DATA_ATTRIBUTE_TYPEINT,
+[DMT_LONG] = NODE_DATA_ATTRIBUTE_TYPELONG,
+[DMT_BOOL] = NODE_DATA_ATTRIBUTE_TYPEBOOL,
+[DMT_TIME] = NODE_DATA_ATTRIBUTE_TYPEDATETIME,
+[DMT_HEXBIN] = NODE_DATA_ATTRIBUTE_TYPEBIN,
+};
+#endif
+
+struct dm_permession_s DMREAD = {"0", NULL};
+struct dm_permession_s DMWRITE = {"1", NULL};
+struct dm_forced_inform_s DMFINFRM = {1, NULL};
+struct dm_notif_s DMNONE = { "0", NULL };
+struct dm_notif_s DMPASSIVE = { "1", NULL };
+struct dm_notif_s DMACTIVE = { "2", NULL };
+
+int plugin_obj_match(DMOBJECT_ARGS)
+{
+	if (node->matched)
+		return 0;
+	if (!dmctx->inparam_isparam && strstr(node->current_object, dmctx->in_param) == node->current_object) {
+		node->matched++;
+		dmctx->findparam = 1;
+		return 0;
+	}
+	if (strstr(dmctx->in_param, node->current_object) == dmctx->in_param) {
+		return 0;
+	}
+	return FAULT_9005;
+}
+
+int plugin_leaf_match(DMOBJECT_ARGS)
+{
+	char *str;
+	if (node->matched)
+		return 0;
+	if (!dmctx->inparam_isparam)
+		return FAULT_9005;
+	str = dmctx->in_param + strlen(node->current_object);
+	if (!strchr(str, dm_delim))
+		return 0;
+	return FAULT_9005;
+}
+
+int plugin_obj_forcedinform_match(DMOBJECT_ARGS)
+{
+	unsigned char fi;
+	if (forced_inform) {
+		if (forced_inform->get_forced_inform)
+			fi = forced_inform->get_forced_inform(node->current_object, dmctx, data, instance);
+		else
+			fi = forced_inform->val;
+		if (fi)
+			return 0;
+	}
+	return FAULT_9005;
+}
+
+int plugin_leaf_onlyobj_match(DMOBJECT_ARGS)
+{
+	return FAULT_9005;
+}
+
+int plugin_obj_nextlevel_match(DMOBJECT_ARGS)
+{
+	if (node->matched > 1)
+		return FAULT_9005;
+	if (node->matched) {
+		node->matched++;
+		return 0;
+	}
+	if (!dmctx->inparam_isparam && strstr(node->current_object, dmctx->in_param) == node->current_object) {
+		node->matched++;
+		dmctx->findparam = 1;
+		return 0;
+	}
+	if (strstr(dmctx->in_param, node->current_object) == dmctx->in_param) {
+		return 0;
+	}
+	return FAULT_9005;
+}
+
+int plugin_leaf_nextlevel_match(DMOBJECT_ARGS)
+{
+	char *str;
+	if (node->matched > 1)
+		return FAULT_9005;
+	if (node->matched)
+		return 0;
+	if (!dmctx->inparam_isparam)
+		return FAULT_9005;
+	str = dmctx->in_param + strlen(node->current_object);
+	if (!strchr(str, dm_delim))
+		return 0;
+	return FAULT_9005;
+}
+
+int dm_browse_leaf(struct dmctx *dmctx, DMNODE *parent_node, DMLEAF *leaf, void *data, char *instance)
+{
+	int err = 0;
+	if (!leaf)
+		return 0;
+
+	for (; leaf->parameter; leaf++) {
+		if (leaf->bbfdm_type != bbfdatamodel_type &&  leaf->bbfdm_type != BBFDM_BOTH)
+			continue;
+		err = dmctx->method_param(dmctx, parent_node, leaf->parameter, leaf->permission, leaf->type, leaf->getvalue, leaf->setvalue, leaf->forced_inform, leaf->notification, data, instance);
+		if (dmctx->stop)
+			return err;
+	}
+	return err;
+}
+
+int dm_browse(struct dmctx *dmctx, DMNODE *parent_node, DMOBJ *entryobj, void *data, char *instance)
+{
+	int err = 0;
+	if (!entryobj)
+		return 0;
+	char *parent_obj = parent_node->current_object;
+	for (; entryobj->obj; entryobj++) {
+		DMNODE node = {0};
+		node.obj = entryobj;
+		node.parent = parent_node;
+		node.instance_level = parent_node->instance_level;
+		node.matched = parent_node->matched;
+		dmasprintf(&(node.current_object), "%s%s%c", parent_obj, entryobj->obj, dm_delim);
+		if (entryobj->bbfdm_type != bbfdatamodel_type &&  entryobj->bbfdm_type != BBFDM_BOTH)
+			continue;
+		if (dmctx->checkobj) {
+			err = dmctx->checkobj(dmctx, &node, entryobj->permission, entryobj->addobj, entryobj->delobj, entryobj->forced_inform, entryobj->notification, entryobj->get_linker, data, instance);
+			if (err)
+				continue;
+		}
+		err = dmctx->method_obj(dmctx, &node, entryobj->permission, entryobj->addobj, entryobj->delobj, entryobj->forced_inform, entryobj->notification, entryobj->get_linker, data, instance);
+		if (dmctx->stop)
+			return err;
+		if (entryobj->checkobj && ((entryobj->checkobj)(dmctx, data) == false) ){
+			continue;
+		}
+		if (entryobj->browseinstobj) {
+			if (dmctx->instance_wildchar) {
+				dm_link_inst_obj(dmctx, &node, data, dmctx->instance_wildchar);
+				continue;
+			}
+			else {
+				entryobj->browseinstobj(dmctx, &node, data, instance);
+				err = dmctx->faultcode;
+				if (dmctx->stop)
+					return err;
+				continue;
+			}
+		}
+		if (entryobj->leaf) {
+			if (dmctx->checkleaf) {
+				err = dmctx->checkleaf(dmctx, &node, entryobj->permission, entryobj->addobj, entryobj->delobj, entryobj->forced_inform, entryobj->notification, entryobj->get_linker, data, instance);
+				if (!err) {
+					err = dm_browse_leaf(dmctx, &node, entryobj->leaf, data, instance);
+					if (dmctx->stop)
+						return err;
+				}
+			} else {
+				err = dm_browse_leaf(dmctx, &node, entryobj->leaf, data, instance);
+				if (dmctx->stop)
+					return err;
+			}
+		}
+		if (entryobj->nextobj) {
+			err = dm_browse(dmctx, &node, entryobj->nextobj, data, instance);
+			if (dmctx->stop)
+				return err;
+		}
+	}
+	return err;
+}
+
+int dm_link_inst_obj(struct dmctx *dmctx, DMNODE *parent_node, void *data, char *instance)
+{
+	int err = 0;
+	char *parent_obj;
+	DMOBJ *prevobj = parent_node->obj;
+	DMOBJ *nextobj = prevobj->nextobj;
+	DMLEAF *nextleaf = prevobj->leaf;
+
+	DMNODE node = {0};
+	node.obj = prevobj;
+	node.parent = parent_node;
+	node.instance_level = parent_node->instance_level + 1;
+	node.is_instanceobj = 1;
+	node.matched = parent_node->matched;
+
+	parent_obj = parent_node->current_object;
+	if (instance == NULL)
+		return -1;
+	dmasprintf(&node.current_object, "%s%s%c", parent_obj, instance, dm_delim);
+	if (dmctx->checkobj) {
+		err = dmctx->checkobj(dmctx, &node, prevobj->permission, prevobj->addobj, prevobj->delobj, prevobj->forced_inform, prevobj->notification, prevobj->get_linker, data, instance);
+		if (err)
+			return err;
+	}
+	err = dmctx->method_obj(dmctx, &node, prevobj->permission, prevobj->addobj, prevobj->delobj, prevobj->forced_inform, prevobj->notification, prevobj->get_linker, data, instance);
+	if (dmctx->stop)
+		return err;
+	if (nextleaf) {
+		if (dmctx->checkleaf) {
+			err = dmctx->checkleaf(dmctx, &node, prevobj->permission, prevobj->addobj, prevobj->delobj, prevobj->forced_inform, prevobj->notification, prevobj->get_linker, data, instance);
+			if (!err) {
+				err = dm_browse_leaf(dmctx, &node, nextleaf, data, instance);
+				if (dmctx->stop)
+					return err;
+			}
+		} else {
+			err = dm_browse_leaf(dmctx, &node, nextleaf, data, instance);
+			if (dmctx->stop)
+				return err;
+		}
+	}
+	if (nextobj) {
+		err = dm_browse(dmctx, &node, nextobj, data, instance);
+		if (dmctx->stop)
+			return err;
+	}
+	return err;
+}
+
+int rootcmp(char *inparam, char *rootobj)
+{
+	int cmp = -1;
+	char buf[32];
+	sprintf(buf, "%s%c", rootobj, dm_delim);
+	cmp = strcmp(inparam, buf);
+	return cmp;
+}
+
+//END//
+/***************************
+ * update instance & alias
+ ***************************/
+char *handle_update_instance(int instance_ranck, struct dmctx *ctx, char **last_inst, char * (*up_instance)(int action, char **last_inst, void *argv[]), int argc, ...)
+{
+	va_list arg;
+	char *instance, *inst_mode;
+	char *alias;
+	int i = 0;
+	unsigned int pos = instance_ranck - 1;
+	unsigned int alias_resister = 0, max, action;
+	void *argv[argc];
+	char *str;
+
+	va_start(arg, argc);
+	for (i = 0; i < argc; i++) {
+		argv[i] = va_arg(arg, void*);
+	}
+	va_end(arg);
+	if (ctx->amd_version >= AMD_4) {
+		if(pos < ctx->nbrof_instance) {
+			action = (ctx->alias_register & (1 << pos)) ? INSTANCE_UPDATE_ALIAS : INSTANCE_UPDATE_NUMBER;
+		} else {
+			action = (ctx->instance_mode == INSTANCE_MODE_ALIAS) ? INSTANCE_UPDATE_ALIAS : INSTANCE_UPDATE_NUMBER;
+		}
+	} else {
+		action = INSTANCE_UPDATE_NUMBER;
+	}
+
+	instance = up_instance(action, last_inst, argv);
+	if(*last_inst)
+		ctx->inst_buf[pos] = dmstrdup(*last_inst);
+
+	return instance;
+}
+char *update_instance(struct uci_section *s, char *last_inst, char *inst_opt)
+{
+	char *instance;
+	void *argv[3];
+
+	argv[0] = s;
+	argv[1] = inst_opt;
+	argv[2] = "";
+
+	instance = update_instance_alias_icwmpd(0, &last_inst, argv);
+	return instance;
+}
+
+char *update_instance_icwmpd(struct uci_section *s, char *last_inst, char *inst_opt)
+{
+	char *instance;
+	void *argv[3];
+
+	argv[0]= s;
+	argv[1]= inst_opt;
+	argv[2]= "";
+	instance = update_instance_alias_icwmpd(0, &last_inst, argv);
+	return instance;
+}
+
+char *update_instance_alias_icwmpd(int action, char **last_inst , void *argv[])
+{
+	char *instance;
+	char *alias;
+	char buf[64] = {0};
+	struct uci_section *s = (struct uci_section *) argv[0];
+	char *inst_opt = (char *) argv[1];
+	char *alias_opt = (char *) argv[2];
+	dmuci_get_value_by_section_string(s, inst_opt, &instance);
+	if (instance[0] == '\0') {
+		if (*last_inst == NULL)
+			sprintf(buf, "%d", 1);
+		else
+			sprintf(buf, "%d", atoi(*last_inst)+1);
+		instance = DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, inst_opt, buf);
+	}
+	*last_inst = instance;
+	if (action == INSTANCE_MODE_ALIAS) {
+		dmuci_get_value_by_section_string(s, alias_opt, &alias);
+		if (alias[0] == '\0') {
+			sprintf(buf, "cpe-%s", instance);
+			alias = DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, alias_opt, buf);
+		}
+		sprintf(buf, "[%s]", alias);
+		instance = dmstrdup(buf);
+	}
+	return instance;
+}
+
+char *update_instance_alias(int action, char **last_inst, void *argv[])
+{
+	char *instance;
+	char *alias;
+	char buf[64] = {0};
+
+	struct uci_section *s = (struct uci_section *) argv[0];
+	char *inst_opt = (char *) argv[1];
+	char *alias_opt = (char *) argv[2];
+
+	dmuci_get_value_by_section_string(s, inst_opt, &instance);
+	if (instance[0] == '\0') {
+		if (*last_inst == NULL)
+			sprintf(buf, "%d", 1);
+		else
+			sprintf(buf, "%d", atoi(*last_inst) + 1);
+		instance = dmuci_set_value_by_section(s, inst_opt, buf);
+	}
+	*last_inst = instance;
+	if (action == INSTANCE_MODE_ALIAS) {
+		dmuci_get_value_by_section_string(s, alias_opt, &alias);
+		if (alias[0] == '\0') {
+			sprintf(buf, "cpe-%s", instance);
+			alias = dmuci_set_value_by_section(s, alias_opt, buf);
+		}
+		sprintf(buf, "[%s]", alias);
+		instance = dmstrdup(buf);
+	}
+	return instance;
+}
+
+char *update_instance_without_section(int action, char **last_inst, void *argv[])
+{
+	char *instance;
+	char *alias;
+	char buf[64] = {0};
+
+	int instnbr = (int) argv[0];
+
+	if (action == INSTANCE_MODE_ALIAS) {
+		sprintf(buf, "[cpe-%d]", instnbr);
+		instance = dmstrdup(buf);
+	} else {
+		sprintf(buf, "%d", instnbr);
+		instance = dmstrdup(buf);
+	}
+	return instance;
+}
+
+char *get_vlan_last_instance_icwmpd(char *package, char *section, char *opt_inst, char *vlan_method)
+{
+	struct uci_section *s, *confsect;
+	char *inst = NULL, *last_inst = NULL, *type, *sect_name;
+
+	uci_path_foreach_sections(icwmpd, package, section, s) {
+		dmuci_get_value_by_section_string(s, "section_name", &sect_name);
+		get_config_section_of_dmmap_section("network", "device", sect_name, &confsect);
+		dmuci_get_value_by_section_string(confsect, "type", &type);
+		if ((strcmp(vlan_method, "2") != 0 && strcmp(vlan_method, "1") != 0) || (strcmp(vlan_method, "1") == 0 && strcmp(type, "untagged") == 0) )
+			continue;
+		inst = update_instance_icwmpd(s, last_inst, opt_inst);
+		if(last_inst)
+			dmfree(last_inst);
+		last_inst = dmstrdup(inst);
+	}
+	return inst;
+}
+
+char *get_last_instance_icwmpd(char *package, char *section, char *opt_inst)
+{
+	struct uci_section *s;
+	char *inst = NULL;
+	char *last_inst = NULL;
+
+	uci_path_foreach_sections(icwmpd, package, section, s) {
+		inst = update_instance_icwmpd(s, last_inst, opt_inst);
+		if(last_inst)
+			dmfree(last_inst);
+		last_inst = dmstrdup(inst);
+	}
+	return inst;
+}
+
+char *get_last_instance_icwmpd_without_update(char *package, char *section, char *opt_inst)
+{
+	struct uci_section *s;
+	char *inst = NULL;
+	char *last_inst = NULL;
+
+	uci_path_foreach_sections(icwmpd, package, section, s) {
+		dmuci_get_value_by_section_string(s, opt_inst, &inst);
+		if(last_inst)
+			dmfree(last_inst);
+		last_inst = dmstrdup(inst);
+	}
+	return inst;
+}
+
+char *get_last_instance(char *package, char *section, char *opt_inst)
+{
+	struct uci_section *s;
+	char *inst = NULL;
+	char *last_inst = NULL;
+	if (package == DMMAP)
+	{
+		uci_path_foreach_sections(icwmpd, "dmmap", section, s) {
+			inst = update_instance_icwmpd(s, last_inst, opt_inst);
+			if(last_inst)
+				dmfree(last_inst);
+			last_inst = dmstrdup(inst);
+		}
+	}
+	else
+	{
+		uci_foreach_sections(package, section, s) {
+			inst = update_instance(s, inst, opt_inst);
+		}
+	}
+	return inst;
+}
+
+char *get_last_instance_lev2_icwmpd_dmmap_opt(char* dmmap_package, char *section,  char *opt_inst, char *opt_check, char *value_check)
+{
+	struct uci_section *s;
+	char *instance = NULL, *section_name= NULL;
+	char *last_inst = NULL;
+
+	uci_path_foreach_option_eq(icwmpd, dmmap_package, section, opt_check, value_check, s) {
+		dmuci_get_value_by_section_string(s, "section_name", &section_name);
+		instance = update_instance_icwmpd(s, last_inst, opt_inst);
+		if(last_inst)
+			dmfree(last_inst);
+		last_inst = dmstrdup(instance);
+	}
+	return instance;
+}
+char *get_last_instance_lev2_icwmpd(char *package, char *section, char* dmmap_package, char *opt_inst, char *opt_check, char *value_check)
+{
+	struct uci_section *s, *dmmap_section;
+	char *instance = NULL;
+	char *last_inst = NULL, *v= NULL;
+
+	check_create_dmmap_package(dmmap_package);
+	uci_foreach_option_cont(package, section, opt_check, value_check, s) {
+		get_dmmap_section_of_config_section(dmmap_package, section, section_name(s), &dmmap_section);
+		if(dmmap_section == NULL){
+			dmuci_add_section_icwmpd(dmmap_package, section, &dmmap_section, &v);
+			dmuci_set_value_by_section(dmmap_section, "section_name", section_name(s));
+		}
+		instance = update_instance_icwmpd(dmmap_section, last_inst, opt_inst);
+		if(last_inst)
+			dmfree(last_inst);
+		last_inst = dmstrdup(instance);
+	}
+	return instance;
+}
+
+char *get_last_instance_lev2(char *package, char *section, char *opt_inst, char *opt_check, char *value_check)
+{
+	struct uci_section *s;
+	char *instance = NULL;
+	char *last_inst = NULL;
+
+	if (package == DMMAP)
+	{
+		uci_path_foreach_option_cont(icwmpd, package, section, opt_check, value_check, s) {
+			instance = update_instance_icwmpd(s, last_inst, opt_inst);
+			if(last_inst)
+				dmfree(last_inst);
+			last_inst = dmstrdup(instance);
+		}
+	}
+	else
+	{
+		uci_foreach_option_cont(package, section, opt_check, value_check, s) {
+			instance = update_instance(s, instance, opt_inst);
+		}
+	}
+	return instance;
+}
+
+int get_empty(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "";
+	return 0;
+}
+
+void add_list_paramameter(struct dmctx *ctx, char *param_name, char *param_data, char *param_type, char *param_version, unsigned int flags)
+{
+	struct dm_parameter *dm_parameter;
+	struct list_head *ilist;
+	list_for_each(ilist, &ctx->list_parameter)
+	{
+		dm_parameter = list_entry(ilist, struct dm_parameter, list);
+		int cmp = strcmp(dm_parameter->name, param_name);
+		if (cmp == 0) {
+			return;
+		} else if (cmp > 0) {
+			break;
+		}
+	}
+	dm_parameter = dmcalloc(1, sizeof(struct dm_parameter));
+	_list_add(&dm_parameter->list, ilist->prev, ilist);
+	dm_parameter->name = param_name;
+	dm_parameter->data = param_data ? param_data : ""; //allocate memory in function
+	dm_parameter->type = param_type;
+	dm_parameter->version = param_version;
+	dm_parameter->flags = flags;
+}
+
+void del_list_parameter(struct dm_parameter *dm_parameter)
+{
+	list_del(&dm_parameter->list);
+	dmfree(dm_parameter->name);
+	dmfree(dm_parameter);
+}
+
+void free_all_list_parameter(struct dmctx *ctx)
+{
+	struct dm_parameter *dm_parameter;
+	while (ctx->list_parameter.next != &ctx->list_parameter) {
+		dm_parameter = list_entry(ctx->list_parameter.next, struct dm_parameter, list);
+		del_list_parameter(dm_parameter);
+	}
+}
+
+void add_set_list_tmp(struct dmctx *ctx, char *param, char *value, unsigned int flags)
+{
+	struct set_tmp *set_tmp;
+	set_tmp = dmcalloc(1, sizeof(struct set_tmp));
+	list_add_tail(&set_tmp->list, &ctx->set_list_tmp);
+	set_tmp->name = dmstrdup(param);
+	set_tmp->value = value ? dmstrdup(value) : NULL;
+	set_tmp->flags = flags;
+}
+
+void del_set_list_tmp(struct set_tmp *set_tmp)
+{
+	list_del(&set_tmp->list);
+	dmfree(set_tmp->name);
+	dmfree(set_tmp->value);
+	dmfree(set_tmp);
+}
+
+void free_all_set_list_tmp(struct dmctx *ctx)
+{
+	struct set_tmp *set_tmp;
+	while (ctx->set_list_tmp.next != &ctx->set_list_tmp) {
+		set_tmp = list_entry(ctx->set_list_tmp.next, struct set_tmp, list);
+		del_set_list_tmp(set_tmp);
+	}
+}
+
+void add_list_fault_param(struct dmctx *ctx, char *param, int fault)
+{
+	struct param_fault *param_fault;
+	if (param == NULL) param = "";
+
+	param_fault = dmcalloc(1, sizeof(struct param_fault));
+	list_add_tail(&param_fault->list, &ctx->list_fault_param);
+	param_fault->name = dmstrdup(param);
+	param_fault->fault = fault;
+}
+
+void del_list_fault_param(struct param_fault *param_fault)
+{
+	list_del(&param_fault->list);
+	dmfree(param_fault->name);
+	dmfree(param_fault);
+}
+
+void free_all_list_fault_param(struct dmctx *ctx)
+{
+	struct param_fault *param_fault;
+	while (ctx->list_fault_param.next != &ctx->list_fault_param) {
+		param_fault = list_entry(ctx->list_fault_param.next, struct param_fault, list);
+		del_list_fault_param(param_fault);
+	}
+}
+
+void add_list_enabled_lwnotify(struct dmctx *dmctx, char *param, char *notification, char *value)
+{
+	struct dm_enabled_notify *dm_enabled_notify;
+
+	dm_enabled_notify = calloc(1, sizeof(struct dm_enabled_notify)); // Should be calloc and not dmcalloc
+	list_add_tail(&dm_enabled_notify->list, &list_enabled_lw_notify);
+	dm_enabled_notify->name = strdup(param); // Should be strdup and not dmstrdup
+	dm_enabled_notify->value = value ? strdup(value) : strdup(""); // Should be strdup and not dmstrdup
+	dm_enabled_notify->notification = strdup(notification); // Should be strdup and not dmstrdup
+}
+
+void del_list_enabled_notify(struct dm_enabled_notify *dm_enabled_notify)
+{
+	list_del(&dm_enabled_notify->list); // Should be free and not dmfree
+	free(dm_enabled_notify->name);
+	free(dm_enabled_notify->value);
+	free(dm_enabled_notify->notification);
+	free(dm_enabled_notify);
+}
+
+void free_all_list_enabled_lwnotify()
+{
+	struct dm_enabled_notify *dm_enabled_notify;
+	while (list_enabled_lw_notify.next != &list_enabled_lw_notify) {
+		dm_enabled_notify = list_entry(list_enabled_lw_notify.next, struct dm_enabled_notify, list);
+		del_list_enabled_notify(dm_enabled_notify);
+	}
+}
+
+int dm_update_file_enabled_notify(char *param, char *new_value)
+{
+	FILE *fp, *ftmp;
+	char buf[512];
+	char *parameter, *notification, *value, *type, *jval;
+
+	fp = fopen(DM_ENABLED_NOTIFY, "r");
+	if (fp == NULL)
+		return 0;
+
+	ftmp = fopen(DM_ENABLED_NOTIFY_TEMPORARY, "a");
+	if (ftmp == NULL) {
+		fclose(fp);
+		return 0;
+	}
+
+	while (fgets(buf, 512, fp) != NULL) {
+		int len = strlen(buf);
+		if (len)
+			buf[len-1] = '\0';
+		dmjson_parse_init(buf);
+		dmjson_get_var("parameter", &jval);
+		parameter = dmstrdup(jval);
+		dmjson_get_var("value", &jval);
+		value = dmstrdup(jval);
+		dmjson_get_var("notification", &jval);
+		notification = dmstrdup(jval);
+		dmjson_get_var("type", &jval);
+		type = dmstrdup(jval);
+		dmjson_parse_fini();
+		if (strcmp(parameter, param) == 0)
+			dmjson_fprintf(ftmp, 4, DMJSON_ARGS{{"parameter", parameter}, {"notification", notification}, {"value", new_value}, {"type", type}});
+		else
+			dmjson_fprintf(ftmp, 4, DMJSON_ARGS{{"parameter", parameter}, {"notification", notification}, {"value", value}, {"type", type}});
+	}
+	fclose(fp);
+	fclose(ftmp);
+
+	return 0;
+}
+
+void dm_update_enabled_notify(struct dm_enabled_notify *p, char *new_value)
+{
+	free(p->value); // Should be free and not dmfree
+	p->value = strdup(new_value);
+}
+
+void dm_update_enabled_notify_byname(char *name, char *new_value)
+{
+	int iscopy;
+	dm_update_file_enabled_notify(name, new_value);
+	remove(DM_ENABLED_NOTIFY);
+	iscopy = copy_temporary_file_to_original_file(DM_ENABLED_NOTIFY, DM_ENABLED_NOTIFY_TEMPORARY);
+	if(iscopy)
+		remove(DM_ENABLED_NOTIFY_TEMPORARY);
+
+}
+
+int update_param_instance_alias(struct dmctx *ctx, char *param, char **new_param)
+{
+	char *pch, *spch, *p;
+	char buf[512];
+	int i = 0, j = 0;
+	char pat[2] = {0};
+
+	char *dup = dmstrdup(param);
+	*pat = dm_delim;
+	p = buf;
+	for (pch = strtok_r(dup, pat, &spch); pch != NULL; pch = strtok_r(NULL, pat, &spch)) {
+		if (isdigit(pch[0])) {
+			dmstrappendchr(p, dm_delim);
+			dmstrappendstr(p, pch);
+			i++;
+		} else if (pch[0]== '[') {
+			dmstrappendchr(p, dm_delim);
+			dmstrappendstr(p, ctx->inst_buf[i]);
+			i++;
+		} else {
+			if (j > 0) {
+				dmstrappendchr(p, dm_delim);
+				dmstrappendstr(p, pch);
+			}
+			if (j == 0) {
+				dmstrappendstr(p, pch);
+				j++;
+			}
+		}
+	}
+	if (param[strlen(param) - 1] == dm_delim)
+		dmstrappendchr(p, dm_delim);
+	dmstrappendend(p);
+	*new_param = dmstrdup(buf);
+	dmfree(dup);
+	return 0;
+}
+
+static char *get_parameter_notification(struct dmctx *ctx, char *param)
+{
+	int i, maxlen = 0, len;
+	struct uci_list *list_notif;
+	char *pch, *new_param;
+	char *notification = "0";
+	struct uci_element *e;
+
+	update_param_instance_alias(ctx, param, &new_param);
+	for (i = (ARRAY_SIZE(notifications) - 1); i >= 0; i--) {
+		dmuci_get_option_value_list("cwmp", "@notifications[0]", notifications[i].type, &list_notif);
+		if (list_notif) {
+			uci_foreach_element(list_notif, e) {
+				pch = e->name;
+				if (strcmp(pch, new_param) == 0) {
+					notification = notifications[i].value;
+					return notification;
+				}
+				len = strlen(pch);
+				if (pch[len-1] == dm_delim) {
+					if (strstr(new_param, pch)) {
+						if (len > maxlen )
+						{
+							notification = notifications[i].value;
+							maxlen = len;
+						}
+					}
+				}
+			}
+		}
+	}
+	dmfree(new_param);
+	return notification;
+}
+
+static int remove_parameter_notification(char *param)
+{
+	int i;
+	struct uci_list *list_notif;
+	struct uci_element *e, *tmp;
+	char *pch;
+	for (i = (ARRAY_SIZE(notifications) - 1); i >= 0; i--) {
+		if (param[strlen(param)-1] == dm_delim) {
+			dmuci_get_option_value_list("cwmp", "@notifications[0]", notifications[i].type, &list_notif);
+			if (list_notif) {
+				uci_foreach_element_safe(list_notif, e, tmp) {
+					pch = tmp->name;
+					if (strstr(pch, param)) {
+						dmuci_del_list_value("cwmp", "@notifications[0]", notifications[i].type, pch);
+					}
+				}
+			}
+		} else {
+			dmuci_del_list_value("cwmp", "@notifications[0]", notifications[i].type, param);
+		}
+	}
+	return 0;
+}
+
+static int set_parameter_notification(struct dmctx *ctx, char *param, char *value)
+{
+	char *tmp = NULL, *buf = NULL, *pch, *new_param;
+	char *notification = NULL;
+	struct uci_section *s;
+	dmuci_get_section_type("cwmp", "@notifications[0]", &tmp);
+	update_param_instance_alias(ctx, param, &new_param);
+	if (!tmp || tmp[0] == '\0') {
+		dmuci_add_section("cwmp", "notifications", &s, &buf);
+	} else {
+		remove_parameter_notification(new_param);
+	}
+
+	notification = get_parameter_notification(ctx, new_param);
+	if (strcmp(notification, value) == 0) {
+		goto end;
+	}
+	if (strcmp(value, "1") == 0) {
+		dmuci_add_list_value("cwmp", "@notifications[0]", "passive", new_param);
+	} else if (strcmp(value, "2") == 0) {
+		dmuci_add_list_value("cwmp", "@notifications[0]", "active", new_param);
+	} else if (strcmp(value, "3") == 0) {
+		dmuci_add_list_value("cwmp", "@notifications[0]", "passive_lw", new_param);
+	} else if (strcmp(value, "4") == 0) {
+		dmuci_add_list_value("cwmp", "@notifications[0]", "passive_passive_lw", new_param);
+	} else if (strcmp(value, "5") == 0) {
+		dmuci_add_list_value("cwmp", "@notifications[0]", "active_lw", new_param);
+	} else if (strcmp(value, "6") == 0) {
+		dmuci_add_list_value("cwmp", "@notifications[0]", "passive_active_lw", new_param);
+	} else if (strcmp(value, "0") == 0) {
+		struct uci_list *list_notif;
+		struct uci_element *e;
+		int i, len;
+		for (i = (ARRAY_SIZE(notifications) - 1); i >= 1; i--) {
+			dmuci_get_option_value_list("cwmp", "@notifications[0]", notifications[i].type, &list_notif);
+			if (list_notif) {
+				uci_foreach_element(list_notif, e) {
+					pch = e->name;
+					len = strlen(pch);
+					if (pch[len-1] == dm_delim && strstr(new_param, pch)) {
+						dmuci_add_list_value("cwmp", "@notifications[0]", "disabled", new_param);
+						goto end;
+					}
+				}
+			}
+		}
+
+	} else {
+		return -1;
+	}
+end:
+	dmfree(new_param);
+	return 0;
+}
+
+int string_to_bool(char *v, bool *b)
+{
+	if (v[0] == '1' && v[1] == '\0') {
+		*b = true;
+		return 0;
+	}
+	if (v[0] == '0' && v[1] == '\0') {
+		*b = false;
+		return 0;
+	}
+	if (strcasecmp(v, "true") == 0) {
+		*b = true;
+		return 0;
+	}
+	if (strcasecmp(v, "false") == 0) {
+		*b = false;
+		return 0;
+	}
+	*b = false;
+	return -1;
+}
+
+/******************
+ * operate commands
+ *****************/
+int dm_entry_operate(struct dmctx *dmctx)
+{
+	int res;
+
+	res = operate_on_node(dmctx, dmctx->in_param, dmctx->in_value);
+	return res;
+}
+
+/* **********
+ * get value 
+ * **********/
+int dm_entry_get_value(struct dmctx *dmctx)
+{
+	int i;
+	int err = 0;
+	unsigned char findparam_check = 0;
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = {.current_object = ""};
+
+	if (dmctx->in_param[0] == '\0' || rootcmp(dmctx->in_param, root->obj) == 0) {
+		dmctx->inparam_isparam = 0;
+		dmctx->method_obj = get_value_obj;
+		dmctx->method_param = get_value_param;
+		dmctx->checkobj = NULL;
+		dmctx->checkleaf = NULL;
+		dmctx->findparam = 1;
+		dmctx->stop = 0;
+		findparam_check = 1;
+	} else if (dmctx->in_param[strlen(dmctx->in_param) - 1] == dm_delim) {
+		dmctx->inparam_isparam = 0;
+		dmctx->findparam = 0;
+		dmctx->stop = 0;
+		dmctx->checkobj = plugin_obj_match;
+		dmctx->checkleaf = plugin_leaf_match;
+		dmctx->method_obj = get_value_obj;
+		dmctx->method_param = get_value_param;
+		findparam_check = 1;
+	} else {
+		dmctx->inparam_isparam = 1;
+		dmctx->findparam = 0;
+		dmctx->stop = 0;
+		dmctx->checkobj = plugin_obj_match;
+		dmctx->checkleaf = plugin_leaf_match;
+		dmctx->method_obj = mobj_get_value_in_param;
+		dmctx->method_param = mparam_get_value_in_param;
+	}
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (findparam_check && dmctx->findparam)
+		return 0;
+	else
+		return err;
+}
+
+static int get_value_obj(DMOBJECT_ARGS)
+{
+	return 0;
+}
+
+static int get_value_param(DMPARAM_ARGS)
+{
+	char *full_param;
+	char *value = "";
+
+	dmastrcat(&full_param, node->current_object, lastname);
+	(get_cmd)(full_param, dmctx, data, instance, &value);
+	add_list_paramameter(dmctx, full_param, value, DMT_TYPE[type], NULL, 0);
+	return 0;
+}
+
+static int mobj_get_value_in_param(DMOBJECT_ARGS)
+{
+	return 0;
+}
+static int mparam_get_value_in_param(DMPARAM_ARGS)
+{
+	char *full_param;
+	char *value = "";
+
+	dmastrcat(&full_param, node->current_object, lastname);
+	if (strcmp(dmctx->in_param, full_param) != 0) {
+		dmfree(full_param);
+		return FAULT_9005;
+	}
+
+	(get_cmd)(full_param, dmctx, data, instance, &value);
+	add_list_paramameter(dmctx, full_param, value, DMT_TYPE[type], NULL, 0);
+	dmctx->stop = true;
+	return 0;
+}
+
+/* **********
+ * get name 
+ * **********/
+
+int dm_entry_get_name(struct dmctx *ctx)
+{
+	DMOBJ *root = ctx->dm_entryobj;
+	DMNODE node = {.current_object = ""};
+	unsigned char findparam_check = 0;
+	int err;
+	if (ctx->nextlevel == 0	&& (ctx->in_param[0] == '\0' || rootcmp(ctx->in_param, root->obj) == 0)) {
+		ctx->inparam_isparam = 0;
+		ctx->findparam = 1;
+		ctx->stop = 0;
+		ctx->checkobj = NULL;
+		ctx->checkleaf = NULL;
+		ctx->method_obj = mobj_get_name;
+		ctx->method_param = mparam_get_name;
+	} else if (ctx->nextlevel && (ctx->in_param[0] == '\0')) {
+		ctx->inparam_isparam = 0;
+		ctx->findparam = 1;
+		ctx->stop = 0;
+		ctx->checkobj = plugin_obj_nextlevel_match;
+		ctx->checkleaf = plugin_leaf_nextlevel_match;
+		ctx->method_obj = mobj_get_name;
+		ctx->method_param = mparam_get_name;
+		ctx->in_param = root->obj;
+		node.matched = 1;
+		findparam_check = 1;
+	} else if (*(ctx->in_param + strlen(ctx->in_param) - 1) == dm_delim) {
+		ctx->inparam_isparam = 0;
+		ctx->findparam = 0;
+		ctx->stop = 0;
+		ctx->method_obj = mobj_get_name_in_obj;
+		ctx->method_param = mparam_get_name_in_obj;
+		ctx->checkobj = (ctx->nextlevel) ? plugin_obj_nextlevel_match : plugin_obj_match;
+		ctx->checkleaf = (ctx->nextlevel) ? plugin_leaf_nextlevel_match : plugin_leaf_match;
+		findparam_check = 1;
+	} else {
+		ctx->inparam_isparam = 1;
+		ctx->findparam = 0;
+		ctx->stop = 0;
+		ctx->checkobj = plugin_obj_match;
+		ctx->checkleaf = plugin_leaf_match;
+		ctx->method_obj = mobj_get_name_in_param;
+		ctx->method_param = mparam_get_name_in_param;
+	}
+	err = dm_browse(ctx, &node, root, NULL, NULL);
+	if (findparam_check && ctx->findparam)
+		return 0;
+	else
+		return err;
+}
+
+static int mparam_get_name(DMPARAM_ARGS)
+{
+	char *refparam;
+	char *perm = permission->val;
+	dmastrcat(&refparam, node->current_object, lastname);
+	if (permission->get_permission != NULL)
+		perm = permission->get_permission(refparam, dmctx, data, instance);
+
+	add_list_paramameter(dmctx, refparam, perm, NULL, NULL, 0);
+	return 0;
+}
+
+static int mobj_get_name(DMOBJECT_ARGS)
+{
+	char *refparam;
+	char *perm = permission->val;
+	refparam = node->current_object;
+	if (permission->get_permission != NULL)
+		perm = permission->get_permission(refparam, dmctx, data, instance);
+
+	add_list_paramameter(dmctx, refparam, perm, NULL, NULL, 0);
+	return 0;
+}
+
+static int mparam_get_name_in_param(DMPARAM_ARGS)
+{
+	char *refparam;
+	char *perm = permission->val;
+	dmastrcat(&refparam, node->current_object, lastname);
+	if (strcmp(refparam, dmctx->in_param) != 0) {
+		dmfree(refparam);
+		return FAULT_9005;
+	}
+	dmctx->stop = 1;
+	if (dmctx->nextlevel == 1) {
+		dmfree(refparam);
+		return FAULT_9003;
+	}
+	if (permission->get_permission != NULL)
+		perm = permission->get_permission(refparam, dmctx, data, instance);
+
+	add_list_paramameter(dmctx, refparam, perm, NULL, NULL, 0);
+	return 0;
+}
+
+static int mobj_get_name_in_param(DMOBJECT_ARGS)
+{
+	return 0;
+}
+
+static int mparam_get_name_in_obj(DMPARAM_ARGS)
+{
+	char *refparam;
+	char *perm = permission->val;
+
+	if (permission->get_permission != NULL)
+		perm = permission->get_permission(refparam, dmctx, data, instance);
+
+	dmastrcat(&refparam, node->current_object, lastname);
+	add_list_paramameter(dmctx, refparam, perm, NULL, NULL, 0);
+	return 0;
+}
+
+static int mobj_get_name_in_obj(DMOBJECT_ARGS)
+{
+	char *refparam;
+	char *perm = permission->val;
+
+	if (!node->matched) {
+		return FAULT_9005;
+	}
+
+	if (dmctx->nextlevel && strcmp(node->current_object, dmctx->in_param) == 0)
+		return 0;
+
+	if (permission->get_permission != NULL)
+		perm = permission->get_permission(refparam, dmctx, data, instance);
+
+	refparam = node->current_object;
+	add_list_paramameter(dmctx, refparam, perm, NULL, NULL, 0);
+	return 0;
+}
+
+/* ********************
+ * get notification
+ * ********************/
+int dm_entry_get_notification(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = { .current_object = "" };
+	unsigned char findparam_check = 0;
+	int err;
+
+	if (dmctx->in_param[0] == '\0'
+		|| rootcmp(dmctx->in_param, root->obj) == 0) {
+		dmctx->inparam_isparam = 0;
+		dmctx->findparam = 1;
+		dmctx->stop = 0;
+		dmctx->checkobj = NULL;
+		dmctx->checkleaf = NULL;
+		dmctx->method_obj = mobj_get_notification;
+		dmctx->method_param = mparam_get_notification;
+		findparam_check = 1;
+	} else if (*(dmctx->in_param + strlen(dmctx->in_param) - 1) == dm_delim) {
+		dmctx->inparam_isparam = 0;
+		dmctx->findparam = 0;
+		dmctx->stop = 0;
+		dmctx->checkobj = plugin_obj_match;
+		dmctx->checkleaf = plugin_leaf_match;
+		dmctx->method_obj = mobj_get_notification;
+		dmctx->method_param = mparam_get_notification;
+		findparam_check = 1;
+	} else {
+		dmctx->inparam_isparam = 1;
+		dmctx->findparam = 0;
+		dmctx->stop = 0;
+		dmctx->checkobj = plugin_obj_match;
+		dmctx->checkleaf = plugin_leaf_match;
+		dmctx->method_obj = mobj_get_notification_in_param;
+		dmctx->method_param = mparam_get_notification_in_param;
+	}
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (findparam_check && dmctx->findparam)
+		return 0;
+	else
+		return err;
+}
+
+static int mparam_get_notification(DMPARAM_ARGS)
+{
+	char *value;
+	char *refparam;
+
+	dmastrcat(&refparam, node->current_object, lastname);
+
+	if (notification == NULL) {
+		value = get_parameter_notification(dmctx, refparam);
+	} else {
+		value = notification->val;
+		if (notification->get_notif)
+			value = notification->get_notif(refparam, dmctx, data, instance);
+	}
+	add_list_paramameter(dmctx, refparam, value, NULL, NULL, 0);
+	return 0;
+}
+
+static int mobj_get_notification(DMOBJECT_ARGS)
+{
+	return 0;
+}
+
+static int mparam_get_notification_in_param(DMPARAM_ARGS)
+{
+	char *value = NULL;
+	char *refparam;
+
+	dmastrcat(&refparam, node->current_object, lastname);
+	if (strcmp(refparam, dmctx->in_param) != 0) {
+		dmfree(refparam);
+		return FAULT_9005;
+	}
+	if (notification == NULL) {
+		value = get_parameter_notification(dmctx, refparam);
+	} else {
+		value = notification->val;
+		if (notification->get_notif)
+			value = notification->get_notif(refparam, dmctx, data, instance);
+	}
+	add_list_paramameter(dmctx, refparam, value, NULL, NULL, 0);
+	dmctx->stop = 1;
+	return 0;
+}
+
+static int mobj_get_notification_in_param(DMOBJECT_ARGS)
+{
+	return 0;
+}
+
+/***************
+ * inform
+ ***************/
+int dm_entry_inform(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = {.current_object = ""};
+	int err;
+
+	dmctx->inparam_isparam = 0;
+	dmctx->stop = 0;
+	dmctx->checkobj = plugin_obj_forcedinform_match;
+	dmctx->checkleaf = NULL;
+	dmctx->method_obj = &inform_check_obj;
+	dmctx->method_param = &inform_check_param;
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->stop)
+		return err;
+	else
+		return FAULT_9005;
+}
+
+static int inform_check_obj(DMOBJECT_ARGS)
+{
+	return 0;
+}
+
+static int inform_check_param(DMPARAM_ARGS)
+{
+	char *value = "";
+	char *full_param;
+	unsigned char fi;
+
+	if (!forced_inform)
+		return FAULT_9005;
+
+	if (forced_inform->get_forced_inform)
+		fi = forced_inform->get_forced_inform(node->current_object, dmctx, data,
+				instance);
+	else
+		fi = forced_inform->val;
+
+	if (!fi)
+		return FAULT_9005;
+
+	dmastrcat(&full_param, node->current_object, lastname);
+	(get_cmd)(full_param, dmctx, data, instance, &value);
+	add_list_paramameter(dmctx, full_param, value, DMT_TYPE[type], NULL, 0);
+	return 0;
+}
+
+/* **************
+ * add object 
+ * **************/
+int dm_entry_add_object(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = { .current_object = "" };
+	int err;
+
+	if (dmctx->in_param == NULL || dmctx->in_param[0] == '\0'
+			|| (*(dmctx->in_param + strlen(dmctx->in_param) - 1) != dm_delim))
+		return FAULT_9005;
+
+	dmctx->inparam_isparam = 0;
+	dmctx->stop = 0;
+	dmctx->checkobj = plugin_obj_match;
+	dmctx->checkleaf = plugin_leaf_onlyobj_match;
+	dmctx->method_obj = mobj_add_object;
+	dmctx->method_param = mparam_add_object;
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->stop)
+		return err;
+	else
+		return FAULT_9005;
+}
+
+static int mparam_add_object(DMPARAM_ARGS)
+{
+	return FAULT_9005;
+}
+
+static int mobj_add_object(DMOBJECT_ARGS)
+{
+	char *addinst;
+	char newparam[256];
+	char *refparam = node->current_object;
+	char *perm = permission->val;
+	char *objinst;
+
+	if (strcmp(refparam, dmctx->in_param) != 0)
+		return FAULT_9005;
+
+	dmctx->stop = 1;
+	if (node->is_instanceobj)
+		return FAULT_9005;
+	if (permission->get_permission != NULL)
+		perm = permission->get_permission(refparam, dmctx, data, instance);
+
+	if (perm[0] == '0' || addobj == NULL)
+		return FAULT_9005;
+
+	int fault = (addobj)(refparam, dmctx, data, &instance);
+	if (fault)
+		return fault;
+	dmctx->addobj_instance = instance;
+	dmasprintf(&objinst, "%s%s%c", node->current_object, instance, dm_delim);
+	set_parameter_notification(dmctx, objinst, "0");
+	dmfree(objinst);
+	return 0;
+}
+/* **************
+ * del object 
+ * **************/
+int dm_entry_delete_object(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = { .current_object = "" };
+	int err;
+
+	if (dmctx->in_param == NULL || dmctx->in_param[0] == '\0'
+			|| (*(dmctx->in_param + strlen(dmctx->in_param) - 1) != dm_delim))
+		return FAULT_9005;
+
+	dmctx->inparam_isparam = 0;
+	dmctx->stop = 0;
+	dmctx->checkobj = plugin_obj_match;
+	dmctx->checkleaf = plugin_leaf_onlyobj_match;
+	dmctx->method_obj = delete_object_obj;
+	dmctx->method_param = delete_object_param;
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->stop)
+		return err;
+	else
+		return FAULT_9005;
+}
+
+static int delete_object_obj(DMOBJECT_ARGS)
+{
+	char *refparam = node->current_object;
+	char *perm = permission->val;
+	unsigned char del_action = DEL_INST;
+	if (strcmp(refparam, dmctx->in_param) != 0)
+		return FAULT_9005;
+
+	dmctx->stop = 1;
+
+	if (permission->get_permission != NULL)
+		perm = permission->get_permission(refparam, dmctx, data, instance);
+
+	if (perm[0] == '0' || delobj == NULL)
+		return FAULT_9005;
+
+	if (!node->is_instanceobj)
+		del_action = DEL_ALL;
+	int fault = (delobj)(refparam, dmctx, data, instance, del_action);
+	return fault;
+}
+
+static int delete_object_param(DMPARAM_ARGS)
+{
+	return FAULT_9005;
+}
+
+/* **************
+ * set value  
+ * **************/
+int dm_entry_set_value(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = { .current_object = "" };
+	int err;
+
+	if (dmctx->in_param == NULL || dmctx->in_param[0] == '\0'
+			|| (*(dmctx->in_param + strlen(dmctx->in_param) - 1) == dm_delim))
+		return FAULT_9005;
+
+	dmctx->inparam_isparam = 1;
+	dmctx->stop = 0;
+	dmctx->checkobj = plugin_obj_match;
+	dmctx->checkleaf = plugin_leaf_match;
+	dmctx->method_obj = mobj_set_value;
+	dmctx->method_param = mparam_set_value;
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->stop)
+		return err;
+	else
+		return FAULT_9005;
+}
+
+static int mobj_set_value(DMOBJECT_ARGS)
+{
+	return FAULT_9005;
+}
+
+static int mparam_set_value(DMPARAM_ARGS)
+{
+	int err;
+	char *refparam;
+	char *perm;
+	char *v = "";
+
+	dmastrcat(&refparam, node->current_object, lastname);
+	if (strcmp(refparam, dmctx->in_param) != 0) {
+		dmfree(refparam);
+		return FAULT_9005;
+	}
+	dmctx->stop = 1;
+
+	if (dmctx->setaction == VALUECHECK) {
+		perm = permission->val;
+		if (permission->get_permission != NULL)
+			perm = permission->get_permission(refparam, dmctx, data, instance);
+
+		if (perm[0] == '0' || !set_cmd) {
+			dmfree(refparam);
+			return FAULT_9008;
+		}
+		int fault = (set_cmd)(refparam, dmctx, data, instance, dmctx->in_value, VALUECHECK);
+		if (fault) {
+			dmfree(refparam);
+			return fault;
+		}
+		add_set_list_tmp(dmctx, dmctx->in_param, dmctx->in_value, 0);
+	}
+	else if (dmctx->setaction == VALUESET) {
+		(set_cmd)(refparam, dmctx, data, instance, dmctx->in_value, VALUESET);
+		//(get_cmd)(refparam, dmctx, data, instance, &v);
+		dm_update_enabled_notify_byname(refparam, dmctx->in_value);
+	}
+	dmfree(refparam);
+	return 0;
+}
+
+/* ****************
+ * set notification  
+ * ****************/
+int dm_entry_set_notification(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = { .current_object = "" };
+	unsigned char findparam_check = 0;
+	int err;
+
+	if (dmcommon_check_notification_value(dmctx->in_notification) < 0)
+		return FAULT_9003;
+
+	if (dmctx->in_param[0] == '\0' || rootcmp(dmctx->in_param, root->obj) == 0) {
+		return FAULT_9009;
+	} else if (*(dmctx->in_param + strlen(dmctx->in_param) - 1) == dm_delim) {
+		dmctx->inparam_isparam = 0;
+		dmctx->findparam = 0;
+		dmctx->stop = 0;
+		dmctx->checkobj = plugin_obj_match;
+		dmctx->checkleaf = plugin_leaf_match;
+		dmctx->method_obj = mobj_set_notification_in_obj;
+		dmctx->method_param = mparam_set_notification_in_obj;
+	} else {
+		dmctx->inparam_isparam = 1;
+		dmctx->findparam = 0;
+		dmctx->stop = 0;
+		dmctx->checkobj = plugin_obj_match;
+		dmctx->checkleaf = plugin_leaf_match;
+		dmctx->method_obj = mobj_set_notification_in_param;
+		dmctx->method_param = mparam_set_notification_in_param;
+	}
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->stop)
+		return err;
+	else
+		return FAULT_9005;
+}
+
+/* SET Notification*/
+
+static int mparam_set_notification_in_obj(DMPARAM_ARGS)
+{
+	return FAULT_9005;
+}
+
+static int mobj_set_notification_in_obj(DMOBJECT_ARGS)
+{
+	int err;
+	char *refparam;
+	char *perm;
+	char tparam[256];
+
+	refparam = node->current_object;
+	if (strcmp(refparam, dmctx->in_param) != 0) {
+		return FAULT_9005;
+	}
+	dmctx->stop = 1;
+	if (!dmctx->notification_change) {
+		return 0;
+	}
+	if (dmctx->setaction == VALUECHECK) {
+		if (notification)
+			return FAULT_9009;
+
+		add_set_list_tmp(dmctx, dmctx->in_param, dmctx->in_notification, 0);
+	}
+	else if (dmctx->setaction == VALUESET) {
+		set_parameter_notification(dmctx, dmctx->in_param, dmctx->in_notification);
+		cwmp_set_end_session(END_SESSION_RELOAD);
+	}
+	return 0;
+}
+
+static int mparam_set_notification_in_param(DMPARAM_ARGS)
+{
+	int err;
+	char *refparam;
+	char tparam[256];
+
+	dmastrcat(&refparam, node->current_object, lastname);
+	if (strcmp(refparam, dmctx->in_param) != 0) {
+		dmfree(refparam);
+		return FAULT_9005;
+	}
+
+	dmctx->stop = 1;
+	if (!dmctx->notification_change) {
+		return 0;
+	}
+	if (dmctx->setaction == VALUECHECK) {
+		if (notification) {
+			dmfree(refparam);
+			return FAULT_9009;
+		}
+		add_set_list_tmp(dmctx, dmctx->in_param, dmctx->in_notification, 0);
+	} else if (dmctx->setaction == VALUESET) {
+		set_parameter_notification(dmctx, dmctx->in_param, dmctx->in_notification);
+		cwmp_set_end_session(END_SESSION_RELOAD);
+	}
+	dmfree(refparam);
+	return 0;
+}
+
+static int mobj_set_notification_in_param(DMOBJECT_ARGS)
+{
+	return FAULT_9005;
+}
+
+/*********************
+ * load enabled notify
+ ********************/
+int dm_entry_enabled_notify(struct dmctx *dmctx)
+{
+	int err;
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = { .current_object = "" };
+
+	dmctx->method_obj = enabled_notify_check_obj;
+	dmctx->method_param = enabled_notify_check_param;
+	dmctx->checkobj = NULL ;
+	dmctx->checkleaf = NULL;
+	remove(DM_ENABLED_NOTIFY);
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	return err;
+
+}
+
+static int enabled_notify_check_obj(DMOBJECT_ARGS)
+{
+	return FAULT_9005;
+}
+
+static int enabled_notify_check_param(DMPARAM_ARGS)
+{
+	char *refparam, *stype, *notif, *value = "";
+	FILE *fp;
+
+	dmastrcat(&refparam, node->current_object, lastname);
+
+	if (notification == NULL) {
+		notif = get_parameter_notification(dmctx, refparam);
+	} else {
+		notif = notification->val;
+		if (notification->get_notif)
+			notif = notification->get_notif(refparam, dmctx, data, instance);
+	}
+	if (notif[0] == '0') {
+		dmfree(refparam);
+		return 0;
+	}
+	(get_cmd)(refparam, dmctx, data, instance, &value);
+	fp = fopen(DM_ENABLED_NOTIFY, "a");
+	if (fp == NULL) {
+		dmfree(refparam);
+		return 0;
+	}
+	if (notif[0] == '1' || notif[0] == '2' || notif[0] == '4' || notif[0] == '6') {
+		stype = DMT_TYPE[type];
+		dmjson_fprintf(fp, 4, DMJSON_ARGS{{"parameter", refparam}, {"notification", notif}, {"value", value}, {"type", stype}});
+	}
+	fclose(fp);
+
+	if (notif[0] >= '3') {
+		add_list_enabled_lwnotify(dmctx, refparam, notif, value);
+	}
+	dmfree(refparam);
+	return 0;
+}
+
+/*********************
+ * Check enabled notify value change
+ ********************/
+int dm_entry_enabled_notify_check_value_change(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	FILE *fp;
+	char buf[512];
+	char *jval;
+
+	fp = fopen(DM_ENABLED_NOTIFY, "r");
+	if (fp == NULL) {
+		return 0;
+	}
+
+	while (fgets(buf, 512, fp) != NULL) {
+		DMNODE node = {.current_object = ""};
+		int len = strlen(buf);
+		if (len)
+			buf[len-1] = '\0';
+		dmjson_parse_init(buf);
+		dmjson_get_var("parameter", &jval);
+		dmctx->in_param = dmstrdup(jval);
+		dmjson_get_var("value", &jval);
+		dmctx->in_value = dmstrdup(jval);
+		dmjson_get_var("notification", &jval);
+		dmctx->in_notification = dmstrdup(jval);
+		dmjson_parse_fini();
+		dmctx->checkobj = NULL ;
+		dmctx->checkleaf = NULL;
+		dmctx->method_obj = enabled_notify_check_value_change_obj;
+		dmctx->method_param = enabled_notify_check_value_change_param;
+		dm_browse(dmctx, &node, root, NULL, NULL);
+	}
+	fclose(fp);
+	return 0;
+}
+
+static int enabled_notify_check_value_change_obj(DMOBJECT_ARGS)
+{
+	return FAULT_9005;
+}
+
+static int enabled_notify_check_value_change_param(DMPARAM_ARGS)
+{
+	char *refparam, *value = "";
+
+	dmastrcat(&refparam, node->current_object, lastname);
+	if (strcmp(refparam, dmctx->in_param) != 0) {
+		dmfree(refparam);
+		return FAULT_9005;
+	}
+	(get_cmd)(refparam, dmctx, data, instance, &value);
+	if (strcmp(value, dmctx->in_value) != 0) {
+		add_list_value_change(refparam, value, DMT_TYPE[type]);
+		if(dmctx->in_notification[0] =='2')
+			send_active_value_change();
+	}
+	dmfree(refparam);
+	return 0;
+}
+
+/******************
+ * get linker param
+ *****************/
+int dm_entry_get_linker(struct dmctx *dmctx)
+{
+	int err;
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = { .current_object = "" };
+
+	dmctx->method_obj = get_linker_check_obj;
+	dmctx->method_param = get_linker_check_param;
+	dmctx->checkobj = plugin_obj_match;
+	dmctx->checkleaf = plugin_leaf_onlyobj_match;
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->stop)
+		return err;
+	else
+		return FAULT_9005;
+}
+
+static int get_linker_check_obj(DMOBJECT_ARGS)
+{
+	char *link_val = "";
+
+	if (!get_linker) {
+		return  FAULT_9005;
+	}
+	if (node->obj->browseinstobj && !node->is_instanceobj) {
+		return  FAULT_9005;
+	}
+	get_linker(node->current_object, dmctx, data, instance, &link_val);
+	if (dmctx->linker[0] == '\0') {
+		return  FAULT_9005;
+	}
+	if (link_val && link_val[0] != '\0' && strcmp(link_val, dmctx->linker) == 0) {
+		dmctx->linker_param = dmstrdup(node->current_object);
+		dmctx->stop = true;
+		return 0;
+	}
+	return FAULT_9005;
+}
+
+static int get_linker_check_param(DMPARAM_ARGS)
+{
+	return FAULT_9005;
+}
+
+/******************
+ * get linker value
+ *****************/
+int dm_entry_get_linker_value(struct dmctx *dmctx)
+{
+	int err ;
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = { .current_object = "" };
+
+	dmctx->method_obj = get_linker_value_check_obj;
+	dmctx->method_param = get_linker_value_check_param;
+	dmctx->checkobj = plugin_obj_match;
+	dmctx->checkleaf = plugin_leaf_match;
+	dmentry_instance_lookup_inparam(dmctx);
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->stop)
+		return err;
+	else
+		return FAULT_9005;
+}
+
+static int get_linker_value_check_obj(DMOBJECT_ARGS)
+{
+	char *link_val;
+	if (!get_linker)
+		return FAULT_9005;
+
+	if (strcmp(node->current_object, dmctx->in_param) == 0) {
+		get_linker(node->current_object, dmctx, data, instance, &link_val);
+		dmctx->linker = dmstrdup(link_val);
+		dmctx->stop = true;
+		return 0;
+	}
+	return FAULT_9005;
+}
+
+static int get_linker_value_check_param(DMPARAM_ARGS)
+{
+	return FAULT_9005;
+}
+
+#ifdef BBF_TR064
+/* ******************
+ * UPNP entries
+ * ******************/
+
+int upnp_map_cwmp_fault(int cwmp_fault)
+{
+	switch (cwmp_fault) {
+	case FAULT_9005:
+		return FAULT_UPNP_703;
+	case FAULT_9003:
+		return FAULT_UPNP_701;
+	case FAULT_9007:
+		return FAULT_UPNP_705;
+	case FAULT_9008:
+		return FAULT_UPNP_706;
+	}
+	if (cwmp_fault > __FAULT_UPNP_MAX)
+		return FAULT_UPNP_701;
+	return cwmp_fault;
+}
+
+int plugin_upnp_structured_obj_match(DMOBJECT_ARGS)
+{
+	if (node->matched)
+		return 0;
+	if (!dmctx->inparam_isparam && strstructered(node->current_object, dmctx->in_param) == STRUCTERED_SAME) {
+		node->matched++;
+		dmctx->findparam = 1;
+		return 0;
+	}
+	if (strstructered(dmctx->in_param, node->current_object) == STRUCTERED_PART) {
+		return 0;
+	}
+	return FAULT_UPNP_703;
+}
+
+int plugin_upnp_leaf_match(DMOBJECT_ARGS)
+{
+	char *str;
+	if (node->matched)
+		return 0;
+	if (!dmctx->inparam_isparam)
+		return FAULT_UPNP_703;
+	str = dmctx->in_param + strlen(node->current_object);
+	if (!strchr(str, dm_delim))
+		return 0;
+	return FAULT_UPNP_703;
+}
+
+static int plugin_upnp_obj_depth_match(DMOBJECT_ARGS)
+{
+	if (node->matched) {
+		node->matched++;
+	}
+	else if (strcmp(node->current_object, dmctx->in_param) == 0) {
+		node->matched++;
+		dmctx->findparam = 1;
+	}
+	else if (strstr(dmctx->in_param, node->current_object) == dmctx->in_param) {
+		return 0;
+	}
+	if (dmctx->depth == 0 || dmctx->depth >= (node->matched - 1))
+		return 0;
+	return FAULT_UPNP_703;
+}
+
+int plugin_upnp_leaf_depth_match(DMOBJECT_ARGS)
+{
+	char *str;
+	if (!node->matched) {
+		if (!dmctx->inparam_isparam) {
+			return FAULT_UPNP_703;
+		}
+		else {
+			str = dmctx->in_param + strlen(node->current_object);
+			if (strchr(str, dm_delim))
+				return FAULT_UPNP_703;
+		}
+	}
+	if (dmctx->depth == 0)
+		return 0;
+	if (dmctx->depth >= node->matched)
+		return 0;
+	return FAULT_UPNP_703;
+}
+
+static int plugin_upnp_skip_leafs(DMOBJECT_ARGS)
+{
+	return FAULT_UPNP_703;
+}
+
+static int upnp_get_parameter_onchange(struct dmctx *ctx, char *param, char *onchange)
+{
+	struct uci_list *list_onchange;
+	char *pch;
+	struct uci_element *e;
+	dmuci_get_option_value_list(UPNP_CFG, "@notifications[0]", onchange, &list_onchange);
+	if (list_onchange) {
+		uci_foreach_element(list_onchange, e) {
+			pch = e->name;
+			if (strcmp(pch, param) == 0) {
+				return 1;
+			}
+		}
+	}
+	return 0;
+}
+
+static int upnp_set_parameter_onchange(struct dmctx *ctx, char *param, char *onchange, unsigned int value)
+{
+	char *tmp;
+	struct uci_section *s;
+
+	dmuci_get_section_type(UPNP_CFG, "@notifications[0]", &tmp);
+	if (!tmp || tmp[0] == '\0') {
+		dmuci_add_section(UPNP_CFG, "notifications", &s, &tmp);
+	}
+
+	dmuci_del_list_value(UPNP_CFG, "@notifications[0]",onchange, param);
+	if (value) {
+		dmuci_add_list_value(UPNP_CFG, "@notifications[0]", onchange, param);
+	}
+	return 0;
+}
+
+void add_list_upnp_param_track(struct dmctx *dmctx, struct list_head *pchead, char *param, char *key, char *value, unsigned int isobj)
+{
+	struct dm_upnp_enabled_track *dm_upnp_enabled_track;
+
+	dm_upnp_enabled_track = calloc(1, sizeof(struct dm_upnp_enabled_track)); // Should be calloc and not dmcalloc
+	list_add_tail(&dm_upnp_enabled_track->list, pchead);
+	dm_upnp_enabled_track->name = strdup(param); // Should be strdup and not dmstrdup
+	dm_upnp_enabled_track->value = value ? strdup(value) : strdup(""); // Should be strdup and not dmstrdup
+	dm_upnp_enabled_track->key = key ? strdup(key) : NULL; // Should be strdup and not dmstrdup
+	dm_upnp_enabled_track->isobj = isobj;
+}
+
+void del_list_upnp_param_track(struct dm_upnp_enabled_track *dm_upnp_enabled_track)
+{
+	list_del(&dm_upnp_enabled_track->list); // Should be free and not dmfree
+	free(dm_upnp_enabled_track->name);
+	free(dm_upnp_enabled_track->value);
+	free(dm_upnp_enabled_track->key);
+	free(dm_upnp_enabled_track);
+}
+
+void free_all_list_upnp_param_track(struct list_head *pchead)
+{
+	struct dm_upnp_enabled_track *dm_upnp_enabled_track;
+	while (pchead->next != pchead) {
+		dm_upnp_enabled_track = list_entry(pchead->next, struct dm_upnp_enabled_track, list);
+		del_list_upnp_param_track(dm_upnp_enabled_track);
+	}
+}
+
+int get_parameter_version(struct dmctx *ctx, char *param, char **version, struct uci_section **rs)
+{
+	int found = 0;
+	struct uci_list *list_struc;
+	struct uci_section *s = NULL;
+	char *pch;
+	unsigned int acl = 0, f;
+	struct uci_element *e;
+
+	*version = NULL;
+	*rs = NULL;
+
+	uci_foreach_option_eq(UPNP_CFG, "parameter_version", "parameter", param, s) {
+		break;
+	}
+	if (s != NULL) {
+		*rs = s;
+		dmuci_get_value_by_section_string(s, "version", version);
+		if (**version == '\0')
+			*version = "0";
+		return 1;
+	}
+	else {
+		dmuci_get_option_value_list(UPNP_CFG, "@parameter_version_structured[0]", "paramater", &list_struc);
+		if (list_struc) {
+			uci_foreach_element(list_struc, e) {
+				pch = e->name;
+				if (strstructered(pch, param) == STRUCTERED_SAME) {
+					*version = "0";
+					return 1;
+				}
+			}
+		}
+	}
+	return 0;
+}
+
+unsigned int get_parameter_acl(struct dmctx *ctx, char *param)
+{
+	int i, maxlen = 0, len;
+	struct uci_list *list_acl;
+	char *pch;
+	unsigned int acl = 0, f;
+	struct uci_element *e;
+
+	for (i = (ARRAY_SIZE(dm_acl) - 1); i >= 0; i--) {
+		dmuci_get_option_value_list(UPNP_CFG, "@acl_factorized[0]", dm_acl[i].user_access, &list_acl);
+		if (list_acl) {
+			f = 0;
+			maxlen = 0;
+			uci_foreach_element(list_acl, e) {
+				pch = e->name;
+				if (strstructered(pch, param) == STRUCTERED_SAME) {
+					f = dm_acl[i].flag;
+					break;
+				}
+				len = strlen(pch);
+				if (pch[len-1] == dm_delim) {
+					if (strstructered(param, pch) == STRUCTERED_PART) {
+						if (len > maxlen )
+						{
+							f = dm_acl[i].flag;
+							maxlen = len;
+						}
+					}
+				}
+			}
+			acl |= f;
+		}
+	}
+	return acl;
+}
+
+unsigned int dm_upnp_check_acl_list(struct dmctx *dmctx, char *param)
+{
+	unsigned int flag;
+	unsigned int mask = DM_LIST_MASK | DM_READ_MASK | DM_WRITE_MASK;
+	flag = get_parameter_acl(dmctx, param);
+	if (flag & mask & dmctx->user_mask)
+		return flag;
+	return 0;
+}
+
+unsigned int dm_upnp_check_acl_read(struct dmctx *dmctx, char *param)
+{
+	unsigned int flag;
+	unsigned int mask = DM_READ_MASK | DM_WRITE_MASK;
+	flag = get_parameter_acl(dmctx, param);
+	if (flag & mask & dmctx->user_mask)
+		return flag;
+	return 0;
+}
+
+unsigned int dm_upnp_check_acl_write(struct dmctx *dmctx, char *param)
+{
+	unsigned int flag;
+	unsigned int mask = DM_WRITE_MASK;
+	flag = get_parameter_acl(dmctx, param);
+	if (flag & mask & dmctx->user_mask)
+		return flag;
+	return 0;
+}
+
+int dm_entry_upnp_update_attribute_values_update(struct dmctx *dmctx)
+{
+	char *v, *tmp, buf[32];
+	struct uci_section *s;
+	int version;
+	time_t time_value;
+
+	dmuci_get_option_value_string(UPNP_CFG, "@dm[0]", "attribute_values_version", &v);
+	version = atoi(v);
+	version++;
+
+	dmuci_get_section_type(UPNP_CFG, "@dm[0]", &tmp);
+	if (!tmp || tmp[0] == '\0') {
+		dmuci_add_section(UPNP_CFG, "dm", &s, &tmp);
+	}
+	sprintf(buf, "%d", version);
+	dmuci_set_value(UPNP_CFG, "@dm[0]", "attribute_values_version", buf);
+	sprintf(buf, "%ld", time(NULL));
+	dmuci_set_value(UPNP_CFG, "@dm[0]", "attribute_values_epochtime", buf);
+
+	return 0;
+}
+
+/* ******************
+ * UPNP get instances
+ * ******************/
+
+int dm_entry_upnp_get_instances(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = {.current_object = ""};
+	int err;
+	char buf[4] = {0};
+	buf[0] = dm_delim;
+
+	if (*(dmctx->in_param) == '\0')
+		dmctx->in_param = buf;
+
+	if (*(dmctx->in_param + strlen(dmctx->in_param) - 1) != dm_delim)
+		return FAULT_UPNP_701;
+
+	dmctx->inparam_isparam = 0;
+	dmctx->findparam = 0;
+	dmctx->stop = 0;
+	dmctx->checkobj = plugin_upnp_obj_depth_match;
+	dmctx->checkleaf = plugin_upnp_skip_leafs;
+	dmctx->method_obj = mobj_upnp_get_instances;
+	dmctx->method_param = mparam_upnp_get_instances;
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->findparam)
+		return 0;
+	else
+		return (upnp_map_cwmp_fault(err));
+}
+
+static int mparam_upnp_get_instances(DMPARAM_ARGS)
+{
+	return 0;
+}
+
+static int mobj_upnp_get_instances(DMOBJECT_ARGS)
+{
+	char *refparam;
+	refparam = node->current_object;
+	if (!node->is_instanceobj || !node->matched)
+		return FAULT_UPNP_703;
+	if (!dm_upnp_check_acl_read(dmctx, refparam)) {
+		dmctx->findparam = 0;
+		dmctx->stop = 1;
+		return FAULT_UPNP_703;
+	}
+	add_list_paramameter(dmctx, refparam, NULL, NULL, NULL, 0);
+	return 0;
+}
+
+/* *****************************
+ * UPNP get supported parameters
+ * *****************************/
+
+int dm_entry_upnp_get_supported_parameters(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = {.current_object = ""};
+	int err;
+
+	char buf[4] = {0};
+	buf[0] = dm_delim;
+
+	if (*(dmctx->in_param) == '\0')
+		dmctx->in_param = buf;
+
+	if (*(dmctx->in_param + strlen(dmctx->in_param) - 1) != dm_delim)
+		dmctx->inparam_isparam = 1;
+	else
+		dmctx->inparam_isparam = 0;
+	dmctx->instance_wildchar = "#";
+	dmctx->findparam = 0;
+	dmctx->stop = 0;
+	dmctx->checkobj = plugin_upnp_obj_depth_match;
+	dmctx->checkleaf = plugin_upnp_leaf_depth_match;
+	dmctx->method_obj = mobj_upnp_get_supportedparams;
+	dmctx->method_param = mparam_upnp_get_supportedparams;
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->findparam)
+		return 0;
+	else
+		return (upnp_map_cwmp_fault(err));
+}
+
+static int mparam_upnp_get_supportedparams(DMPARAM_ARGS)
+{
+	char *refparam;
+	dmastrcat(&refparam, node->current_object, lastname);
+	if (dmctx->inparam_isparam) {
+		if (strcmp(refparam, dmctx->in_param) == 0) {
+			if (!dm_upnp_check_acl_list(dmctx, refparam)) {
+				dmctx->findparam = 0;
+				dmctx->stop = 1;
+				return FAULT_UPNP_703;
+			}
+			dmctx->findparam = 1;
+			add_list_paramameter(dmctx, refparam, NULL, NULL, NULL, 0);
+			return 0;
+		}
+	}
+	else {
+		if (!dm_upnp_check_acl_list(dmctx, refparam)) {
+			dmctx->findparam = 0;
+			dmctx->stop = 1;
+			return FAULT_UPNP_703;
+		}
+		add_list_paramameter(dmctx, refparam, NULL, NULL, NULL, 0);
+		return 0;
+	}
+	return FAULT_UPNP_703;
+}
+
+static int mobj_upnp_get_supportedparams(DMOBJECT_ARGS)
+{
+	char *refparam;
+	if (node->matched <= 1)
+		return FAULT_UPNP_703;
+	if (dmctx->depth == (node->matched - 1)) {
+		if (node->obj->browseinstobj && !node->is_instanceobj)
+			dmastrcat(&refparam, node->current_object, "#/");
+		else
+			refparam = node->current_object;
+		if (!dm_upnp_check_acl_list(dmctx, refparam)) {
+			dmctx->findparam = 0;
+			dmctx->stop = 1;
+			return FAULT_UPNP_703;
+		}
+		add_list_paramameter(dmctx, refparam, NULL, NULL, NULL, 0);
+		return 0;
+	}
+	return FAULT_UPNP_703;
+}
+
+/* ************************
+ * UPNP get selected values
+ * ************************/
+
+int dm_entry_upnp_get_selected_values(struct dmctx *dmctx)
+{
+	int i;
+	int err = 0;
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = {.current_object = ""};
+
+	if (dmctx->in_param[0] == '\0' || rootcmp(dmctx->in_param, root->obj) == 0) {
+		dmctx->inparam_isparam = 0;
+		dmctx->method_obj = get_value_obj;
+		dmctx->method_param = get_value_param;
+		dmctx->checkobj = NULL;
+		dmctx->checkleaf = NULL;
+		dmctx->findparam = 1;
+		dmctx->stop = 0;
+	} else if (dmctx->in_param[strlen(dmctx->in_param) - 1] == dm_delim) {
+		dmctx->inparam_isparam = 0;
+		dmctx->findparam = 0;
+		dmctx->stop = 0;
+		dmctx->checkobj = plugin_upnp_structured_obj_match;
+		dmctx->checkleaf = plugin_upnp_leaf_match;
+		dmctx->method_obj = get_value_obj;
+		dmctx->method_param = get_value_param;
+	} else {
+		dmctx->inparam_isparam = 1;
+		dmctx->findparam = 0;
+		dmctx->stop = 0;
+		dmctx->checkobj = plugin_upnp_structured_obj_match;
+		dmctx->checkleaf = plugin_upnp_leaf_match;
+		dmctx->method_obj = mobj_get_value_in_param;
+		dmctx->method_param = mparam_upnp_structured_get_value_in_param;
+	}
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->findparam)
+		return 0;
+	else
+		return (upnp_map_cwmp_fault(err));
+}
+
+static int mparam_upnp_structured_get_value_in_param(DMPARAM_ARGS)
+{
+	char *full_param;
+	char *value = "";
+
+	dmastrcat(&full_param, node->current_object, lastname);
+	if (strstructered(dmctx->in_param, full_param) == STRUCTERED_NULL) {
+		dmfree(full_param);
+		return FAULT_UPNP_703;
+	}
+	if (!dm_upnp_check_acl_read(dmctx, full_param)) {
+		dmctx->findparam = 0;
+		dmctx->stop = 1;
+		return FAULT_UPNP_703;
+	}
+	dmctx->findparam = 1;
+	(get_cmd)(full_param, dmctx, data, instance, &value);
+	add_list_paramameter(dmctx, full_param, value, DMT_TYPE[type], NULL, 0);
+	return 0;
+}
+
+/* ***************
+ * UPNP get values
+ * ***************/
+
+int dm_entry_upnp_get_values(struct dmctx *dmctx)
+{
+	int i;
+	int err = 0;
+	unsigned char findparam_check = 0;
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = {.current_object = ""};
+
+	if (dmctx->in_param[0] == '\0' || rootcmp(dmctx->in_param, root->obj) == 0) {
+		dmctx->inparam_isparam = 0;
+		dmctx->method_obj = upnp_get_value_obj;
+		dmctx->method_param = upnp_get_value_param;
+		dmctx->checkobj = NULL;
+		dmctx->checkleaf = NULL;
+		dmctx->findparam = 1;
+		dmctx->stop = 0;
+		findparam_check = 1;
+	} else if (dmctx->in_param[strlen(dmctx->in_param) - 1] == dm_delim) {
+		dmctx->inparam_isparam = 0;
+		dmctx->findparam = 0;
+		dmctx->stop = 0;
+		dmctx->checkobj = plugin_obj_match;
+		dmctx->checkleaf = plugin_leaf_match;
+		dmctx->method_obj = upnp_get_value_obj;
+		dmctx->method_param = upnp_get_value_param;
+		findparam_check = 1;
+	} else {
+		dmctx->inparam_isparam = 1;
+		dmctx->findparam = 0;
+		dmctx->stop = 0;
+		dmctx->checkobj = plugin_obj_match;
+		dmctx->checkleaf = plugin_leaf_match;
+		dmctx->method_obj = mobj_upnp_get_value_in_param;
+		dmctx->method_param = mparam_upnp_get_value_in_param;
+	}
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (findparam_check && dmctx->findparam)
+		return 0;
+	else
+	return (upnp_map_cwmp_fault(err));
+}
+
+static int upnp_get_value_obj(DMOBJECT_ARGS)
+{
+	return 0;
+}
+
+static int upnp_get_value_param(DMPARAM_ARGS)
+{
+	char *full_param;
+	char *value = "";
+
+	dmastrcat(&full_param, node->current_object, lastname);
+	if (!dm_upnp_check_acl_read(dmctx, full_param)) {
+		dmctx->findparam = 0;
+		dmctx->stop = 1;
+		return FAULT_UPNP_703;
+	}
+	(get_cmd)(full_param, dmctx, data, instance, &value);
+	add_list_paramameter(dmctx, full_param, value, NULL, NULL, 0);
+	return 0;
+}
+
+static int mobj_upnp_get_value_in_param(DMOBJECT_ARGS)
+{
+	return 0;
+}
+static int mparam_upnp_get_value_in_param(DMPARAM_ARGS)
+{
+	char *full_param;
+	char *value = "";
+
+	dmastrcat(&full_param, node->current_object, lastname);
+	if (strcmp(dmctx->in_param, full_param) != 0) {
+		dmfree(full_param);
+		return FAULT_UPNP_703;
+	}
+
+	if (!dm_upnp_check_acl_read(dmctx, full_param)) {
+		dmctx->findparam = 0;
+		dmctx->stop = 1;
+		return FAULT_UPNP_703;
+	}
+	(get_cmd)(full_param, dmctx, data, instance, &value);
+	add_list_paramameter(dmctx, full_param, value, NULL, NULL, 0);
+	dmctx->stop = 1;
+	return 0;
+}
+
+/* ***************
+ * UPNP set values
+ * ***************/
+
+int dm_entry_upnp_set_values(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = { .current_object = "" };
+	int err;
+
+	if (dmctx->in_param == NULL || dmctx->in_param[0] == '\0'
+			|| (*(dmctx->in_param + strlen(dmctx->in_param) - 1) == dm_delim))
+		return FAULT_UPNP_703;
+
+	dmctx->inparam_isparam = 1;
+	dmctx->stop = 0;
+	dmctx->checkobj = plugin_obj_match;
+	dmctx->checkleaf = plugin_leaf_match;
+	dmctx->method_obj = mobj_upnp_set_value;
+	dmctx->method_param = mparam_upnp_set_value;
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->stop)
+	return (upnp_map_cwmp_fault(err));
+	else
+		return FAULT_UPNP_703;
+}
+
+static int mobj_upnp_set_value(DMOBJECT_ARGS)
+{
+	return FAULT_UPNP_703;
+}
+
+static int mparam_upnp_set_value(DMPARAM_ARGS)
+{
+	int err;
+	char *refparam;
+	char *perm;
+	char *v = "";
+
+	dmastrcat(&refparam, node->current_object, lastname);
+	if (strcmp(refparam, dmctx->in_param) != 0) {
+		dmfree(refparam);
+		return FAULT_UPNP_703;
+	}
+	dmctx->stop = 1;
+
+	if (dmctx->setaction == VALUECHECK) {
+		perm = permission->val;
+		if (permission->get_permission != NULL)
+			perm = permission->get_permission(refparam, dmctx, data, instance);
+
+		if (perm[0] == '0' || !set_cmd) {
+			dmfree(refparam);
+			return FAULT_UPNP_706;
+		}
+		if (!dm_upnp_check_acl_write(dmctx, refparam)) {
+			dmctx->findparam = 0;
+			return FAULT_UPNP_706;
+		}
+		int fault = (set_cmd)(refparam, dmctx, data, instance, dmctx->in_value, VALUECHECK);
+		if (fault) {
+			dmfree(refparam);
+			return fault;
+		}
+		add_set_list_tmp(dmctx, dmctx->in_param, dmctx->in_value, 0);
+	}
+	else if (dmctx->setaction == VALUESET) {
+		(set_cmd)(refparam, dmctx, data, instance, dmctx->in_value, VALUESET);
+		(get_cmd)(refparam, dmctx, data, instance, &v);
+		dm_update_enabled_notify_byname(refparam, v);
+	}
+	dmfree(refparam);
+	return 0;
+}
+
+/* ********************
+ * UPNP delete instance
+ * *******************/
+
+int dm_entry_upnp_delete_instance(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = { .current_object = "" };
+	int err;
+
+	if (dmctx->in_param == NULL || dmctx->in_param[0] == '\0'
+			|| (*(dmctx->in_param + strlen(dmctx->in_param) - 1) != dm_delim))
+		return FAULT_UPNP_703;
+
+	dmctx->inparam_isparam = 0;
+	dmctx->stop = 0;
+	dmctx->checkobj = plugin_obj_match;
+	dmctx->checkleaf = plugin_leaf_onlyobj_match;
+	dmctx->method_obj = upnp_delete_instance_obj;
+	dmctx->method_param = upnp_delete_instance_param;
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->stop)
+	return (upnp_map_cwmp_fault(err));
+	else
+		return FAULT_UPNP_703;
+}
+
+static int upnp_delete_instance_obj(DMOBJECT_ARGS)
+{
+	char *refparam = node->current_object;
+	char *perm = permission->val;
+	unsigned char del_action = DEL_INST;
+	if (strcmp(refparam, dmctx->in_param) != 0)
+		return FAULT_UPNP_703;
+
+	dmctx->stop = 1;
+
+	if (permission->get_permission != NULL)
+		perm = permission->get_permission(refparam, dmctx, data, instance);
+
+	if (perm[0] == '0' || delobj == NULL)
+		return FAULT_UPNP_706;
+
+	if (!dm_upnp_check_acl_write(dmctx, refparam)) {
+		dmctx->findparam = 0;
+		return FAULT_UPNP_706;
+	}
+
+	if (!node->is_instanceobj)
+		del_action = DEL_ALL;
+	int fault = (delobj)(refparam, dmctx, data, instance, del_action);
+	return fault;
+}
+
+static int upnp_delete_instance_param(DMPARAM_ARGS)
+{
+	return FAULT_UPNP_703;
+}
+
+/* ********************
+ * UPNP add instance
+ * *******************/
+
+int dm_entry_upnp_add_instance(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = { .current_object = "" };
+	int err;
+
+	if (dmctx->in_param == NULL || dmctx->in_param[0] == '\0'
+			|| (*(dmctx->in_param + strlen(dmctx->in_param) - 1) != dm_delim))
+		return FAULT_UPNP_703;
+
+	dmctx->inparam_isparam = 0;
+	dmctx->stop = 0;
+	dmctx->checkobj = plugin_obj_match;
+	dmctx->checkleaf = plugin_leaf_onlyobj_match;
+	dmctx->method_obj = mobj_upnp_add_instance;
+	dmctx->method_param = mparam_upnp_add_instance;
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->stop)
+	return (upnp_map_cwmp_fault(err));
+	else
+		return FAULT_UPNP_703;
+}
+
+static int mparam_upnp_add_instance(DMPARAM_ARGS)
+{
+	return FAULT_UPNP_703;
+}
+
+static int mobj_upnp_add_instance(DMOBJECT_ARGS)
+{
+	char *addinst;
+	char newparam[256];
+	char *refparam = node->current_object;
+	char *perm = permission->val;
+	char *objinst;
+
+	if (strcmp(refparam, dmctx->in_param) != 0)
+		return FAULT_UPNP_703;
+
+	dmctx->stop = 1;
+	if (node->is_instanceobj)
+		return FAULT_UPNP_703;
+	if (permission->get_permission != NULL)
+		perm = permission->get_permission(refparam, dmctx, data, instance);
+
+	if (perm[0] == '0' || addobj == NULL)
+		return FAULT_UPNP_706;
+
+	if (!dm_upnp_check_acl_write(dmctx, refparam)) {
+		dmctx->findparam = 0;
+		return FAULT_UPNP_706;
+	}
+
+	int fault = (addobj)(refparam, dmctx, data, &instance);
+	if (fault)
+		return fault;
+	dmctx->addobj_instance = instance;
+	dmasprintf(&objinst, "%s%s%c", node->current_object, instance, dm_delim);
+	set_parameter_notification(dmctx, objinst, "0");
+	dmfree(objinst);
+	return 0;
+}
+
+/* ********************
+ * UPNP get attributes
+ * ********************/
+int dm_entry_upnp_get_attributes(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = { .current_object = "" };
+	unsigned char findparam_check = 0;
+	int err;
+	char buf[4] = {0};
+	buf[0] = dm_delim;
+
+	if (*(dmctx->in_param) == '\0')
+		dmctx->in_param = buf;
+
+	if (*(dmctx->in_param + strlen(dmctx->in_param) - 1) != dm_delim)
+		dmctx->inparam_isparam = 1;
+	else
+		dmctx->inparam_isparam = 0;
+
+	dmctx->findparam = 0;
+	dmctx->stop = 0;
+	dmctx->checkobj = plugin_obj_match;
+	dmctx->checkleaf = plugin_leaf_match;
+	dmctx->method_obj = mobj_upnp_get_attributes;
+	dmctx->method_param = mparam_upnp_get_attributes;
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->findparam)
+		return 0;
+	else
+		return (upnp_map_cwmp_fault(err));
+}
+
+static int mparam_upnp_get_attributes(DMPARAM_ARGS)
+{
+	char *refparam;
+	unsigned int flags = 0;
+	char *perm = permission->val;
+	char *version = NULL;
+	struct uci_section *s = NULL;
+
+	dmastrcat(&refparam, node->current_object, lastname);
+
+	if (strcmp(refparam, dmctx->in_param) != 0)
+			return FAULT_UPNP_703;
+
+	if (!dm_upnp_check_acl_read(dmctx, refparam)) {
+		dmctx->findparam = 0;
+		dmctx->stop = 1;
+		return FAULT_UPNP_703;
+	}
+
+	dmctx->stop = 1;
+
+	if (permission->get_permission != NULL)
+		perm = permission->get_permission(refparam, dmctx, data, instance);
+
+	perm = (*perm == '1') ? "readWrite" : "readOnly";
+
+	if (upnp_get_parameter_onchange(dmctx, refparam, "alarmchange"))
+		flags |= DM_PARAM_ALARAM_ON_CHANGE;
+	if (upnp_get_parameter_onchange(dmctx, refparam, "eventchange"))
+		flags |= DM_PARAM_EVENT_ON_CHANGE;
+	get_parameter_version(dmctx, refparam, &version, &s);
+	flags |= UPNP_DMT_TYPE[type];
+
+	add_list_paramameter(dmctx, refparam, perm, NULL, version, flags);
+	return 0;
+}
+
+static int mobj_upnp_get_attributes(DMOBJECT_ARGS)
+{
+	char *refparam;
+	unsigned int flags = 0;
+	char *perm = permission->val;
+	char *version = NULL;
+	char *type;
+	struct uci_section *s = NULL;
+
+	refparam = node->current_object;
+
+	if (strcmp(refparam, dmctx->in_param) != 0)
+			return FAULT_UPNP_703;
+
+	if (!dm_upnp_check_acl_read(dmctx, refparam)) {
+		dmctx->findparam = 0;
+		dmctx->stop = 1;
+		return FAULT_UPNP_703;
+	}
+
+	dmctx->stop = 1;
+
+	if (permission->get_permission != NULL)
+		perm = permission->get_permission(refparam, dmctx, data, instance);
+
+	perm = (*perm == '1') ? "readWrite" : "readOnly";
+
+	if (!node->is_instanceobj && upnp_get_parameter_onchange(dmctx, refparam, "eventchange"))
+		flags |= DM_PARAM_EVENT_ON_CHANGE;
+
+	get_parameter_version(dmctx, refparam, &version, &s);
+
+	if (node->is_instanceobj)
+		flags |= (NODE_DATA_ATTRIBUTE_INSTANCE | NODE_DATA_ATTRIBUTE_TYPEPTR);
+	else if (node->obj->browseinstobj)
+		flags |= (NODE_DATA_ATTRIBUTE_MULTIINSTANCE | NODE_DATA_ATTRIBUTE_TYPEPTR);
+
+	add_list_paramameter(dmctx, refparam, perm, NULL, version, flags);
+
+	return 0;
+}
+
+/* ********************
+ * UPNP set attributes
+ * ********************/
+int dm_entry_upnp_set_attributes(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = { .current_object = "" };
+	unsigned char findparam_check = 0;
+	int err;
+	char buf[4] = {0};
+	buf[0] = dm_delim;
+
+	if (*(dmctx->in_param) == '\0')
+		dmctx->in_param = buf;
+
+	if (*(dmctx->in_param + strlen(dmctx->in_param) - 1) != dm_delim)
+		dmctx->inparam_isparam = 1;
+	else
+		dmctx->inparam_isparam = 0;
+
+	dmctx->findparam = 0;
+	dmctx->stop = 0;
+	dmctx->checkobj = plugin_obj_match;
+	dmctx->checkleaf = plugin_leaf_match;
+	dmctx->method_obj = mobj_upnp_set_attributes;
+	dmctx->method_param = mparam_upnp_set_attributes;
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->findparam)
+		return 0;
+	else
+		return (upnp_map_cwmp_fault(err));
+}
+
+static int mparam_upnp_set_attributes(DMPARAM_ARGS)
+{
+	char *refparam;
+	unsigned int flags = 0;
+	char *perm = permission->val;
+
+	dmastrcat(&refparam, node->current_object, lastname);
+
+	if (strcmp(refparam, dmctx->in_param) != 0)
+			return FAULT_UPNP_703;
+
+	dmctx->stop = 1;
+	if (dmctx->setaction == VALUECHECK) {
+		if (!dm_upnp_check_acl_write(dmctx, refparam)) {
+			dmctx->findparam = 0;
+			return FAULT_UPNP_706;
+		}
+		add_set_list_tmp(dmctx, dmctx->in_param, NULL, dmctx->dmparam_flags);
+	}
+	else {
+		upnp_set_parameter_onchange(dmctx, refparam, "alarmchange", dmctx->dmparam_flags & DM_PARAM_ALARAM_ON_CHANGE);
+		upnp_set_parameter_onchange(dmctx, refparam, "eventchange", dmctx->dmparam_flags & DM_PARAM_EVENT_ON_CHANGE);
+		dm_entry_upnp_update_attribute_values_update(dmctx);
+	}
+	return 0;
+}
+
+static int mobj_upnp_set_attributes(DMOBJECT_ARGS)
+{
+	char *refparam;
+	unsigned int flags = 0;
+	char *perm = permission->val;
+
+	refparam = node->current_object;
+
+	if (strcmp(refparam, dmctx->in_param) != 0)
+			return FAULT_UPNP_703;
+
+	dmctx->stop = 1;
+
+	if (dmctx->setaction == VALUECHECK) {
+		if (!dm_upnp_check_acl_write(dmctx, refparam)) {
+			dmctx->findparam = 0;
+			return FAULT_UPNP_706;
+		}
+		add_set_list_tmp(dmctx, dmctx->in_param, NULL, dmctx->dmparam_flags);
+	}
+	else {
+		if (!node->is_instanceobj) {
+			upnp_set_parameter_onchange(dmctx, refparam,  "eventchange", dmctx->dmparam_flags & DM_PARAM_EVENT_ON_CHANGE);
+			dm_entry_upnp_update_attribute_values_update(dmctx);
+		}
+	}
+	return 0;
+}
+
+/* *******************
+ * UPNP get ACL data
+ * ******************/
+
+int dm_entry_upnp_get_acl_data(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = { .current_object = "" };
+	unsigned char findparam_check = 0;
+	int err;
+	char buf[4] = {0};
+	buf[0] = dm_delim;
+
+	if (*(dmctx->in_param) == '\0')
+		dmctx->in_param = buf;
+
+	if (*(dmctx->in_param + strlen(dmctx->in_param) - 1) != dm_delim)
+		dmctx->inparam_isparam = 1;
+	else
+		dmctx->inparam_isparam = 0;
+
+	if (strchr(dmctx->in_param, '#'))
+		dmctx->instance_wildchar = "#";
+	else
+		dmctx->instance_wildchar = NULL;
+	dmctx->findparam = 0;
+	dmctx->stop = 0;
+	dmctx->checkobj = plugin_obj_match;
+	dmctx->checkleaf = plugin_leaf_match;
+	dmctx->method_obj = mobj_upnp_get_acldata;
+	dmctx->method_param = mparam_upnp_get_acldata;
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->findparam)
+		return 0;
+	else
+		return (upnp_map_cwmp_fault(err));
+}
+
+static int mparam_upnp_get_acldata(DMPARAM_ARGS)
+{
+	char *refparam;
+	unsigned int flags = 0;
+	char *perm = permission->val;
+
+	dmastrcat(&refparam, node->current_object, lastname);
+
+	if (strcmp(refparam, dmctx->in_param) != 0)
+			return FAULT_UPNP_703;
+
+	flags = dm_upnp_check_acl_list(dmctx, refparam);
+	if (!flags) {
+		dmctx->findparam = 0;
+		dmctx->stop = 1;
+		return FAULT_UPNP_703;
+	}
+
+	dmctx->stop = 1;
+
+	add_list_paramameter(dmctx, refparam, NULL, NULL, NULL, flags);
+	return 0;
+}
+
+static int mobj_upnp_get_acldata(DMOBJECT_ARGS)
+{
+	char *refparam;
+	unsigned int flags = 0;
+	char *perm = permission->val;
+
+	refparam = node->current_object;
+
+	if (strcmp(refparam, dmctx->in_param) != 0)
+			return FAULT_UPNP_703;
+
+	flags = dm_upnp_check_acl_list(dmctx, refparam);
+	if (!flags) {
+		dmctx->findparam = 0;
+		dmctx->stop = 1;
+		return FAULT_UPNP_703;
+	}
+
+	dmctx->stop = 1;
+	flags |= DM_FACTORIZED;
+
+	add_list_paramameter(dmctx, refparam, NULL, NULL, NULL, flags);
+	return 0;
+}
+
+/* **************************
+ * UPNP get instance numbers
+ * *************************/
+
+char *dm_entry_get_all_instance_numbers(struct dmctx *pctx, char *param)
+{
+	static char instbuf[256];
+	struct dmctx dmctx = {0};
+
+	dm_ctx_init_sub(&dmctx, pctx->dm_type,  pctx->amd_version, pctx->instance_mode);
+	dmctx.in_param = param;
+	dmctx.depth = 1;
+	dm_entry_upnp_get_instance_numbers(&dmctx);
+	strcpy(instbuf, dmctx.all_instances);
+	dm_ctx_clean_sub(&dmctx);
+	return instbuf;
+}
+
+int dm_entry_upnp_get_instance_numbers(struct dmctx *dmctx)
+{
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = {.current_object = ""};
+	int err;
+	char buf[4] = {0};
+	buf[0] = dm_delim;
+
+	if (*(dmctx->in_param) == '\0')
+		dmctx->in_param = buf;
+
+	if (*(dmctx->in_param + strlen(dmctx->in_param) - 1) != dm_delim)
+		return FAULT_UPNP_701;
+
+	dmctx->inparam_isparam = 0;
+	dmctx->findparam = 0;
+	dmctx->stop = 0;
+	dmctx->checkobj = plugin_upnp_obj_depth_match;
+	dmctx->checkleaf = plugin_upnp_skip_leafs;
+	dmctx->method_obj = mobj_upnp_get_instance_numbers;
+	dmctx->method_param = mparam_upnp_get_instance_numbers;
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	if (dmctx->findparam)
+		return 0;
+	else
+		return (upnp_map_cwmp_fault(err));
+}
+
+static int mparam_upnp_get_instance_numbers(DMPARAM_ARGS)
+{
+	return 0;
+}
+
+static int mobj_upnp_get_instance_numbers(DMOBJECT_ARGS)
+{
+	char *refparam;
+	refparam = node->current_object;
+	if (!node->is_instanceobj || !node->matched)
+		return FAULT_UPNP_703;
+	if (*(dmctx->all_instances)) {
+		strcat(dmctx->all_instances, ",");
+	}
+	strcat(dmctx->all_instances, instance);
+	return 0;
+}
+
+/************************************
+ * upnp load tracked parameter values
+ ***********************************/
+int dm_entry_upnp_tracked_parameters(struct dmctx *dmctx)
+{
+	int err;
+	DMOBJ *root = dmctx->dm_entryobj;
+	DMNODE node = { .current_object = "" };
+
+	dmctx->method_obj = enabled_tracked_param_check_obj;
+	dmctx->method_param = enabled_tracked_param_check_param;
+	dmctx->checkobj = NULL ;
+	dmctx->checkleaf = NULL;
+	err = dm_browse(dmctx, &node, root, NULL, NULL);
+	return err;
+}
+
+static int enabled_tracked_param_check_obj(DMOBJECT_ARGS)
+{
+	char *refparam;
+	char *all_instances;
+	char *version = "0";
+	struct uci_section *s;
+	int isevnt, isversion;
+
+	refparam = node->current_object;
+	if (!node->obj->browseinstobj || node->is_instanceobj)
+		return FAULT_UPNP_703;
+
+	isevnt = upnp_get_parameter_onchange(dmctx, refparam, "eventchange");
+	isversion = get_parameter_version(dmctx, refparam, &version, &s);
+	if (isevnt || isversion)
+		all_instances = dm_entry_get_all_instance_numbers(dmctx, refparam);
+
+	if (isevnt) {
+		add_list_upnp_param_track(dmctx, &list_upnp_enabled_onevent, refparam, "1", all_instances, 1);
+	}
+	if (isversion) {
+		add_list_upnp_param_track(dmctx, &list_upnp_enabled_version, refparam, (s ? section_name(s) : NULL), all_instances, 1);
+	}
+	return 0;
+}
+
+static int enabled_tracked_param_check_param(DMPARAM_ARGS)
+{
+	char *refparam;
+	char *value = "";
+	char *version = "0";
+	struct uci_section *s;
+	int isalrm, isevnt, isversion;
+
+	dmastrcat(&refparam, node->current_object, lastname);
+	isalrm = upnp_get_parameter_onchange(dmctx, refparam, "alarmchange");
+	isevnt = upnp_get_parameter_onchange(dmctx, refparam, "eventchange");
+	isversion = get_parameter_version(dmctx, refparam, &version, &s);
+
+	if (isalrm || isevnt || isversion)
+		(get_cmd)(refparam, dmctx, data, instance, &value);
+	if (isalrm) {
+		add_list_upnp_param_track(dmctx, &list_upnp_enabled_onalarm, refparam, "1", value, 0);
+	}
+	if (isevnt) {
+		add_list_upnp_param_track(dmctx, &list_upnp_enabled_onevent, refparam, "1", value, 0);
+	}
+	if (isversion) {
+		add_list_upnp_param_track(dmctx, &list_upnp_enabled_version, refparam, (s ? section_name(s) : NULL), value, 0);
+	}
+
+	dmfree(refparam);
+	return 0;
+}
+#endif
+
+/********************/
+
+int dm_add_end_session(struct dmctx *ctx, void(*function)(struct execute_end_session *), int action, void *data)
+{
+	struct execute_end_session *execute_end_session;
+
+	execute_end_session = calloc (1,sizeof(struct execute_end_session));
+	if (execute_end_session == NULL)
+	{
+		return -1;
+	}
+	execute_end_session->action = action;
+	execute_end_session->data = data;
+	execute_end_session->function = function;
+	execute_end_session->amd_version = ctx->amd_version;
+	execute_end_session->instance_mode = ctx->instance_mode;
+	execute_end_session->dm_type = ctx->dm_type;
+	list_add_tail (&(execute_end_session->list), &(list_execute_end_session));
+
+	return 0;
+}
+
+int cwmp_free_dm_end_session(struct execute_end_session *execute_end_session)
+{
+	if(execute_end_session != NULL)
+	{
+		FREE(execute_end_session);
+	}
+	return 0;
+}
+
+int apply_end_session()
+{
+	struct execute_end_session *p, *q;
+	list_for_each_entry_safe(p, q, &(list_execute_end_session), list) {
+		p->function(p);
+		list_del(&(p->list));
+		cwmp_free_dm_end_session(p);
+	}
+	return 0;
+}
+
+void cwmp_set_end_session (unsigned int flag)
+{
+	end_session_flag |= flag;
+}
+
+char *dm_print_path(char *fpath, ...)
+{
+	static char pathbuf[512] = "";
+	va_list vl;
+
+	va_start(vl, fpath);
+	vsprintf(pathbuf, fpath, vl);
+	va_end(vl);
+	return pathbuf;
+}
diff --git a/dmcwmp.h b/dmcwmp.h
new file mode 100644
index 0000000000000000000000000000000000000000..f54ea5b403804fdaa1dec02d6c251f951cc58c46
--- /dev/null
+++ b/dmcwmp.h
@@ -0,0 +1,589 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author MOHAMED Kallel <mohamed.kallel@pivasoftware.com>
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *	  Author Feten Besbes <feten.besbes@pivasoftware.com>
+ *
+ */
+
+#ifndef __DMCWMP_H__
+#define __DMCWMP_H__
+#include <stdio.h>
+#include <string.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <libubox/list.h>
+#include "dmuci.h"
+#include "dmmem.h"
+
+#ifdef BBF_TR064
+#define DMROOT_UPNP ""
+#define DMDELIM_UPNP '/'
+#endif
+
+#define DMDELIM_CWMP '.'
+
+#define DM_PROMPT "icwmp>"
+
+#define DM_ENABLED_NOTIFY "/etc/icwmpd/.dm_enabled_notify"
+#define DM_ENABLED_NOTIFY_TEMPORARY "/tmp/.dm_enabled_notify_temporary"
+
+#ifdef BBF_TR064
+#define UPNP_CFG "tr064"
+#endif
+
+#ifdef UNDEF
+#undef UNDEF
+#endif
+#define UNDEF -1
+
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
+#endif
+
+#ifndef FREE
+#define FREE(x) do { free(x); x = NULL; } while (0)
+#endif
+
+extern struct dm_permession_s DMREAD;
+extern struct dm_permession_s DMWRITE;
+extern struct dm_forced_inform_s DMFINFRM;
+
+extern struct dm_notif_s DMNONE;
+extern struct dm_notif_s DMACTIVE;
+extern struct dm_notif_s DMPASSIVE;
+
+#define DMPARAM_ARGS \
+	struct dmctx *dmctx, \
+	struct dmnode *node, \
+	char *lastname, \
+	struct dm_permession_s *permission, \
+	int type, \
+	int (*get_cmd)(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value), \
+	int (*set_cmd)(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action), \
+	struct dm_forced_inform_s *forced_inform, \
+	struct dm_notif_s *notification, \
+	void *data, \
+	char *instance
+
+#define DMOBJECT_ARGS \
+	struct dmctx *dmctx, \
+	struct dmnode *node, \
+	struct dm_permession_s *permission, \
+	int (*addobj)(char *refparam, struct dmctx *ctx, void *data, char **instance), \
+	int (*delobj)(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action), \
+	struct dm_forced_inform_s *forced_inform, \
+	struct dm_notif_s *notification, \
+	int (*get_linker)(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker), \
+	void *data, \
+	char *instance
+
+#define TAILLE_MAX 1024
+
+struct dm_forced_inform_s;
+struct dm_permession_s;
+struct dm_parameter;
+struct dm_leaf_s;
+struct dm_obj_s;
+struct dmnode;
+struct dmctx;
+struct dm_notif_s;
+
+struct dm_permession_s {
+	char *val;
+	char *(*get_permission)(char *refparam, struct dmctx *dmctx, void *data, char *instance);
+};
+
+struct dm_forced_inform_s {
+	unsigned char val;
+	unsigned char (*get_forced_inform)(char *refparam, struct dmctx *dmctx, void *data, char *instance);
+};
+
+struct dm_notif_s {
+	char *val;
+	char *(*get_notif)(char *refparam, struct dmctx *dmctx, void *data, char *instance);
+};
+
+typedef struct dm_leaf_s {
+	/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type(8)*/
+	char *parameter;
+	struct dm_permession_s *permission;
+	int type;
+	int (*getvalue)(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+	int (*setvalue)(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+	struct dm_forced_inform_s *forced_inform;
+	struct dm_notif_s *notification;
+	int bbfdm_type;
+} DMLEAF;
+
+typedef struct dm_obj_s {
+	/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type(12)*/
+	char *obj;
+	struct dm_permession_s *permission;
+	int (*addobj)(char *refparam, struct dmctx *ctx, void *data, char **instance);
+	int (*delobj)(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+	bool (*checkobj)(struct dmctx *dmctx, void *data);
+	int (*browseinstobj)(struct dmctx *dmctx, struct dmnode *node, void *data, char *instance);
+	struct dm_forced_inform_s *forced_inform;
+	struct dm_notif_s *notification;
+	struct dm_obj_s *nextobj;
+	struct dm_leaf_s *leaf;
+	int (*get_linker)(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+	int bbfdm_type;	
+} DMOBJ;
+
+#ifdef BBF_TR064
+typedef struct dm_upnp_supported_dm_s {
+	char *location;
+	char *uri;
+	char *url;
+	char *description;
+	char *source_location;
+} UPNP_SUPPORTED_DM;
+#endif
+
+struct set_tmp {
+	struct list_head list;
+	char *name;
+	char *value;
+	unsigned int flags;
+};
+
+struct param_fault {
+	struct list_head list;
+	char *name;
+	int fault;
+};
+
+struct dm_enabled_notify {
+	struct list_head list;
+	char *name;
+	char *notification;
+	char *value;
+};
+
+#ifdef BBF_TR064
+struct dm_upnp_enabled_track {
+	struct list_head list;
+	char *name;
+	char *key;
+	char *value;
+	unsigned int isobj;
+};
+#endif
+
+struct dm_parameter {
+	struct list_head list;
+	char *name;
+	char *data;
+	char *type; 
+	char *version;
+	unsigned int flags;
+};
+
+struct dmctx
+{
+	bool stop;
+	bool match;
+	int (*method_param)(DMPARAM_ARGS);
+	int (*method_obj)(DMOBJECT_ARGS);
+	int (*checkobj)(DMOBJECT_ARGS);
+	int (*checkleaf)(DMOBJECT_ARGS);
+	struct list_head list_parameter;
+	struct list_head set_list_tmp;
+	struct list_head list_fault_param;
+	DMOBJ *dm_entryobj;
+	bool nextlevel;
+	int depth;
+	int faultcode;
+	int setaction;
+	char *in_param;
+	char *in_notification;
+	bool notification_change;
+	char *in_value;
+	char *addobj_instance;
+	char *linker;
+	char *linker_param;
+	unsigned int dmparam_flags;
+	unsigned int alias_register;
+	unsigned int nbrof_instance;
+	unsigned int amd_version;
+	unsigned int instance_mode;
+	unsigned int dm_type;
+	unsigned int user_mask;
+	unsigned char inparam_isparam;
+	unsigned char findparam;
+	char all_instances[512];
+	char *inst_buf[16];
+	char *instance_wildchar;
+};
+
+
+typedef struct dmnode {
+	DMOBJ *obj;
+	struct dmnode *parent;
+	char *current_object;
+	unsigned char instance_level;
+	unsigned char matched;
+	unsigned char is_instanceobj;
+} DMNODE;
+
+struct prefix_method {
+	const char *prefix_name;
+	bool enable;
+	bool (*set_enable)(void);
+	bool forced_inform;
+	int (*method)(struct dmctx *ctx);
+};
+
+struct notification {
+	char *value;
+	char *type;
+};
+
+struct dm_acl {
+	unsigned int flag;
+	char *user_access;
+};
+
+typedef struct execute_end_session {
+	struct list_head list;
+	int action;
+	unsigned int dm_type;
+	unsigned int amd_version;
+	unsigned int instance_mode;
+	void *data;
+	void (*function)(struct execute_end_session *);
+} execute_end_session;
+
+enum set_value_action {
+	VALUECHECK,
+	VALUESET
+};
+
+enum del_action_enum {
+	DEL_INST,
+	DEL_ALL
+};
+enum {
+	CMD_GET_VALUE,
+	CMD_GET_NAME,
+	CMD_GET_NOTIFICATION,
+	CMD_SET_VALUE,
+	CMD_SET_NOTIFICATION,
+	CMD_ADD_OBJECT,
+	CMD_DEL_OBJECT,
+	CMD_INFORM,
+	CMD_USP_OPERATE,
+#ifdef BBF_TR064
+	CMD_UPNP_GET_SUPPORTED_PARAMETERS,
+	CMD_UPNP_GET_INSTANCES,
+	CMD_UPNP_GET_SELECTED_VALUES,
+	CMD_UPNP_GET_VALUES,
+	CMD_UPNP_SET_VALUES,
+	CMD_UPNP_GET_ATTRIBUTES,
+	CMD_UPNP_SET_ATTRIBUTES,
+	CMD_UPNP_DEL_INSTANCE,
+	CMD_UPNP_ADD_INSTANCE,
+	CMD_UPNP_GET_ACLDATA,
+	CMD_UPNP_INIT_STATE_VARIABLES,
+	CMD_UPNP_LOAD_ENABLED_PARAMETRS_TRACK,
+	CMD_UPNP_GET_CONFIGURATION_UPDATE,
+	CMD_UPNP_GET_CURRENT_CONFIGURATION_VERSION,
+	CMD_UPNP_GET_SUPPORTED_DATA_MODEL_UPDATE,
+	CMD_UPNP_GET_SUPPORTED_PARAMETERS_UPDATE,
+	CMD_UPNP_GET_ATTRIBUTE_VALUES_UPDATE,
+	CMD_UPNP_GET_ENABLED_PARAMETRS_ALARM,
+	CMD_UPNP_GET_ENABLED_PARAMETRS_EVENT,
+	CMD_UPNP_GET_ENABLED_PARAMETRS_VERSION,
+	CMD_UPNP_CHECK_CHANGED_PARAMETRS_ALARM,
+	CMD_UPNP_CHECK_CHANGED_PARAMETRS_EVENT,
+	CMD_UPNP_CHECK_CHANGED_PARAMETRS_VERSION,
+#endif
+	CMD_EXTERNAL_COMMAND
+};
+
+enum fault_code_enum {
+	FAULT_9000 = 9000,// Method not supported
+	FAULT_9001,// Request denied
+	FAULT_9002,// Internal error
+	FAULT_9003,// Invalid arguments
+	FAULT_9004,// Resources exceeded
+	FAULT_9005,// Invalid parameter name
+	FAULT_9006,// Invalid parameter type
+	FAULT_9007,// Invalid parameter value
+	FAULT_9008,// Attempt to set a non-writable parameter
+	FAULT_9009,// Notification request rejected
+	FAULT_9010,// Download failure
+	FAULT_9011,// Upload failure
+	FAULT_9012,// File transfer server authentication failure
+	FAULT_9013,// Unsupported protocol for file transfer
+	FAULT_9014,// Download failure: unable to join multicast group
+	FAULT_9015,// Download failure: unable to contact file server
+	FAULT_9016,// Download failure: unable to access file
+	FAULT_9017,// Download failure: unable to complete download
+	FAULT_9018,// Download failure: file corrupted
+	FAULT_9019,// Download failure: file authentication failure
+	FAULT_9020,// Download failure: unable to complete download
+	FAULT_9021,// Cancelation of file transfer not permitted
+	FAULT_9022,// Invalid UUID format
+	FAULT_9023,// Unknown Execution Environment
+	FAULT_9024,// Disabled Execution Environment
+	FAULT_9025,// Diployment Unit to Execution environment mismatch
+	FAULT_9026,// Duplicate Deployment Unit
+	FAULT_9027,// System Ressources Exceeded
+	FAULT_9028,// Unknown Deployment Unit
+	FAULT_9029,// Invalid Deployment Unit State
+	FAULT_9030,// Invalid Deployment Unit Update: Downgrade not permitted
+	FAULT_9031,// Invalid Deployment Unit Update: Version not specified
+	FAULT_9032,// Invalid Deployment Unit Update: Version already exist
+	__FAULT_MAX
+};
+
+#ifdef BBF_TR064
+enum upnp_fault_code_enum {
+	FAULT_UPNP_606 = 606,// Action not authorized
+	FAULT_UPNP_701 = 701,// Invalid Argument Syntax
+	FAULT_UPNP_702,//Invalid XML Argument
+	FAULT_UPNP_703,// No Such Name
+	FAULT_UPNP_704,// Invalid Value Type
+	FAULT_UPNP_705,// Invalid Value
+	FAULT_UPNP_706,// Read Only Violation
+	FAULT_UPNP_707,// Multiple Set
+	FAULT_UPNP_708,// Resource Temporarily Unavailable
+	__FAULT_UPNP_MAX
+};
+#endif
+
+enum {
+	INSTANCE_UPDATE_NUMBER,
+	INSTANCE_UPDATE_ALIAS
+};
+
+enum instance_mode {
+	INSTANCE_MODE_NUMBER,
+	INSTANCE_MODE_ALIAS
+};
+
+enum end_session_enum {
+	END_SESSION_REBOOT = 1,
+	END_SESSION_EXTERNAL_ACTION = 1<<1,
+	END_SESSION_RELOAD = 1<<2,
+	END_SESSION_FACTORY_RESET = 1<<3,
+	END_SESSION_IPPING_DIAGNOSTIC = 1<<4,
+	END_SESSION_DOWNLOAD_DIAGNOSTIC = 1<<5,
+	END_SESSION_UPLOAD_DIAGNOSTIC = 1<<6,
+	END_SESSION_X_FACTORY_RESET_SOFT = 1<<7,
+	END_SESSION_NSLOOKUP_DIAGNOSTIC = 1<<8,
+	END_SESSION_TRACEROUTE_DIAGNOSTIC = 1<<9,
+	END_SESSION_UDPECHO_DIAGNOSTIC = 1<<10,
+	END_SESSION_SERVERSELECTION_DIAGNOSTIC = 1<<11
+};
+
+enum dm_browse_enum {
+	DM_ERROR = -1,
+	DM_OK = 0,
+	DM_STOP = 1
+};
+
+enum dmt_type_enum {
+	DMT_STRING,
+	DMT_UNINT,
+	DMT_INT,
+	DMT_LONG,
+	DMT_BOOL,
+	DMT_TIME,
+	DMT_HEXBIN,
+};
+
+enum amd_version_enum{
+	AMD_1 = 1,
+	AMD_2,
+	AMD_3,
+	AMD_4,
+	AMD_5,
+};
+
+enum dm_type_enum{
+	DM_CWMP,
+	DM_UPNP,
+};
+
+enum bbfdm_type_enum{
+	BBFDM_BOTH,
+	BBFDM_CWMP,
+	BBFDM_USP,
+};
+
+enum dm_param_flags_enum{
+	/* UPNP OnChange flags flags */
+	DM_PARAM_ALARAM_ON_CHANGE = 1 << 0,
+	DM_PARAM_EVENT_ON_CHANGE = 1 << 1,
+	/* UPNP type flags */
+	NODE_DATA_ATTRIBUTE_INSTANCE = 0x0010,
+	NODE_DATA_ATTRIBUTE_MULTIINSTANCE = 0x0020,
+	NODE_DATA_ATTRIBUTE_TYPESTRING = 0x0100,
+	NODE_DATA_ATTRIBUTE_TYPEINT = 0x0200,
+	NODE_DATA_ATTRIBUTE_TYPELONG = 0x0400,
+	NODE_DATA_ATTRIBUTE_TYPEBOOL = 0x0800,
+	NODE_DATA_ATTRIBUTE_TYPEDATETIME = 0x1000,
+	NODE_DATA_ATTRIBUTE_TYPEBASE64 = 0x2000,
+	NODE_DATA_ATTRIBUTE_TYPEBIN = 0x4000,
+	NODE_DATA_ATTRIBUTE_TYPEPTR = 0x8000,
+	NODE_DATA_ATTRIBUTE_TYPEMASK = 0x0000FF00,
+	/*ACLRoles*/
+	DM_PUBLIC_LIST = 1 << 0,
+	DM_PUBLIC_READ = 1 << 1,
+	DM_PUBLIC_WRITE = 1 << 2,
+	DM_PUBLIC_MASK = DM_PUBLIC_LIST|DM_PUBLIC_READ|DM_PUBLIC_WRITE,
+	DM_BASIC_LIST = 1 << 3,
+	DM_BASIC_READ = 1 << 4,
+	DM_BASIC_WRITE = 1 << 5,
+	DM_BASIC_MASK = DM_PUBLIC_MASK|DM_BASIC_LIST|DM_BASIC_READ|DM_BASIC_WRITE,
+	DM_XXXADMIN_LIST = 1 << 6,
+	DM_XXXADMIN_READ = 1 << 7,
+	DM_XXXADMIN_WRITE = 1 << 8,
+	DM_XXXADMIN_MASK = DM_BASIC_MASK|DM_XXXADMIN_LIST|DM_XXXADMIN_READ|DM_XXXADMIN_WRITE,
+	DM_SUPERADMIN_MASK = DM_XXXADMIN_MASK | (1 << 9),
+	DM_LIST_MASK = DM_PUBLIC_LIST|DM_BASIC_LIST|DM_XXXADMIN_LIST,
+	DM_READ_MASK = DM_PUBLIC_READ|DM_BASIC_READ|DM_XXXADMIN_READ,
+	DM_WRITE_MASK = DM_PUBLIC_WRITE|DM_BASIC_WRITE|DM_XXXADMIN_WRITE,
+	DM_FACTORIZED = 1 << 31
+};
+
+extern struct list_head list_enabled_notify;
+extern struct list_head list_enabled_lw_notify;
+extern struct list_head list_execute_end_session;
+
+#ifdef BBF_TR064
+extern struct list_head list_upnp_enabled_onevent;
+extern struct list_head list_upnp_enabled_onalarm;
+extern struct list_head list_upnp_enabled_version;
+extern struct list_head list_upnp_changed_onevent;
+extern struct list_head list_upnp_changed_onalarm;
+extern struct list_head list_upnp_changed_version;
+#endif
+
+extern int end_session_flag;
+extern int ip_version;
+extern char dm_delim;
+extern char dmroot[64];
+extern int bbfdatamodel_type;
+extern unsigned int upnp_in_user_mask;
+
+char *update_instance(struct uci_section *s, char *last_inst, char *inst_opt);
+char *update_instance_icwmpd(struct uci_section *s, char *last_inst, char *inst_opt);
+char *update_instance_alias_icwmpd(int action, char **last_inst , void *argv[]);
+char *update_instance_alias(int action, char **last_inst , void *argv[]);
+char *update_instance_without_section(int action, char **last_inst, void *argv[]);
+int get_empty(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+void add_list_paramameter(struct dmctx *ctx, char *param_name, char *param_data, char *param_type, char *param_version, unsigned int flags);
+void del_list_parameter(struct dm_parameter *dm_parameter);
+void free_all_list_parameter(struct dmctx *ctx);
+void add_set_list_tmp(struct dmctx *ctx, char *param, char *value, unsigned int flags);
+void del_set_list_tmp(struct set_tmp *set_tmp);
+void free_all_set_list_tmp(struct dmctx *ctx);
+void add_list_fault_param(struct dmctx *ctx, char *param, int fault);
+void del_list_fault_param(struct param_fault *param_fault);
+void free_all_list_fault_param(struct dmctx *ctx);
+int string_to_bool(char *v, bool *b);
+int dm_entry_operate(struct dmctx *dmctx);
+int dm_entry_get_value(struct dmctx *ctx);
+int dm_entry_get_name(struct dmctx *ctx);
+int dm_entry_get_notification(struct dmctx *ctx);
+int dm_entry_inform(struct dmctx *ctx);
+int dm_entry_add_object(struct dmctx *ctx);
+int dm_entry_delete_object(struct dmctx *ctx);
+int dm_entry_set_value(struct dmctx *ctx);
+int dm_entry_set_notification(struct dmctx *ctx);
+int dm_entry_enabled_notify(struct dmctx *ctx);
+int dm_entry_enabled_notify_check_value_change(struct dmctx *dmctx);
+int dm_entry_get_linker(struct dmctx *ctx);
+int dm_entry_get_linker_value(struct dmctx *ctx);
+#ifdef BBF_TR064
+int dm_entry_upnp_get_instances(struct dmctx *ctx);
+int dm_entry_upnp_get_selected_values(struct dmctx *dmctx);
+int dm_entry_upnp_get_values(struct dmctx *dmctx);
+int dm_entry_upnp_set_values(struct dmctx *dmctx);
+int dm_entry_upnp_get_attributes(struct dmctx *dmctx);
+int upnp_state_variables_init(struct dmctx *dmctx);
+int dm_entry_upnp_tracked_parameters(struct dmctx *dmctx);
+int dm_entry_upnp_get_instance_numbers(struct dmctx *dmctx);
+char *dm_entry_get_all_instance_numbers(struct dmctx *pctx, char *param);
+void free_all_list_enabled_notify();
+void free_all_list_upnp_param_track(struct list_head *head);
+#endif
+void dm_update_enabled_notify(struct dm_enabled_notify *p, char *new_value);
+int dm_update_file_enabled_notify(char *param, char *new_value);
+void dm_update_enabled_notify_byname(char *name, char *new_value);
+char *get_last_instance(char *package, char *section, char *opt_inst);
+char *get_last_instance_icwmpd_without_update(char *package, char *section, char *opt_inst);
+char *get_last_instance_icwmpd(char *package, char *section, char *opt_inst);
+char *get_vlan_last_instance_icwmpd(char *package, char *section, char *opt_inst, char *vlan_method);
+char *get_last_instance_lev2(char *package, char *section, char *opt_inst, char *opt_check, char *value_check);
+char *get_last_instance_lev2_icwmpd_dmmap_opt(char* dmmap_package, char *section,  char *opt_inst, char *opt_check, char *value_check);
+char *get_last_instance_lev2_icwmpd(char *package, char *section, char* dmmap_package, char *opt_inst, char *opt_check, char *value_check);
+char *handle_update_instance(int instance_ranck, struct dmctx *ctx, char **last_inst, char * (*up_instance)(int action, char **last_inst, void *argv[]), int argc, ...);
+int dm_add_end_session(struct dmctx *ctx, void(*function)(struct execute_end_session *), int action, void *data);
+int apply_end_session();
+void cwmp_set_end_session (unsigned int flag);
+char *dm_print_path(char *fpath, ...);
+void free_all_list_enabled_lwnotify();
+int dm_link_inst_obj(struct dmctx *dmctx, DMNODE *parent_node, void *data, char *instance);
+#ifdef BBF_TR064
+void dm_upnp_apply_config(void);
+void add_list_upnp_param_track(struct dmctx *dmctx, struct list_head *pchead, char *param, char *key, char *value, unsigned int isobj);
+int dm_link_inst_obj(struct dmctx *dmctx, DMNODE *parent_node, void *data, char *instance);
+int dm_entry_upnp_get_supported_parameters(struct dmctx *dmctx);
+int dm_entry_upnp_set_attributes(struct dmctx *dmctx);
+int dm_entry_upnp_delete_instance(struct dmctx *dmctx);
+int dm_entry_upnp_get_acl_data(struct dmctx *dmctx);
+void free_all_list_enabled_lwnotify();
+int dm_entry_upnp_add_instance(struct dmctx *dmctx);
+#endif
+
+static inline int DM_LINK_INST_OBJ(struct dmctx *dmctx, DMNODE *parent_node, void *data, char *instance)
+{
+	dmctx->faultcode = dm_link_inst_obj(dmctx, parent_node, data, instance);
+	if (dmctx->stop)
+		return DM_STOP;
+	return DM_OK;
+}
+
+#ifndef TRACE
+#define TRACE_TYPE 0
+static inline void trace_empty_func()
+{
+}
+#if TRACE_TYPE == 2
+#define TRACE(MESSAGE,args...) do { \
+	const char *A[] = {MESSAGE}; \
+	fprintf(stderr, "TRACE: %s %s %d ",__FUNCTION__,__FILE__,__LINE__); \
+	if(sizeof(A) > 0) \
+		fprintf(stderr, *A,##args); \
+	fprintf(stderr, "\n"); \
+	fflush(stderr); \
+} while(0)
+#elif TRACE_TYPE == 1
+#define TRACE(MESSAGE, ...) printf(MESSAGE, ## __VA_ARGS__)
+#else
+#define TRACE(MESSAGE, ...) trace_empty_func()
+#endif
+#endif
+
+#ifndef DETECT_CRASH
+#define DETECT_CRASH(MESSAGE,args...) { \
+	const char *A[] = {MESSAGE}; \
+	printf("DETECT_CRASH: %s %s %d\n",__FUNCTION__,__FILE__,__LINE__); fflush(stdout);\
+	if(sizeof(A) > 0) \
+		printf(*A,##args); \
+	sleep(1); \
+}
+#endif
+
+#endif
diff --git a/dmdiagnostics.c b/dmdiagnostics.c
new file mode 100644
index 0000000000000000000000000000000000000000..4efb435831a6dcb7c86893ca3fa5b15b7ce0568f
--- /dev/null
+++ b/dmdiagnostics.c
@@ -0,0 +1,656 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2019 iopsys Software Solutions AB
+ *	  Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <pthread.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <netinet/if_ether.h>
+#include <arpa/inet.h>
+#include <libtrace.h>
+#include <libpacketdump.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <getopt.h>
+#include "dmentry.h"
+#include "dmcommon.h"
+#include "dmdiagnostics.h"
+
+int read_next;
+struct download_diag download_stats = {0};
+struct upload_diagnostic_stats upload_stats = {0};
+
+char *get_param_diagnostics(char *diag, char *option)
+{
+	char buf[32], *value;
+
+	sprintf(buf, "@%s[0]", diag);
+	dmuci_get_varstate_string("cwmp", buf, option, &value);
+		return value;
+}
+
+void set_param_diagnostics(char *diag, char *option, char *value)
+{
+	struct uci_section *curr_section = NULL;
+	char buf[32], *tmp;
+
+	curr_section = dmuci_walk_state_section("cwmp", diag, NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+	if(!curr_section)
+	{
+		dmuci_add_state_section("cwmp", diag, &curr_section, &tmp);
+	}
+	sprintf(buf, "@%s[0]", diag);
+	dmuci_set_varstate_value("cwmp", buf, option, value);
+}
+
+void init_download_stats(void)
+{
+	memset(&download_stats, 0, sizeof(download_stats));
+}
+
+void init_upload_stats(void)
+{
+	memset(&upload_stats, 0, sizeof(upload_stats));
+}
+
+static void ftp_download_per_packet(libtrace_packet_t *packet)
+{
+	struct tm lt;
+	struct timeval ts;
+	libtrace_tcp_t *tcp;
+	char tcp_flag[16] = "";
+	char *nexthdr;
+	char s_now[default_date_size];
+	uint8_t proto;
+	uint32_t remaining;
+
+	tcp = trace_get_transport(packet, &proto, &remaining);
+	if (tcp == NULL)
+		return;
+	else
+		nexthdr = trace_get_payload_from_tcp(tcp, &remaining);
+
+	if (tcp->ecn_ns) strcat(tcp_flag, "ECN_NS ");
+	if (tcp->cwr) strcat(tcp_flag, "CWR ");
+	if (tcp->ece) strcat(tcp_flag, "ECE ");
+	if (tcp->fin) strcat(tcp_flag, "FIN ");
+	if (tcp->syn) strcat(tcp_flag, "SYN ");
+	if (tcp->rst) strcat(tcp_flag, "RST ");
+	if (tcp->psh) strcat(tcp_flag, "PSH ");
+	if (tcp->ack) strcat(tcp_flag, "ACK ");
+	if (tcp->urg) strcat(tcp_flag, "URG ");
+
+	if (strcmp(tcp_flag, "PSH ACK ") == 0 && strlen(nexthdr) > strlen(FTP_SIZE_RESPONSE) && strncmp(nexthdr, FTP_SIZE_RESPONSE, strlen(FTP_SIZE_RESPONSE)) == 0)
+	{
+		char *val = strstr(nexthdr,"213");
+		char *pch, *pchr;
+		val += strlen("213 ");
+		pch=strtok_r(val, " \r\n\t", &pchr);
+		download_stats.test_bytes_received = atoi(pch);
+	}
+	if(strcmp(tcp_flag, "PSH ACK ") == 0 && strlen(nexthdr) > strlen(FTP_PASV_RESPONSE) && strncmp(nexthdr, FTP_PASV_RESPONSE, strlen(FTP_PASV_RESPONSE)) == 0)
+	{
+		download_stats.ftp_syn = 1;
+		return;
+	}
+    if (download_stats.random_seq == 0 && strcmp(tcp_flag, "SYN ") == 0 && download_stats.ftp_syn == 1)
+	{
+    	ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		download_stats.random_seq = ntohl(tcp->seq);
+		sprintf((download_stats.tcpopenrequesttime),"%s.%06ld", s_now, (long) ts.tv_usec);
+	}
+	if (strcmp(tcp_flag, "SYN ACK ") == 0 && download_stats.random_seq != 0 && (ntohl(tcp->ack_seq) - 1 ) == download_stats.random_seq)
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		sprintf((download_stats.tcpopenresponsetime),"%s.%06ld", s_now, (long) ts.tv_usec);
+		download_stats.random_seq = ntohl(tcp->ack_seq);
+		sprintf((download_stats.tcpopenresponsetime),"%s.%06ld", s_now, (long) ts.tv_usec);
+	}
+	if (strcmp(tcp_flag, "PSH ACK ") == 0 && strlen(nexthdr) > strlen(FTP_RETR_REQUEST) && strncmp(nexthdr, FTP_RETR_REQUEST, strlen(FTP_RETR_REQUEST)) == 0)
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		sprintf((download_stats.romtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+	}
+	if(strcmp(tcp_flag, "ACK ") == 0 && ntohl(tcp->seq) == download_stats.random_seq && download_stats.ack_seq == 0)
+	{
+		download_stats.ack_seq = ntohl(tcp->seq);
+		return;
+	}
+	if(strcmp(tcp_flag, "ACK ") == 0 && ntohl(tcp->ack_seq) == download_stats.ack_seq )
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		if (download_stats.first_data == 0)
+		{
+			sprintf((download_stats.bomtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+		}
+		download_stats.first_data = 1;
+	}
+	if ( (strcmp(tcp_flag, "PSH ACK ") == 0 || strcmp(tcp_flag, "FIN PSH ACK ") == 0) &&  ntohl(tcp->ack_seq) == download_stats.ack_seq)
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		if (download_stats.first_data == 0)
+		{
+			sprintf((download_stats.bomtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+			download_stats.first_data = 1;
+		}
+		sprintf((download_stats.eomtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+	}
+}
+
+static void http_download_per_packet(libtrace_packet_t *packet)
+{
+	struct tm lt;
+	struct timeval ts;
+	libtrace_tcp_t *tcp;
+	uint32_t seq = 0;
+	char tcp_flag[16] = "";
+	char *nexthdr;
+	char s_now[default_date_size];
+	uint8_t proto;
+	uint32_t remaining;
+
+	tcp = trace_get_transport(packet, &proto, &remaining);
+	if (tcp == NULL)
+		return;
+	else
+		nexthdr = trace_get_payload_from_tcp(tcp, &remaining);
+
+	if (tcp->ecn_ns) strcat(tcp_flag, "ECN_NS ");
+	if (tcp->cwr) strcat(tcp_flag, "CWR ");
+	if (tcp->ece) strcat(tcp_flag, "ECE ");
+	if (tcp->fin) strcat(tcp_flag, "FIN ");
+	if (tcp->syn) strcat(tcp_flag, "SYN ");
+	if (tcp->rst) strcat(tcp_flag, "RST ");
+	if (tcp->psh) strcat(tcp_flag, "PSH ");
+	if (tcp->ack) strcat(tcp_flag, "ACK ");
+	if (tcp->urg) strcat(tcp_flag, "URG ");
+
+	if (strcmp(tcp_flag, "SYN ") == 0 && download_stats.random_seq == 0)
+	{
+    	ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		sprintf((download_stats.tcpopenrequesttime),"%s.%06ld", s_now, (long) ts.tv_usec);
+		download_stats.random_seq = ntohl(tcp->seq);
+		return;
+	}
+	if (strcmp(tcp_flag, "SYN ACK ") == 0 && download_stats.random_seq != 0 && (ntohl(tcp->ack_seq) - 1 ) == download_stats.random_seq)
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		sprintf((download_stats.tcpopenresponsetime),"%s.%06ld", s_now, (long) ts.tv_usec);
+		download_stats.random_seq = ntohl(tcp->seq);
+		return;
+	}
+	if (strcmp(tcp_flag, "PSH ACK ") == 0 && strncmp(nexthdr, "GET", 3) == 0)
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		sprintf((download_stats.romtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+		download_stats.get_ack = ntohl(tcp->ack_seq);
+		return;
+	}
+	if(strcmp(tcp_flag, "ACK ") == 0 && ntohl(tcp->seq) == download_stats.get_ack && download_stats.ack_seq == 0)
+	{
+		download_stats.ack_seq = ntohl(tcp->ack_seq);
+		return;
+	}
+	if(strcmp(tcp_flag, "ACK ") == 0 && ntohl(tcp->ack_seq) == download_stats.ack_seq )
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		if (download_stats.first_data == 0)
+		{
+			sprintf((download_stats.bomtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+			char *val = strstr(nexthdr,"Content-Length");
+			char *pch, *pchr;
+			val += strlen("Content-Length: ");
+			pch=strtok_r(val, " \r\n\t", &pchr);
+			download_stats.test_bytes_received = atoi(pch);
+			download_stats.first_data = 1;
+		}
+		return;
+	}
+	if ( (strcmp(tcp_flag, "PSH ACK ") == 0 || strcmp(tcp_flag, "FIN PSH ACK ") == 0) &&  ntohl(tcp->ack_seq) == download_stats.ack_seq)
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		if (download_stats.first_data == 0)
+		{
+			sprintf((download_stats.bomtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+			char *val = strstr(nexthdr,"Content-Length");
+			char *pch, *pchr;
+			val += strlen("Content-Length: ");
+			pch=strtok_r(val, " \r\n\t", &pchr);
+			download_stats.test_bytes_received = atoi(pch);
+			download_stats.first_data = 1;
+		}
+		sprintf((download_stats.eomtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+		return;
+	}
+}
+
+static void libtrace_cleanup(libtrace_t *trace, libtrace_packet_t *packet)
+{
+	if (trace)
+		trace_destroy(trace);
+
+	if (packet)
+		trace_destroy_packet(packet);
+}
+
+static void set_download_stats(char *protocol)
+{
+	char buf[16];
+
+	if(strcmp(protocol, "cwmp")== 0)
+		init_uci_varstate_ctx();
+
+	set_param_diagnostics("downloaddiagnostic", "ROMtime", download_stats.romtime);
+	set_param_diagnostics("downloaddiagnostic", "BOMtime", download_stats.bomtime);
+	set_param_diagnostics("downloaddiagnostic", "EOMtime", download_stats.eomtime);
+	set_param_diagnostics("downloaddiagnostic", "TCPOpenRequestTimes", download_stats.tcpopenrequesttime);
+	set_param_diagnostics("downloaddiagnostic", "TCPOpenResponseTime", download_stats.tcpopenresponsetime);
+	sprintf(buf,"%d", download_stats.test_bytes_received);
+	set_param_diagnostics("downloaddiagnostic", "TestBytesReceived", buf);
+
+	if(strcmp(protocol, "cwmp")== 0)
+		end_uci_varstate_ctx();
+}
+
+static void set_upload_stats(char *protocol)
+{
+	if(strcmp(protocol, "cwmp")== 0)
+		init_uci_varstate_ctx();
+
+	set_param_diagnostics("uploaddiagnostic", "ROMtime", upload_stats.romtime);
+	set_param_diagnostics("uploaddiagnostic", "BOMtime", upload_stats.bomtime);
+	set_param_diagnostics("uploaddiagnostic", "EOMtime", upload_stats.eomtime);
+	set_param_diagnostics("uploaddiagnostic", "TCPOpenRequestTimes", upload_stats.tcpopenrequesttime);
+	set_param_diagnostics("uploaddiagnostic", "TCPOpenResponseTime", upload_stats.tcpopenresponsetime);
+
+	if(strcmp(protocol, "cwmp")== 0)
+		end_uci_varstate_ctx();
+}
+
+static void http_upload_per_packet(libtrace_packet_t *packet)
+{
+	struct tm lt;
+	struct timeval ts;
+	libtrace_tcp_t *tcp;
+	char tcp_flag[16] = "";
+	char *nexthdr;
+	char s_now[default_date_size];
+	uint8_t proto;
+	uint32_t remaining;
+
+	tcp = trace_get_transport(packet, &proto, &remaining);
+	if (tcp == NULL)
+		return;
+	else
+		nexthdr = trace_get_payload_from_tcp(tcp, &remaining);
+
+	if (tcp->ecn_ns) strcat(tcp_flag, "ECN_NS ");
+	if (tcp->cwr) strcat(tcp_flag, "CWR ");
+	if (tcp->ece) strcat(tcp_flag, "ECE ");
+	if (tcp->fin) strcat(tcp_flag, "FIN ");
+	if (tcp->syn) strcat(tcp_flag, "SYN ");
+	if (tcp->rst) strcat(tcp_flag, "RST ");
+	if (tcp->psh) strcat(tcp_flag, "PSH ");
+	if (tcp->ack) strcat(tcp_flag, "ACK ");
+	if (tcp->urg) strcat(tcp_flag, "URG ");
+
+	if (strcmp(tcp_flag, "SYN ") == 0 && download_stats.random_seq == 0)
+	{
+    	ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		sprintf((upload_stats.tcpopenrequesttime),"%s.%06ld", s_now, (long) ts.tv_usec);
+		upload_stats.random_seq = ntohl(tcp->seq);
+	}
+	if (strcmp(tcp_flag, "SYN ACK ") == 0 && upload_stats.random_seq != 0 && (ntohl(tcp->ack_seq) - 1 ) == upload_stats.random_seq)
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		sprintf((upload_stats.tcpopenresponsetime),"%s.%06ld", s_now, (long) ts.tv_usec);
+		upload_stats.random_seq = ntohl(tcp->seq);
+	}
+	if (strcmp(tcp_flag, "PSH ACK ") == 0 && strncmp(nexthdr, "PUT", 3) == 0)
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		sprintf((upload_stats.romtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+		if (strstr(nexthdr, "Expect: 100-continue"))
+		{
+			upload_stats.tmp=1;
+			upload_stats.ack_seq = ntohl(tcp->ack_seq);
+		}
+		else
+			upload_stats.ack_seq = ntohl(tcp->ack_seq);
+		return;
+	}
+	if (strcmp(tcp_flag, "PSH ACK ") == 0 && upload_stats.tmp == 1 && strstr(nexthdr, "100 Continue"))
+	{
+		upload_stats.tmp = 2;
+		upload_stats.ack_seq = ntohl(tcp->ack_seq);
+		return;
+	}
+	if (strcmp(tcp_flag, "ACK ") == 0 && upload_stats.tmp == 2 && ntohl(tcp->seq) == upload_stats.ack_seq)
+	{
+		upload_stats.tmp = 0;
+		upload_stats.ack_seq = ntohl(tcp->ack_seq);
+		return;
+	}
+	if(strcmp(tcp_flag, "ACK ") == 0 && ntohl(tcp->ack_seq) == upload_stats.ack_seq && upload_stats.tmp == 0)
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		if (upload_stats.first_data == 0)
+		{
+			sprintf((upload_stats.bomtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+			upload_stats.first_data = 1;
+		}
+	}
+	if ( (strcmp(tcp_flag, "PSH ACK ") == 0 || strcmp(tcp_flag, "FIN PSH ACK ") == 0) &&  ntohl(tcp->ack_seq) == upload_stats.ack_seq && upload_stats.tmp == 0)
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		if (upload_stats.first_data == 0)
+		{
+			sprintf((upload_stats.bomtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+			upload_stats.first_data = 1;
+		}
+	}
+	if ( (strcmp(tcp_flag, "PSH ACK ") == 0 || strcmp(tcp_flag, "FIN PSH ACK ") == 0) &&  ntohl(tcp->seq) == upload_stats.ack_seq && upload_stats.tmp == 0)
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		sprintf((upload_stats.eomtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+	}
+}
+
+static void ftp_upload_per_packet(libtrace_packet_t *packet)
+{
+	struct tm lt;
+	struct timeval ts;
+	libtrace_tcp_t *tcp;
+	uint8_t proto;
+	uint32_t remaining;
+	char tcp_flag[16] = "";
+	char *nexthdr;
+	char s_now[default_date_size];
+
+	tcp = trace_get_transport(packet, &proto, &remaining);
+	if (tcp == NULL)
+		return;
+	else
+		nexthdr = trace_get_payload_from_tcp(tcp, &remaining);
+
+	if (tcp->ecn_ns) strcat(tcp_flag, "ECN_NS ");
+	if (tcp->cwr) strcat(tcp_flag, "CWR ");
+	if (tcp->ece) strcat(tcp_flag, "ECE ");
+	if (tcp->fin) strcat(tcp_flag, "FIN ");
+	if (tcp->syn) strcat(tcp_flag, "SYN ");
+	if (tcp->rst) strcat(tcp_flag, "RST ");
+	if (tcp->psh) strcat(tcp_flag, "PSH ");
+	if (tcp->ack) strcat(tcp_flag, "ACK ");
+	if (tcp->urg) strcat(tcp_flag, "URG ");
+
+	if(strcmp(tcp_flag, "PSH ACK ") == 0 && strlen(nexthdr) > strlen(FTP_PASV_RESPONSE) && strncmp(nexthdr, FTP_PASV_RESPONSE, strlen(FTP_PASV_RESPONSE)) == 0)
+	{
+		upload_stats.ftp_syn = 1;
+		return;
+	}
+    if (strcmp(tcp_flag, "SYN ") == 0 && upload_stats.ftp_syn == 1)
+	{
+    	ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		upload_stats.random_seq = ntohl(tcp->seq);
+		sprintf((upload_stats.tcpopenrequesttime),"%s.%06ld", s_now, (long) ts.tv_usec);
+	}
+	if (strcmp(tcp_flag, "SYN ACK ") == 0 && upload_stats.random_seq != 0 && (ntohl(tcp->ack_seq) - 1 ) == upload_stats.random_seq)
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		sprintf((upload_stats.tcpopenresponsetime),"%s.%06ld", s_now, (long) ts.tv_usec);
+		upload_stats.random_seq = ntohl(tcp->ack_seq);
+	}
+	if (strcmp(tcp_flag, "PSH ACK ") == 0 && strlen(nexthdr) > strlen(FTP_STOR_REQUEST) && strncmp(nexthdr, FTP_STOR_REQUEST, strlen(FTP_STOR_REQUEST)) == 0)
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		sprintf((upload_stats.romtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+	}
+	if(strcmp(tcp_flag, "ACK ") == 0 && ntohl(tcp->seq) == upload_stats.random_seq && upload_stats.ack_seq == 0)
+	{
+		upload_stats.ack_seq = ntohl(tcp->ack_seq);
+		return;
+	}
+	if(strcmp(tcp_flag, "ACK ") == 0 && ntohl(tcp->ack_seq) == upload_stats.ack_seq )
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		if (upload_stats.first_data == 0)
+		{
+			sprintf((upload_stats.bomtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+			upload_stats.first_data = 1;
+		}
+	}
+	if ( (strcmp(tcp_flag, "PSH ACK ") == 0 || strcmp(tcp_flag, "FIN PSH ACK ") == 0) &&  ntohl(tcp->ack_seq) == upload_stats.ack_seq) //&& strlen(nexthdr) > 16 && strncmp(nexthdr, "HTTP/1.1 200 OK", 16) == 0
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		if (upload_stats.first_data == 0)
+		{
+			sprintf((upload_stats.bomtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+			upload_stats.first_data = 1;
+		}
+	}
+	if ( (strcmp(tcp_flag, "PSH ACK ") == 0 || strcmp(tcp_flag, "FIN PSH ACK ") == 0) &&  strlen(nexthdr) > strlen(FTP_TRANSFERT_COMPLETE) && strncmp(nexthdr, FTP_TRANSFERT_COMPLETE, strlen(FTP_TRANSFERT_COMPLETE)) == 0) //&& strlen(nexthdr) > 16 && strncmp(nexthdr, "HTTP/1.1 200 OK", 16) == 0
+	{
+		ts = trace_get_timeval(packet);
+		(void) localtime_r(&(ts.tv_sec), &lt);
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S", &lt);
+		sprintf((upload_stats.eomtime),"%s.%06ld", s_now, (long) ts.tv_usec);
+		read_next = 0;
+	}
+}
+
+int extract_stats(char *dump_file, int proto, int diagnostic_type, char *protocol)
+{
+	libtrace_t *trace = NULL;
+	libtrace_packet_t *packet = NULL;
+	read_next = 1;
+	packet = trace_create_packet();
+	if (packet == NULL) {
+		perror("Creating libtrace packet");
+		libtrace_cleanup(trace, packet);
+		return 1;
+	}
+
+	trace = trace_create(dump_file);
+	if (!trace) {
+		return -1;
+	}
+
+	if (trace_is_err(trace)) {
+		trace_perror(trace,"Opening trace file");
+		libtrace_cleanup(trace, packet);
+		return 1;
+	}
+
+	if (trace_start(trace) == -1) {
+		trace_perror(trace,"Starting trace");
+		libtrace_cleanup(trace, packet);
+		return 1;
+	}
+	if (proto == DOWNLOAD_DIAGNOSTIC_HTTP && diagnostic_type == DOWNLOAD_DIAGNOSTIC)
+	{
+		while (trace_read_packet(trace,packet)>0 && read_next == 1) {
+			http_download_per_packet(packet);
+			continue;
+		}
+		set_download_stats(protocol);
+	}
+	else if (proto == DOWNLOAD_DIAGNOSTIC_FTP && diagnostic_type == DOWNLOAD_DIAGNOSTIC)
+	{
+		while (trace_read_packet(trace,packet)>0 && read_next == 1) {
+			ftp_download_per_packet(packet);
+			continue;
+		}
+		set_download_stats(protocol);
+	}
+	else if (proto == DOWNLOAD_DIAGNOSTIC_HTTP && diagnostic_type == UPLOAD_DIAGNOSTIC)
+	{
+		while (trace_read_packet(trace,packet)>0 && read_next == 1) {
+			http_upload_per_packet(packet);
+			continue;
+		}
+		set_upload_stats(protocol);
+	}
+	else
+	{
+		while (trace_read_packet(trace,packet)>0 && read_next == 1) {
+			ftp_upload_per_packet(packet);
+			continue;
+		}
+		set_upload_stats(protocol);
+	}
+	libtrace_cleanup(trace, packet);
+	return 0;
+}
+
+int get_default_gateway_device( char **gw )
+{
+    FILE *f;
+    char line[100], *p, *c, *saveptr;
+
+    f = fopen("/proc/net/route" , "r");
+	if (f != NULL)
+	{
+		while(fgets(line , 100 , f))
+		{
+			p = strtok_r(line, " \t", &saveptr);
+			c = strtok_r(NULL, " \t", &saveptr);
+			if(p!=NULL && c!=NULL)
+			{
+				if(strcmp(c, "00000000") == 0)
+				{
+					dmasprintf(gw, "%s", p);
+					fclose(f);
+					return 0;
+				}
+			}
+		}
+		fclose(f);
+	}
+    return -1;
+}
+
+int start_upload_download_diagnostic(int diagnostic_type)
+{
+	char *url = NULL;
+	char *interface = NULL;
+	char *size = NULL;
+	int error;
+	char *status;
+
+	if (diagnostic_type == DOWNLOAD_DIAGNOSTIC) {
+		dmuci_get_varstate_string("cwmp", "@downloaddiagnostic[0]", "url", &url);
+		dmuci_get_varstate_string("cwmp", "@downloaddiagnostic[0]", "device", &interface);
+	}
+	else {
+		dmuci_get_varstate_string("cwmp", "@uploaddiagnostic[0]", "url", &url);
+		dmuci_get_varstate_string("cwmp", "@uploaddiagnostic[0]", "TestFileLength", &size);
+		dmuci_get_varstate_string("cwmp", "@uploaddiagnostic[0]", "device", &interface);
+	}
+
+	if ( interface == NULL || interface[0] == '\0' )
+	{
+		error = get_default_gateway_device(&interface);
+		if (error == -1)
+			return -1;
+	}
+	if (diagnostic_type == DOWNLOAD_DIAGNOSTIC)
+	{
+		//Free uci_varstate_ctx
+		end_uci_varstate_ctx();
+
+		dmcmd("/bin/sh", 5, DOWNLOAD_DIAGNOSTIC_PATH, "run", "usp", url, interface);
+
+		//Allocate uci_varstate_ctx
+		init_uci_varstate_ctx();
+
+		dmuci_get_varstate_string("cwmp", "@downloaddiagnostic[0]", "url", &url);
+		dmuci_get_varstate_string("cwmp", "@downloaddiagnostic[0]", "DiagnosticState", &status);
+		if (status && strcmp(status, "Completed") == 0)
+		{
+			init_download_stats();
+			if(strncmp(url,DOWNLOAD_UPLOAD_PROTOCOL_HTTP,strlen(DOWNLOAD_UPLOAD_PROTOCOL_HTTP)) == 0)
+				extract_stats(DOWNLOAD_DUMP_FILE, DOWNLOAD_DIAGNOSTIC_HTTP, DOWNLOAD_DIAGNOSTIC, "usp");
+			if(strncmp(url,DOWNLOAD_UPLOAD_PROTOCOL_FTP,strlen(DOWNLOAD_UPLOAD_PROTOCOL_FTP)) == 0)
+				extract_stats(DOWNLOAD_DUMP_FILE, DOWNLOAD_DIAGNOSTIC_FTP, DOWNLOAD_DIAGNOSTIC, "usp");
+		}
+		else if (status && strncmp(status, "Error_", strlen("Error_")) == 0)
+			return -1;
+	}
+	else
+	{
+		//Free uci_varstate_ctx
+		end_uci_varstate_ctx();
+
+		dmcmd("/bin/sh", 6, UPLOAD_DIAGNOSTIC_PATH, "run", "usp", url, interface, size);
+
+		//Allocate uci_varstate_ctx
+		init_uci_varstate_ctx();
+
+		dmuci_get_varstate_string("cwmp", "@uploaddiagnostic[0]", "url", &url);
+		dmuci_get_varstate_string("cwmp", "@uploaddiagnostic[0]", "DiagnosticState", &status);
+		if (status && strcmp(status, "Completed") == 0)
+		{
+			init_upload_stats();
+			if(strncmp(url,DOWNLOAD_UPLOAD_PROTOCOL_HTTP,strlen(DOWNLOAD_UPLOAD_PROTOCOL_HTTP)) == 0)
+				extract_stats(UPLOAD_DUMP_FILE, DOWNLOAD_DIAGNOSTIC_HTTP, UPLOAD_DIAGNOSTIC, "usp");
+			if(strncmp(url,DOWNLOAD_UPLOAD_PROTOCOL_FTP,strlen(DOWNLOAD_UPLOAD_PROTOCOL_FTP)) == 0)
+				extract_stats(UPLOAD_DUMP_FILE, DOWNLOAD_DIAGNOSTIC_FTP, UPLOAD_DIAGNOSTIC, "usp");
+		}
+		else if (status && strncmp(status, "Error_", strlen("Error_")) == 0)
+			return -1;
+	}
+	return 0;
+}
diff --git a/dmdiagnostics.h b/dmdiagnostics.h
new file mode 100644
index 0000000000000000000000000000000000000000..e4684bb6e00f657ac0da52c0a0abb80221432243
--- /dev/null
+++ b/dmdiagnostics.h
@@ -0,0 +1,79 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2019 iopsys Software Solutions AB
+ *	  Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#ifndef __DMDIAGNOSTICS_H__
+#define __DMDIAGNOSTICS_H__
+
+#define DOWNLOAD_UPLOAD_PROTOCOL_HTTP		"http://"
+#define DOWNLOAD_UPLOAD_PROTOCOL_FTP		"ftp://"
+#define default_date_format "AAAA-MM-JJTHH:MM:SS.000000Z"
+#define default_date_size sizeof(default_date_format) + 1
+#define FTP_SIZE_RESPONSE "213"
+#define FTP_PASV_RESPONSE "227 Entering Passive"
+#define FTP_TRANSFERT_COMPLETE "226 Transfer"
+#define FTP_RETR_REQUEST "RETR"
+#define FTP_STOR_REQUEST "STOR"
+
+struct download_diag
+{
+	char romtime[default_date_size];
+	char bomtime[default_date_size];
+	char eomtime[default_date_size];
+	int test_bytes_received;
+	unsigned long total_bytes_received;
+	char tcpopenrequesttime[default_date_size];
+	char tcpopenresponsetime[default_date_size];
+	int tmp;
+	int first_data;
+	uint16_t ip_len;
+	uint32_t ack_seq;
+	uint32_t random_seq;
+	uint32_t get_ack;
+	uint32_t ftp_syn;
+};
+
+struct upload_diagnostic_stats
+{
+	char romtime[default_date_size];
+	char bomtime[default_date_size];
+	char eomtime[default_date_size];
+	unsigned long total_bytes_sent;
+	char tcpopenrequesttime[default_date_size];
+	char tcpopenresponsetime[default_date_size];
+	int tmp;
+	int first_data;
+	uint16_t ip_len;
+	uint32_t ack_seq;
+	uint32_t random_seq;
+	uint32_t get_ack;
+	uint32_t ftp_syn;
+};
+
+
+enum download_diagnostic_protocol {
+	DOWNLOAD_DIAGNOSTIC_HTTP = 1,
+	DOWNLOAD_DIAGNOSTIC_FTP
+};
+
+enum diagnostic_type {
+	DOWNLOAD_DIAGNOSTIC = 1,
+	UPLOAD_DIAGNOSTIC
+};
+
+char *get_param_diagnostics(char *diag, char *option);
+void set_param_diagnostics(char *diag, char *option, char *value);
+void init_download_stats(void);
+void init_upload_stats(void);
+int extract_stats(char *dump_file, int proto, int diagnostic_type, char *protocol);
+int get_default_gateway_device( char **gw );
+int start_upload_download_diagnostic(int diagnostic_type);
+
+#endif
diff --git a/dmentry.c b/dmentry.c
new file mode 100644
index 0000000000000000000000000000000000000000..a3ccd7b22fd2bd63126de310b34110d42745db5e
--- /dev/null
+++ b/dmentry.c
@@ -0,0 +1,1989 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author MOHAMED Kallel <mohamed.kallel@pivasoftware.com>
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *	  Author Feten Besbes <feten.besbes@pivasoftware.com>
+ *
+ */
+
+#include "dmcwmp.h"
+#include "dmubus.h"
+#include "dmuci.h"
+#include "dmentry.h"
+#include "device.h"
+#include "wepkey.h"
+#include <unistd.h>
+#include <sys/wait.h>
+#include <ctype.h>
+#include "dmcommon.h"
+#include "dmoperate.h"
+
+LIST_HEAD(head_package_change);
+unsigned char dmcli_timetrack = 0;
+unsigned char dmcli_evaluatetest = 0;
+
+static void print_dm_help(void)
+{
+	printf("Usage:\n");
+	printf(" get_value [param]\n");
+	printf(" set_value <parameter key> <param1> <val1> [<param2> <val2>] .... [<param N> <val N>]\n");
+	printf(" get_name <param> <Next Level>\n");
+	printf(" get_notification [param]\n");
+	printf(" set_notification <param1> <notif1> <change1> [<param2> <notif2> <change2>] ....[<param N> <notif N> <change N>]\n");
+	printf(" add_obj <param> <parameter key>\n");
+	printf(" del_obj <param> <parameter key>\n");
+	printf(" inform\n");
+#ifdef BBF_TR064
+	printf(" upnp_get_values [param]\n");
+	printf(" upnp_get_selected_values [param]\n");
+	printf(" upnp_get_instances <param> <depth>\n");
+	printf(" upnp_get_supported_parameters <param> <depth>\n");
+	printf(" upnp_set_values <param1> <val1> [<param2> <val2>] .... [<param N> <val N>]\n");
+	printf(" upnp_get_attributes <param>\n");
+	printf(" upnp_set_attributes <param 1> <EventOnChange 1> <AlarmOnChange 1> .... [<param N> <EventOnChange N> <AlarmOnChange N>\n");
+	printf(" upnp_add_instance <param> [<sub param 1> <val1>] [<sub param 2> <val2>] .... [<sub param N> <val N>]\n");
+	printf(" upnp_delete_instance <param>\n");
+	printf(" upnp_get_acldata <param>\n");
+	printf(" upnp_init_state_variables\n");
+	printf(" upnp_get_supported_parameters_update\n");
+	printf(" upnp_get_supported_datamodel_update\n");
+	printf(" upnp_get_configuration_update\n");
+	printf(" upnp_get_current_configuration_version\n");
+	printf(" upnp_get_attribute_values_update\n");
+	printf(" upnp_load_enabled_parametrs_track\n");
+	printf(" upnp_get_enabled_parametrs_alarm\n");
+	printf(" upnp_get_enabled_parametrs_event\n");
+	printf(" upnp_get_enabled_parametrs_version\n");
+	printf(" upnp_check_changed_parametrs_alarm\n");
+	printf(" upnp_check_changed_parametrs_event\n");
+	printf(" upnp_check_changed_parametrs_version\n");
+#endif
+	printf(" external_command <command> [arg 1] [arg 2] ... [arg N]\n");
+	printf(" exit\n");
+}
+
+static int dm_ctx_init_custom(struct dmctx *ctx, unsigned int dm_type, unsigned int amd_version, unsigned int instance_mode, int custom)
+{
+#ifdef BBF_TR064
+	UPNP_SUPPORTED_DM *tUPNPSupportedDM = NULL;
+#endif
+	if (custom == CTX_INIT_ALL) {
+		memset(&dmubus_ctx, 0, sizeof(struct dmubus_ctx));
+		INIT_LIST_HEAD(&dmubus_ctx.obj_head);
+		uci_ctx = uci_alloc_context();
+		uci_varstate_ctx = uci_alloc_context();
+		DMUCI_INIT(icwmpd);
+	}
+	INIT_LIST_HEAD(&ctx->list_parameter);
+	INIT_LIST_HEAD(&ctx->set_list_tmp);
+	INIT_LIST_HEAD(&ctx->list_fault_param);
+	ctx->amd_version = amd_version;
+	ctx->instance_mode = instance_mode;
+	ctx->dm_type = dm_type;
+#ifdef BBF_TR064
+	if (dm_type == DM_UPNP) {
+		if(uci_data_model == DM_TR098) {
+			strcpy(dmroot, DMROOT_UPNP);
+			dm_delim = DMDELIM_UPNP;
+			ctx->dm_entryobj = tEntry098ObjUPNP;
+			ctx->user_mask = upnp_in_user_mask;
+		}
+		else {
+			strcpy(dmroot, DMROOT_UPNP);
+			dm_delim = DMDELIM_UPNP;
+			ctx->dm_entryobj = tEntry181ObjUPNP;
+			ctx->user_mask = upnp_in_user_mask;
+		}
+	}
+	else {
+		if(uci_data_model == DM_TR098) {
+			strcpy(dmroot, "InternetGatewayDevice");
+			dm_delim = DMDELIM_CWMP;
+			ctx->dm_entryobj = tEntry098Obj;
+		}
+		else {
+			strcpy(dmroot, "Device");
+			dm_delim = DMDELIM_CWMP;
+			ctx->dm_entryobj = tEntry181Obj;
+		}
+	}
+
+	if(uci_data_model == DM_TR098) {
+		tUPNPSupportedDM = malloc(tr98_size);
+		if (tUPNPSupportedDM == NULL) {
+			exit(0);
+		}
+		tUPNPSupportedDM = tUPNPSupportedDM_098;
+	}
+	else {
+		tUPNPSupportedDM = malloc(tr181_size);
+		if (tUPNPSupportedDM == NULL) {
+			exit(0);
+		}
+		tUPNPSupportedDM = tUPNPSupportedDM_181;
+	}
+
+	free(tUPNPSupportedDM);
+#else
+	strcpy(dmroot, "Device");
+	dm_delim = DMDELIM_CWMP;
+	ctx->dm_entryobj = tEntry181Obj;
+#endif
+	return 0;
+}
+
+static int dm_ctx_clean_custom(struct dmctx *ctx, int custom)
+{
+	free_all_list_parameter(ctx);
+	free_all_set_list_tmp(ctx);
+	free_all_list_fault_param(ctx);
+	DMFREE(ctx->addobj_instance);
+	if (custom == CTX_INIT_ALL) {
+		if (uci_ctx) uci_free_context(uci_ctx);
+		uci_ctx = NULL;
+		if (uci_varstate_ctx) uci_free_context(uci_varstate_ctx);
+		uci_varstate_ctx = NULL;
+		DMUCI_EXIT(icwmpd);
+		dmubus_ctx_free(&dmubus_ctx);
+		dmcleanmem();
+	}
+	return 0;
+}
+
+int dm_ctx_init(struct dmctx *ctx, unsigned int dm_type, unsigned int amd_version, unsigned int instance_mode)
+{
+	dm_ctx_init_custom(ctx, dm_type, amd_version, instance_mode, CTX_INIT_ALL);
+	return 0;
+}
+
+int dm_ctx_clean(struct dmctx *ctx)
+{
+	dm_ctx_clean_custom(ctx, CTX_INIT_ALL);
+	return 0;
+}
+
+int dm_ctx_init_sub(struct dmctx *ctx, unsigned int dm_type, unsigned int amd_version, unsigned int instance_mode)
+{
+	dm_ctx_init_custom(ctx, dm_type, amd_version, instance_mode, CTX_INIT_SUB);
+	return 0;
+}
+
+int dm_ctx_clean_sub(struct dmctx *ctx)
+{
+	dm_ctx_clean_custom(ctx, CTX_INIT_SUB);
+	return 0;
+}
+
+void dmentry_instance_lookup_inparam(struct dmctx *ctx)
+{
+	char *pch, *spch, *in_param;
+	in_param = dmstrdup(ctx->in_param);
+	int i = 0;
+	char pat[2] = {0};
+	*pat = dm_delim;
+	for (pch = strtok_r(in_param, pat, &spch); pch != NULL; pch = strtok_r(NULL, pat, &spch)) {
+		if (pch[0]== '[') {
+			ctx->alias_register |= (1 << i);
+			i++;
+		} else if (isdigit(pch[0])) {
+			i++;
+		}
+	}
+	dmfree(in_param);
+	ctx->nbrof_instance = i;
+}
+
+int dm_entry_param_method(struct dmctx *ctx, int cmd, char *inparam, char *arg1, char *arg2)
+{
+	int fault = 0;
+	bool setnotif = true;
+	bool alarm = false, event = false;
+	int err, err2;
+	
+	if (!inparam) inparam = "";
+	ctx->in_param = inparam;
+	dmentry_instance_lookup_inparam(ctx);
+	ctx->stop = false;
+	switch(cmd) {
+		case CMD_GET_VALUE:
+			if (ctx->dm_type == DM_CWMP && ctx->in_param[0] == dm_delim && strlen(ctx->in_param) == 1)
+				fault = FAULT_9005;
+			else
+				fault = dm_entry_get_value(ctx);
+			break;
+		case CMD_GET_NAME:
+			if (ctx->dm_type == DM_CWMP && ctx->in_param[0] == dm_delim && strlen(ctx->in_param) == 1)
+				fault = FAULT_9005;
+			else if (arg1 && string_to_bool(arg1, &ctx->nextlevel) == 0){
+				fault = dm_entry_get_name(ctx);
+			} else {
+				fault = FAULT_9003;
+			}
+			break;
+		case CMD_GET_NOTIFICATION:
+			if (ctx->dm_type == DM_CWMP && ctx->in_param[0] == dm_delim && strlen(ctx->in_param) == 1)
+				fault = FAULT_9005;
+			else
+				fault = dm_entry_get_notification(ctx);
+			break;
+		case CMD_SET_VALUE:
+			ctx->in_value = arg1 ? arg1 : "";
+			ctx->setaction = VALUECHECK;
+			fault = dm_entry_set_value(ctx);
+			if (fault)
+				add_list_fault_param(ctx, ctx->in_param, fault);
+			break;
+		case CMD_SET_NOTIFICATION:
+			if (arg2)
+				err = string_to_bool(arg2, &setnotif);
+			if (!err && arg1 &&
+				(strcmp(arg1, "0") == 0 ||
+				strcmp(arg1, "1") == 0  ||
+				strcmp(arg1, "2") == 0 ||
+				strcmp(arg1, "3") == 0 ||
+				strcmp(arg1, "4") == 0 ||
+				strcmp(arg1, "5") == 0 ||
+				strcmp(arg1, "6") == 0)) {
+				ctx->in_notification = arg1;
+				ctx->setaction = VALUECHECK;
+				ctx->notification_change = setnotif;
+				fault = dm_entry_set_notification(ctx);
+			} else {
+				fault = FAULT_9003;
+			}
+			break;
+		case CMD_INFORM:
+			dm_entry_inform(ctx);
+			break;
+		case CMD_ADD_OBJECT:
+			fault = dm_entry_add_object(ctx);
+			if (!fault) {
+				dmuci_set_value("cwmp", "acs", "ParameterKey", arg1 ? arg1 : "");
+				dmuci_change_packages(&head_package_change);
+			}
+			break;
+		case CMD_DEL_OBJECT:
+			fault = dm_entry_delete_object(ctx);
+			if (!fault) {
+				dmuci_set_value("cwmp", "acs", "ParameterKey", arg1 ? arg1 : "");
+				dmuci_change_packages(&head_package_change);
+			}
+			break;
+		case CMD_USP_OPERATE:
+			ctx->in_value = arg1 ? arg1 : "";
+			fault = dm_entry_operate(ctx);
+			break;
+#ifdef BBF_TR064
+		case CMD_UPNP_GET_SUPPORTED_PARAMETERS:
+			ctx->depth = atoi(arg1);
+			fault = dm_entry_upnp_get_supported_parameters(ctx);
+			break;
+		case CMD_UPNP_GET_VALUES:
+			fault = dm_entry_upnp_get_values(ctx);
+			break;
+		case CMD_UPNP_GET_SELECTED_VALUES:
+			fault = dm_entry_upnp_get_selected_values(ctx);
+			break;
+		case CMD_UPNP_GET_INSTANCES:
+			ctx->depth = atoi(arg1);
+			fault = dm_entry_upnp_get_instances(ctx);
+			break;
+		case CMD_UPNP_SET_VALUES:
+			ctx->in_value = arg1 ? arg1 : "";
+			ctx->setaction = VALUECHECK;
+			fault = dm_entry_upnp_set_values(ctx);
+			break;
+		case CMD_UPNP_SET_ATTRIBUTES:
+			if (arg1)
+				err = string_to_bool(arg1, &event);
+			if (arg2)
+				err2 = string_to_bool(arg2, &alarm);
+			if (!err && !err2) {
+				ctx->dmparam_flags |= (event) ? DM_PARAM_EVENT_ON_CHANGE : 0;
+				ctx->dmparam_flags |= (alarm) ? DM_PARAM_ALARAM_ON_CHANGE : 0;
+				ctx->setaction = VALUECHECK;
+				fault = dm_entry_upnp_set_attributes(ctx);
+			} else {
+				fault = FAULT_9003;
+			}
+			break;
+		case CMD_UPNP_GET_ATTRIBUTES:
+			fault = dm_entry_upnp_get_attributes(ctx);
+			break;
+		case CMD_UPNP_DEL_INSTANCE:
+			fault = dm_entry_upnp_delete_instance(ctx);
+			if (!fault) {
+				dmuci_change_packages(&head_package_change);
+			}
+			break;
+		case CMD_UPNP_ADD_INSTANCE:
+			fault = dm_entry_upnp_add_instance(ctx);
+			if (!fault) {
+				dmuci_change_packages(&head_package_change);
+			}
+			break;
+		case CMD_UPNP_GET_ACLDATA:
+			fault = dm_entry_upnp_get_acl_data(ctx);
+			break;
+#endif
+	}
+	dmuci_commit();
+	return fault;
+}
+
+int dm_entry_apply(struct dmctx *ctx, int cmd, char *arg1, char *arg2)
+{
+	int fault = 0;
+	struct set_tmp *n, *p;
+	
+	switch(cmd) {
+		case CMD_SET_VALUE:
+			ctx->setaction = VALUESET;
+			list_for_each_entry_safe(n, p, &ctx->set_list_tmp, list) {
+				ctx->in_param = n->name;
+				ctx->in_value = n->value ? n->value : "";
+				ctx->stop = false;
+				fault = dm_entry_set_value(ctx);
+				if (fault) break;
+			}
+			if (fault) {
+				//Should not happen
+				dmuci_revert();
+				add_list_fault_param(ctx, ctx->in_param, fault);
+			} else {
+				dmuci_set_value("cwmp", "acs", "ParameterKey", arg1 ? arg1 : "");
+				dmuci_change_packages(&head_package_change);
+				dmuci_commit();
+			}
+			free_all_set_list_tmp(ctx);
+			break;
+		case CMD_SET_NOTIFICATION:
+			ctx->setaction = VALUESET;
+			list_for_each_entry_safe(n, p, &ctx->set_list_tmp, list) {
+				ctx->in_param = n->name;
+				ctx->in_notification = n->value ? n->value : "0";
+				ctx->stop = false;
+				fault = dm_entry_set_notification(ctx);
+				if (fault) break;
+			}
+			if (fault) {
+				//Should not happen
+				dmuci_revert();
+			} else {
+				dmuci_commit();
+			}
+			free_all_set_list_tmp(ctx);
+			break;
+#ifdef BBF_TR064
+		case CMD_UPNP_SET_VALUES:
+			ctx->setaction = VALUESET;
+			list_for_each_entry_safe(n, p, &ctx->set_list_tmp, list) {
+				ctx->in_param = n->name;
+				ctx->in_value = n->value ? n->value : "";
+				ctx->stop = false;
+				fault = dm_entry_upnp_set_values(ctx);
+				if (fault) break;
+			}
+			if (fault) {
+				//Should not happen
+				dmuci_revert();
+			} else {
+				dmuci_change_packages(&head_package_change);
+				dmuci_commit();
+			}
+			break;
+		case CMD_UPNP_SET_ATTRIBUTES:
+			ctx->setaction = VALUESET;
+			list_for_each_entry_safe(n, p, &ctx->set_list_tmp, list) {
+				ctx->in_param = n->name;
+				ctx->dmparam_flags = n->flags;
+				ctx->stop = false;
+				fault = dm_entry_upnp_set_attributes(ctx);
+				if (fault) break;
+			}
+			if (fault) {
+				//Should not happen
+				dmuci_revert();
+			} else {
+				dmuci_commit();
+			}
+			free_all_set_list_tmp(ctx);
+			break;
+#endif
+	}
+	return fault;
+}
+
+int dm_entry_load_enabled_notify(unsigned int dm_type, unsigned int amd_version, int instance_mode)
+{
+	struct dmctx dmctx = {0};
+
+	dm_ctx_init(&dmctx, dm_type, amd_version, instance_mode);
+	dmctx.in_param = "";
+
+	free_all_list_enabled_lwnotify();
+	dm_entry_enabled_notify_check_value_change(&dmctx);
+	dm_entry_enabled_notify(&dmctx);
+
+	dm_ctx_clean(&dmctx);
+	return 0;
+}
+
+int dm_entry_reload_enabled_notify(unsigned int dm_type, unsigned int amd_version, int instance_mode)
+{
+	struct dmctx dmctx = {0};
+
+	dm_ctx_init(&dmctx, dm_type, amd_version, instance_mode);
+	dmctx.in_param = "";
+
+	free_all_list_enabled_lwnotify();
+	dm_entry_enabled_notify(&dmctx);
+
+	dm_ctx_clean(&dmctx);
+	return 0;
+}
+
+int adm_entry_get_linker_param(struct dmctx *ctx, char *param, char *linker, char **value)
+{
+	struct dmctx dmctx = {0};
+
+	dm_ctx_init_sub(&dmctx, ctx->dm_type, ctx->amd_version, ctx->instance_mode);
+	dmctx.in_param = param ? param : "";
+	dmctx.linker = linker;
+
+	dm_entry_get_linker(&dmctx);
+	*value = dmctx.linker_param;
+	dm_ctx_clean_sub(&dmctx);
+	return 0;
+}
+
+int adm_entry_get_linker_value(struct dmctx *ctx, char *param, char **value)
+{
+	struct dmctx dmctx = {0};
+	*value = NULL;
+
+	if (!param || param[0] == '\0') {
+		return 0;
+	}
+
+	dm_ctx_init_sub(&dmctx, ctx->dm_type, ctx->amd_version, ctx->instance_mode);
+	dmctx.in_param = param;
+
+	dm_entry_get_linker_value(&dmctx);
+	*value = dmctx.linker;
+
+	dm_ctx_clean_sub(&dmctx);
+	return 0;
+}
+
+#ifdef BBF_TR064
+/****************************************
+ * upnp load tracked on change parameters
+ ****************************************/
+
+int dm_entry_upnp_load_tracked_parameters(struct dmctx *dmctx)
+{
+
+	dmctx->in_param = "";
+
+	free_all_list_upnp_param_track(&list_upnp_enabled_onevent);
+	free_all_list_upnp_param_track(&list_upnp_enabled_onalarm);
+	free_all_list_upnp_param_track(&list_upnp_enabled_version);
+	dm_entry_upnp_tracked_parameters(dmctx);
+
+	return 0;
+}
+
+/*********************************************
+ * upnp check on change params (event & alarm)
+ *********************************************/
+
+void dm_upnp_update_enabled_track_value(struct dm_upnp_enabled_track *p, char *new_value)
+{
+	free(p->value); // Should be free and not dmfree
+	p->value = strdup(new_value);
+}
+
+void dm_upnp_update_enabled_track_key(struct dm_upnp_enabled_track *p, char *key)
+{
+	free(p->key); // Should be free and not dmfree
+	p->key = strdup(key);
+}
+
+int dm_entry_upnp_check_onchange_param(struct dmctx *pctx, struct list_head *enabled_head, struct list_head *changed_head)
+{
+	struct dmctx dmctx = {0};
+	struct dm_upnp_enabled_track *p;
+	struct dm_parameter *dm_parameter;
+	int fault;
+	int ischange = 0;
+	char *all_instances;
+
+	list_for_each_entry(p, enabled_head, list) {
+		dm_ctx_init_sub(&dmctx, pctx->dm_type, pctx->amd_version, pctx->instance_mode);
+		dmctx.user_mask = DM_SUPERADMIN_MASK;
+		if (p->isobj) {
+			all_instances = dm_entry_get_all_instance_numbers(&dmctx, p->name);
+			if (all_instances && strcmp(all_instances, p->value) != 0) {
+				dm_upnp_update_enabled_track_value(p, all_instances);
+				add_list_upnp_param_track(&dmctx, changed_head, p->name, "1", all_instances, 1);
+				ischange = 1;
+			}
+		}
+		else {
+			fault = dm_entry_param_method(&dmctx, CMD_UPNP_GET_VALUES, p->name, NULL, NULL);
+			if (!fault && dmctx.list_parameter.next != &dmctx.list_parameter) {
+				dm_parameter = list_entry(dmctx.list_parameter.next, struct dm_parameter, list);
+				if (strcmp(dm_parameter->data, p->value) != 0) {
+					dm_upnp_update_enabled_track_value(p, dm_parameter->data);
+					add_list_upnp_param_track(&dmctx, changed_head, p->name, "1", dm_parameter->data, 0);
+					ischange = 1;
+				}
+			}
+			free_all_list_parameter(&dmctx);
+		}
+		dm_ctx_clean_sub(&dmctx);
+		memset(&dmctx, 0, sizeof(struct dmctx));
+	}
+	return ischange;
+}
+
+int dm_entry_upnp_check_alarmonchange_param(struct dmctx *dmctx)
+{
+	int r;
+	r = dm_entry_upnp_check_onchange_param(dmctx, &list_upnp_enabled_onalarm, &list_upnp_changed_onalarm);
+	return r;
+}
+
+int dm_entry_upnp_check_eventonchange_param(struct dmctx *dmctx)
+{
+	int r;
+	r = dm_entry_upnp_check_onchange_param(dmctx, &list_upnp_enabled_onevent, &list_upnp_changed_onevent);
+	return r;
+}
+
+/*************************************
+ * upnp check on change version params
+ *************************************/
+
+int dm_entry_upnp_update_version_configuration(struct dmctx *dmctx)
+{
+	char *v, *tmp, buf[32];
+	struct uci_section *s;
+	int version;
+
+	dmuci_get_option_value_string(UPNP_CFG, "@dm[0]", "current_configuration_version", &v);
+	version = atoi(v);
+	version++;
+
+	dmuci_get_section_type(UPNP_CFG, "@dm[0]", &tmp);
+	if (!tmp || tmp[0] == '\0') {
+		dmuci_add_section(UPNP_CFG, "dm", &s, &tmp);
+	}
+	sprintf(buf, "%d", version);
+	dmuci_set_value(UPNP_CFG, "@dm[0]", "current_configuration_version", buf);
+	sprintf(buf, "%ld", time(NULL));
+	dmuci_set_value(UPNP_CFG, "@dm[0]", "current_configuration_epochtime", buf);
+
+	return version;
+}
+
+int dm_entry_upnp_check_versiononchange_param(struct dmctx *pctx)
+{
+	struct dmctx dmctx = {0};
+	struct dm_upnp_enabled_track *p;
+	struct dm_parameter *dm_parameter;
+	int version, fault;
+	int ischange;
+	char *all_instances;
+
+	list_for_each_entry(p, &list_upnp_enabled_version, list) {
+		ischange = 0;
+		dm_ctx_init_sub(&dmctx, pctx->dm_type, pctx->amd_version, pctx->instance_mode);
+		dmctx.user_mask = DM_SUPERADMIN_MASK;
+		if (p->isobj) {
+			all_instances = dm_entry_get_all_instance_numbers(&dmctx, p->name);
+			if (strcmp(all_instances, p->value) != 0) {
+				dm_upnp_update_enabled_track_value(p, all_instances);
+				add_list_upnp_param_track(&dmctx, &list_upnp_changed_version, p->name, "1", all_instances, 1);
+				ischange = 1;
+			}
+		}
+		else {
+			fault = dm_entry_param_method(&dmctx, CMD_UPNP_GET_VALUES, p->name, NULL, NULL);
+			if (!fault && dmctx.list_parameter.next != &dmctx.list_parameter) {
+				dm_parameter = list_entry(dmctx.list_parameter.next, struct dm_parameter, list);
+				if (strcmp(dm_parameter->data, p->value) != 0) {
+					dm_upnp_update_enabled_track_value(p, dm_parameter->data);
+					add_list_upnp_param_track(&dmctx, &list_upnp_changed_version, p->name, p->key, dm_parameter->data, 0);
+					ischange = 1;
+				}
+			}
+			free_all_list_parameter(&dmctx);
+		}
+		if (ischange)
+		{
+			char buf[32];
+			char *tmp;
+			struct uci_section *s = NULL;
+			version = dm_entry_upnp_update_version_configuration(&dmctx);
+			sprintf(buf, "%d", version);
+			if (p->key) {
+				dmuci_set_value(UPNP_CFG, p->key, "version", buf);
+			}
+			else {
+				dmuci_add_section(UPNP_CFG, "parameter_version", &s, &tmp);
+				if (s != NULL) {
+					dmuci_set_value_by_section(s, "version", buf);
+					dmuci_set_value_by_section(s, "parameter", p->name);
+					dm_upnp_update_enabled_track_key(p, section_name(s));
+				}
+			}
+			dmuci_commit();
+		}
+		dm_ctx_clean_sub(&dmctx);
+		memset(&dmctx, 0, sizeof(struct dmctx));
+	}
+	return ischange;
+}
+
+/* *************************
+ * UPNP init state variables
+ * ************************/
+int upnp_state_variables_init(struct dmctx *dmctx)
+{
+	char *v, *tmp;
+	struct uci_section *s;
+	char buf[32];
+	int n;
+
+	dmuci_get_section_type(UPNP_CFG, "@dm[0]", &tmp);
+	if (!tmp || tmp[0] == '\0') {
+		dmuci_add_section(UPNP_CFG, "dm", &s, &tmp);
+	}
+	dmuci_get_option_value_string(UPNP_CFG, "@dm[0]", "supported_datamodel_version", &v);
+	n = atoi(v);
+	if (n != UPNP_SUPPORTED_DATAMODEL_VERSION) {
+		sprintf(buf, "%d", UPNP_SUPPORTED_DATAMODEL_VERSION);
+		dmuci_set_value(UPNP_CFG, "@dm[0]", "supported_datamodel_version", buf);
+		sprintf(buf, "%ld", time(NULL));
+		dmuci_set_value(UPNP_CFG, "@dm[0]", "supported_datamodel_epochtime", buf);
+	}
+	dmuci_get_option_value_string(UPNP_CFG, "@dm[0]", "supported_parameters_version", &v);
+	n = atoi(v);
+	if (n != UPNP_SUPPORTED_PARAMETERS_VERSION) {
+		sprintf(buf, "%d", UPNP_SUPPORTED_PARAMETERS_VERSION);
+		dmuci_set_value(UPNP_CFG, "@dm[0]", "supported_parameters_version", buf);
+		sprintf(buf, "%ld", time(NULL));
+		dmuci_set_value(UPNP_CFG, "@dm[0]", "supported_parameters_epochtime", buf);
+	}
+	dmuci_get_option_value_string(UPNP_CFG, "@dm[0]", "current_configuration_version", &v);
+	if (*v == '\0') {
+		dmuci_set_value(UPNP_CFG, "@dm[0]", "current_configuration_version", "0");
+		sprintf(buf, "%ld", time(NULL));
+		dmuci_set_value(UPNP_CFG, "@dm[0]", "current_configuration_epochtime", buf);
+	}
+	dmuci_get_option_value_string(UPNP_CFG, "@dm[0]", "attribute_values_version", &v);
+	if (*v == '\0') {
+		dmuci_set_value(UPNP_CFG, "@dm[0]", "attribute_values_version", "0");
+		sprintf(buf, "%ld", time(NULL));
+		dmuci_set_value(UPNP_CFG, "@dm[0]", "attribute_values_epochtime", buf);
+	}
+
+	dmuci_commit();
+	return 0;
+}
+
+/* ************************************
+ * UPNP get supported parameters update
+ * ***********************************/
+
+int dm_entry_upnp_get_supported_parameters_update(struct dmctx *dmctx, char **value)
+{
+	static char csv[128] = "";
+	char *v;
+	time_t time_value;
+
+	*value = csv;
+
+	dmuci_get_option_value_string(UPNP_CFG, "@dm[0]", "supported_parameters_epochtime", &v);
+	if (v[0] != '0' && v[0] != '\0') {
+		time_value = atoi(v);
+		char s_now[sizeof "AAAA-MM-JJTHH:MM:SS.000Z"];
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S.000Z", localtime(&time_value));
+		sprintf(csv, "%d,%s", UPNP_SUPPORTED_PARAMETERS_VERSION, s_now);
+	}
+
+	return 0;
+}
+
+/* ************************************
+ * UPNP get supported_datamodel update
+ * ***********************************/
+
+int dm_entry_upnp_get_supported_datamodel_update(struct dmctx *dmctx, char **value)
+{
+	static char csv[128] = "";
+	char *v;
+	time_t time_value;
+
+	*value = csv;
+
+	dmuci_get_option_value_string(UPNP_CFG, "@dm[0]", "supported_datamodel_epochtime", &v);
+	if (v[0] != '0' && v[0] != '\0') {
+		time_value = atoi(v);
+		char s_now[sizeof "AAAA-MM-JJTHH:MM:SS.000Z"];
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S.000Z", localtime(&time_value));
+		sprintf(csv, "%d,%s", UPNP_SUPPORTED_DATAMODEL_VERSION, s_now);
+	}
+
+	return 0;
+}
+
+/* ********************************
+ * UPNP get attribute values update
+ * ********************************/
+
+int dm_entry_upnp_get_attribute_values_update(struct dmctx *dmctx, char **value)
+{
+	static char csv[128] = "";
+	char *v, *s;
+	time_t time_value;
+
+	*value = csv;
+
+	dmuci_get_option_value_string(UPNP_CFG, "@dm[0]", "attribute_values_epochtime", &v);
+	dmuci_get_option_value_string(UPNP_CFG, "@dm[0]", "attribute_values_version", &s);
+	if (v[0] != '0' && v[0] != '\0' && s[0] != '\0') {
+		time_value = atoi(v);
+		char s_now[sizeof "AAAA-MM-JJTHH:MM:SS.000Z"];
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S.000Z", localtime(&time_value));
+		sprintf(csv, "%s,%s", s, s_now);
+	}
+
+	return 0;
+}
+
+/* ********************************
+ * UPNP get configuration update
+ * ********************************/
+
+int dm_entry_upnp_get_configuration_update(struct dmctx *dmctx, char **value)
+{
+	static char csv[128] = "";
+	char *v, *s;
+	time_t time_value;
+
+	*value = csv;
+
+	dmuci_get_option_value_string(UPNP_CFG, "@dm[0]", "current_configuration_epochtime", &v);
+	dmuci_get_option_value_string(UPNP_CFG, "@dm[0]", "current_configuration_version", &s);
+	if (v[0] != '\0' && s[0] != '\0') {
+		time_value = atoi(v);
+		char s_now[sizeof "AAAA-MM-JJTHH:MM:SS.000Z"];
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S.000Z", localtime(&time_value));
+		sprintf(csv, "%s,%s", s, s_now);
+	}
+
+	return 0;
+}
+
+/* **************************************
+ * UPNP get current configuration version
+ * *************************************/
+
+int dm_entry_upnp_get_current_configuration_version(struct dmctx *dmctx, char **value)
+{
+	dmuci_get_option_value_string(UPNP_CFG, "@dm[0]", "current_configuration_version", value);
+	return 0;
+}
+#endif
+/************************/
+
+int dm_entry_restart_services(void)
+{
+	struct package_change *pc;
+
+	list_for_each_entry(pc, &head_package_change, list) {
+		if(strcmp(pc->package, "cwmp") == 0)
+			continue;
+		dmubus_call_set("uci", "commit", UBUS_ARGS{{"config", pc->package, String}}, 1);
+	}
+	free_all_list_package_change(&head_package_change);
+
+	return 0;
+}
+
+void dm_apply_config(void)
+{
+	apply_end_session();
+	dm_entry_restart_services();
+}
+
+#ifdef BBF_TR064
+int dm_entry_upnp_restart_services(void)
+{
+	struct package_change *pc;
+
+	list_for_each_entry(pc, &head_package_change, list) {
+		dmubus_call_set("uci", "commit", UBUS_ARGS{{"config", pc->package}}, 1);
+	}
+	free_all_list_package_change(&head_package_change);
+
+	return 0;
+}
+
+void dm_upnp_apply_config(void)
+{
+	apply_end_session();
+	dm_entry_upnp_restart_services();
+}
+
+int cli_output_dm_upnp_variable_state(struct dmctx *dmctx, int cmd, char *variable)
+{
+	switch (cmd) {
+		case CMD_UPNP_GET_CONFIGURATION_UPDATE:
+			fprintf (stdout, "{ \"ConfigurationUpdate\": \"%s\"}\n", variable);
+			break;
+		case CMD_UPNP_GET_CURRENT_CONFIGURATION_VERSION:
+			fprintf (stdout, "{ \"CurrentConfigurationVersion\": \"%s\"}\n", variable);
+			break;
+		case CMD_UPNP_GET_SUPPORTED_DATA_MODEL_UPDATE:
+			fprintf (stdout, "{ \"SupportedDataModelsUpdate\": \"%s\"}\n", variable);
+			break;
+		case CMD_UPNP_GET_SUPPORTED_PARAMETERS_UPDATE:
+			fprintf (stdout, "{ \"SupportedParametersUpdate\": \"%s\"}\n", variable);
+			break;
+		case CMD_UPNP_GET_ATTRIBUTE_VALUES_UPDATE:
+			fprintf (stdout, "{ \"AttributeValuesUpdate\": \"%s\"}\n", variable);
+			break;
+	}
+	return 0;
+}
+#endif
+
+int cli_output_dm_result(struct dmctx *dmctx, int fault, int cmd, int out)
+{
+	struct dm_parameter *n;
+	if (!out) return 0;
+
+	if (dmctx->list_fault_param.next != &dmctx->list_fault_param) {
+		struct param_fault *p;
+		list_for_each_entry(p, &dmctx->list_fault_param, list) {
+			fprintf (stdout, "{ \"parameter\": \"%s\", \"fault\": \"%d\" }\n", p->name, p->fault);
+		}
+		goto end;
+	}
+	if (fault) {
+		fprintf (stdout, "{ \"fault\": \"%d\" }\n", fault);
+		goto end;
+	}
+
+	switch (cmd) {
+	case CMD_ADD_OBJECT:
+		if (dmctx->addobj_instance) {
+			fprintf (stdout, "{ \"status\": \"1\", \"instance\": \"%s\" }\n", dmctx->addobj_instance);
+		} else {
+			fprintf (stdout, "{ \"fault\": \"%d\" }\n", FAULT_9002);
+		}
+		break;
+#ifdef BBF_TR064
+	case CMD_UPNP_ADD_INSTANCE:
+		if (dmctx->addobj_instance) {
+			fprintf (stdout, "{ \"status\": \"ChangesApplied\", \"instance_path\": \"%s%s%c\" }\n", dmctx->in_param, dmctx->addobj_instance, dm_delim);
+		} else {
+			fprintf (stdout, "{ \"fault\": \"%d\" }\n", FAULT_UPNP_701);
+		}
+		break;
+#endif
+	case CMD_DEL_OBJECT:
+	case CMD_SET_VALUE:
+		fprintf (stdout, "{ \"status\": \"1\" }\n");
+		break;
+
+	case CMD_SET_NOTIFICATION:
+		fprintf (stdout, "{ \"status\": \"0\" }\n");
+		break;
+
+#ifdef BBF_TR064
+	case CMD_UPNP_SET_ATTRIBUTES:
+	case CMD_UPNP_SET_VALUES:
+	case CMD_UPNP_DEL_INSTANCE:
+		fprintf (stdout, "{ \"status\": \"ChangesApplied\" }\n");
+		break;
+#endif
+
+	case CMD_GET_NAME:
+		list_for_each_entry(n, &dmctx->list_parameter, list) {
+			fprintf (stdout, "{ \"parameter\": \"%s\", \"writable\": \"%s\" }\n", n->name, n->data);
+		}
+		break;
+	case CMD_GET_NOTIFICATION:
+		list_for_each_entry(n, &dmctx->list_parameter, list) {
+			fprintf (stdout, "{ \"parameter\": \"%s\", \"notification\": \"%s\" }\n", n->name, n->data);
+		}
+		break;
+	case CMD_GET_VALUE:
+	case CMD_INFORM:
+		list_for_each_entry(n, &dmctx->list_parameter, list) {
+			fprintf (stdout, "{ \"parameter\": \"%s\", \"value\": \"%s\", \"type\": \"%s\" }\n", n->name, n->data, n->type);
+		}
+		break;
+
+#ifdef BBF_TR064
+	case CMD_UPNP_GET_VALUES:
+	case CMD_UPNP_GET_SELECTED_VALUES:
+		list_for_each_entry(n, &dmctx->list_parameter, list) {
+			fprintf (stdout, "{ \"parameter\": \"%s\", \"value\": \"%s\" }\n", n->name, n->data);
+		}
+		break;
+	case CMD_UPNP_GET_ATTRIBUTES:
+		list_for_each_entry(n, &dmctx->list_parameter, list) {
+			char alrm[32] = "", evnt[32] = "", btype[16], bversion[32] = "", *stype = NULL;
+			if (n->flags & DM_PARAM_ALARAM_ON_CHANGE)
+				strcpy(alrm, ", \"alarmOnChange\": \"1\"");
+			if (n->flags & DM_PARAM_EVENT_ON_CHANGE)
+				strcpy(evnt, ", \"eventOnChange\": \"1\"");
+			if (n->version)
+				sprintf(bversion, ", \"version\": \"%s\"", n->version);
+			switch (n->flags & NODE_DATA_ATTRIBUTE_TYPEMASK) {
+			case NODE_DATA_ATTRIBUTE_TYPEINT:
+				stype = "int";
+				break;
+			case NODE_DATA_ATTRIBUTE_TYPESTRING:
+				stype = "string";
+				break;
+			case NODE_DATA_ATTRIBUTE_TYPELONG:
+				stype = "long";
+				break;
+			case NODE_DATA_ATTRIBUTE_TYPEBOOL:
+				stype = "boolean";
+				break;
+			case NODE_DATA_ATTRIBUTE_TYPEDATETIME:
+				stype = "dateTime";
+				break;
+			case NODE_DATA_ATTRIBUTE_TYPEPTR:
+				if (n->flags & NODE_DATA_ATTRIBUTE_INSTANCE)
+					stype = "Instance";
+				else if (n->flags & NODE_DATA_ATTRIBUTE_MULTIINSTANCE)
+					stype = "MultiInstance";
+				break;
+			}
+			if (stype)
+				sprintf(btype, ",  \"type\": \"%s\"", stype);
+			fprintf (stdout, "{ \"parameter\": \"%s\", \"access\": \"%s\"%s%s%s%s}\n", n->name, n->data, btype, evnt, alrm, bversion);
+		}
+		break;
+	case CMD_UPNP_GET_INSTANCES:
+	case CMD_UPNP_GET_SUPPORTED_PARAMETERS:
+		list_for_each_entry(n, &dmctx->list_parameter, list) {
+			fprintf (stdout, "{ \"parameter\": \"%s\"}\n", n->name);
+		}
+		break;
+	case CMD_UPNP_GET_ACLDATA:
+		list_for_each_entry(n, &dmctx->list_parameter, list) {
+			char blist[64] = "";
+			char bread[64] = "";
+			char bwrite[64] = "";
+			char bfac[32] = "";
+			if (n->flags & DM_PUBLIC_LIST) {
+				strcat(blist, "Public ");
+			}
+			if (n->flags & DM_BASIC_LIST) {
+				strcat(blist, "Basic ");
+			}
+			if (n->flags & DM_XXXADMIN_LIST) {
+				strcat(blist, "xxxAdmin ");
+			}
+			if (*blist)
+				blist[strlen(blist) - 1] = '\0';
+			if (n->flags & DM_PUBLIC_READ) {
+				strcat(bread, "Public ");
+			}
+			if (n->flags & DM_BASIC_READ) {
+				strcat(bread, "Basic ");
+			}
+			if (n->flags & DM_XXXADMIN_READ) {
+				strcat(bread, "xxxAdmin ");
+			}
+			if (*bread)
+				bread[strlen(bread) - 1] = '\0';
+			if (n->flags & DM_PUBLIC_WRITE) {
+				strcat(bwrite, "Public ");
+			}
+			if (n->flags & DM_BASIC_WRITE) {
+				strcat(bwrite, "Basic ");
+			}
+			if (n->flags & DM_XXXADMIN_WRITE) {
+				strcat(bwrite, "xxxAdmin ");
+			}
+			if (*bwrite)
+				bwrite[strlen(bwrite) - 1] = '\0';
+			if (n->flags & DM_FACTORIZED)
+				sprintf(bfac, ", \"factorized\": \"1\"");
+			fprintf (stdout, "{ \"ACLDataPath\": \"%s\", \"List\": \"%s\", \"Read\": \"%s\", \"Write\": \"%s\"%s }\n", n->name, blist, bread, bwrite, bfac);
+		}
+		break;
+	case CMD_UPNP_GET_ENABLED_PARAMETRS_ALARM:
+		{
+			struct dm_upnp_enabled_track *p;
+			list_for_each_entry(p, &list_upnp_enabled_onalarm, list) {
+				fprintf (stdout, "{ \"parameter\": \"%s\", \"value\": \"%s\", \"key\": \"%s\"}\n", p->name, p->value, p->key ? p->key : "");
+			}
+		}
+		break;
+	case CMD_UPNP_GET_ENABLED_PARAMETRS_EVENT:
+		{
+			struct dm_upnp_enabled_track *p;
+			list_for_each_entry(p, &list_upnp_enabled_onevent, list) {
+				fprintf (stdout, "{ \"parameter\": \"%s\", \"value\": \"%s\", \"key\": \"%s\"}\n", p->name, p->value, p->key ? p->key : "");
+			}
+		}
+		break;
+	case CMD_UPNP_GET_ENABLED_PARAMETRS_VERSION:
+		{
+			struct dm_upnp_enabled_track *p;
+			list_for_each_entry(p, &list_upnp_enabled_version, list) {
+				fprintf (stdout, "{ \"parameter\": \"%s\", \"value\": \"%s\", \"key\": \"%s\"}\n", p->name, p->value, p->key ? p->key : "");
+			}
+		}
+		break;
+	case CMD_UPNP_CHECK_CHANGED_PARAMETRS_ALARM:
+		{
+			struct dm_upnp_enabled_track *p;
+			list_for_each_entry(p, &list_upnp_changed_onalarm, list) {
+				fprintf (stdout, "{ \"parameter\": \"%s\", \"value\": \"%s\", \"key\": \"%s\"}\n", p->name, p->value, p->key ? p->key : "");
+			}
+		}
+		break;
+	case CMD_UPNP_CHECK_CHANGED_PARAMETRS_EVENT:
+		{
+			struct dm_upnp_enabled_track *p;
+			list_for_each_entry(p, &list_upnp_changed_onevent, list) {
+				fprintf (stdout, "{ \"parameter\": \"%s\", \"value\": \"%s\", \"key\": \"%s\"}\n", p->name, p->value, p->key ? p->key : "");
+			}
+		}
+		break;
+	case CMD_UPNP_CHECK_CHANGED_PARAMETRS_VERSION:
+		{
+			struct dm_upnp_enabled_track *p;
+			list_for_each_entry(p, &list_upnp_changed_version, list) {
+				fprintf (stdout, "{ \"parameter\": \"%s\", \"value\": \"%s\", \"key\": \"%s\"}\n", p->name, p->value, p->key ? p->key : "");
+			}
+		}
+		break;
+#endif
+	}
+end:
+	return 0;
+}
+
+static char *parse_arg_r(char *pch, char **last)
+{
+	if (pch == NULL) {
+		pch = *last;
+	}
+
+	if (pch == NULL) {
+		return NULL;
+	}
+
+	for(; *pch != '\0'; pch++)
+	{
+		if(*pch == ' ' || *pch == '\t')
+			continue;
+		if (*pch == '"')
+		{
+			char *s = strchr(++pch, '"');
+			if(s) {
+				*s = '\0';
+				*last = s + 1;
+				return pch;
+			}
+			else {
+				*last = NULL;
+				return NULL;
+			}
+		}
+		else
+		{
+			char *s = strchr(pch, ' ');
+			if(s) {
+				*s = '\0';
+				 *last = s + 1;
+			}
+			else {
+				s = strchr(pch, '\t');
+				if(s) {
+					*s = '\0';
+					 *last = s + 1;
+				}
+				else {
+					*last = NULL;
+				}
+			}
+
+			return pch;
+		}
+	}
+	*last = NULL;
+	return NULL;
+}
+
+static int dmentry_external_cmd(char **argv)
+{
+	int pid;
+
+	if ((pid = fork()) == -1)
+		return -1;
+
+	if (pid == 0) {
+		/* child */
+		execvp(argv[0], argv);
+		exit(ESRCH);
+
+	} else if (pid < 0)
+		return -1;
+
+	int status;
+	while (wait(&status) != pid);
+
+	return 0;
+}
+
+void dm_execute_cli_shell(int argc, char** argv, unsigned int dmtype, unsigned int amd_version, unsigned int instance_mode)
+{
+	struct dmctx cli_dmctx = {0};
+	int output = 1, dmrpc;
+	char *param, *next_level, *parameter_key, *value, *cmd;
+	int fault = 0, status = -1;
+	bool set_fault = false;
+	long ms; // Milliseconds
+	time_t s;  // Seconds
+	struct timespec tstart, tend;
+	unsigned char apply_services = 0;
+
+	if (dmcli_timetrack)
+		clock_gettime(CLOCK_REALTIME, &tstart);
+
+	dm_ctx_init(&cli_dmctx, dmtype, amd_version, instance_mode);
+
+	if (argc < 4) goto invalid_arguments;
+
+	output = atoi(argv[2]);
+	cmd = argv[3];
+
+	check_create_dmmap_package(DMMAP);
+	/* GET NAME */
+	if (strcmp(cmd, "get_name") == 0) {
+		if (argc < 6) goto invalid_arguments;
+		dmrpc = CMD_GET_NAME;
+		param = argv[4];
+		next_level =argv[5];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_GET_NAME, param, next_level, NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_GET_NAME, output);
+	}
+	/* GET VALUE */
+	else if (strcmp(cmd, "get_value") == 0) {
+		if (argc < 5) goto invalid_arguments;
+		dmrpc = CMD_GET_VALUE;
+		param = argv[4];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_GET_VALUE, param, NULL, NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_GET_VALUE, output);
+	}
+	/* GET NOTIFICATION */
+	else if (strcmp(cmd, "get_notification") == 0) {
+		if (argc < 5) goto invalid_arguments;
+		dmrpc = CMD_GET_NOTIFICATION;
+		param = argv[4];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_GET_NOTIFICATION, param, NULL, NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_GET_NOTIFICATION, output);
+	}
+	/* SET VALUE */
+	else if (strcmp(cmd, "set_value") == 0) {
+		if (argc < 7 || (argc % 2) == 0) goto invalid_arguments;
+		dmrpc = CMD_SET_VALUE;
+		int i;
+		for (i = 5; i < argc; i+=2) {
+			param = argv[i];
+			value = argv[i+1];
+			fault = dm_entry_param_method(&cli_dmctx, CMD_SET_VALUE, param, value, NULL);
+			if (fault) set_fault = true;
+		}
+		parameter_key = argv[4];
+		if (!set_fault) {
+			apply_services = 1;
+			fault = dm_entry_apply(&cli_dmctx, CMD_SET_VALUE, parameter_key, NULL);
+		}
+		cli_output_dm_result(&cli_dmctx, fault, CMD_SET_VALUE, output);
+	}
+	/* SET NOTIFICATION */
+	else if (strcmp(cmd, "set_notification") == 0) {
+		if (argc < 6 || (argc % 2) != 0) goto invalid_arguments;
+		dmrpc = CMD_SET_NOTIFICATION;
+		int i;
+		for (i = 4; i < argc; i+=2) {
+			param = argv[i];
+			value = argv[i+1];
+			fault = dm_entry_param_method(&cli_dmctx, CMD_SET_NOTIFICATION, param, value, "1");
+			if (fault) set_fault = true;
+		}
+		if(!set_fault) {
+			fault = dm_entry_apply(&cli_dmctx, CMD_SET_NOTIFICATION, NULL, NULL);
+		}
+		cli_output_dm_result(&cli_dmctx, fault, CMD_SET_NOTIFICATION, output);
+	}
+	/* ADD OBJECT */
+	else if (strcmp(cmd, "add_object") == 0) {
+		if (argc < 6) goto invalid_arguments;
+		dmrpc = CMD_ADD_OBJECT;
+		param =argv[5];
+		parameter_key =argv[4];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_ADD_OBJECT, param, parameter_key, NULL);
+		if (!fault)
+			apply_services = 1;
+		cli_output_dm_result(&cli_dmctx, fault, CMD_ADD_OBJECT, output);
+	}
+	/* DEL OBJECT */
+	else if (strcmp(cmd, "delete_object") == 0) {
+		dmrpc = CMD_DEL_OBJECT;
+		if (argc < 6) goto invalid_arguments;
+		param =argv[5];
+		parameter_key =argv[4];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_DEL_OBJECT, param, parameter_key, NULL);
+		if (!fault)
+			apply_services = 1;
+		cli_output_dm_result(&cli_dmctx, fault, CMD_DEL_OBJECT, output);
+	}
+	/* INFORM */
+	else if (strcmp(cmd, "inform") == 0) {
+		dmrpc = CMD_INFORM;
+		fault = dm_entry_param_method(&cli_dmctx, CMD_INFORM, "", NULL, NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_INFORM, output);
+	}
+#ifdef BBF_TR064
+	/* UPNP GET VALUES */
+	else if (strcmp(cmd, "upnp_get_values") == 0) {
+		if (argc < 5) goto invalid_arguments;
+		dmrpc = CMD_UPNP_GET_VALUES;
+		param = argv[4];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_GET_VALUES, param, NULL, NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_VALUES, output);
+	}
+	/* UPNP GET SELECTED VALUES */
+	else if (strcmp(cmd, "upnp_get_selected_values") == 0) {
+		if (argc < 5) goto invalid_arguments;
+		dmrpc = CMD_UPNP_GET_SELECTED_VALUES;
+		param = argv[4];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_GET_SELECTED_VALUES, param, NULL, NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_SELECTED_VALUES, output);
+	}
+	/* UPNP GET INSTANCES */
+	else if (strcmp(cmd, "upnp_get_instances") == 0) {
+		if (argc < 6) goto invalid_arguments;
+		dmrpc = CMD_UPNP_GET_INSTANCES;
+		param = argv[4];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_GET_INSTANCES, param, argv[5], NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_INSTANCES, output);
+	}
+	/* UPNP GET SUPPORTED PARAMETERS */
+	else if (strcmp(cmd, "upnp_get_supported_parameters") == 0) {
+		if (argc < 6) goto invalid_arguments;
+		dmrpc = CMD_UPNP_GET_SUPPORTED_PARAMETERS;
+		param = argv[4];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_GET_SUPPORTED_PARAMETERS, param, argv[5], NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_SUPPORTED_PARAMETERS, output);
+	}
+	/* UPNP SET VALUE */
+	else if (strcmp(cmd, "upnp_set_values") == 0) {
+		if (argc < 6 || (argc % 2) == 1) goto invalid_arguments;
+		dmrpc = CMD_UPNP_SET_VALUES;
+		int i;
+		for (i = 4; i < argc; i+=2) {
+			param = argv[i];
+			value = argv[i+1];
+			fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_SET_VALUES, param, value, NULL);
+			if (fault) break;
+		}
+		if (!fault) {
+			apply_services = 1;
+			fault = dm_entry_apply(&cli_dmctx, CMD_UPNP_SET_VALUES, NULL, NULL);
+		}
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_SET_VALUES, output);
+	}
+	/* UPNP DEL INSTANCE */
+	else if (strcmp(cmd, "upnp_delete_instance") == 0) {
+		if (argc < 5) goto invalid_arguments;
+		dmrpc = CMD_UPNP_DEL_INSTANCE;
+		param =argv[4];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_DEL_INSTANCE, param, NULL, NULL);
+		if (!fault)
+			apply_services = 1;
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_DEL_INSTANCE, output);
+	}
+	/* UPNP ADD INSTANCE */
+	else if (strcmp(cmd, "upnp_add_instance") == 0) {
+		char buf[256];
+		dmrpc = CMD_UPNP_ADD_INSTANCE;
+		int i;
+		if (argc < 5 || (argc % 2) == 0) goto invalid_arguments;
+		param = argv[4];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_ADD_INSTANCE, param, NULL, NULL);
+		if (!fault && cli_dmctx.addobj_instance) {
+			struct dmctx set_dmctx = {0};
+			apply_services = 1;
+			if (argc >= 6) {
+				dm_ctx_init_sub(&set_dmctx, dmtype, amd_version, instance_mode);
+				for (i = 5; i < argc; i+=2) {
+					sprintf(buf, "%s%s%c%s", param, cli_dmctx.addobj_instance, dm_delim, argv[i]); // concatenate obj path + instance + sub param
+					value = argv[i+1];
+					dm_entry_param_method(&set_dmctx, CMD_UPNP_SET_VALUES, buf, value, NULL);
+				}
+				dm_entry_apply(&set_dmctx, CMD_UPNP_SET_VALUES, NULL, NULL);
+				dm_ctx_clean_sub(&set_dmctx);
+			}
+		}
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_ADD_INSTANCE, output);
+	}
+	/* UPNP GET ATTRIBUTES */
+	else if (strcmp(cmd, "upnp_get_attributes") == 0) {
+		if (argc < 5) goto invalid_arguments;
+		dmrpc = CMD_UPNP_GET_ATTRIBUTES;
+		param = argv[4];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_GET_ATTRIBUTES, param, NULL, NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_ATTRIBUTES, output);
+	}
+	/* UPNP SET ATTRIBUTES */
+	else if (strcmp(cmd, "upnp_set_attributes") == 0) {
+		if (argc < 7 || (argc % 3) != 1) goto invalid_arguments;
+		dmrpc = CMD_UPNP_SET_ATTRIBUTES;
+		int i;
+		for (i = 4; i < argc; i+=3) {
+			param = argv[i];
+			char *evnt = argv[i+1];
+			char *alrm = argv[i+2];
+			fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_SET_ATTRIBUTES, param, evnt, alrm);
+			if (fault) break;
+		}
+		if(!fault) {
+			fault = dm_entry_apply(&cli_dmctx, CMD_UPNP_SET_ATTRIBUTES, NULL, NULL);
+		}
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_SET_ATTRIBUTES, output);
+	}
+	/* UPNP GET ACLDATA */
+	else if (strcmp(cmd, "upnp_get_acldata") == 0) {
+		if (argc < 5) goto invalid_arguments;
+		dmrpc = CMD_UPNP_GET_ACLDATA;
+		param = argv[4];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_GET_ACLDATA, param, NULL, NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_ACLDATA, output);
+	}
+	else if (strcmp(cmd, "upnp_init_state_variables") == 0) {
+		dmrpc = CMD_UPNP_INIT_STATE_VARIABLES;
+		upnp_state_variables_init(&cli_dmctx);
+	}
+	else if (strcmp(cmd, "upnp_get_supported_parameters_update") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_SUPPORTED_PARAMETERS_UPDATE;
+		dm_entry_upnp_get_supported_parameters_update(&cli_dmctx, &var);
+		cli_output_dm_upnp_variable_state(&cli_dmctx, CMD_UPNP_GET_SUPPORTED_PARAMETERS_UPDATE, var);
+	}
+	else if (strcmp(cmd, "upnp_get_supported_datamodel_update") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_SUPPORTED_DATA_MODEL_UPDATE;
+		dm_entry_upnp_get_supported_datamodel_update(&cli_dmctx, &var);
+		cli_output_dm_upnp_variable_state(&cli_dmctx, CMD_UPNP_GET_SUPPORTED_DATA_MODEL_UPDATE, var);
+	}
+	else if (strcmp(cmd, "upnp_get_configuration_update") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_CONFIGURATION_UPDATE;
+		dm_entry_upnp_get_configuration_update(&cli_dmctx, &var);
+		cli_output_dm_upnp_variable_state(&cli_dmctx, CMD_UPNP_GET_CONFIGURATION_UPDATE, var);
+	}
+	else if (strcmp(cmd, "upnp_get_current_configuration_version") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_CURRENT_CONFIGURATION_VERSION;
+		dm_entry_upnp_get_current_configuration_version(&cli_dmctx, &var);
+		cli_output_dm_upnp_variable_state(&cli_dmctx, CMD_UPNP_GET_CURRENT_CONFIGURATION_VERSION, var);
+	}
+	else if (strcmp(cmd, "upnp_get_attribute_values_update") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_ATTRIBUTE_VALUES_UPDATE;
+		dm_entry_upnp_get_attribute_values_update(&cli_dmctx, &var);
+		cli_output_dm_upnp_variable_state(&cli_dmctx, CMD_UPNP_GET_ATTRIBUTE_VALUES_UPDATE, var);
+	}
+	else if (strcmp(cmd, "upnp_load_enabled_parametrs_track") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_LOAD_ENABLED_PARAMETRS_TRACK;
+		dm_entry_upnp_load_tracked_parameters(&cli_dmctx);
+	}
+	else if (strcmp(cmd, "upnp_get_enabled_parametrs_alarm") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_ENABLED_PARAMETRS_ALARM;
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_ENABLED_PARAMETRS_ALARM, output);
+	}
+	else if (strcmp(cmd, "upnp_get_enabled_parametrs_event") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_ENABLED_PARAMETRS_EVENT;
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_ENABLED_PARAMETRS_EVENT, output);
+	}
+	else if (strcmp(cmd, "upnp_get_enabled_parametrs_version") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_ENABLED_PARAMETRS_VERSION;
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_ENABLED_PARAMETRS_VERSION, output);
+	}
+	else if (strcmp(cmd, "upnp_check_changed_parametrs_alarm") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_CHECK_CHANGED_PARAMETRS_ALARM;
+		dm_entry_upnp_check_alarmonchange_param(&cli_dmctx);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_CHECK_CHANGED_PARAMETRS_ALARM, output);
+	}
+	else if (strcmp(cmd, "upnp_check_changed_parametrs_event") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_CHECK_CHANGED_PARAMETRS_EVENT;
+		dm_entry_upnp_check_eventonchange_param(&cli_dmctx);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_CHECK_CHANGED_PARAMETRS_EVENT, output);
+	}
+	else if (strcmp(cmd, "upnp_check_changed_parametrs_version") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_CHECK_CHANGED_PARAMETRS_VERSION;
+		dm_entry_upnp_check_versiononchange_param(&cli_dmctx);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_CHECK_CHANGED_PARAMETRS_VERSION, output);
+	}
+#endif
+	else {
+		goto invalid_arguments;
+	}
+
+	dm_ctx_clean(&cli_dmctx);
+	if (apply_services) {
+		dm_apply_config();
+	}
+
+	if (!fault) {
+		int ualarm, uversion, uevent;
+#ifdef BBF_TR064
+		switch (dmrpc) {
+		case CMD_UPNP_SET_VALUES:
+		case CMD_UPNP_DEL_INSTANCE:
+		case CMD_UPNP_ADD_INSTANCE:
+			DM_ENTRY_UPNP_CHECK_CHANGES(ualarm, uevent, uversion);
+			break;
+		case CMD_UPNP_SET_ATTRIBUTES:
+			DM_ENTRY_UPNP_LOAD_TRACKED_PARAMETERS();
+			break;
+		}
+#endif
+	}
+
+	if (dmcli_timetrack) {
+		clock_gettime(CLOCK_REALTIME, &tend);
+		s = tend.tv_sec - tstart.tv_sec;
+		ms = (tend.tv_nsec - tstart.tv_nsec) / 1.0e6; // Convert nanoseconds to milliseconds
+		if (ms < 0) {
+			ms = 1000 + ms;
+			s--;
+		}
+		fprintf(stdout, "-----------------------------\n");
+		fprintf(stdout, "End: %ld s : %ld ms\n", (long)s, ms);
+		fprintf(stdout, "-----------------------------\n");
+		fflush(stdout);
+	}
+	return;
+
+invalid_arguments:
+	dm_ctx_clean(&cli_dmctx);
+	fprintf(stdout, "Invalid arguments!\n");;
+}
+
+int dmentry_cli(int argc, char *argv[], unsigned int dmtype, unsigned int amd_version, unsigned int instance_mode)
+{
+	struct dmctx cli_dmctx = {0};
+	int fault = 0, set_fault = 0;
+	int i, dmrpc;
+	char *param;
+	char *value;
+	char *parameter_key;
+	char *notifset;
+	unsigned char apply_services = 0;
+
+	if (argc < 3) {
+		fprintf(stderr, "Wrong arguments!\n");
+		return -1;
+	}
+
+	check_create_dmmap_package(DMMAP);
+	dm_ctx_init(&cli_dmctx, dmtype, amd_version, instance_mode);
+	if (strcmp(argv[2], "get_value") == 0) {
+		char *param = "";
+		dmrpc = CMD_GET_VALUE;
+		if (argc >= 4)
+			param = argv[3];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_GET_VALUE, param, NULL, NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_GET_VALUE, 1);
+	}
+	else if (strcmp(argv[2], "get_name") == 0) {
+		if (argc < 5)
+			goto invalid_arguments;
+		dmrpc = CMD_GET_NAME;
+		fault = dm_entry_param_method(&cli_dmctx, CMD_GET_NAME, argv[3], argv[4], NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_GET_NAME, 1);
+	}
+	else if (strcmp(argv[2], "get_notification") == 0) {
+		char *param = "";
+		dmrpc = CMD_GET_NOTIFICATION;
+		if (argc >= 4)
+			param = argv[3];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_GET_NOTIFICATION, param, NULL, NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_GET_NOTIFICATION, 1);
+	}
+	else if (strcmp(argv[2], "set_value") == 0) {
+		if (argc < 6 || (argc % 2) != 0)
+			goto invalid_arguments;
+
+		dmrpc = CMD_SET_VALUE;
+		for (i = 4; i < argc; i+=2) {
+			param = argv[i];
+			value = argv[i+1];
+			fault = dm_entry_param_method(&cli_dmctx, CMD_SET_VALUE, param, value, NULL);
+			if (fault) set_fault = true;
+		}
+		parameter_key = argv[3];
+		if (!set_fault) {
+			apply_services = 1;
+			fault = dm_entry_apply(&cli_dmctx, CMD_SET_VALUE, parameter_key, NULL);
+		}
+		cli_output_dm_result(&cli_dmctx, fault, CMD_SET_VALUE, 1);
+	}
+	else if (strcmp(argv[2], "set_notification") == 0) {
+		if (argc < 6 || (argc % 3) != 0)
+			goto invalid_arguments;
+		dmrpc = CMD_SET_NOTIFICATION;
+		for (i=3; i<argc; i+=3) {
+			param = argv[i];
+			value = argv[i+1];
+			notifset = argv[i+2];
+			fault = dm_entry_param_method(&cli_dmctx, CMD_SET_NOTIFICATION, param, value, notifset);
+			if (fault) set_fault = true;
+		}
+		if(!set_fault) {
+			fault = dm_entry_apply(&cli_dmctx, CMD_SET_NOTIFICATION, NULL, NULL);
+		}
+		cli_output_dm_result(&cli_dmctx, fault, CMD_SET_NOTIFICATION, 1);
+	}
+	else if (strcmp(argv[2], "inform") == 0 || strcmp(argv[2], "inform_parameter") == 0) {
+		dmrpc = CMD_INFORM;
+		fault = dm_entry_param_method(&cli_dmctx, CMD_INFORM, "", NULL, NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_INFORM, 1);
+	}
+	else if (strcmp(argv[2], "add_obj") == 0) {
+		if (argc < 5)
+			goto invalid_arguments;
+		dmrpc = CMD_ADD_OBJECT;
+		param = argv[3];
+		parameter_key = argv[4];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_ADD_OBJECT, param, parameter_key, NULL);
+		if (!fault)
+			apply_services = 1;
+		cli_output_dm_result(&cli_dmctx, fault, CMD_ADD_OBJECT, 1);
+	}
+	else if (strcmp(argv[2], "del_obj") == 0) {
+		if (argc < 5)
+			goto invalid_arguments;
+		dmrpc = CMD_DEL_OBJECT;
+		param =argv[3];
+		parameter_key =argv[4];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_DEL_OBJECT, param, parameter_key, NULL);
+		if (!fault)
+			apply_services = 1;
+		cli_output_dm_result(&cli_dmctx, fault, CMD_DEL_OBJECT, 1);
+	}
+	else if (strcmp(argv[2], "external_command") == 0) {
+		if (argc < 4)
+			goto invalid_arguments;
+		dmrpc = CMD_EXTERNAL_COMMAND;
+		argv[argc] = NULL;
+		dmentry_external_cmd(&argv[3]);
+	}
+#ifdef BBF_TR064
+	else if (strcmp(argv[2], "upnp_get_values") == 0) {
+		char *param = "";
+		dmrpc = CMD_UPNP_GET_VALUES;
+		if (argc >= 4)
+			param = argv[3];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_GET_VALUES, param, NULL, NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_VALUES, 1);
+	}
+	else if (strcmp(argv[2], "upnp_get_selected_values") == 0) {
+		char *param = "";
+		dmrpc = CMD_UPNP_GET_SELECTED_VALUES;
+		if (argc >= 4)
+			param = argv[3];
+		param = argv[3];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_GET_SELECTED_VALUES, param, NULL, NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_SELECTED_VALUES, 1);
+	}
+	else if (strcmp(argv[2], "upnp_get_supported_parameters") == 0) {
+		if (argc < 5)
+			goto invalid_arguments;
+		dmrpc = CMD_UPNP_GET_SUPPORTED_PARAMETERS;
+		param = argv[3];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_GET_SUPPORTED_PARAMETERS, param, argv[4], NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_SUPPORTED_PARAMETERS, 1);
+	}
+	else if (strcmp(argv[2], "upnp_get_instances") == 0) {
+		if (argc < 5)
+			goto invalid_arguments;
+		dmrpc = CMD_UPNP_GET_INSTANCES;
+		param = argv[3];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_GET_INSTANCES, param, argv[4], NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_INSTANCES, 1);
+	}
+	else if (strcmp(argv[2], "upnp_set_values") == 0) {
+		if (argc < 5 || (argc % 2) == 0)
+			goto invalid_arguments;
+
+		dmrpc = CMD_UPNP_SET_VALUES;
+		for (i = 3; i < argc; i+=2) {
+			param = argv[i];
+			value = argv[i+1];
+			fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_SET_VALUES, param, value, NULL);
+			if (fault) break;
+		}
+		if (!fault) {
+			apply_services = 1;
+			fault = dm_entry_apply(&cli_dmctx, CMD_UPNP_SET_VALUES, parameter_key, NULL);
+		}
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_SET_VALUES, 1);
+	}
+	else if (strcmp(argv[2], "upnp_get_attributes") == 0) {
+		if (argc < 4) goto invalid_arguments;
+		dmrpc = CMD_UPNP_GET_ATTRIBUTES;
+		param = argv[3];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_GET_ATTRIBUTES, param, NULL, NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_ATTRIBUTES, 1);
+	}
+	else if (strcmp(argv[2], "upnp_set_attributes") == 0) {
+		if (argc < 6 || (argc % 3) != 0) goto invalid_arguments;
+		dmrpc = CMD_UPNP_SET_ATTRIBUTES;
+		int i;
+		for (i = 3; i < argc; i+=3) {
+			param = argv[i];
+			char *evnt = argv[i+1];
+			char *alrm = argv[i+2];
+			fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_SET_ATTRIBUTES, param, evnt, alrm);
+			if (fault) break;
+		}
+		if(!fault) {
+			fault = dm_entry_apply(&cli_dmctx, CMD_UPNP_SET_ATTRIBUTES, NULL, NULL);
+		}
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_SET_ATTRIBUTES, 1);
+	}
+	else if (strcmp(argv[2], "upnp_add_instance") == 0) {
+		char buf[256];
+		int i;
+		if (argc < 4 || (argc % 2) != 0)
+			goto invalid_arguments;
+		dmrpc = CMD_UPNP_ADD_INSTANCE;
+		param = argv[3];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_ADD_INSTANCE, param, NULL, NULL);
+		if (!fault && cli_dmctx.addobj_instance) {
+			struct dmctx set_dmctx = {0};
+			apply_services = 1;
+			if (argc >= 5) {
+				dm_ctx_init_sub(&set_dmctx, dmtype, amd_version, instance_mode);
+				for (i = 4; i < argc; i+=2) {
+					sprintf(buf, "%s%s%c%s", param, cli_dmctx.addobj_instance, dm_delim, argv[i]); // concatenate obj path + instance + sub param
+					value = argv[i+1];
+					dm_entry_param_method(&set_dmctx, CMD_UPNP_SET_VALUES, buf, value, NULL);
+				}
+				dm_entry_apply(&set_dmctx, CMD_UPNP_SET_VALUES, NULL, NULL);
+				dm_ctx_clean_sub(&set_dmctx);
+			}
+		}
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_ADD_INSTANCE, 1);
+	}
+	else if (strcmp(argv[2], "upnp_delete_instance") == 0) {
+		if (argc < 4)
+			goto invalid_arguments;
+		dmrpc = CMD_UPNP_DEL_INSTANCE;
+		param =argv[3];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_DEL_INSTANCE, param, NULL, NULL);
+		if (!fault)
+			apply_services = 1;
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_DEL_INSTANCE, 1);
+	}
+	else if (strcmp(argv[2], "upnp_get_acldata") == 0) {
+		if (argc < 4) goto invalid_arguments;
+		dmrpc = CMD_UPNP_GET_ACLDATA;
+		param = argv[3];
+		fault = dm_entry_param_method(&cli_dmctx, CMD_UPNP_GET_ACLDATA, param, NULL, NULL);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_ACLDATA, 1);
+	}
+	else if (strcmp(argv[2], "upnp_init_state_variables") == 0) {
+		dmrpc = CMD_UPNP_INIT_STATE_VARIABLES;
+		upnp_state_variables_init(&cli_dmctx);
+	}
+	else if (strcmp(argv[2], "upnp_get_supported_parameters_update") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_SUPPORTED_PARAMETERS_UPDATE;
+		dm_entry_upnp_get_supported_parameters_update(&cli_dmctx, &var);
+		cli_output_dm_upnp_variable_state(&cli_dmctx, CMD_UPNP_GET_SUPPORTED_PARAMETERS_UPDATE, var);
+	}
+	else if (strcmp(argv[2], "upnp_get_supported_datamodel_update") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_SUPPORTED_DATA_MODEL_UPDATE;
+		dm_entry_upnp_get_supported_datamodel_update(&cli_dmctx, &var);
+		cli_output_dm_upnp_variable_state(&cli_dmctx, CMD_UPNP_GET_SUPPORTED_DATA_MODEL_UPDATE, var);
+	}
+	else if (strcmp(argv[2], "upnp_get_configuration_update") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_CONFIGURATION_UPDATE;
+		dm_entry_upnp_get_configuration_update(&cli_dmctx, &var);
+		cli_output_dm_upnp_variable_state(&cli_dmctx, CMD_UPNP_GET_CONFIGURATION_UPDATE, var);
+	}
+	else if (strcmp(argv[2], "upnp_get_current_configuration_version") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_CURRENT_CONFIGURATION_VERSION;
+		dm_entry_upnp_get_current_configuration_version(&cli_dmctx, &var);
+		cli_output_dm_upnp_variable_state(&cli_dmctx, CMD_UPNP_GET_CURRENT_CONFIGURATION_VERSION, var);
+	}
+	else if (strcmp(argv[2], "upnp_get_attribute_values_update") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_ATTRIBUTE_VALUES_UPDATE;
+		dm_entry_upnp_get_attribute_values_update(&cli_dmctx, &var);
+		cli_output_dm_upnp_variable_state(&cli_dmctx, CMD_UPNP_GET_ATTRIBUTE_VALUES_UPDATE, var);
+	}
+	else if (strcmp(argv[2], "upnp_load_enabled_parametrs_track") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_LOAD_ENABLED_PARAMETRS_TRACK;
+		dm_entry_upnp_load_tracked_parameters(&cli_dmctx);
+	}
+	else if (strcmp(argv[2], "upnp_get_enabled_parametrs_alarm") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_ENABLED_PARAMETRS_ALARM;
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_ENABLED_PARAMETRS_ALARM, 1);
+	}
+	else if (strcmp(argv[2], "upnp_get_enabled_parametrs_event") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_ENABLED_PARAMETRS_EVENT;
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_ENABLED_PARAMETRS_EVENT, 1);
+	}
+	else if (strcmp(argv[2], "upnp_get_enabled_parametrs_version") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_GET_ENABLED_PARAMETRS_VERSION;
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_GET_ENABLED_PARAMETRS_VERSION, 1);
+	}
+	else if (strcmp(argv[2], "upnp_check_changed_parametrs_alarm") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_CHECK_CHANGED_PARAMETRS_ALARM;
+		dm_entry_upnp_check_alarmonchange_param(&cli_dmctx);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_CHECK_CHANGED_PARAMETRS_ALARM, 1);
+	}
+	else if (strcmp(argv[2], "upnp_check_changed_parametrs_event") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_CHECK_CHANGED_PARAMETRS_EVENT;
+		dm_entry_upnp_check_eventonchange_param(&cli_dmctx);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_CHECK_CHANGED_PARAMETRS_EVENT, 1);
+	}
+	else if (strcmp(argv[2], "upnp_check_changed_parametrs_version") == 0) {
+		char *var;
+		dmrpc = CMD_UPNP_CHECK_CHANGED_PARAMETRS_VERSION;
+		dm_entry_upnp_check_versiononchange_param(&cli_dmctx);
+		cli_output_dm_result(&cli_dmctx, fault, CMD_UPNP_CHECK_CHANGED_PARAMETRS_VERSION, 1);
+	}
+#endif
+	else {
+		goto invalid_arguments;
+	}
+
+	dm_ctx_clean(&cli_dmctx);
+	if (apply_services) {
+		dm_apply_config();
+	}
+
+	if (!fault) {
+		int ualarm, uversion, uevent;
+#ifdef BBF_TR064
+		switch (dmrpc) {
+		case CMD_UPNP_SET_VALUES:
+		case CMD_UPNP_DEL_INSTANCE:
+		case CMD_UPNP_ADD_INSTANCE:
+			DM_ENTRY_UPNP_CHECK_CHANGES(ualarm, uevent, uversion);
+			break;
+		case CMD_UPNP_SET_ATTRIBUTES:
+			DM_ENTRY_UPNP_LOAD_TRACKED_PARAMETERS();
+			break;
+		}
+#endif
+	}
+
+	return 0;
+
+invalid_arguments:
+	dm_ctx_clean(&cli_dmctx);
+	fprintf(stdout, "Invalid arguments!\n");
+	return -1;
+}
+
+void dm_execute_cli_command(char *file, unsigned int dmtype, unsigned int amd_version, unsigned int instance_mode)
+{
+	FILE *fp;
+	char *argv[64];
+	char buf[2048], dbuf[2048];
+	char *pch, *pchr;
+	int argc, len, i=0;
+	long ms; // Milliseconds
+	time_t s;  // Seconds
+	struct timespec tstart, tend;
+
+	if (file) {
+		fp = fopen(file, "r");
+		if (fp == NULL) {
+			fprintf(stderr, "ERROR: Wrong file!\n");
+			fflush(stderr);
+			return;
+		}
+	}
+	else {
+		fp = stdin;
+	}
+
+	printf("%s", DM_PROMPT" "); fflush(stdout);
+
+	while (fgets (buf , 2048 , fp) != NULL) {
+		if (dmcli_evaluatetest)
+			argc = 1;
+		else
+			argc = 2;
+
+		len = strlen(buf);
+		if (len>0 && buf[len-1] == '\n') {
+			buf[len-1] = '\0';
+		}
+		if (strcasecmp(buf, "exit") == 0) {
+			if (file) {
+				fprintf(stdout, "%s\n", buf);
+				fflush(stdout);
+			}
+			return;
+		}
+		if (strcasecmp(buf, "help") == 0) {
+			if (file) {
+				fprintf(stdout, "%s\n", buf);
+				fflush(stdout);
+			}
+			print_dm_help();
+			printf(DM_PROMPT" "); fflush(stdout);
+			continue;
+		}
+
+		i++;
+
+		strcpy(dbuf, buf);
+		for (pch = parse_arg_r(buf, &pchr); pch != NULL; pch = parse_arg_r(NULL, &pchr)) {
+			if(argc < 3 && (pch[0] == '#' || pch[0] == '\0'))
+				break;
+			if (*pch == '"')
+				pch++;
+			len = strlen(pch);
+			if (len>0 && pch[len-1] == '"')
+				pch[len-1] = '\0';
+			argv[argc++] = pch;
+		}
+		if (file) {
+			if (!pch || pch[0] != '#') {
+				fprintf(stdout, "%s\n", dbuf);
+				fflush(stdout);
+			}
+			else {
+				fprintf(stdout, "\n");
+				fflush(stdout);
+			}
+		}
+		if (argc>2) {
+			char testref[32] = "";
+			if (dmcli_evaluatetest)
+				sprintf(testref, "Ref: %s - ", argv[1]);
+			if (dmcli_timetrack || dmcli_evaluatetest) {
+				fprintf(stdout, "-----------------------------\n");
+				fprintf(stdout, "[%s%04d] %s\n", testref, i, dbuf);
+				fprintf(stdout, "-----------------------------\n");
+				fflush(stdout);
+				clock_gettime(CLOCK_REALTIME, &tstart);
+			}
+			if (dmentry_cli(argc, argv, dmtype, amd_version, instance_mode) == 0) {
+				if (dmcli_timetrack || dmcli_evaluatetest) {
+					clock_gettime(CLOCK_REALTIME, &tend);
+					s = tend.tv_sec - tstart.tv_sec;
+					ms = (tend.tv_nsec - tstart.tv_nsec) / 1.0e6; // Convert nanoseconds to milliseconds
+					if (ms < 0) {
+						ms = 1000 + ms;
+						s--;
+					}
+					fprintf(stdout, "-----------------------------\n");
+					fprintf(stdout, "%sEnd: %ld s : %ld ms\n", testref, (long)s, ms);
+					fprintf(stdout, "-----------------------------\n");
+					fflush(stdout);
+				}
+			}
+			else {
+				fprintf(stdout, "Type help for help\n");
+				fflush(stdout);
+			}
+		}
+		printf(DM_PROMPT" "); fflush(stdout);
+	}
+	if (file) {
+		fclose(fp);
+		fprintf(stdout, "\n");
+		fflush(stdout);
+	}
+}
+
+int cli_output_wepkey64(char strk64[4][11])
+{
+	fprintf(stdout, "%s\n%s\n%s\n%s\n", strk64[0], strk64[1], strk64[2], strk64[3]);
+	return 0;
+}
+
+int cli_output_wepkey128(char strk128[27])
+{
+	fprintf(stdout, "%s\n", strk128);
+	return 0;
+}
+
+void wepkey_cli(int argc, char** argv)
+{
+	if (argc < 4) goto invalid_arguments;
+
+	char *strength = argv[2];
+	char *passphrase =  argv[3];
+
+	if (!strength || !passphrase || passphrase[0] == '\0')
+		goto invalid_arguments;
+
+	if (strcmp(strength, "64") == 0) {
+		char strk64[4][11];
+		wepkey64(passphrase, strk64);
+		cli_output_wepkey64(strk64);
+	}
+	else if (strcmp(strength, "128") == 0) {
+		char strk128[27];
+		wepkey128(passphrase, strk128);
+		cli_output_wepkey128(strk128);
+	}
+	else {
+		goto invalid_arguments;
+	}
+	return;
+
+invalid_arguments:
+	fprintf(stdout, "Invalid arguments!\n");;
+}
+
diff --git a/dmentry.h b/dmentry.h
new file mode 100644
index 0000000000000000000000000000000000000000..2194cfa71f55bbce4a915ab9d8e239549bd733c8
--- /dev/null
+++ b/dmentry.h
@@ -0,0 +1,77 @@
+#ifndef __DMENTRY_H__
+#define __DMENTRY_H__
+
+#include "dmcwmp.h"
+extern struct list_head head_package_change;
+extern unsigned char dmcli_timetrack;
+extern unsigned char dmcli_evaluatetest;
+
+enum ctx_init_enum {
+	CTX_INIT_ALL,
+	CTX_INIT_SUB
+};
+
+int dm_ctx_init(struct dmctx *ctx, unsigned int dm_type, unsigned int amd_version, unsigned int instance_mode);
+int dm_ctx_init_sub(struct dmctx *ctx, unsigned int dm_type, unsigned int amd_version, unsigned int instance_mode);
+int dm_entry_param_method(struct dmctx *ctx, int cmd, char *inparam, char *arg1, char *arg2);
+int dm_entry_apply(struct dmctx *ctx, int cmd, char *arg1, char *arg2);
+int dm_entry_load_enabled_notify(unsigned int dm_type, unsigned int amd_version, int instance_mode);
+int dm_entry_reload_enabled_notify(unsigned int dm_type, unsigned int amd_version, int instance_mode);
+int adm_entry_get_linker_param(struct dmctx *ctx, char *param, char *linker, char **value);
+int adm_entry_get_linker_value(struct dmctx *ctx, char *param, char **value);
+int dm_entry_restart_services(void);
+#ifdef BBF_TR064
+int dm_entry_upnp_restart_services(void);
+void dm_upnp_apply_config(void);
+int dm_entry_upnp_check_alarmonchange_param(struct dmctx *dmctx);
+int dm_entry_upnp_check_eventonchange_param(struct dmctx *dmctx);
+int dm_entry_upnp_check_versiononchange_param(struct dmctx *pctx);
+int dm_entry_upnp_load_tracked_parameters(struct dmctx *dmctx);
+int dm_entry_upnp_get_supported_parameters_update(struct dmctx *dmctx, char **value);
+int dm_entry_upnp_get_supported_datamodel_update(struct dmctx *dmctx, char **value);
+int dm_entry_upnp_get_attribute_values_update(struct dmctx *dmctx, char **value);
+int dm_entry_upnp_get_configuration_update(struct dmctx *dmctx, char **value);
+int dm_entry_upnp_get_current_configuration_version(struct dmctx *dmctx, char **value);
+#endif
+
+int dm_ctx_clean(struct dmctx *ctx);
+int dm_ctx_clean_sub(struct dmctx *ctx);
+void dm_execute_cli_shell(int argc, char** argv, unsigned int dmtype, unsigned int amd_version, unsigned int instance_mode);
+void dm_execute_cli_command(char *file, unsigned int dmtype, unsigned int amd_version, unsigned int instance_mode);
+void wepkey_cli(int argc, char** argv);
+void dmentry_instance_lookup_inparam(struct dmctx *ctx);
+
+#ifdef BBF_TR064
+#define DM_ENTRY_UPNP_CHECK_CHANGES(ALARM, EVENT, VERSION) \
+	do { \
+		struct dmctx dmctx_chg = {0}; \
+		dm_ctx_init(&dmctx_chg, DM_UPNP, AMD_2, INSTANCE_MODE_NUMBER); \
+		ALARM = dm_entry_upnp_check_alarmonchange_param(&dmctx_chg); \
+		dm_ctx_clean(&dmctx_chg); \
+		memset(&dmctx_chg, 0, sizeof(struct dmctx)); \
+		dm_ctx_init(&dmctx_chg, DM_UPNP, AMD_2, INSTANCE_MODE_NUMBER); \
+		EVENT = dm_entry_upnp_check_eventonchange_param(&dmctx_chg); \
+		dm_ctx_clean(&dmctx_chg); \
+		memset(&dmctx_chg, 0, sizeof(struct dmctx)); \
+		dm_ctx_init(&dmctx_chg, DM_UPNP, AMD_2, INSTANCE_MODE_NUMBER); \
+		VERSION = dm_entry_upnp_check_versiononchange_param(&dmctx_chg); \
+		dm_ctx_clean(&dmctx_chg); \
+	} while(0)
+
+#define DM_ENTRY_UPNP_FREE_ALL_CHECK_CHANGES() \
+	do { \
+		free_all_list_upnp_param_track(&list_upnp_changed_onevent); \
+		free_all_list_upnp_param_track(&list_upnp_changed_onalarm); \
+		free_all_list_upnp_param_track(&list_upnp_changed_version); \
+	} while(0)
+
+#define DM_ENTRY_UPNP_LOAD_TRACKED_PARAMETERS() \
+	do { \
+		struct dmctx dmctx_trk = {0}; \
+		dm_ctx_init(&dmctx_trk, DM_UPNP, AMD_2, INSTANCE_MODE_NUMBER); \
+		dm_entry_upnp_load_tracked_parameters(&dmctx_trk); \
+		dm_ctx_clean(&dmctx_trk); \
+	} while(0)
+#endif
+
+#endif
diff --git a/dmjson.c b/dmjson.c
new file mode 100644
index 0000000000000000000000000000000000000000..4577f51958a2bcfa4d5fe805b14fd58123a2a15c
--- /dev/null
+++ b/dmjson.c
@@ -0,0 +1,286 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <json-c/json.h>
+#include <libubox/blobmsg_json.h>
+#include "dmjson.h"
+#include "dmmem.h"
+
+static json_object *dmjson_jobj = NULL;
+
+void dm_add_json_obj(json_object *json_obj_out, char *object, char *string)
+{
+	json_object *json_obj_tmp = json_object_new_string(string);
+	json_object_object_add(json_obj_out, object, json_obj_tmp);
+}
+
+static void inline __dmjson_fprintf(FILE *fp, int argc, struct dmjson_arg dmarg[])
+{
+	int i;
+	char *arg;
+	json_object *json_obj_out = json_object_new_object();
+	if (json_obj_out == NULL)
+		return;
+
+	if (argc) {
+		for (i = 0; i < argc; i++) {
+			dm_add_json_obj(json_obj_out, dmarg[i].key, dmarg[i].val);
+		}
+		arg = (char *)json_object_to_json_string(json_obj_out);
+		fprintf(fp, "%s\n", arg);
+	}
+
+	json_object_put(json_obj_out);
+}
+
+void dmjson_fprintf(FILE *fp, int argc, struct dmjson_arg dmarg[])
+{
+	__dmjson_fprintf(fp, argc, dmarg);
+}
+
+void dmjson_parse_init(char *msg)
+{
+	if (dmjson_jobj) {
+		json_object_put(dmjson_jobj);
+		dmjson_jobj = NULL;
+	}
+	dmjson_jobj = json_tokener_parse(msg);
+}
+
+void dmjson_parse_fini(void)
+{
+	if (dmjson_jobj) {
+		json_object_put(dmjson_jobj);
+		dmjson_jobj = NULL;
+	}
+}
+
+static char *dmjson_print_value(json_object *jobj)
+{
+	enum json_type type;
+	char *ret = "";
+
+	if (!jobj)
+		return ret;
+
+	type = json_object_get_type(jobj);
+	switch (type) {
+	case json_type_boolean:
+	case json_type_double:
+	case json_type_int:
+	case json_type_string:
+		ret = (char *)json_object_get_string(jobj);
+		break;
+	}
+	return ret;
+}
+
+char *____dmjson_get_value_in_obj(json_object *mainjobj, char *argv[])
+{
+	json_object *jobj = NULL;
+	char *value = "";
+
+	jobj = dmjson_select_obj(mainjobj, argv);
+	value = dmjson_print_value(jobj);
+
+	return value;
+}
+
+char *__dmjson_get_value_in_obj(json_object *mainjobj, int argc, ...)
+{
+	va_list arg;
+	char *argv[64], *v;
+	int i;
+
+	va_start(arg, argc);
+	for (i = 0; i < argc; i++)
+	{
+		argv[i] = va_arg(arg, char *);
+	}
+	argv[argc] = NULL;
+	va_end(arg);
+	v = ____dmjson_get_value_in_obj(mainjobj, argv);
+	return v;
+}
+
+json_object *__dmjson_get_obj(json_object *mainjobj, int argc, ...)
+{
+	va_list arg;
+	char *argv[64];
+	int i;
+
+	va_start(arg, argc);
+	for (i = 0; i < argc; i++)
+	{
+		argv[i] = va_arg(arg, char *);
+	}
+	argv[argc] = NULL;
+	va_end(arg);
+	return dmjson_select_obj(mainjobj, argv);
+	//return v;
+}
+
+
+json_object *dmjson_select_obj(json_object * jobj, char *argv[])
+{
+	int i;
+	for (i = 0; argv[i]; i++) {
+		if (jobj == NULL)
+			return NULL;
+		json_object_object_get_ex(jobj, argv[i], &jobj);
+	}
+	return jobj;
+}
+
+
+json_object *____dmjson_select_obj_in_array_idx(json_object *mainjobj, json_object **arrobj, int index, char *argv[])
+{
+	json_object *jobj = NULL;
+	int i;
+
+	if (arrobj == NULL || *arrobj == NULL) {
+		jobj = dmjson_select_obj(mainjobj, argv);
+		if (arrobj)
+			*arrobj = jobj;
+		if (jobj && json_object_get_type(jobj) == json_type_array) {
+			jobj = json_object_array_get_idx(jobj, index);
+			return jobj;
+		}
+		else {
+			return NULL;
+		}
+	}
+	else {
+		jobj = json_object_array_get_idx(*arrobj, index);
+		return jobj;
+	}
+
+	return NULL;
+}
+
+json_object *__dmjson_select_obj_in_array_idx(json_object *mainjobj, json_object **arrobj, int index, int argc, ...)
+{
+	va_list arg;
+	json_object *jobj;
+	char *argv[64];
+	int i;
+
+	if (mainjobj == NULL)
+		return NULL;
+
+	va_start(arg, argc);
+	for (i = 0; i < argc; i++)
+	{
+		argv[i] = va_arg(arg, char *);
+	}
+	argv[argc] = NULL;
+	va_end(arg);
+	jobj = ____dmjson_select_obj_in_array_idx(mainjobj, arrobj, index, argv);
+	return jobj;
+}
+
+char *____dmjson_get_value_in_array_idx(json_object *mainjobj, json_object **arrobj, int index, char *argv[])
+{
+	json_object *jobj = NULL;
+	char *value = NULL;
+	int i;
+
+	if (arrobj == NULL || *arrobj == NULL) {
+		jobj = dmjson_select_obj(mainjobj, argv);
+		if (arrobj)
+			*arrobj = jobj;
+		if (jobj && json_object_get_type(jobj) == json_type_array) {
+			jobj = json_object_array_get_idx(jobj, index);
+			if (jobj == NULL)
+				return NULL;
+			value = dmjson_print_value(jobj);
+			return value;
+		}
+	}
+	else {
+		jobj = json_object_array_get_idx(*arrobj, index);
+		if (jobj == NULL)
+			return NULL;
+		value = dmjson_print_value(jobj);
+		return value;
+	}
+
+	return value;
+}
+
+char *__dmjson_get_value_in_array_idx(json_object *mainjobj, json_object **arrobj, char *defret, int index, int argc, ...)
+{
+	va_list arg;
+	char *argv[64], *v;
+	int i;
+
+	if (mainjobj == NULL)
+		return defret;
+
+	va_start(arg, argc);
+	for (i = 0; i < argc; i++)
+	{
+		argv[i] = va_arg(arg, char *);
+	}
+	argv[argc] = NULL;
+	va_end(arg);
+	v = ____dmjson_get_value_in_array_idx(mainjobj, arrobj, index, argv);
+	return (v ? v : defret) ;
+}
+
+char *____dmjson_get_value_array_all(json_object *mainjobj, char *delim, char *argv[])
+{
+	json_object *arrobj;
+	char *v, *ret = "";
+	int i, dlen;
+
+	delim = (delim) ? delim : ",";
+	dlen = strlen(delim);
+
+	for (i = 0, arrobj = NULL, v = ____dmjson_get_value_in_array_idx(mainjobj, &arrobj, i, argv);
+		v;
+		v = ____dmjson_get_value_in_array_idx(mainjobj, &arrobj, ++i, argv)) {
+
+		if (*ret == '\0') {
+			ret = dmstrdup(v);
+		}
+		else if (*v) {
+			ret = dmrealloc(ret, strlen(ret) + dlen + strlen(v) + 1);
+			strcat(ret, delim);
+			strcat(ret, v);
+		}
+	}
+	return ret;
+}
+
+char *__dmjson_get_value_array_all(json_object *mainjobj, char *delim, int argc, ...)
+{
+	char *argv[64], *ret;
+	va_list arg;
+	int i;
+
+	va_start(arg, argc);
+	for (i = 0; i < argc; i++)
+	{
+		argv[i] = va_arg(arg, char *);
+	}
+	argv[argc] = NULL;
+	va_end(arg);
+	ret = ____dmjson_get_value_array_all(mainjobj, delim, argv);
+	return ret;
+}
+
+void dmjson_get_var(char *jkey, char **jval)
+{
+	enum json_type type;
+	*jval = "";
+
+	if (dmjson_jobj == NULL)
+		return;
+
+	json_object_object_foreach(dmjson_jobj, key, val) {
+		if (strcmp(jkey, key) == 0) {
+			*jval = dmjson_print_value(val);
+			return;
+		}
+	}
+}
diff --git a/dmjson.h b/dmjson.h
new file mode 100644
index 0000000000000000000000000000000000000000..6a1702ea24f093de6add3408066b6198d39d2a56
--- /dev/null
+++ b/dmjson.h
@@ -0,0 +1,50 @@
+#ifndef __DMJSON_H
+#define __DMJSON_H
+
+#include <string.h>
+#include <json-c/json.h>
+#include <libubox/blobmsg_json.h>
+#include "dmcwmp.h"
+
+struct dmjson_arg {
+	char *key;
+	char *val;
+};
+
+#define DMJSON_ARGS (struct dmjson_arg[])
+
+void dm_add_json_obj(json_object *json_obj_out, char *object, char *string);
+void dmjson_printf(int argc, struct dmjson_arg dmarg[]);
+void dmjson_fprintf(FILE *fp, int argc, struct dmjson_arg dmarg[]);
+void dmjson_parse_init(char *msg);
+void dmjson_parse_fini(void);
+void dmjson_get_var(char *jkey, char **jval);
+json_object *dmjson_select_obj(json_object * jobj, char *argv[]);
+json_object *__dmjson_get_obj(json_object *mainjobj, int argc, ...);
+char *____dmjson_get_value_in_obj(json_object *mainjobj, char *argv[]);
+char *__dmjson_get_value_in_obj(json_object *mainjobj, int argc, ...);
+json_object *__dmjson_select_obj_in_array_idx(json_object *mainjobj, json_object **arrobj, int index, int argc, ...);
+
+char *____dmjson_get_value_array_all(json_object *mainjobj, char *delim, char *argv[]);
+char *__dmjson_get_value_array_all(json_object *mainjobj, char *delim, int argc, ...);
+
+#define dmjson_get_value(JOBJ,ARGC,args...) \
+	__dmjson_get_value_in_obj(JOBJ, ARGC, ##args)
+#define dmjson_get_obj(JOBJ,ARGC,args...) \
+	__dmjson_get_obj(JOBJ, ARGC, ##args)
+
+#define dmjson_get_value_in_array_idx(MAINJOBJ,INDEX,ARGC,args...) \
+	__dmjson_get_value_in_array_idx(MAINJOBJ, NULL, "", INDEX, ARGC, ##args)
+
+#define dmjson_select_obj_in_array_idx(MAINJOBJ,INDEX,ARGC,args...) \
+	__dmjson_select_obj_in_array_idx(MAINJOBJ, NULL, INDEX, ARGC, ##args)
+
+#define dmjson_get_value_array_all(MAINJOBJ,DELIM,ARGC,args...) \
+	__dmjson_get_value_array_all(MAINJOBJ, DELIM, ARGC, ##args);
+
+#define dmjson_foreach_value_in_array(MAINJOBJ,ARROBJ,VAL,INDEX,ARGC,args...) \
+	for (INDEX = 0, ARROBJ = NULL, VAL = __dmjson_get_value_in_array_idx(MAINJOBJ, &(ARROBJ), NULL, INDEX, ARGC, ##args);\
+		VAL; \
+		VAL = __dmjson_get_value_in_array_idx(MAINJOBJ, &(ARROBJ), NULL, ++INDEX, 0))
+
+#endif
diff --git a/dmmem.c b/dmmem.c
new file mode 100644
index 0000000000000000000000000000000000000000..252a5d7e41f5ddb164099d58b337e01f1dc4156f
--- /dev/null
+++ b/dmmem.c
@@ -0,0 +1,152 @@
+#include "dmmem.h"
+
+#ifdef WITH_MEMLEACKSEC
+LIST_HEAD(memhead);
+
+inline void *__dmmalloc
+(
+#ifdef WITH_MEMTRACK
+const char *file, const char *func, int line,
+#endif /*WITH_MEMTRACK*/
+size_t size
+)
+{
+	struct dmmem *m = malloc(sizeof(struct dmmem) + size);
+	if (m == NULL) return NULL;
+	list_add(&m->list, &memhead);
+#ifdef WITH_MEMTRACK
+	m->file = (char *)file;
+	m->func = (char *)func;
+	m->line = line;
+#endif /*WITH_MEMTRACK*/
+	return (void *)m->mem;
+}
+
+inline void *__dmcalloc
+(
+#ifdef WITH_MEMTRACK
+const char *file, const char *func, int line,
+#endif /*WITH_MEMTRACK*/
+int n, size_t size
+)
+{
+	struct dmmem *m = calloc(n, sizeof(struct dmmem) + size);
+	if (m == NULL) return NULL;
+	list_add(&m->list, &memhead);
+#ifdef WITH_MEMTRACK
+	m->file = (char *)file;
+	m->func = (char *)func;
+	m->line = line;
+#endif /*WITH_MEMTRACK*/
+	return (void *)m->mem;
+}
+
+inline void *__dmrealloc
+(
+#ifdef WITH_MEMTRACK
+const char *file, const char *func, int line,
+#endif /*WITH_MEMTRACK*/
+void *old, size_t size
+)
+{
+	struct dmmem *m = NULL;
+	if (old != NULL) {
+		m = container_of(old, struct dmmem, mem);
+		list_del(&m->list);
+	}
+	m = realloc(m, sizeof(struct dmmem) + size);
+	if (m == NULL) return NULL;
+	list_add(&m->list, &memhead);
+#ifdef WITH_MEMTRACK
+	m->file = (char *)file;
+	m->func = (char *)func;
+	m->line = line;
+#endif /*WITH_MEMTRACK*/
+	return (void *)m->mem;
+}
+
+inline void dmfree(void *m)
+{
+	if (m == NULL) return;
+	struct dmmem *rm;
+	rm = container_of(m, struct dmmem, mem);
+	list_del(&rm->list);
+	free(rm);
+}
+
+void dmcleanmem()
+{
+	struct dmmem *dmm;
+	while (memhead.next != &memhead) {
+		dmm = list_entry(memhead.next, struct dmmem, list);
+#ifdef WITH_MEMTRACK
+		fprintf(stderr, "Allocated memory in {%s, %s(), line %d} is not freed\n", dmm->file, dmm->func, dmm->line);
+#endif /*WITH_MEMTRACK*/
+		list_del(&dmm->list);
+		free(dmm);
+	}
+}
+
+char *__dmstrdup
+(
+#ifdef WITH_MEMTRACK
+const char *file, const char *func, int line,
+#endif /*WITH_MEMTRACK*/
+const char *s
+)
+{
+	size_t len = strlen(s) + 1;
+#ifdef WITH_MEMTRACK
+	void *new = __dmmalloc(file, func, line, len);
+#else
+	void *new = __dmmalloc(len);
+#endif /*WITH_MEMTRACK*/
+	if (new == NULL) return NULL;
+	return (char *) memcpy(new, s, len);
+}
+#endif /*WITH_MEMLEACKSEC*/
+
+int __dmasprintf
+(
+#ifdef WITH_MEMTRACK
+const char *file, const char *func, int line,
+#endif /*WITH_MEMTRACK*/
+char **s, const char *format, ...
+)
+{
+	char buf[512];
+	va_list arg;
+	int ret;
+	va_start(arg,format);
+	ret = vsprintf(buf, format, arg);
+	va_end(arg);
+#ifdef WITH_MEMTRACK
+	*s = __dmstrdup(file, func, line, buf);
+#else
+	*s = __dmstrdup(buf);
+#endif /*WITH_MEMTRACK*/
+	if (*s == NULL) return -1;
+	return 0;	
+}
+
+int __dmastrcat
+(
+#ifdef WITH_MEMTRACK
+const char *file, const char *func, int line,
+#endif /*WITH_MEMTRACK*/
+char **s, char *obj, char *lastname
+)
+{
+	char buf[512];
+	int olen = strlen(obj);
+	memcpy(buf, obj, olen);
+	int llen = strlen(lastname) + 1;
+	memcpy(buf + olen, lastname, llen);
+#ifdef WITH_MEMTRACK
+	*s = __dmstrdup(file, func, line, buf);
+#else
+	*s = __dmstrdup(buf);
+#endif /*WITH_MEMTRACK*/
+	if (*s == NULL) return -1;
+	return 0;	
+}
\ No newline at end of file
diff --git a/dmmem.h b/dmmem.h
new file mode 100644
index 0000000000000000000000000000000000000000..2312e8c7e6e8af1a9af109f1cfe453bda72599e4
--- /dev/null
+++ b/dmmem.h
@@ -0,0 +1,110 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <libubox/list.h>
+#ifndef __DMMEM_H
+#define __DMMEM_H
+
+void dmfree(void *m);
+static inline void dm_empty_func()
+{
+}
+
+#define WITH_MEMLEACKSEC 1
+//#define WITH_MEMTRACK 1
+
+#ifndef WITH_MEMLEACKSEC
+#undef WITH_MEMTRACK
+#endif
+
+#ifdef WITH_MEMLEACKSEC
+struct dmmem {
+	struct list_head list;
+#ifdef WITH_MEMTRACK
+	char *file;
+	char *func;
+	int line;
+#endif /*WITH_MEMTRACK*/
+	char mem[0];
+};
+
+void *__dmmalloc
+(
+#ifdef WITH_MEMTRACK
+const char *file, const char *func, int line,
+#endif /*WITH_MEMTRACK*/
+size_t size
+);
+
+void *__dmcalloc
+(
+#ifdef WITH_MEMTRACK
+const char *file, const char *func, int line,
+#endif /*WITH_MEMTRACK*/
+int n, size_t size
+);
+
+void *__dmrealloc
+(
+#ifdef WITH_MEMTRACK
+const char *file, const char *func, int line,
+#endif /*WITH_MEMTRACK*/
+void *n, size_t size
+);
+
+char *__dmstrdup
+(
+#ifdef WITH_MEMTRACK
+const char *file, const char *func, int line,
+#endif /*WITH_MEMTRACK*/
+const char *s
+);
+
+void dmcleanmem();
+#endif /*WITH_MEMLEACKSEC*/
+int __dmasprintf
+(
+#ifdef WITH_MEMTRACK
+const char *file, const char *func, int line,
+#endif /*WITH_MEMTRACK*/
+char **s, const char *format, ...
+);
+
+int __dmastrcat
+(
+#ifdef WITH_MEMTRACK
+const char *file, const char *func, int line,
+#endif /*WITH_MEMTRACK*/
+char **s, char *obj, char *lastname
+);
+
+#ifdef WITH_MEMLEACKSEC
+#ifdef WITH_MEMTRACK
+#define dmmalloc(x) __dmmalloc(__FILE__, __func__, __LINE__, x)
+#define dmcalloc(n, x) __dmcalloc(__FILE__, __func__, __LINE__, n, x)
+#define dmrealloc(x, n) __dmrealloc(__FILE__, __func__, __LINE__, x, n)
+#define dmstrdup(x) __dmstrdup(__FILE__, __func__, __LINE__, x)
+#define dmasprintf(s, format, ...) __dmasprintf(__FILE__, __func__, __LINE__, s, format, ## __VA_ARGS__)
+#define dmastrcat(s, b, m) __dmastrcat(__FILE__, __func__, __LINE__, s, b, m)
+#else
+#define dmmalloc(x) __dmmalloc(x)
+#define dmcalloc(n, x) __dmcalloc(n, x)
+#define dmrealloc(x, n) __dmrealloc(x, n)
+#define dmstrdup(x) __dmstrdup(x)
+#define dmasprintf(s, format, ...) __dmasprintf(s, format, ## __VA_ARGS__)
+#define dmastrcat(s, b, m) __dmastrcat(s, b, m)
+#endif /*WITH_MEMTRACK*/
+#else
+#define dmmalloc(x) malloc(x)
+#define dmcalloc(n, x) calloc(n, x)
+#define __dmstrdup(x) strdup(x)
+#define dmstrdup(x) strdup(x)
+#define dmasprintf(s, format, ...) __dmasprintf(s, format, ## __VA_ARGS__)
+#define dmastrcat(s, b, m) __dmastrcat(s, b, m)
+#define dmfree(x) free(x)
+#define dmcleanmem() dm_empty_func()
+#endif /*WITH_MEMLEACKSEC*/
+
+#define DMFREE(x) do { dmfree(x); x = NULL; } while (0);
+#endif
diff --git a/dmoperate.c b/dmoperate.c
new file mode 100644
index 0000000000000000000000000000000000000000..1926d2e89bfb1e68725bed346e62084864517b9b
--- /dev/null
+++ b/dmoperate.c
@@ -0,0 +1,865 @@
+/*
+ * dmoperate.c: Operate handler for uspd
+ *
+ * Copyright (C) 2019 iopsys Software Solutions AB. All rights reserved.
+ *
+ * Author: Vivek Dutta <vivek.dutta@iopsys.eu>
+ * Author: Yashvardhan <y.yashvardhan@iopsys.eu>
+ * Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <regex.h>
+#include "dmcwmp.h"
+#include "dmubus.h"
+#include "dmuci.h"
+#include "dmjson.h"
+#include "dmentry.h"
+#include "dmcommon.h"
+#include "dmoperate.h"
+#include "dmdiagnostics.h"
+
+#define GLOB_EXPR "[=><]+"
+
+bool match(const char *string, const char *pattern)
+{
+	regex_t re;
+	if (regcomp(&re, pattern, REG_EXTENDED) != 0) return 0;
+	int status = regexec(&re, string, 0, NULL, 0);
+	regfree(&re);
+	if (status != 0) return false;
+	return true;
+}
+
+bool is_str_eq(const char *s1, const char *s2)
+{
+	if(0==strcmp(s1, s2))
+		return true;
+
+	return false;
+}
+
+static void cwmp_init(struct dmctx *dm_ctx, char *path)
+{
+	char *uci_amd = NULL, *uci_instance = NULL;
+	int amd = AMD_2, instance = INSTANCE_MODE_ALIAS;
+
+	if(match(path, "[[]+")) {
+		if(!match(path, GLOB_EXPR)) {
+			amd = AMD_5;
+		}
+	} else {
+		dmuci_get_option_value_string("cwmp", "cpe", "amd_version", &uci_amd);
+		if(uci_amd) {
+			amd = atoi(uci_amd);
+			free(uci_amd);
+		}
+		dmuci_get_option_value_string("cwmp", "cpe", "instance_mode", &uci_instance);
+		if(uci_instance) {
+			if(!is_str_eq(uci_instance, "InstanceAlias"))
+				instance = INSTANCE_MODE_NUMBER;
+			free(uci_instance);
+		}
+	}
+	printf("amd |%d| instance|%d|\n", amd, instance);
+	dm_ctx_init(dm_ctx, DM_CWMP, amd, instance);
+}
+
+static void cwmp_cleanup(struct dmctx *dm_ctx)
+{
+	dm_ctx_clean(dm_ctx);
+}
+
+static bool cwmp_get(int operation, char *path, struct dmctx *dm_ctx)
+{
+	int fault = 0;
+
+	printf("Entry |%s| operation|%d| \n", path, operation);
+	switch(operation) {
+		case CMD_GET_NAME:
+			fault = dm_entry_param_method(dm_ctx, CMD_GET_NAME, path, "true", NULL);
+			break;
+		case CMD_GET_VALUE:
+			fault = dm_entry_param_method(dm_ctx, CMD_GET_VALUE, path, NULL, NULL);
+			break;
+		default:
+			printf("Operation not supported yet!\n");
+			return false;
+	}
+
+	if (dm_ctx->list_fault_param.next != &dm_ctx->list_fault_param) {
+		return false;
+	}
+	if (fault) {
+		return false;
+	}
+	return true;
+}
+
+static bool cwmp_set_value(char *path, char *value)
+{
+	int fault = 0, res;
+	struct dmctx dm_ctx = {0};
+	struct dmctx *p_dmctx = &dm_ctx;
+
+	cwmp_init(&dm_ctx, path);
+	printf("Entry path|%s|, value|%s|", path, value);
+	fault = dm_entry_param_method(&dm_ctx, CMD_SET_VALUE, path, value, NULL);
+
+	if(!fault) {
+		fault = dm_entry_apply(&dm_ctx, CMD_SET_VALUE, "", NULL);
+	}
+
+	if (p_dmctx->list_fault_param.next != &p_dmctx->list_fault_param) {
+		res = FAIL;
+	}
+
+	if (fault)
+		res = FAIL;
+	else
+		res = SUCCESS;
+
+	cwmp_cleanup(&dm_ctx);
+	return res;
+}
+
+
+char *cwmp_get_value_by_id(char *id)
+{
+	struct dmctx dm_ctx = {0};
+	struct dm_parameter *n;
+	char *value = NULL;
+
+	printf("Entry id |%s|", id);
+	cwmp_init(&dm_ctx, id);
+	if(cwmp_get(CMD_GET_VALUE, id, &dm_ctx)) {
+			list_for_each_entry(n, &dm_ctx.list_parameter, list) {
+				printf("value |%s| \n", n->name);
+				value = dmstrdup(n->data);
+				break;
+			}
+	}
+	cwmp_cleanup(&dm_ctx);
+	return value;
+}
+
+static char *get_param_val_from_op_cmd(char *op_cmd, const char *param)
+{
+	char *val = NULL;
+	char node[256] = {'\0'};
+
+	// Trim action from operation command
+	// For eg: trim Reset from Device.IP.Interface.*.Reset
+	char *ret = strrchr(op_cmd, '.');
+	strncpy(node, op_cmd, ret - op_cmd +1);
+
+	// Append param name to the trimmed path
+	strcat(node, param);
+
+	// Get parameter value
+	val = cwmp_get_value_by_id(node);
+	return val;
+}
+
+// Operate function definitions
+static opr_ret_t reboot_device(struct dmctx *dmctx, char *path, char *input)
+{
+	if(0 == dmubus_call_set(SYSTEM_UBUS_PATH, "reboot", UBUS_ARGS{}, 0))
+		return SUCCESS;
+	else
+		return FAIL;
+}
+
+static opr_ret_t factory_reset(struct dmctx *dmctx, char *path, char *input)
+{
+	if(0 == dmcmd_no_wait("/sbin/defaultreset", 0))
+		return SUCCESS;
+	else
+		return FAIL;
+}
+
+static opr_ret_t network_interface_reset(struct dmctx *dmctx, char *path, char *input)
+{
+	char cmd[NAME_MAX] = NETWORK_INTERFACE_UBUS_PATH;
+	bool status = false;
+
+	snprintf(cmd + strlen(cmd), NAME_MAX - strlen(cmd), "%s", ".");
+	char *zone = NULL;
+	zone = get_param_val_from_op_cmd(path, "Name");
+	if(zone) {
+		strcat(cmd, zone);
+		dmfree(zone);
+	} else {
+		printf("Network not reachable |%s|", cmd);
+		return FAIL;
+	}
+	printf("cmd |%s|", cmd);
+	if(0 == dmubus_call_set(cmd, "down", UBUS_ARGS{}, 0))
+		status = true;
+
+	if(0 == dmubus_call_set(cmd, "up", UBUS_ARGS{}, 0))
+		status &= true;
+
+	if(status)
+		return SUCCESS;
+	else
+		return FAIL;
+}
+
+static opr_ret_t wireless_reset(struct dmctx *dmctx, char *path, char *input)
+{
+	if(0 == dmcmd_no_wait("/sbin/wifi", 2, "reload", "&"))
+		return SUCCESS;
+	else
+		return FAIL;
+}
+
+struct wifi_security_params reset_params[] = {
+	{"", "ModeEnabled", ""},
+	{"", "PreSharedKey", ""},
+	{"", "KeyPassphrase", ""}
+};
+
+static opr_ret_t ap_security_reset(struct dmctx *dmctx, char *path, char *input)
+{
+	char *wpakey = NULL;
+	char node[MAXNAMLEN] = {'\0'};
+	int i, len = 0;
+
+	char *ret = strrchr(path, '.');
+	strncpy(node, path, ret - path +1);
+
+	len = ARRAY_SIZE(reset_params);
+
+	for (i = 0; i < len; i++) {
+		strncpy(reset_params[i].node, node, MAXNAMLEN);
+		strcat(reset_params[i].node, reset_params[i].param);
+	}
+	const char *mode_enabled = "WPA2-Personal";
+
+	// Default mode - WPA2-Personal
+	strncpy(reset_params[0].value, mode_enabled, MAXNAMLEN);
+
+	// Get Default wpakey
+	db_get_value_string("hw", "board", "wpaKey", &wpakey);
+
+	// PreSharedKey and KeyPassphrase are kept same
+	strncpy(reset_params[1].value, wpakey, MAXNAMLEN);
+	strncpy(reset_params[2].value, wpakey, MAXNAMLEN);
+
+	for (i = 0; i < len; i++) {
+		cwmp_set_value(reset_params[i].node, reset_params[i].value);
+	}
+	return SUCCESS;
+}
+
+static opr_ret_t dhcp_client_renew(struct dmctx *dmctx, char *path, char *input)
+{
+	if(SUCCESS == cwmp_set_value(path, "true"))
+		return SUCCESS;
+	else
+		return FAIL;
+}
+
+static opr_ret_t vendor_conf_backup(struct dmctx *dmctx, char *path, char *input)
+{
+	struct file_server fserver = {0};
+	json_object *json_res = NULL;
+	char *vcf_name = NULL;
+
+	vcf_name = get_param_val_from_op_cmd(path, "Name");
+	if (vcf_name[0] == '\0')
+		return FAIL;
+
+	json_res = json_tokener_parse((const char *)input);
+	fserver.url = dmstrdup(dmjson_get_value(json_res, 1, "URL"));
+	if(fserver.url[0] == '\0')
+		return UBUS_INVALID_ARGUMENTS;
+
+	fserver.user = dmstrdup(dmjson_get_value(json_res, 1, "Username"));
+	if(fserver.user[0] == '\0')
+		return UBUS_INVALID_ARGUMENTS;
+
+	fserver.pass = dmjson_get_value(json_res, 1, "Password");
+	if(fserver.pass[0] == '\0')
+		return UBUS_INVALID_ARGUMENTS;
+
+	dmcmd("/bin/sh", 7, ICWMP_SCRIPT, "upload", fserver.url, VCF_FILE_TYPE, fserver.user, fserver.pass, vcf_name);
+	dmfree(vcf_name);
+
+	return SUCCESS;
+}
+
+static opr_ret_t vendor_conf_restore(struct dmctx *dmctx, char *path, char *input)
+{
+	struct file_server fserver = {0};
+	json_object *json_res = NULL;
+	char *file_size = NULL;
+
+	json_res = json_tokener_parse((const char *)input);
+	fserver.url = dmjson_get_value(json_res, 1, "URL");
+	if(fserver.url[0] == '\0')
+		return UBUS_INVALID_ARGUMENTS;
+
+	fserver.user = dmjson_get_value(json_res, 1, "Username");
+	if(fserver.user[0] == '\0')
+		return UBUS_INVALID_ARGUMENTS;
+
+	fserver.pass = dmjson_get_value(json_res, 1, "Password");
+	if(fserver.pass[0] == '\0')
+		return UBUS_INVALID_ARGUMENTS;
+
+	file_size = dmjson_get_value(json_res, 1, "FileSize");
+
+	dmcmd("/bin/sh", 7, ICWMP_SCRIPT, "download", fserver.url, file_size, VCF_FILE_TYPE, fserver.user, fserver.pass);
+
+	if (0 == dmcmd_no_wait("/bin/sh", 4, ICWMP_SCRIPT, "apply", "download", VCF_FILE_TYPE))
+		return SUCCESS;
+	else
+		return FAIL;
+}
+
+static void fill_wireless_scan_results(struct dmctx *dmctx, char *radio)
+{
+	json_object *res, *obj;
+	struct neighboring_wiFi_diagnostic neighboring = {0};
+	char *ssid, *bssid, *channel, *frequency, *signal_stregth, *noise;
+
+	dmubus_call(ROUTER_WIRELESS_UBUS_PATH, "scanresults", UBUS_ARGS{{"radio", radio, String}}, 1, &res);
+
+	if(!json_object_object_get_ex(res,"access_points", &obj)) {
+		return;
+	}
+
+	uint8_t len = json_object_array_length(obj);
+	for (uint8_t j = 0; j < len; j++ ) {
+		json_object *array_obj = json_object_array_get_idx(obj, j);
+		neighboring.ssid = dmjson_get_value(array_obj, 1, "ssid");
+		neighboring.bssid = dmjson_get_value(array_obj, 1, "bssid");
+		neighboring.channel = dmjson_get_value(array_obj, 1, "channel");
+		neighboring.frequency = dmjson_get_value(array_obj, 1, "frequency");
+		neighboring.signal_strength = dmjson_get_value(array_obj, 1, "rssi");
+		neighboring.noise = dmjson_get_value(array_obj, 1, "snr");
+
+		dmasprintf(&ssid, "Result.%d.SSID", j+1);
+		dmasprintf(&bssid, "Result.%d.BSSID", j+1);
+		dmasprintf(&channel, "Result.%d.Channel", j+1);
+		dmasprintf(&frequency, "Result.%d.OperatingFrequencyBand", j+1);
+		dmasprintf(&signal_stregth, "Result.%d.SignalStrength", j+1);
+		dmasprintf(&noise, "Result.%d.Noise", j+1);
+
+		add_list_paramameter(dmctx, ssid, neighboring.ssid, "string­", NULL, 0);
+		add_list_paramameter(dmctx, bssid, neighboring.bssid, "string­", NULL, 0);
+		add_list_paramameter(dmctx, channel, neighboring.channel, "unsignedInt­", NULL, 0);
+		add_list_paramameter(dmctx, frequency, neighboring.frequency, "string­", NULL, 0);
+		add_list_paramameter(dmctx, signal_stregth, neighboring.signal_strength, "int­", NULL, 0);
+		add_list_paramameter(dmctx, noise, neighboring.noise, "int­", NULL, 0);
+	}
+}
+
+static opr_ret_t fetch_neighboring_wifi_diagnostic(struct dmctx *dmctx, char *path, char *input)
+{
+	json_object *res;
+
+	dmubus_call(ROUTER_WIRELESS_UBUS_PATH, "radios", UBUS_ARGS{}, 0, &res);
+	json_object_object_foreach(res, key, val) {
+		fill_wireless_scan_results(dmctx, key);
+	}
+
+	return SUCCESS;
+}
+
+static opr_ret_t ip_diagnostics_ipping(struct dmctx *dmctx, char *path, char *input)
+{
+	json_object *json_res = NULL;
+	struct ipping_diagnostics ipping = {0};
+
+	json_res = json_tokener_parse((const char *)input);
+	ipping.host = dmjson_get_value(json_res, 1, "Host");
+	if(ipping.host[0] == '\0')
+		return UBUS_INVALID_ARGUMENTS;
+	ipping.interface = dmjson_get_value(json_res, 1, "Interface");
+	ipping.proto = dmjson_get_value(json_res, 1, "ProtocolVersion");
+	ipping.nbofrepetition = dmjson_get_value(json_res, 1, "NumberOfRepetitions");
+	ipping.timeout = dmjson_get_value(json_res, 1, "Timeout");
+	ipping.datablocksize = dmjson_get_value(json_res, 1, "DataBlockSize");
+	ipping.dscp = dmjson_get_value(json_res, 1, "DSCP");
+
+	set_param_diagnostics("ippingdiagnostic", "Host", ipping.host);
+	set_param_diagnostics("ippingdiagnostic", "interface", ipping.interface);
+	set_param_diagnostics("ippingdiagnostic", "ProtocolVersion", ipping.proto);
+	set_param_diagnostics("ippingdiagnostic", "NumberOfRepetitions", ipping.nbofrepetition);
+	set_param_diagnostics("ippingdiagnostic", "Timeout", ipping.timeout);
+	set_param_diagnostics("ippingdiagnostic", "DataBlockSize", ipping.datablocksize);
+	set_param_diagnostics("ippingdiagnostic", "DSCP", ipping.dscp);
+
+	//Free uci_varstate_ctx
+	end_uci_varstate_ctx();
+
+	dmcmd("/bin/sh", 3, IPPING_PATH, "run", "usp");
+
+	//Allocate uci_varstate_ctx
+	init_uci_varstate_ctx();
+
+	ipping.success_count = get_param_diagnostics("ippingdiagnostic", "SuccessCount");
+	ipping.failure_count = get_param_diagnostics("ippingdiagnostic", "FailureCount");
+	ipping.average_response_time = get_param_diagnostics("ippingdiagnostic", "AverageResponseTime");
+	ipping.minimum_response_time = get_param_diagnostics("ippingdiagnostic", "MinimumResponseTime");
+	ipping.maximum_response_time = get_param_diagnostics("ippingdiagnostic", "MaximumResponseTime");
+	ipping.average_response_time_detailed = get_param_diagnostics("ippingdiagnostic", "AverageResponseTimeDetailed");
+	ipping.minimum_response_time_detailed = get_param_diagnostics("ippingdiagnostic", "MinimumResponseTimeDetailed");
+	ipping.maximum_response_time_detailed = get_param_diagnostics("ippingdiagnostic", "MaximumResponseTimeDetailed");
+
+	char *param_success_count = dmstrdup("SuccessCount");
+	char *param_failure_count = dmstrdup("FailureCount");
+	char *param_average_response_time = dmstrdup("AverageResponseTime");
+	char *param_minimum_response_time = dmstrdup("MinimumResponseTime");
+	char *param_maximum_response_time = dmstrdup("MaximumResponseTime");
+	char *param_average_response_time_detailed = dmstrdup("AverageResponseTimeDetailed");
+	char *param_minimum_response_time_detailed = dmstrdup("MinimumResponseTimeDetailed");
+	char *param_maximum_response_time_detailed = dmstrdup("MaximumResponseTimeDetailed");
+
+	add_list_paramameter(dmctx, param_success_count, ipping.success_count, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_failure_count, ipping.failure_count, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_average_response_time, ipping.average_response_time, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_minimum_response_time, ipping.minimum_response_time, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_maximum_response_time, ipping.maximum_response_time, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_average_response_time_detailed, ipping.average_response_time_detailed, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_minimum_response_time_detailed, ipping.minimum_response_time_detailed, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_maximum_response_time_detailed, ipping.maximum_response_time_detailed, "unsignedInt", NULL, 0);
+
+	return SUCCESS;
+}
+
+static opr_ret_t ip_diagnostics_traceroute(struct dmctx *dmctx, char *path, char *input)
+{
+	json_object *json_res = NULL;
+	struct traceroute_diagnostics traceroute = {0};
+	struct uci_section *s = NULL;
+	char *host, *host_address, *errorcode, *rttimes;
+	int i = 1;
+
+	json_res = json_tokener_parse((const char *)input);
+	traceroute.host = dmjson_get_value(json_res, 1, "Host");
+	if(traceroute.host[0] == '\0')
+		return UBUS_INVALID_ARGUMENTS;
+	traceroute.interface = dmjson_get_value(json_res, 1, "Interface");
+	traceroute.proto = dmjson_get_value(json_res, 1, "ProtocolVersion");
+	traceroute.nboftries = dmjson_get_value(json_res, 1, "NumberOfTries");
+	traceroute.timeout = dmjson_get_value(json_res, 1, "Timeout");
+	traceroute.datablocksize = dmjson_get_value(json_res, 1, "DataBlockSize");
+	traceroute.dscp = dmjson_get_value(json_res, 1, "DSCP");
+	traceroute.maxhops = dmjson_get_value(json_res, 1, "MaxHopCount");
+
+	set_param_diagnostics("traceroutediagnostic", "Host", traceroute.host);
+	set_param_diagnostics("traceroutediagnostic", "interface", traceroute.interface);
+	set_param_diagnostics("traceroutediagnostic", "ProtocolVersion", traceroute.proto);
+	set_param_diagnostics("traceroutediagnostic", "NumberOfTries", traceroute.nboftries);
+	set_param_diagnostics("traceroutediagnostic", "Timeout", traceroute.timeout);
+	set_param_diagnostics("traceroutediagnostic", "DataBlockSize", traceroute.datablocksize);
+	set_param_diagnostics("traceroutediagnostic", "DSCP", traceroute.dscp);
+	set_param_diagnostics("traceroutediagnostic", "MaxHops", traceroute.maxhops);
+
+	//Free uci_varstate_ctx
+	end_uci_varstate_ctx();
+
+	dmcmd("/bin/sh", 3, TRACEROUTE_PATH, "run", "usp");
+
+	//Allocate uci_varstate_ctx
+	init_uci_varstate_ctx();
+
+	traceroute.response_time = get_param_diagnostics("traceroutediagnostic", "ResponseTime");
+	char *param_response_time = dmstrdup("ResponseTime");
+	add_list_paramameter(dmctx, param_response_time, traceroute.response_time, "unsignedInt", NULL, 0);
+
+	uci_foreach_sections_state("cwmp", "RouteHops", s)
+	{
+		dmasprintf(&host, "RouteHops.%d.Host", i);
+		dmasprintf(&host_address, "RouteHops.%d.HostAddress", i);
+		dmasprintf(&errorcode, "RouteHops.%d.ErrorCode", i);
+		dmasprintf(&rttimes, "RouteHops.%d.RTTimes", i);
+
+		dmuci_get_value_by_section_string(s, "host", &traceroute.host_name);
+		dmuci_get_value_by_section_string(s, "ip", &traceroute.host_address);
+		dmuci_get_value_by_section_string(s, "time", &traceroute.rttimes);
+
+		add_list_paramameter(dmctx, host, traceroute.host_name, "string­", NULL, 0);
+		add_list_paramameter(dmctx, host_address, traceroute.host_address, "string­", NULL, 0);
+		add_list_paramameter(dmctx, errorcode, "0", "unsignedInt", NULL, 0);
+		add_list_paramameter(dmctx, rttimes, traceroute.rttimes, "string­", NULL, 0);
+		i++;
+	}
+
+	return SUCCESS;
+}
+
+static opr_ret_t ip_diagnostics_download(struct dmctx *dmctx, char *path, char *input)
+{
+	json_object *json_res = NULL;
+	struct download_diagnostics download = {0};
+
+	json_res = json_tokener_parse((const char *)input);
+	download.download_url = dmjson_get_value(json_res, 1, "DownloadURL");
+	if(download.download_url[0] == '\0')
+		return UBUS_INVALID_ARGUMENTS;
+	download.interface = dmjson_get_value(json_res, 1, "Interface");
+	download.dscp = dmjson_get_value(json_res, 1, "DSCP");
+	download.ethernet_priority = dmjson_get_value(json_res, 1, "EthernetPriority");
+	download.proto = dmjson_get_value(json_res, 1, "ProtocolVersion");
+	download.num_of_connections = dmjson_get_value(json_res, 1, "NumberOfConnections");
+	download.enable_per_connection_results = dmjson_get_value(json_res, 1, "EnablePerConnectionResults");
+
+	set_param_diagnostics("downloaddiagnostic", "url", download.download_url);
+	set_param_diagnostics("downloaddiagnostic", "device", download.interface);
+	set_param_diagnostics("downloaddiagnostic", "DSCP", download.dscp);
+	set_param_diagnostics("downloaddiagnostic", "ethernetpriority", download.ethernet_priority);
+	set_param_diagnostics("downloaddiagnostic", "ProtocolVersion", download.proto);
+	set_param_diagnostics("downloaddiagnostic", "NumberOfConnections", download.num_of_connections);
+	set_param_diagnostics("downloaddiagnostic", "EnablePerConnection", download.enable_per_connection_results);
+
+	if(start_upload_download_diagnostic(DOWNLOAD_DIAGNOSTIC) == -1)
+		return FAIL;
+
+	download.romtime = get_param_diagnostics("downloaddiagnostic", "ROMtime");
+	download.bomtime = get_param_diagnostics("downloaddiagnostic", "BOMtime");
+	download.eomtime = get_param_diagnostics("downloaddiagnostic", "EOMtime");
+	download.test_bytes_received = get_param_diagnostics("downloaddiagnostic", "TestBytesReceived");
+	download.total_bytes_received = get_param_diagnostics("downloaddiagnostic", "TotalBytesReceived");
+	download.total_bytes_sent = get_param_diagnostics("downloaddiagnostic", "TotalBytesSent");
+	download.test_bytes_received_under_full_loading = get_param_diagnostics("downloaddiagnostic", "TestBytesReceived");
+	download.total_bytes_received_under_full_loading = get_param_diagnostics("downloaddiagnostic", "TotalBytesReceived");
+	download.total_bytes_sent_under_full_loading = get_param_diagnostics("downloaddiagnostic", "TotalBytesSent");
+	download.period_of_full_loading = get_param_diagnostics("downloaddiagnostic", "PeriodOfFullLoading");
+	download.tcp_open_request_time = get_param_diagnostics("downloaddiagnostic", "TCPOpenRequestTimes");
+	download.tcp_open_response_time = get_param_diagnostics("downloaddiagnostic", "TCPOpenResponseTime");
+
+	char *param_rom_time = dmstrdup("ROMTime");
+	char *param_bom_time = dmstrdup("BOMTime");
+	char *param_eom_time = dmstrdup("EOMTime");
+	char *param_test_bytes_received = dmstrdup("TestBytesReceived");
+	char *param_total_bytes_received = dmstrdup("TotalBytesReceived");
+	char *param_total_bytes_sent = dmstrdup("TotalBytesSent");
+	char *param_test_bytes_received_under_full_loading = dmstrdup("TestBytesReceivedUnderFullLoading");
+	char *param_total_bytes_received_under_full_loading = dmstrdup("TotalBytesReceivedUnderFullLoading");
+	char *param_total_bytes_sent_under_full_loading = dmstrdup("TotalBytesSentUnderFullLoading");
+	char *param_period_of_full_loading = dmstrdup("PeriodOfFullLoading");
+	char *param_tcp_open_request_time = dmstrdup("TCPOpenRequestTime");
+	char *param_tcp_open_response_time = dmstrdup("TCPOpenResponseTime");
+
+	add_list_paramameter(dmctx, param_rom_time, download.romtime, "dateTime", NULL, 0);
+	add_list_paramameter(dmctx, param_bom_time, download.bomtime, "dateTime", NULL, 0);
+	add_list_paramameter(dmctx, param_eom_time, download.eomtime, "dateTime", NULL, 0);
+	add_list_paramameter(dmctx, param_test_bytes_received, download.test_bytes_received, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_total_bytes_received, download.total_bytes_received, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_total_bytes_sent, download.total_bytes_sent, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_test_bytes_received_under_full_loading, download.test_bytes_received_under_full_loading, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_total_bytes_received_under_full_loading, download.total_bytes_received_under_full_loading, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_total_bytes_sent_under_full_loading, download.total_bytes_sent_under_full_loading, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_period_of_full_loading, download.period_of_full_loading, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_tcp_open_request_time, download.tcp_open_request_time, "dateTime", NULL, 0);
+	add_list_paramameter(dmctx, param_tcp_open_response_time, download.tcp_open_response_time, "dateTime", NULL, 0);
+
+	return SUCCESS;
+}
+
+static opr_ret_t ip_diagnostics_upload(struct dmctx *dmctx, char *path, char *input)
+{
+	json_object *json_res = NULL;
+	struct upload_diagnostics upload = {0};
+
+	json_res = json_tokener_parse((const char *)input);
+	upload.upload_url = dmjson_get_value(json_res, 1, "UploadURL");
+	if(upload.upload_url[0] == '\0')
+		return UBUS_INVALID_ARGUMENTS;
+	upload.test_file_length = dmjson_get_value(json_res, 1, "TestFileLength");
+	if(upload.test_file_length[0] == '\0')
+		return UBUS_INVALID_ARGUMENTS;
+	upload.interface = dmjson_get_value(json_res, 1, "Interface");
+	upload.dscp = dmjson_get_value(json_res, 1, "DSCP");
+	upload.ethernet_priority = dmjson_get_value(json_res, 1, "EthernetPriority");
+	upload.proto = dmjson_get_value(json_res, 1, "ProtocolVersion");
+	upload.num_of_connections = dmjson_get_value(json_res, 1, "NumberOfConnections");
+	upload.enable_per_connection_results = dmjson_get_value(json_res, 1, "EnablePerConnectionResults");
+
+	set_param_diagnostics("uploaddiagnostic", "url", upload.upload_url);
+	set_param_diagnostics("uploaddiagnostic", "TestFileLength", upload.test_file_length);
+	set_param_diagnostics("uploaddiagnostic", "device", upload.interface);
+	set_param_diagnostics("uploaddiagnostic", "DSCP", upload.dscp);
+	set_param_diagnostics("uploaddiagnostic", "ethernetpriority", upload.ethernet_priority);
+	set_param_diagnostics("uploaddiagnostic", "ProtocolVersion", upload.proto);
+	set_param_diagnostics("uploaddiagnostic", "NumberOfConnections", upload.num_of_connections);
+	set_param_diagnostics("uploaddiagnostic", "EnablePerConnection", upload.enable_per_connection_results);
+
+	if(start_upload_download_diagnostic(UPLOAD_DIAGNOSTIC) == -1)
+		return FAIL;
+
+	upload.romtime = get_param_diagnostics("uploaddiagnostic", "ROMtime");
+	upload.bomtime = get_param_diagnostics("uploaddiagnostic", "BOMtime");
+	upload.eomtime = get_param_diagnostics("uploaddiagnostic", "EOMtime");
+	upload.test_bytes_sent = get_param_diagnostics("uploaddiagnostic", "TestBytesSent");
+	upload.total_bytes_received = get_param_diagnostics("uploaddiagnostic", "TotalBytesReceived");
+	upload.total_bytes_sent = get_param_diagnostics("uploaddiagnostic", "TotalBytesSent");
+	upload.test_bytes_sent_under_full_loading = get_param_diagnostics("uploaddiagnostic", "TestBytesSent");
+	upload.total_bytes_received_under_full_loading = get_param_diagnostics("uploaddiagnostic", "TotalBytesReceived");
+	upload.total_bytes_sent_under_full_loading = get_param_diagnostics("uploaddiagnostic", "TotalBytesSent");
+	upload.period_of_full_loading = get_param_diagnostics("uploaddiagnostic", "PeriodOfFullLoading");
+	upload.tcp_open_request_time = get_param_diagnostics("uploaddiagnostic", "TCPOpenRequestTimes");
+	upload.tcp_open_response_time = get_param_diagnostics("uploaddiagnostic", "TCPOpenResponseTime");
+
+	char *param_rom_time = dmstrdup("ROMTime");
+	char *param_bom_time = dmstrdup("BOMTime");
+	char *param_eom_time = dmstrdup("EOMTime");
+	char *param_test_bytes_sent = dmstrdup("TestBytesSent");
+	char *param_total_bytes_received = dmstrdup("TotalBytesReceived");
+	char *param_total_bytes_sent = dmstrdup("TotalBytesSent");
+	char *param_test_bytes_sent_under_full_loading = dmstrdup("TestBytesSentUnderFullLoading");
+	char *param_total_bytes_received_under_full_loading = dmstrdup("TotalBytesReceivedUnderFullLoading");
+	char *param_total_bytes_sent_under_full_loading = dmstrdup("TotalBytesSentUnderFullLoading");
+	char *param_period_of_full_loading = dmstrdup("PeriodOfFullLoading");
+	char *param_tcp_open_request_time = dmstrdup("TCPOpenRequestTime");
+	char *param_tcp_open_response_time = dmstrdup("TCPOpenResponseTime");
+
+	add_list_paramameter(dmctx, param_rom_time, upload.romtime, "dateTime", NULL, 0);
+	add_list_paramameter(dmctx, param_bom_time, upload.bomtime, "dateTime", NULL, 0);
+	add_list_paramameter(dmctx, param_eom_time, upload.eomtime, "dateTime", NULL, 0);
+	add_list_paramameter(dmctx, param_test_bytes_sent, upload.test_bytes_sent, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_total_bytes_received, upload.total_bytes_received, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_total_bytes_sent, upload.total_bytes_sent, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_test_bytes_sent_under_full_loading, upload.test_bytes_sent_under_full_loading, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_total_bytes_received_under_full_loading, upload.total_bytes_received_under_full_loading, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_total_bytes_sent_under_full_loading, upload.total_bytes_sent_under_full_loading, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_period_of_full_loading, upload.period_of_full_loading, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_tcp_open_request_time, upload.tcp_open_request_time, "dateTime", NULL, 0);
+	add_list_paramameter(dmctx, param_tcp_open_response_time, upload.tcp_open_response_time, "dateTime", NULL, 0);
+
+	return SUCCESS;
+}
+
+static opr_ret_t ip_diagnostics_udpecho(struct dmctx *dmctx, char *path, char *input)
+{
+	json_object *json_res = NULL;
+	struct udpecho_diagnostics udpecho = {0};
+
+	json_res = json_tokener_parse((const char *)input);
+	udpecho.host = dmjson_get_value(json_res, 1, "Host");
+	if(udpecho.host[0] == '\0')
+		return UBUS_INVALID_ARGUMENTS;
+	udpecho.port = dmjson_get_value(json_res, 1, "Port");
+	if(udpecho.port[0] == '\0')
+		return UBUS_INVALID_ARGUMENTS;
+
+	udpecho.interface = dmjson_get_value(json_res, 1, "Interface");
+	udpecho.proto = dmjson_get_value(json_res, 1, "ProtocolVersion");
+	udpecho.nbofrepetition = dmjson_get_value(json_res, 1, "NumberOfRepetitions");
+	udpecho.timeout = dmjson_get_value(json_res, 1, "Timeout");
+	udpecho.datablocksize = dmjson_get_value(json_res, 1, "DataBlockSize");
+	udpecho.dscp = dmjson_get_value(json_res, 1, "DSCP");
+	udpecho.inter_transmission_time = dmjson_get_value(json_res, 1, "InterTransmissionTime");
+
+	set_param_diagnostics("udpechodiagnostic", "Host", udpecho.host);
+	set_param_diagnostics("udpechodiagnostic", "port", udpecho.port);
+	set_param_diagnostics("udpechodiagnostic", "interface", udpecho.interface);
+	set_param_diagnostics("udpechodiagnostic", "ProtocolVersion", udpecho.proto);
+	set_param_diagnostics("udpechodiagnostic", "NumberOfRepetitions", udpecho.nbofrepetition);
+	set_param_diagnostics("udpechodiagnostic", "Timeout", udpecho.timeout);
+	set_param_diagnostics("udpechodiagnostic", "DataBlockSize", udpecho.datablocksize);
+	set_param_diagnostics("udpechodiagnostic", "DSCP", udpecho.dscp);
+	set_param_diagnostics("udpechodiagnostic", "InterTransmissionTime", udpecho.inter_transmission_time);
+
+	//Free uci_varstate_ctx
+	end_uci_varstate_ctx();
+
+	dmcmd("/bin/sh", 3, UDPECHO_PATH, "run", "usp");
+
+	//Allocate uci_varstate_ctx
+	init_uci_varstate_ctx();
+
+	udpecho.success_count = get_param_diagnostics("udpechodiagnostic", "SuccessCount");
+	udpecho.failure_count = get_param_diagnostics("udpechodiagnostic", "FailureCount");
+	udpecho.average_response_time = get_param_diagnostics("udpechodiagnostic", "AverageResponseTime");
+	udpecho.minimum_response_time = get_param_diagnostics("udpechodiagnostic", "MinimumResponseTime");
+	udpecho.maximum_response_time = get_param_diagnostics("udpechodiagnostic", "MaximumResponseTime");
+
+	char *param_success_count = dmstrdup("SuccessCount");
+	char *param_failure_count = dmstrdup("FailureCount");
+	char *param_average_response_time = dmstrdup("AverageResponseTime");
+	char *param_minimum_response_time = dmstrdup("MinimumResponseTime");
+	char *param_maximum_response_time = dmstrdup("MaximumResponseTime");
+
+	add_list_paramameter(dmctx, param_success_count, udpecho.success_count, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_failure_count, udpecho.failure_count, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_average_response_time, udpecho.average_response_time, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_minimum_response_time, udpecho.minimum_response_time, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_maximum_response_time, udpecho.maximum_response_time, "unsignedInt", NULL, 0);
+
+	return SUCCESS;
+}
+
+static opr_ret_t ip_diagnostics_serverselection(struct dmctx *dmctx, char *path, char *input)
+{
+
+	json_object *json_res = NULL;
+	struct serverselection_diagnostics serverselection = {0};
+
+	json_res = json_tokener_parse((const char *)input);
+	serverselection.hostlist = dmjson_get_value(json_res, 1, "HostList");
+	if(serverselection.hostlist[0] == '\0')
+		return UBUS_INVALID_ARGUMENTS;
+	serverselection.port = dmjson_get_value(json_res, 1, "Port");
+	serverselection.proto = dmjson_get_value(json_res, 1, "Protocol");
+	if (strcmp(serverselection.proto, "ICMP")) {
+		if(serverselection.port[0] == '\0')
+			return UBUS_INVALID_ARGUMENTS;
+	}
+	serverselection.protocol_version = dmjson_get_value(json_res, 1, "ProtocolVersion");
+	serverselection.interface = dmjson_get_value(json_res, 1, "Interface");
+	serverselection.nbofrepetition = dmjson_get_value(json_res, 1, "NumberOfRepetitions");
+	serverselection.timeout = dmjson_get_value(json_res, 1, "Timeout");
+
+	set_param_diagnostics("serverselectiondiagnostic", "HostList", serverselection.hostlist);
+	set_param_diagnostics("serverselectiondiagnostic", "interface", serverselection.interface);
+	set_param_diagnostics("serverselectiondiagnostic", "ProtocolVersion", serverselection.proto);
+	set_param_diagnostics("serverselectiondiagnostic", "NumberOfRepetitions", serverselection.nbofrepetition);
+	set_param_diagnostics("serverselectiondiagnostic", "port", serverselection.port);
+	set_param_diagnostics("serverselectiondiagnostic", "Protocol", serverselection.proto);
+
+	//Free uci_varstate_ctx
+	end_uci_varstate_ctx();
+
+	dmcmd("/bin/sh", 3, SERVERSELECTION_PATH, "run", "usp");
+
+	//Allocate uci_varstate_ctx
+	init_uci_varstate_ctx();
+
+	serverselection.fasthost = get_param_diagnostics("serverselectiondiagnostic", "AverageResponseTimeDetailed");
+	serverselection.average_response_time = get_param_diagnostics("serverselectiondiagnostic", "AverageResponseTime");
+	serverselection.minimum_response_time = get_param_diagnostics("serverselectiondiagnostic", "MinimumResponseTime");
+	serverselection.maximum_response_time = get_param_diagnostics("serverselectiondiagnostic", "MaximumResponseTime");
+
+
+	char *param_fastest_host = dmstrdup("FastestHost");
+	char *param_average_response_time = dmstrdup("AverageResponseTime");
+	char *param_minimum_response_time = dmstrdup("MinimumResponseTime");
+	char *param_maximum_response_time = dmstrdup("MaximumResponseTime");
+
+	add_list_paramameter(dmctx, param_fastest_host, serverselection.fasthost, "string", NULL, 0);
+	add_list_paramameter(dmctx, param_average_response_time, serverselection.average_response_time, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_minimum_response_time, serverselection.minimum_response_time, "unsignedInt", NULL, 0);
+	add_list_paramameter(dmctx, param_maximum_response_time, serverselection.maximum_response_time, "unsignedInt", NULL, 0);
+
+	return SUCCESS;
+}
+
+static opr_ret_t ip_diagnostics_nslookup(struct dmctx *dmctx, char *path, char *input)
+{
+	json_object *json_res = NULL;
+	struct nslookup_diagnostics nslookup = {0};
+	struct uci_section *s = NULL;
+	char *status, *answertype, *hostname, *ipaddress, *dnsserverip, *responsetime;
+	int i = 1;
+
+	json_res = json_tokener_parse((const char *)input);
+	nslookup.hostname = dmjson_get_value(json_res, 1, "HostName");
+	if(nslookup.hostname[0] == '\0')
+		return UBUS_INVALID_ARGUMENTS;
+	nslookup.interface = dmjson_get_value(json_res, 1, "Interface");
+	nslookup.dnsserver = dmjson_get_value(json_res, 1, "DNSServer");
+	nslookup.timeout = dmjson_get_value(json_res, 1, "Timeout");
+	nslookup.nbofrepetition = dmjson_get_value(json_res, 1, "NumberOfRepetitions");
+
+	set_param_diagnostics("nslookupdiagnostic", "HostName", nslookup.hostname);
+	set_param_diagnostics("nslookupdiagnostic", "interface", nslookup.interface);
+	set_param_diagnostics("nslookupdiagnostic", "DNSServer", nslookup.dnsserver);
+	set_param_diagnostics("nslookupdiagnostic", "Timeout", nslookup.timeout);
+	set_param_diagnostics("nslookupdiagnostic", "NumberOfRepetitions", nslookup.nbofrepetition);
+
+	//Free uci_varstate_ctx
+	end_uci_varstate_ctx();
+
+	dmcmd("/bin/sh", 3, NSLOOKUP_PATH, "run", "usp");
+
+	//Allocate uci_varstate_ctx
+	init_uci_varstate_ctx();
+
+	nslookup.success_count = get_param_diagnostics("nslookupdiagnostic", "SuccessCount");
+	char *param_success_count = dmstrdup("SuccessCount");
+	add_list_paramameter(dmctx, param_success_count, nslookup.success_count, "unsignedInt", NULL, 0);
+
+	uci_foreach_sections_state("cwmp", "NSLookupResult", s)
+	{
+		dmasprintf(&status, "Result.%d.Status", i);
+		dmasprintf(&answertype, "Result.%d.AnswerType", i);
+		dmasprintf(&hostname, "Result.%d.HostNameReturned", i);
+		dmasprintf(&ipaddress, "Result.%d.IPAddresses", i);
+		dmasprintf(&dnsserverip, "Result.%d.DNSServerIP", i);
+		dmasprintf(&responsetime, "Result.%d.ResponseTime", i);
+
+		dmuci_get_value_by_section_string(s, "Status", &nslookup.status);
+		dmuci_get_value_by_section_string(s, "AnswerType", &nslookup.answer_type);
+		dmuci_get_value_by_section_string(s, "HostNameReturned", &nslookup.hostname_returned);
+		dmuci_get_value_by_section_string(s, "IPAddresses", &nslookup.ip_addresses);
+		dmuci_get_value_by_section_string(s, "DNSServerIP", &nslookup.dns_server_ip);
+		dmuci_get_value_by_section_string(s, "ResponseTime", &nslookup.response_time);
+
+		add_list_paramameter(dmctx, status, nslookup.status, "string­", NULL, 0);
+		add_list_paramameter(dmctx, answertype, nslookup.answer_type, "string­", NULL, 0);
+		add_list_paramameter(dmctx, hostname, nslookup.hostname_returned, "string­", NULL, 0);
+		add_list_paramameter(dmctx, ipaddress, nslookup.ip_addresses, "string­", NULL, 0);
+		add_list_paramameter(dmctx, dnsserverip, nslookup.dns_server_ip, "string­", NULL, 0);
+		add_list_paramameter(dmctx, responsetime, nslookup.response_time, "unsignedInt", NULL, 0);
+		i++;
+	}
+
+	return SUCCESS;
+}
+
+static struct op_cmd operate_helper[] = {
+	{"Device.Reboot", reboot_device},
+	{"Device.FactoryReset", factory_reset},
+	{"Device.IP.Interface.*.Reset", network_interface_reset},
+	{"Device.PPP.Interface.*.Reset", network_interface_reset},
+	{"Device.WiFi.Reset", wireless_reset},
+	{"Device.WiFi.AccessPoint.*.Security.Reset", ap_security_reset},
+	{"Device.DHCPv4.Client.*.Renew", dhcp_client_renew},
+	{"Device.DHCPv6.Client.*.Renew", dhcp_client_renew},
+	{"Device.DeviceInfo.VendorConfigFile.*.Backup", vendor_conf_backup},
+	{"Device.DeviceInfo.VendorConfigFile.*.Restore", vendor_conf_restore},
+	{"Device.WiFi.NeighboringWiFiDiagnostic", fetch_neighboring_wifi_diagnostic},
+	//{"Device.DeviceInfo.VendorLogFile.*.Upload", blob_parser},
+	{"Device.IP.Diagnostics.IPPing", ip_diagnostics_ipping},
+	{"Device.IP.Diagnostics.TraceRoute", ip_diagnostics_traceroute},
+	{"Device.IP.Diagnostics.DownloadDiagnostics", ip_diagnostics_download},
+	{"Device.IP.Diagnostics.UploadDiagnostics", ip_diagnostics_upload},
+	{"Device.IP.Diagnostics.UDPEchoDiagnostics", ip_diagnostics_udpecho},
+	{"Device.IP.Diagnostics.ServerSelectionDiagnostics", ip_diagnostics_serverselection},
+	{"Device.DNS.Diagnostics.NSLookupDiagnostics", ip_diagnostics_nslookup}
+};
+
+int operate_on_node(struct dmctx *dmctx, char *path, char *input)
+{
+	uint8_t len = 0;
+
+	len = ARRAY_SIZE(operate_helper);
+	for(uint8_t i=0; i<len; i++) {
+		if(match(path, operate_helper[i].name)) {
+			return(operate_helper[i].opt(dmctx, path, input));
+		}
+	}
+	return CMD_NOT_FOUND;
+}
diff --git a/dmoperate.h b/dmoperate.h
new file mode 100644
index 0000000000000000000000000000000000000000..eb4753ba5050449d82e56dc074153f54cb39dd01
--- /dev/null
+++ b/dmoperate.h
@@ -0,0 +1,230 @@
+/*
+ * dmoperate.c: Operate handler for uspd
+ *
+ * Copyright (C) 2019 iopsys Software Solutions AB. All rights reserved.
+ *
+ * Author: Vivek Dutta <vivek.dutta@iopsys.eu>
+ * Author: Yashvardhan <y.yashvardhan@iopsys.eu>
+ * Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#ifndef __DMOPERATE_H__
+#define __DMOPERATE_H__
+
+#include <sys/param.h>
+
+#define SYSTEM_UBUS_PATH "system"
+#define NETWORK_INTERFACE_UBUS_PATH "network.interface"
+#define NETWORK_WIRELESS_UBUS_PATH "network.wireless"
+#define ROUTER_WIRELESS_UBUS_PATH "router.wireless"
+#define ICWMP_SCRIPT "/usr/sbin/icwmp"
+#define VCF_FILE_TYPE "3"
+
+enum operate_ret_status{
+	UBUS_INVALID_ARGUMENTS,
+	SUCCESS,
+	FAIL,
+	CMD_NOT_FOUND,
+	__STATUS_MAX,
+};
+
+typedef enum operate_ret_status opr_ret_t;
+
+typedef opr_ret_t (*operation) (struct dmctx *dmctx, char *p, char *input);
+
+struct wifi_security_params {
+	char node[MAXNAMLEN];
+	char *param;
+	char value[MAXNAMLEN];
+};
+
+struct file_server {
+	char *url;
+	char *user;
+	char *pass;
+};
+
+struct neighboring_wiFi_diagnostic {
+	char *radio;
+	char *ssid;
+	char *bssid;
+	char *channel;
+	char *frequency;
+	char *encryption_mode;
+	char *operating_frequency_band;
+	char *supported_standards;
+	char *operating_standards;
+	char *operating_channel_bandwidth;
+	char *signal_strength;
+	char *noise;
+};
+
+struct ipping_diagnostics {
+	char *host;
+	char *interface;
+	char *proto;
+	char *nbofrepetition;
+	char *timeout;
+	char *datablocksize;
+	char *dscp;
+	char *success_count;
+	char *failure_count;
+	char *average_response_time;
+	char *minimum_response_time;
+	char *maximum_response_time;
+	char *average_response_time_detailed;
+	char *minimum_response_time_detailed;
+	char *maximum_response_time_detailed;
+};
+
+struct traceroute_diagnostics {
+	char *host;
+	char *interface;
+	char *proto;
+	char *nboftries;
+	char *timeout;
+	char *datablocksize;
+	char *dscp;
+	char *maxhops;
+	char *response_time;
+	char *host_name;
+	char *host_address;
+	char *rttimes;
+};
+
+struct download_diagnostics {
+	char *interface;
+	char *download_url;
+	char *dscp;
+	char *ethernet_priority;
+	char *proto;
+	char *num_of_connections;
+	char *enable_per_connection_results;
+
+	char *romtime;
+	char *bomtime;
+	char *eomtime;
+	char *test_bytes_received;
+	char *total_bytes_received;
+	char *total_bytes_sent;
+	char *test_bytes_received_under_full_loading;
+	char *total_bytes_received_under_full_loading;
+	char *total_bytes_sent_under_full_loading;
+	char *period_of_full_loading;
+	char *tcp_open_request_time;
+	char *tcp_open_response_time;
+
+	char *per_conn_romtime;
+	char *per_conn_bomtime;
+	char *per_conn_eomtime;
+	char *per_conn_test_bytes_received;
+	char *per_conn_total_bytes_received;
+	char *per_conn_total_bytes_sent;
+	char *per_conn_period_of_full_loading;
+	char *per_conn_tcp_open_request_time;
+	char *per_conn_tcp_open_response_time;
+};
+
+struct upload_diagnostics {
+	char *interface;
+	char *upload_url;
+	char *dscp;
+	char *ethernet_priority;
+	char *test_file_length;
+	char *proto;
+	char *num_of_connections;
+	char *enable_per_connection_results;
+
+	char *romtime;
+	char *bomtime;
+	char *eomtime;
+	char *test_bytes_sent;
+	char *total_bytes_received;
+	char *total_bytes_sent;
+	char *test_bytes_sent_under_full_loading;
+	char *total_bytes_received_under_full_loading;
+	char *total_bytes_sent_under_full_loading;
+	char *period_of_full_loading;
+	char *tcp_open_request_time;
+	char *tcp_open_response_time;
+
+	char *per_conn_romtime;
+	char *per_conn_bomtime;
+	char *per_conn_eomtime;
+	char *per_conn_test_bytes_sent;
+	char *per_conn_total_bytes_received;
+	char *per_conn_total_bytes_sent;
+	char *per_conn_period_of_full_loading;
+	char *per_conn_tcp_open_request_time;
+	char *per_conn_tcp_open_response_time;
+};
+
+struct udpecho_diagnostics {
+	char *host;
+	char *interface;
+	char *port;
+	char *nbofrepetition;
+	char *timeout;
+	char *datablocksize;
+	char *dscp;
+	char *inter_transmission_time;
+	char *response_time;
+	char *proto;
+	char *success_count;
+	char *failure_count;
+	char *average_response_time;
+	char *minimum_response_time;
+	char *maximum_response_time;
+};
+
+struct serverselection_diagnostics {
+	char *interface;
+	char *protocol_version;
+	char *proto;
+	char *hostlist;
+	char *port;
+	char *nbofrepetition;
+	char *timeout;
+	char *fasthost;
+	char *average_response_time;
+	char *minimum_response_time;
+	char *maximum_response_time;
+};
+
+struct nslookup_diagnostics {
+	char *interface;
+	char *hostname;
+	char *dnsserver;
+	char *timeout;
+	char *nbofrepetition;
+	char *success_count;
+	char *status;
+	char *answer_type;
+	char *hostname_returned;
+	char *ip_addresses;
+	char *dns_server_ip;
+	char *response_time;
+};
+
+struct op_cmd {
+	char *name;
+	operation opt;
+};
+
+int operate_on_node(struct dmctx *dmctx, char *path, char *input);
+
+#endif
diff --git a/dmtree/tr064/upnp_common.c b/dmtree/tr064/upnp_common.c
new file mode 100755
index 0000000000000000000000000000000000000000..20b80465efbb512fc43e59429a5519b3e09281c0
--- /dev/null
+++ b/dmtree/tr064/upnp_common.c
@@ -0,0 +1,173 @@
+#include "upnp_common.h"
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmjson.h"
+#include "dmcommon.h"
+#include <json-c/json.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int upnp_get_NetworkInterfaceNumberOfEntries(){
+	int n = 0;
+	struct uci_section *s = NULL;
+	uci_foreach_sections("network", "interface", s) {
+		n++;
+	}
+	return n;
+}
+
+int upnp_get_IPInterfaceNumberOfEntries(){
+	char *value1 = NULL, *value2 = NULL;
+	int n = 0;
+	struct uci_section *s = NULL;
+
+	uci_foreach_sections("network", "interface", s) {
+		dmuci_get_value_by_section_string(s, "ipaddr", &value1);
+		if(value1 !=NULL && strlen(value1)>0) {
+			n++;
+			continue;
+		}
+		dmuci_get_value_by_section_string(s, "proto", &value2);
+		if(value2 !=NULL && strlen(value2)>0 && strstr(value2, "dhcp") != NULL) {
+			n++;
+			continue;
+		}
+	}
+	return n;
+}
+
+char *upnp_get_softwareversion()
+{
+	char *v=NULL, *tmp=NULL, *val=NULL;
+
+	db_get_value_string("hw", "board", "iopVersion", &v);
+	tmp = dmstrdup(v);// MEM WILL BE FREED IN DMMEMCLEAN
+	if(!tmp) return NULL;
+	val = tmp;
+	return val;
+}
+
+void upnp_getMacAddress(char *interfaceName, char **macAddress){
+	json_object *res = NULL, *res1 =NULL;
+	int length;
+
+	char *device = NULL;
+	char **devices =NULL;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", interfaceName}}, 1, &res);
+	if(!(res)) goto not_found;
+	device = dmjson_get_value(res, 1, "device");
+	devices = strsplit(device, " ", &length);
+	dmubus_call("network.device", "status", UBUS_ARGS{{}}, 0, &res1);
+	if(!(res1)) goto not_found;
+	*macAddress = dmjson_get_value(res1, 2, devices[0], "macaddr");
+	not_found:
+	return;
+}
+
+void upnp_getInterfaceStatus(char *interfaceName, char **status){
+	json_object *res= NULL;
+	char *up= NULL;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", interfaceName}}, 1, &res);
+	if (res == NULL) {
+		*status = NULL;
+		goto end_bloc;
+	}
+	up = dm_ubus_get_value(res, 1, "up");
+	if(up == NULL) {
+		*status = NULL;
+		goto end_bloc;
+	}
+	if(!strcmp(up,"true")) dmasprintf(status, "UP"); else dmasprintf(status, "DOWN");
+
+	end_bloc:
+		return;
+}
+
+int  upnp_getInterfaceTotalPacketSent(char *interfaceName, char **totalPktSent){
+	json_object *res= NULL, *res1= NULL, *res2= NULL;
+	char *device = NULL, *tx_packets = NULL;
+	int length;
+	char **devices = NULL;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", interfaceName}}, 1, &res);
+	if(res == NULL) {
+		*totalPktSent = NULL;
+		goto end_bloc;
+	}
+	device = dmjson_get_value(res, 1, "device");
+	if(device == NULL || strlen(device)<=0){
+		*totalPktSent = NULL;
+		goto end_bloc;
+	}
+	devices = strsplit(device, " ", &length);
+
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", devices[0]}}, 1, &res1);
+	if(res1 == NULL){
+		*totalPktSent = NULL;
+		goto end_bloc;
+	}
+	DM_ASSERT(res1, *totalPktSent = "");
+	*totalPktSent = dmjson_get_value(res1, 2, "statistics", "tx_packets");
+
+	end_bloc:
+		return 0;
+}
+
+int upnp_getInterfaceTotalPacketReceived(char *interfaceName, char **totalPktReceived){
+	json_object *res= NULL, *res1= NULL, *res2= NULL;
+	char *device = NULL, *rx_packets = NULL;
+	int length;
+	char **devices = NULL;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", interfaceName}}, 1, &res);
+	if(res == NULL){
+		*totalPktReceived = NULL;
+		goto end_bloc;
+	}
+	device = dmjson_get_value(res, 1, "device");
+	if(device == NULL || strlen(device)<=0){
+		*totalPktReceived = NULL;
+		goto end_bloc;
+	}
+	devices = strsplit(device, " ", &length);
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", devices[0]}}, 1, &res1);
+	if(res1 == NULL){
+		*totalPktReceived = NULL;
+		goto end_bloc;
+	}
+	DM_ASSERT(res1, *totalPktReceived = "");
+	*totalPktReceived = dmjson_get_value(res1, 2, "statistics", "rx_packets");
+
+	end_bloc:
+		return 0;
+}
+
+char *upnp_get_deviceid_manufactureroui()
+{
+	char *v = NULL;
+	char str[16];
+	char *mac = NULL;
+	json_object *res= NULL;
+	size_t ln;
+
+	dmubus_call("router.system", "info", UBUS_ARGS{{}}, 0, &res);
+	if(!(res)) goto not_found;
+	mac = dmjson_get_value(res, 2, "system", "basemac");
+	if(mac)
+	{
+		ln = strlen(mac);
+		if (ln<17) goto not_found;
+		sscanf (mac,"%2c:%2c:%2c",str,str+2,str+4);
+		str[6] = '\0';
+		v = dmstrdup(str); // MEM WILL BE FREED IN DMMEMCLEAN
+		return v;
+	}
+not_found:
+	v = "";
+	return v;
+}
diff --git a/dmtree/tr064/upnp_common.h b/dmtree/tr064/upnp_common.h
new file mode 100755
index 0000000000000000000000000000000000000000..70b2b337907d0e42be50c057eb1919803c183993
--- /dev/null
+++ b/dmtree/tr064/upnp_common.h
@@ -0,0 +1,11 @@
+#ifndef UPNP_COMMON_H
+#define UPNP_COMMON_H
+char *upnp_get_softwareversion();
+int upnp_get_NetworkInterfaceNumberOfEntries();
+int upnp_get_IPInterfaceNumberOfEntries();
+void upnp_getMacAddress(char *interfaceName, char **macAddress);
+void upnp_getInterfaceStatus(char *interfaceName, char **status);
+int upnp_getInterfaceTotalPacketSent(char *interfaceName, char **totalPktSent);
+int upnp_getInterfaceTotalPacketReceived(char *interfaceName, char **totalPktReceived);
+char *upnp_get_deviceid_manufactureroui();
+#endif
diff --git a/dmtree/tr064/upnp_configuration.c b/dmtree/tr064/upnp_configuration.c
new file mode 100755
index 0000000000000000000000000000000000000000..369a8dbd04b72a26384b242446d25f16efeeda81
--- /dev/null
+++ b/dmtree/tr064/upnp_configuration.c
@@ -0,0 +1,307 @@
+#include "dmcwmp.h"
+#include "upnp_configuration.h"
+#include "upnp_common.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "dmjson.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#define DELIMITOR ","
+/**************************************************************************
+*
+* /UPnP/DM/Configuration/ datamodel tree
+*
+***************************************************************************/
+
+/*** /UPnP/DM/Configuration/ objects ***/
+DMOBJ upnpConfigurationObj[] = {
+{"Network",&DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE, upnpConfigurationNetworkObj, upnpConfigurationNetworkParams, NULL},
+{0}
+};
+
+/*** /UPnP/DM/Configuration/Network objects ***/
+DMOBJ upnpConfigurationNetworkObj[] = {
+{"IPInterface",&DMWRITE, upnp_configuration_ipinterface_createinstance, upnp_configuration_ipinterface_deleteinstance, NULL, upnp_browseIPInterfaceInst, &DMFINFRM, &DMNONE, upnpConfigurationNetworkIPInterfaceObj, upnpConfigurationNetworkIPInterfaceParams, NULL},
+{0}
+};
+
+/*** /UPnP/DM/Configuration/Network parameters ***/
+DMLEAF upnpConfigurationNetworkParams[]= {
+{"HostName", &DMWRITE, DMT_STRING, upnp_configuration_get_hostname, upnp_configuration_set_hostname, &DMFINFRM, NULL},
+{"IPInterfaceNumberOfEntries", &DMREAD, DMT_UNINT, upnp_configuration_get_IPInterfaceNumberOfEntries, NULL, &DMFINFRM, NULL},
+{0}
+};
+
+/*** /UPnP/DM/Configuration/Network/IPInterface/#/ objects ***/
+DMOBJ upnpConfigurationNetworkIPInterfaceObj[]= {
+{"IPv4",&DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE, NULL, upnpConfigurationNetworkIPInterfaceIpv4Params, NULL},
+{0}
+};
+
+/*** /UPnP/DM/Configuration/Network/IPInterface/#/ parameters ***/
+DMLEAF upnpConfigurationNetworkIPInterfaceParams[]= {
+{"SystemName", &DMREAD, DMT_STRING, upnp_configuration_get_SystemName, NULL, &DMFINFRM, NULL},
+{0}
+};
+
+/*** /UPnP/DM/Configuration/Network/IPInterface/#/IPv4/ parameters ***/
+DMLEAF upnpConfigurationNetworkIPInterfaceIpv4Params[]= {
+{"IPAddress", &DMWRITE, DMT_STRING, upnp_configuration_get_ipv4_IPAddress, upnp_configuration_set_ipv4_IPAddress, &DMFINFRM, NULL},
+{"AddressingType", &DMWRITE, DMT_STRING, upnp_configuration_get_ipv4_addressingtype, upnp_configuration_set_ipv4_addressingtype, &DMFINFRM, NULL},
+{"DNSServers", &DMWRITE, DMT_STRING, upnp_configuration_get_ipv4_dnssevers, upnp_configuration_set_ipv4_dnssevers, &DMFINFRM, NULL},
+{"SubnetMask", &DMWRITE, DMT_STRING, upnp_configuration_get_ipv4_subnetmask, upnp_configuration_set_ipv4_subnetmask, &DMFINFRM, NULL},
+{"DefaultGateway", &DMWRITE, DMT_STRING, upnp_configuration_get_ipv4_defaultgateway, upnp_configuration_set_ipv4_defaultgateway, &DMFINFRM, NULL},
+{0}
+};
+
+/**************************************************************************
+*
+* /UPnP/DM/Configuration/* parameters functions
+*
+***************************************************************************/
+
+int upnp_configuration_get_hostname(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) {
+		return 0;
+}
+
+int upnp_configuration_get_IPInterfaceNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	int n = upnp_get_IPInterfaceNumberOfEntries();
+	dmasprintf(value, "%d", n);
+	return 0;
+}
+
+int upnp_configuration_get_SystemName(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct upnp_configuration_args *upnp_configargs = (struct upnp_configuration_args *)data;
+	if(upnp_configargs->systemName !=NULL && strlen(upnp_configargs->systemName)>0) dmasprintf(value, "%s", upnp_configargs->systemName);
+	return 0;
+}
+
+int upnp_configuration_get_ipv4_IPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct upnp_configuration_args *upnp_configargs = (struct upnp_configuration_args *)data;
+	char *ipv4addr=NULL;
+	dmuci_get_value_by_section_string(upnp_configargs->upnpConfiguration_sec, "ipaddr", &ipv4addr);
+	if(ipv4addr!=NULL && strlen(ipv4addr)> 0) dmasprintf(value, "%s", ipv4addr);
+	return 0;
+}
+
+int upnp_configuration_get_ipv4_addressingtype(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	char *proto=NULL;
+	struct upnp_configuration_args *upnp_configargs = (struct upnp_configuration_args *)data;
+	dmuci_get_value_by_section_string(upnp_configargs->upnpConfiguration_sec, "proto", &proto);
+
+	if(proto!=NULL && strlen(proto)>0 && strstr(proto,"dhcp")) dmasprintf(value, "%s", "DHCP");
+	else dmasprintf(value, "%s", "Static");
+	return 0;
+}
+
+int upnp_configuration_get_ipv4_dnssevers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	json_object *res= NULL;
+	struct upnp_configuration_args *upnp_configargs = (struct upnp_configuration_args *)data;
+	char *iface_name = section_name(upnp_configargs->upnpConfiguration_sec);
+	if(iface_name==NULL || strlen(iface_name)<=0) {
+		*value = NULL;
+		return 0;
+	}
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", iface_name}}, 1, &res);
+	if(res == NULL) {
+		*value = NULL;
+		return 0;
+	}
+	DM_ASSERT(res, *value = "");
+
+	*value = dmjson_get_value_array_all(res, DELIMITOR, 1, "dns-server");
+	if ((*value)[0] == '\0') {
+		dmuci_get_value_by_section_string(upnp_configargs->upnpConfiguration_sec, "dns", value);
+		*value = dmstrdup(*value); // MEM WILL BE FREED IN DMMEMCLEAN
+		char *p = *value;
+		while (*p) {
+			if (*p == ' ' && p != *value && *(p-1) != ',')
+				*p++ = ',';
+			else
+				p++;
+		}
+	}
+	return 0;
+}
+
+int upnp_configuration_get_ipv4_subnetmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+
+	struct upnp_configuration_args *upnp_configargs = (struct upnp_configuration_args *)data;
+	char *netmask = NULL;
+	dmuci_get_value_by_section_string(upnp_configargs->upnpConfiguration_sec, "netmask", &netmask);
+
+	if(netmask!=NULL && strlen(netmask)>0) dmasprintf(value, "%s", netmask);
+	else *value =NULL;
+	return 0;
+}
+
+int upnp_configuration_get_ipv4_defaultgateway(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct upnp_configuration_args *upnp_configargs = (struct upnp_configuration_args *)data;
+	FILE* fp = NULL;
+	struct proc_routing proute = {0};
+	char line[MAX_PROC_ROUTING];
+	fp = fopen(ROUTING_FILE, "r");
+	if ( fp != NULL)
+	{
+		fgets(line, MAX_PROC_ROUTING, fp);
+		while (fgets(line, MAX_PROC_ROUTING, fp) != NULL )
+		{
+			if (line[0] == '\n')
+				continue;
+			parse_proc_route_line(line, &proute);
+			if(!strcmp(proute.iface, upnp_configargs->systemName)) {
+				if(proute.gateway!=NULL && strlen(proute.gateway)>0) dmasprintf(value, "%s", proute.gateway);
+				return 0;
+			}
+			else continue;
+		}
+		fclose(fp) ;
+	}
+	return 0;
+}
+
+int upnp_configuration_set_hostname(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	return 0;
+}
+
+int upnp_configuration_set_ipv4_IPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	struct upnp_configuration_args *upnp_configargs = (struct upnp_configuration_args *)data;
+	char *proto= NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(upnp_configargs->upnpConfiguration_sec, "proto", &proto);
+			if(proto == NULL || strlen(proto)<=0) return 0;
+			if(strcmp(proto, "static") == 0)
+				dmuci_set_value_by_section(upnp_configargs->upnpConfiguration_sec, "ipaddr", value);
+			return 0;
+	}
+	return 0;
+}
+
+int upnp_configuration_set_ipv4_addressingtype(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	struct upnp_configuration_args *upnp_configargs = (struct upnp_configuration_args *)data;
+	char *proto= NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if(strcasecmp(value, "static") == 0) {
+				dmuci_set_value_by_section(upnp_configargs->upnpConfiguration_sec, "proto", "static");
+				dmuci_set_value_by_section(upnp_configargs->upnpConfiguration_sec, "ipaddr", "0.0.0.0");
+			}
+			if(strcasecmp(value, "dhcp") == 0) {
+				dmuci_set_value_by_section(upnp_configargs->upnpConfiguration_sec, "proto", "dhcp");
+				dmuci_set_value_by_section(upnp_configargs->upnpConfiguration_sec, "ipaddr", "");
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int upnp_configuration_set_ipv4_dnssevers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	struct upnp_configuration_args *upnp_configargs = (struct upnp_configuration_args *)data;
+	char *dup= NULL, *p= NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dup = dmstrdup(value);
+			p = dup;
+			while (*p) {
+				if (*p == ',')
+					*p++ = ' ';
+				else
+					p++;
+			}
+			dmuci_set_value_by_section(upnp_configargs->upnpConfiguration_sec, "dns", dup);
+			dmfree(dup);
+			return 0;
+	}
+	return 0;
+}
+
+int upnp_configuration_set_ipv4_subnetmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	struct upnp_configuration_args *upnp_configargs = (struct upnp_configuration_args *)data;
+	char *proto = NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(upnp_configargs->upnpConfiguration_sec, "proto", &proto);
+			if(proto == NULL || strlen(proto)<=0) return 0;
+			if(strcmp(proto, "static") == 0)
+				dmuci_set_value_by_section(upnp_configargs->upnpConfiguration_sec, "netmask", value);
+			return 0;
+	}
+	return 0;
+}
+
+int upnp_configuration_set_ipv4_defaultgateway(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	struct upnp_configuration_args *upnp_configargs = (struct upnp_configuration_args *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(upnp_configargs->upnpConfiguration_sec, "gateway", value);
+			return 0;
+	}
+	return 0;
+}
+
+
+int upnp_configuration_ipinterface_createinstance(char *refparam, struct dmctx *ctx, void *data, char **instance){
+	char *value=NULL;
+	char *iface_instance=NULL, ib[8], ip_name[32];
+	char *p = ip_name;
+	struct uci_section *iface_sec = NULL;
+	iface_instance = get_last_instance("network","interface","upnp_ip_iface_instance");
+	sprintf(ib, "%d", iface_instance ? atoi(iface_instance)+1 : 1);
+	dmstrappendstr(p, "ip_interface_");
+	dmstrappendstr(p, ib);
+	dmstrappendend(p);
+	dmuci_add_section_and_rename("network", "interface", &iface_sec, &value);
+	dmuci_set_value("network", ip_name, "", "interface");
+	dmuci_set_value("network", ip_name, "proto", "dhcp");
+	*instance = update_instance(iface_sec, iface_instance, "upnp_ip_iface_instance");
+	return 0;
+}
+
+int upnp_configuration_ipinterface_deleteinstance(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action){
+	struct upnp_configuration_args *upnp_configargs = (struct upnp_configuration_args *)data;
+	switch (del_action) {
+	case DEL_INST:
+		if(upnp_configargs->upnpConfiguration_sec == NULL) return FAULT_9005;
+		dmuci_delete_by_section(upnp_configargs->upnpConfiguration_sec, NULL, NULL);
+		break;
+	case DEL_ALL:
+		return FAULT_9005;
+	}
+	return 0;
+}
+
+int upnp_browseIPInterfaceInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance){
+	char *value1, *value2;
+	struct uci_section *net_sec = NULL;
+	char *iface_int = NULL, *iface_int_last = NULL;
+	struct upnp_configuration_args currUpnpConfigurationArgs = {0};
+	char *type=NULL, *ipv4addr = "", *ipv6addr = "", *proto, *inst;
+	char *value= NULL, *netmask = NULL;
+	json_object *res = NULL, *res1 = NULL;
+
+	uci_foreach_sections("network", "interface", net_sec) {
+		currUpnpConfigurationArgs.upnpConfiguration_sec = net_sec;
+		currUpnpConfigurationArgs.systemName = section_name(net_sec);
+		dmuci_get_value_by_section_string(net_sec, "netmask", &netmask);
+
+		iface_int = handle_update_instance(1, dmctx, &iface_int_last, update_instance_alias, 3, net_sec, "upnp_ip_iface_instance", "upnp_ip_iface_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&currUpnpConfigurationArgs, iface_int) == DM_STOP) break;
+
+	}
+	return 0;
+}
diff --git a/dmtree/tr064/upnp_configuration.h b/dmtree/tr064/upnp_configuration.h
new file mode 100755
index 0000000000000000000000000000000000000000..ae73b7cb016870319562b15d92dec591b3a0a93f
--- /dev/null
+++ b/dmtree/tr064/upnp_configuration.h
@@ -0,0 +1,59 @@
+#ifndef UPNP_CONFIGURATION_H
+#define UPNP_CONFIGURATION_H
+#include "dmcwmp.h"
+
+struct upnp_configuration_args{
+	struct uci_section *upnpConfiguration_sec;
+	char *systemName;
+	char *ipv4address;
+	char *ipv6address;
+	char *addressingType;
+	char *ipAddressType;
+	char *prefix;
+	char **dnsservers;
+	char *netmask;
+	char *gateway;
+	int numberOfEntries;
+};
+
+int upnp_configuration_get_hostname(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_configuration_get_IPInterfaceNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_configuration_get_SystemName(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_configuration_get_ipv4_IPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_configuration_get_ipv4_addressingtype(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_configuration_get_ipv4_dnssevers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_configuration_get_ipv4_subnetmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_configuration_get_ipv4_defaultgateway(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_configuration_get_ipv6_addressnumberofentries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_configuration_get_ipv6_dnsservers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_configuration_get_ipv6_defaultgateway(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_configuration_get_ipv6_IPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_configuration_get_ipv6_IPAddressType(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_configuration_get_ipv6_addressingtype(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_configuration_get_ipv6_Prefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int upnp_configuration_set_hostname(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int upnp_configuration_set_ipv4_IPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int upnp_configuration_set_ipv4_addressingtype(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int upnp_configuration_set_ipv4_dnssevers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int upnp_configuration_set_ipv4_subnetmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int upnp_configuration_set_ipv4_defaultgateway(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int upnp_configuration_ipinterface_createinstance(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int upnp_configuration_ipinterface_deleteinstance(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int upnp_configuration_address_createinstance(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int upnp_configuration_address_deleteinstance(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int upnp_browseIPInterfaceInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int upnp_browseIPv6Address(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+extern DMOBJ upnpConfigurationNetworkObj[];
+extern DMLEAF upnpConfigurationNetworkParams[];
+extern DMLEAF upnpConfigurationNetworkObjParams[];
+extern DMOBJ upnpConfigurationNetworkIPInterfaceObj[];
+extern DMLEAF upnpConfigurationNetworkIPInterfaceParams[];
+extern DMLEAF upnpConfigurationNetworkIPInterfaceIpv4Params[];
+extern DMOBJ upnpConfigurationNetworkIPInterfaceIpv6Obj[];
+extern DMLEAF upnpConfigurationNetworkIPInterfaceIpv6Params[];
+extern DMOBJ upnpConfigurationNetworkIPInterfaceIpv6AddressParams[];
+extern DMOBJ upnpConfigurationObj[];
+#endif
diff --git a/dmtree/tr064/upnp_device.c b/dmtree/tr064/upnp_device.c
new file mode 100644
index 0000000000000000000000000000000000000000..00b1d3429cf92c002201a3029ebe68680ff08c98
--- /dev/null
+++ b/dmtree/tr064/upnp_device.c
@@ -0,0 +1,264 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*      Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+*		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*/
+
+#include "dmuci.h"
+#include "dmcwmp.h"
+#include "upnp_device.h"
+#include "deviceinfo.h"
+#include "managementserver.h"
+#include "times.h"
+#include "upnp.h"
+#if BBF_TR104
+#include "voice_services.h"
+#endif
+#include "x_iopsys_eu_ice.h"
+#include "x_iopsys_eu_igmp.h"
+#include "x_iopsys_eu_ipacccfg.h"
+#include "x_iopsys_eu_logincfg.h"
+#include "x_iopsys_eu_power_mgmt.h"
+#include "x_iopsys_eu_syslog.h"
+#include "softwaremodules.h"
+#include "xmpp.h"
+#include "x_iopsys_eu_owsd.h"
+#include "x_iopsys_eu_dropbear.h"
+#include "x_iopsys_eu_buttons.h"
+#include "x_iopsys_eu_wifilife.h"
+#include "ip.h"
+#include "ethernet.h"
+#include "bridging.h"
+#include "wifi.h"
+#include "atm.h"
+#include "ptm.h"
+#include "dhcpv4.h"
+#include "hosts.h"
+#include "nat.h"
+#include "ppp.h"
+#include "routing.h"
+#include "userinterface.h"
+#include "landevice.h"
+#include "wandevice.h"
+#include "ippingdiagnostics.h"
+#include "lan_interfaces.h"
+#include "layer_3_forwarding.h"
+#include "x_iopsys_eu_wifi.h"
+#include "layer_2_bridging.h"
+#include "downloaddiagnostic.h"
+#include "uploaddiagnostic.h"
+#include "deviceconfig.h"
+#include "firewall.h"
+#include "dns.h"
+#include "users.h"
+#include "dsl.h"
+#include "dhcpv6.h"
+#include "interfacestack.h"
+#include "qos.h"
+
+#ifdef BBF_TR064
+#include "upnp_deviceinfo.h"
+#include "upnp_configuration.h"
+#include "upnp_monitoring.h"
+#endif
+
+/*** UPNP ***/
+#ifdef BBF_TR064
+DMOBJ tEntry098ObjUPNP[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{(char *)&dmroot, &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE, tRoot098ObjUPNP, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMOBJ tRoot098ObjUPNP[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"BBF", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE, tRoot098ObjUPNPBBF, NULL, NULL, BBFDM_BOTH},
+{"UPnP", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE, tRoot098ObjUPNPDMROOT, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMOBJ tRoot098ObjUPNPDMROOT[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"DM", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE, tRoot098ObjUPNPDM, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMOBJ tRoot098ObjUPNPDM[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"DeviceInfo", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,upnpDeviceInfoObj, upnpDeviceInfoParams, NULL, BBFDM_BOTH},
+{"Configuration", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,upnpConfigurationObj, NULL, NULL, BBFDM_BOTH},
+{"Monitoring", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,upnpMonitoringObj, upnpMonitoringParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMOBJ tRoot098ObjUPNPBBF[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"DeviceInfo", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,tDeviceInfoObj, tDeviceInfoParams, NULL, BBFDM_BOTH},
+{"ManagementServer", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,NULL, tManagementServerParams, NULL, BBFDM_BOTH},
+{"Time", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,NULL, tTimeParams, NULL, BBFDM_BOTH},
+{"UPnP", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,tUPnPObj, NULL, NULL, BBFDM_BOTH},
+#if BBF_TR104
+{"VoiceService", &DMREAD, NULL, NULL, NULL, browseVoiceServiceInst, NULL, NULL, tVoiceServiceObj, tVoiceServiceParam, NULL, BBFDM_BOTH},
+#endif
+{CUSTOM_PREFIX"ICE", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,NULL, tSe_IceParam, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"IGMP", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,NULL, tSe_IgmpParam, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"IpAccCfg", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,tSe_IpAccObj, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"LoginCfg", &DMREAD, NULL, NULL, NULL, NULL,NULL, &DMNONE,NULL, tSe_LoginCfgParam, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"PowerManagement", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,NULL, tSe_PowerManagementParam, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"SyslogCfg", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,NULL, tSe_SyslogCfgParam, NULL, BBFDM_BOTH},
+{"SoftwareModules", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,tSoftwareModulesObj, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"Owsd", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,XIopsysEuOwsdObj, XIopsysEuOwsdParams, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"Dropbear", &DMWRITE, add_dropbear_instance, delete_dropbear_instance, NULL, browseXIopsysEuDropbear, NULL, &DMNONE, NULL, X_IOPSYS_EU_DropbearParams, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"Buttons", &DMREAD, NULL, NULL, NULL, browseXIopsysEuButton, NULL, &DMNONE, NULL, X_IOPSYS_EU_ButtonParams, NULL, BBFDM_BOTH},
+{"LANDevice", &DMREAD, NULL, NULL, NULL, browselandeviceInst, &DMFINFRM, &DMNONE,tLANDeviceObj, tLANDeviceParam, NULL, BBFDM_BOTH},
+{"WANDevice", &DMREAD, NULL, NULL, NULL, browsewandeviceInst, &DMFINFRM, &DMWANConnectionDevicenotif,tWANDeviceObj, tWANDeviceParam, NULL, BBFDM_BOTH},
+{"LANInterfaces", &DMREAD, NULL, NULL, check_laninterfaces, NULL, &DMFINFRM, &DMNONE,tLANInterfacesObj, tLANInterfacesParam, NULL, BBFDM_BOTH},
+{"IPPingDiagnostics", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,NULL, tIPPingDiagnosticsParam, NULL, BBFDM_BOTH},
+{"Layer3Forwarding", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,tLayer3ForwardingObj, tLayer3ForwardingParam, NULL, BBFDM_BOTH},
+{"Layer2Bridging", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,tLayer2BridgingObj, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"Wifi", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,tsewifiObj, NULL, NULL, BBFDM_BOTH},
+{"DownloadDiagnostics", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,NULL, tDownloadDiagnosticsParam, NULL, BBFDM_BOTH},
+{"UploadDiagnostics", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,NULL, tUploadDiagnosticsParam, NULL, BBFDM_BOTH},
+{"XMPP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL,tXMPPObj, tXMPPParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMOBJ tEntry181ObjUPNP[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{(char *)&dmroot, &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE, tRoot181ObjUPNP, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMOBJ tRoot181ObjUPNP[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"BBF", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE, tRoot181ObjUPNPBBF, NULL, NULL, BBFDM_BOTH},
+{"UPnP", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE, tRoot181ObjUPNPDMROOT, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMOBJ tRoot181ObjUPNPDMROOT[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"DM", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE, tRoot181ObjUPNPDM, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMOBJ tRoot181ObjUPNPDM[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"DeviceInfo", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,upnpDeviceInfoObj, upnpDeviceInfoParams, NULL, BBFDM_BOTH},
+{"Configuration", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,upnpConfigurationObj, NULL, NULL, BBFDM_BOTH},
+{"Monitoring", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,upnpMonitoringObj, upnpMonitoringParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMOBJ tRoot181ObjUPNPBBF[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"DeviceInfo", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,tDeviceInfoObj, tDeviceInfoParams, NULL, BBFDM_BOTH},
+{"ManagementServer", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,NULL, tManagementServerParams, NULL, BBFDM_BOTH},
+{"Time", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,NULL, tTimeParams, NULL, BBFDM_BOTH, BBFDM_BOTH},
+{"UPnP", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,tUPnPObj, NULL, NULL, BBFDM_BOTH},
+#if BBF_TR104
+{"VoiceService", &DMREAD, NULL, NULL, NULL, browseVoiceServiceInst, NULL, NULL, tVoiceServiceObj, tVoiceServiceParam, NULL, BBFDM_BOTH},
+#endif
+{CUSTOM_PREFIX"ICE", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,NULL, tSe_IceParam, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"IGMP", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,NULL, tSe_IgmpParam, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"IpAccCfg", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,tSe_IpAccObj, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"LoginCfg", &DMREAD, NULL, NULL, NULL, NULL,NULL, &DMNONE,NULL, tSe_LoginCfgParam, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"PowerManagement", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,NULL, tSe_PowerManagementParam, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"SyslogCfg", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,NULL, tSe_SyslogCfgParam, NULL, BBFDM_BOTH},
+{"SoftwareModules", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,tSoftwareModulesObj, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"Owsd", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,XIopsysEuOwsdObj, XIopsysEuOwsdParams, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"Dropbear", &DMWRITE, add_dropbear_instance, delete_dropbear_instance, NULL, browseXIopsysEuDropbear, NULL, &DMNONE, NULL, X_IOPSYS_EU_DropbearParams, NULL, BBFDM_BOTH, BBFDM_BOTH},
+{CUSTOM_PREFIX"Buttons", &DMREAD, NULL, NULL, NULL, browseXIopsysEuButton, NULL, &DMNONE, NULL, X_IOPSYS_EU_ButtonParams, NULL, BBFDM_BOTH},
+{"Bridging",&DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tBridgingObj, NULL, NULL, BBFDM_BOTH},
+{"WiFi",&DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tWifiObj, NULL, NULL, BBFDM_BOTH},
+{"IP",&DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tIPObj, NULL, NULL, BBFDM_BOTH},
+{"Ethernet", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tEthernetObj, NULL, NULL, BBFDM_BOTH},
+{"DSL",&DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDslObj, NULL, NULL, BBFDM_BOTH},
+{"ATM",&DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tAtmObj, NULL, NULL, BBFDM_BOTH},
+{"PTM", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tPtmObj, NULL, NULL, BBFDM_BOTH},
+{"DHCPv4", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDhcpv4Obj, NULL, NULL, BBFDM_BOTH},
+{"Hosts", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, thostsObj, thostsParam, NULL, BBFDM_BOTH},
+{"NAT", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tnatObj, NULL, NULL, BBFDM_BOTH},
+{"PPP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tpppObj, NULL, NULL, BBFDM_BOTH},
+{"Routing", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tRoutingObj, tRoutingParam, NULL, BBFDM_BOTH},
+{"XMPP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL,tXMPPObj, tXMPPParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+UPNP_SUPPORTED_DM tUPNPSupportedDM[];
+UPNP_SUPPORTED_DM tUPNPSupportedDM_098[] = {
+{"/UPnP/DM/DeviceInfo/", "urn:UPnP:Parent Device:1:ConfigurationManagement:2", DMROOT_URL_098, "UPnP DeviceInfo from "DMROOT_DESC_098, ""},
+{"/UPnP/DM/Configuration/", "urn:UPnP:Parent Device:1:ConfigurationManagement:2", DMROOT_URL_098, "Configuration from "DMROOT_DESC_098, ""},
+{"/UPnP/DM/Monitoring/", "urn:UPnP:Parent Device:1:ConfigurationManagement:2", DMROOT_URL_098, "Monitoring from "DMROOT_DESC_098, ""},
+{"/BBF/DeviceInfo/", DMROOT_URI_098, DMROOT_URL_098, "DeviceInfo from "DMROOT_DESC_098, ""},
+{"/BBF/ManagementServer/", DMROOT_URI_098, DMROOT_URL_098, "ManagementServer from "DMROOT_DESC_098, ""},
+{"/BBF/Time/", DMROOT_URI_098, DMROOT_URL_098, "Time from "DMROOT_DESC_098, ""},
+{"/BBF/UPnP/", DMROOT_URI_098, DMROOT_URL_098, "UPnP from "DMROOT_DESC_098, ""},
+{"/BBF/VoiceService/", "urn:broadband-forum-org:wt-104-2-0-0", "https://www.broadband-forum.org/cwmp/tr-104-2-0-0.html", "TR-104 Voice:2 Service Object definition", ""},
+{"/BBF/"CUSTOM_PREFIX"ICE/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for ICE", ""},
+{"/BBF/"CUSTOM_PREFIX"IGMP/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for ICE", ""},
+{"/BBF/"CUSTOM_PREFIX"IpAccCfg/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for IGMP", ""},
+{"/BBF/"CUSTOM_PREFIX"LoginCfg/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for LoginCfg", ""},
+{"/BBF/"CUSTOM_PREFIX"PowerManagement/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for PowerManagement", ""},
+{"/BBF/"CUSTOM_PREFIX"SyslogCfg/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for SyslogCfg", ""},
+{"/BBF/SoftwareModules/", DMROOT_URI_098, DMROOT_URL_098, "SoftwareModules from "DMROOT_DESC_098, ""},
+{"/BBF/"CUSTOM_PREFIX"Owsd/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for Owsd", ""},
+{"/BBF/"CUSTOM_PREFIX"Dropbear/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for Dropbear", ""},
+{"/BBF/"CUSTOM_PREFIX"Buttons/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for Buttons", ""},
+{"/BBF/LANDevice/", DMROOT_URI_098, DMROOT_URL_098, "LANDevice from "DMROOT_DESC_098, ""},
+{"/BBF/WANDevice/", DMROOT_URI_098, DMROOT_URL_098, "WANDevice from "DMROOT_DESC_098, ""},
+{"/BBF/LANInterfaces/", DMROOT_URI_098, DMROOT_URL_098, "LANInterfaces from "DMROOT_DESC_098, ""},
+{"/BBF/IPPingDiagnostics/", DMROOT_URI_098, DMROOT_URL_098, "IPPingDiagnostics from "DMROOT_DESC_098, ""},
+{"/BBF/Layer3Forwarding/", DMROOT_URI_098, DMROOT_URL_098, "Layer3Forwarding from "DMROOT_DESC_098, ""},
+{"/BBF/Layer2Bridging/", DMROOT_URI_098, DMROOT_URL_098, "Layer2Bridging from "DMROOT_DESC_098, ""},
+{"/BBF/"CUSTOM_PREFIX"Wifi/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for WiFi", ""},
+{"/BBF/DownloadDiagnostics/", DMROOT_URI_098, DMROOT_URL_098, "DownloadDiagnostics from "DMROOT_DESC_098, ""},
+{"/BBF/UploadDiagnostics/", DMROOT_URI_098, DMROOT_URL_098, "UploadDiagnostics from "DMROOT_DESC_098, ""},
+{"/BBF/XMPP/", DMROOT_URI_098, DMROOT_URL_098, "XMPP from "DMROOT_DESC_098, ""},
+{0}
+};
+
+UPNP_SUPPORTED_DM tUPNPSupportedDM_181[] = {
+{"/UPnP/DM/DeviceInfo/", "urn:UPnP:Parent Device:1:ConfigurationManagement:2", DMROOT_URL_181, "UPnP DeviceInfo from "DMROOT_DESC_181, ""},
+{"/UPnP/DM/Configuration/", "urn:UPnP:Parent Device:1:ConfigurationManagement:2", DMROOT_URL_181, "Configuration from "DMROOT_DESC_181, ""},
+{"/UPnP/DM/Monitoring/", "urn:UPnP:Parent Device:1:ConfigurationManagement:2", DMROOT_URL_181, "Monitoring from "DMROOT_DESC_181, ""},
+{"/BBF/DeviceInfo/", DMROOT_URI_181, DMROOT_URL_181, "DeviceInfo from "DMROOT_DESC_181, ""},
+{"/BBF/ManagementServer/", DMROOT_URI_181, DMROOT_URL_181, "ManagementServer from "DMROOT_DESC_181, ""},
+{"/BBF/Time/", DMROOT_URI_181, DMROOT_URL_181, "Time from "DMROOT_DESC_181, ""},
+{"/BBF/UPnP/", DMROOT_URI_181, DMROOT_URL_181, "UPnP from "DMROOT_DESC_181, ""},
+{"/BBF/VoiceService/", "urn:broadband-forum-org:wt-104-2-0-0", "https://www.broadband-forum.org/cwmp/tr-104-2-0-0.html", "TR-104 Voice:2 Service Object definition", ""},
+{"/BBF/"CUSTOM_PREFIX"ICE/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for ICE", ""},
+{"/BBF/"CUSTOM_PREFIX"IGMP/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for ICE", ""},
+{"/BBF/"CUSTOM_PREFIX"IpAccCfg/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for IGMP", ""},
+{"/BBF/"CUSTOM_PREFIX"LoginCfg/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for LoginCfg", ""},
+{"/BBF/"CUSTOM_PREFIX"PowerManagement/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for PowerManagement", ""},
+{"/BBF/"CUSTOM_PREFIX"SyslogCfg/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for SyslogCfg", ""},
+{"/BBF/SoftwareModules/", DMROOT_URI_181, DMROOT_URL_181, "SoftwareModules from "DMROOT_DESC_181, ""},
+{"/BBF/"CUSTOM_PREFIX"Owsd/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for Owsd", ""},
+{"/BBF/"CUSTOM_PREFIX"Dropbear/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for Dropbear", ""},
+{"/BBF/"CUSTOM_PREFIX"Buttons/", "urn:intenogroup-com:na", "https://www.intenogroup.com/", "Inteno extension for Buttons", ""},
+{"/BBF/Bridging/", DMROOT_URI_181, DMROOT_URL_181, "Bridging from "DMROOT_DESC_181, ""},
+{"/BBF/WiFi/", DMROOT_URI_181, DMROOT_URL_181, "WiFi from "DMROOT_DESC_181, ""},
+{"/BBF/IP/", DMROOT_URI_181, DMROOT_URL_181, "IP from "DMROOT_DESC_181, ""},
+{"/BBF/Ethernet/", DMROOT_URI_181, DMROOT_URL_181, "Ethernet from "DMROOT_DESC_181, ""},
+{"/BBF/DSL/", DMROOT_URI_181, DMROOT_URL_181, "DSL from "DMROOT_DESC_181, ""},
+{"/BBF/ATM/", DMROOT_URI_181, DMROOT_URL_181, "ATM from "DMROOT_DESC_181, ""},
+{"/BBF/PTM/", DMROOT_URI_181, DMROOT_URL_181, "PTM from "DMROOT_DESC_181, ""},
+{"/BBF/DHCPv4/", DMROOT_URI_181, DMROOT_URL_181, "DHCPv4 from "DMROOT_DESC_181, ""},
+{"/BBF/Hosts/", DMROOT_URI_181, DMROOT_URL_181, "Hosts from "DMROOT_DESC_181, ""},
+{"/BBF/NAT/", DMROOT_URI_181, DMROOT_URL_181, "NAT from "DMROOT_DESC_181, ""},
+{"/BBF/PPP/", DMROOT_URI_181, DMROOT_URL_181, "PPP from "DMROOT_DESC_181, ""},
+{"/BBF/Routing/", DMROOT_URI_181, DMROOT_URL_181, "Routing from "DMROOT_DESC_181, ""},
+{"/BBF/XMPP/", DMROOT_URI_181, DMROOT_URL_181, "XMPP from "DMROOT_DESC_181, ""},
+{0}
+};
+
+size_t tr98_size  = sizeof(tUPNPSupportedDM_098);
+size_t tr181_size = sizeof(tUPNPSupportedDM_181);
+#endif
diff --git a/dmtree/tr064/upnp_device.h b/dmtree/tr064/upnp_device.h
new file mode 100644
index 0000000000000000000000000000000000000000..6fe182890cefbbd292d608e779a88a34ffe4cfc1
--- /dev/null
+++ b/dmtree/tr064/upnp_device.h
@@ -0,0 +1,44 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*      Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+*		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*/
+
+#ifndef __UPNPDEVICE_H
+#define __UPNPDEVICE_H
+
+#ifdef BBF_TR064
+extern DMOBJ tEntry098ObjUPNP[];
+extern DMOBJ tRoot098ObjUPNP[];
+extern DMOBJ tRoot098ObjUPNPDMROOT[];
+extern DMOBJ tRoot098ObjUPNPDM[];
+extern DMOBJ tRoot098ObjUPNPBBF[];
+extern DMOBJ tEntry181ObjUPNP[];
+extern DMOBJ tRoot181ObjUPNP[];
+extern DMOBJ tRoot181ObjUPNPDMROOT[];
+extern DMOBJ tRoot181ObjUPNPDM[];
+extern DMOBJ tRoot181ObjUPNPBBF[];
+extern UPNP_SUPPORTED_DM tUPNPSupportedDM[];
+extern UPNP_SUPPORTED_DM tUPNPSupportedDM_098[];
+extern UPNP_SUPPORTED_DM tUPNPSupportedDM_181[];
+extern size_t tr98_size;
+extern size_t tr181_size;
+
+#define UPNP_SUPPORTED_PARAMETERS_VERSION 1 //Should be incremented each time the Parameters are updated
+#define UPNP_SUPPORTED_DATAMODEL_VERSION 1 //Should be incremented each time the tUPNPSupportedDM array is updated
+
+#define DMROOT_URI_098 "urn:broadband-forum-org:tr-098-1-8-0"
+#define DMROOT_URL_098 "https://www.broadband-forum.org/cwmp/tr-098-1-8-0.html"
+#define DMROOT_DESC_098 "TR-098 InternetGatewayDevice:1 Root Object definition"
+#define DMROOT_URI_181 "urn:broadband-forum-org:tr-181-2-11-0"
+#define DMROOT_URL_181 "https://www.broadband-forum.org/cwmp/tr-181-2-11-0.html"
+#define DMROOT_DESC_181 "TR-181 Device:2 Root Object definition"
+
+#endif
+#endif
diff --git a/dmtree/tr064/upnp_deviceinfo.c b/dmtree/tr064/upnp_deviceinfo.c
new file mode 100755
index 0000000000000000000000000000000000000000..df8d90662db825e648032c5789b1f78a74a8a3a3
--- /dev/null
+++ b/dmtree/tr064/upnp_deviceinfo.c
@@ -0,0 +1,266 @@
+#include <stdio.h>
+#include "dmcwmp.h"
+#include "upnp_deviceinfo.h"
+#include <sys/utsname.h>
+#include "dmuci.h"
+#include "dmmem.h"
+#include "dmcommon.h"
+#include <uci.h>
+#include "upnp_common.h"
+#include<stdbool.h>
+
+int upnp_browseNetworkInterfaceInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+/**************************************************************************
+*
+* /UPnP/DM/DeviceInfo/ datamodel tree
+*
+***************************************************************************/
+
+/*** /UPnP/DM/DeviceInfo/ objects ***/
+DMOBJ upnpDeviceInfoObj[] ={
+{"PhysicalDevice", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,upnpPhysicalDeviceObj, upnpPhysicalDeviceParams, NULL},
+{"OperatingSystem",&DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,NULL, upnpOperatingSystemParams, NULL},
+{"ExecutionEnvironment",&DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,NULL, upnpExecutionEnvironmentParams, NULL},
+{0}
+};
+
+/*** /UPnP/DM/DeviceInfo/ parameters ***/
+DMLEAF upnpDeviceInfoParams[] = {
+{"ProvisioningCode", &DMWRITE, DMT_STRING, upnp_deviceinfo_get_provisionning_code, upnp_deviceinfo_set_provisionning_code, &DMFINFRM, NULL},
+{"SoftwareVersion", &DMREAD, DMT_STRING, upnp_deviceinfo_get_software_version, NULL, &DMFINFRM, NULL},
+{"SoftwareDescription", &DMREAD, DMT_STRING, upnp_deviceinfo_get_software_description, NULL, &DMFINFRM, NULL},
+{"UpTime", &DMREAD, DMT_UNINT, upnp_deviceinfo_get_up_time, NULL, &DMFINFRM, NULL},
+{0}
+};
+
+/*** /UPnP/DM/DeviceInfo/PhysicalDevice/ objects ***/
+DMOBJ upnpPhysicalDeviceObj[] = {
+{"DeviceID", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,NULL, upnpDeviceIdParams, NULL},
+{0}
+};
+
+/*** /UPnP/DM/DeviceInfo/PhysicalDevice/ parameters ***/
+DMLEAF upnpPhysicalDeviceParams[] = {
+{"HardwareVersion", &DMREAD, DMT_STRING, upnp_deviceinfo_get_hardware_version, NULL, &DMFINFRM, NULL},
+{"NetworkInterfaceNumberOfEntries", &DMREAD, DMT_UNINT, upnp_deviceinfo_get_network_interface_number_entries, NULL, &DMFINFRM, NULL},
+{0}
+};
+
+/*** /UPnP/DM/DeviceInfo/OperatingSystem/ parameters ***/
+DMLEAF upnpOperatingSystemParams[] = {
+{"SoftwareVersion", &DMREAD, DMT_STRING, upnp_deviceinfo_get_software_version, NULL, &DMFINFRM, NULL},
+{"SoftwareDescription", &DMREAD, DMT_STRING, upnp_deviceinfo_get_software_description, NULL, &DMFINFRM, NULL},
+{"UpTime", &DMREAD, DMT_UNINT, upnp_deviceinfo_get_up_time, NULL, &DMFINFRM, NULL},
+{"WillReboot", &DMREAD, DMT_BOOL, upnp_deviceinfo_get_will_reboot, NULL, &DMFINFRM, NULL},
+{"WillBaselineReset", &DMREAD, DMT_BOOL, upnp_deviceinfo_get_will_base_line_reset, NULL, &DMFINFRM, NULL},
+{0}
+};
+
+/*** /UPnP/DM/DeviceInfo/ExecutionEnvironment/ parameters ***/
+DMLEAF upnpExecutionEnvironmentParams[] = {
+{"Status", &DMREAD, DMT_STRING, upnp_deviceinfo_get_status, NULL, &DMFINFRM, NULL},
+{"Uptime", &DMREAD, DMT_UNINT, upnp_deviceinfo_get_up_time, NULL, &DMFINFRM, NULL},
+{"SoftwareVersion", &DMREAD, DMT_STRING, upnp_deviceinfo_get_software_version, NULL, &DMFINFRM, NULL},
+{"SoftwareDescription", &DMREAD, DMT_STRING, upnp_deviceinfo_get_software_description, NULL, &DMFINFRM, NULL},
+{"WillReboot", &DMREAD, DMT_BOOL, upnp_deviceinfo_get_will_reboot, NULL, &DMFINFRM, NULL},
+{"WillBaselineReset", &DMREAD, DMT_BOOL, upnp_deviceinfo_get_will_base_line_reset, NULL, &DMFINFRM, NULL},
+{0}
+};
+
+/*** /UPnP/DM/DeviceInfo/DeviceID/ parameters ***/
+DMLEAF upnpDeviceIdParams[] =  {
+{"ManufacturerOUI", &DMREAD, DMT_HEXBIN, upnp_deviceinfo_get_manufacturer_oui, NULL, &DMFINFRM, NULL},
+{"ProductClass", &DMREAD, DMT_STRING, upnp_deviceinfo_get_product_class, NULL, &DMFINFRM, NULL},
+{"SerialNumber", &DMREAD, DMT_STRING, upnp_deviceinfo_get_serial_number, NULL, &DMFINFRM, NULL},
+{0}
+};
+
+
+/**************************************************************************
+*
+* /UPnP/DM/DeviceInfo/* parameters functions
+*
+***************************************************************************/
+
+int upnp_deviceinfo_get_provisionning_code(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	dmuci_get_option_value_string("cwmp", "cpe", "provisioning_code", value);
+	return 0;
+}
+
+int upnp_deviceinfo_get_software_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	char *v = NULL, *tmp = NULL, *val = NULL;
+
+	db_get_value_string("hw", "board", "iopVersion", &v);
+	if(v == NULL || strlen(v)<=0) {
+		*value = NULL;
+		return 0;
+	}
+	tmp = dmstrdup(v);// MEM WILL BE FREED IN DMMEMCLEAN
+	*value = tmp;
+	return 0;
+}
+
+int upnp_deviceinfo_get_software_description(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+    struct utsname unameData;
+    uname(&unameData);
+
+    dmasprintf(value, "GNU/%s",unameData.sysname);
+	return 0;
+}
+
+int upnp_deviceinfo_get_up_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	FILE* fp = NULL;
+	char *pch = NULL, *spch = NULL;
+	char buf[64];
+	*value = "0";
+
+	fp = fopen("/proc/uptime", "r");
+	if (fp != NULL) {
+		fgets(buf, 64, fp);
+		pch = strtok_r(buf, ".", &spch);
+		if (pch)
+			*value = dmstrdup(pch); // MEM WILL BE FREED IN DMMEMCLEAN
+		fclose(fp);
+	}
+	return 0;
+}
+
+int upnp_deviceinfo_get_hardware_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	db_get_value_string("hw", "board", "hardwareVersion", value);
+	return 0;
+}
+
+int upnp_deviceinfo_get_network_interface_number_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	int n = upnp_get_NetworkInterfaceNumberOfEntries();
+	dmasprintf(value, "%d",n);
+	return 0;
+}
+
+int upnp_deviceinfo_get_manufacturer_oui(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	dmuci_get_option_value_string("cwmp", "cpe", "override_oui", value);
+	if(*value == NULL || strlen(value)<=0) {
+		*value = NULL;
+		return 0;
+	}
+	if (*value[0] == '\0')
+		*value = upnp_get_deviceid_manufactureroui();
+	return 0;
+}
+
+
+int upnp_deviceinfo_get_product_class(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	char *v = NULL, *tmp = NULL, *val = NULL;
+
+	db_get_value_string("hw", "board", "iopVerBoard", &v);
+	if(v == NULL || strlen(v)<=NULL){
+		*value = NULL;
+		return 0;
+	}
+	tmp = dmstrdup(v);// MEM WILL BE FREED IN DMMEMCLEAN
+	val = tmp;
+	return 0;
+}
+
+int upnp_deviceinfo_get_serial_number(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	db_get_value_string("hw", "board", "serialNumber", value);
+	return 0;
+}
+
+int upnp_deviceinfo_get_system_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	return 0;
+}
+
+int upnp_deviceinfo_get_mac_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	return 0;
+}
+
+int upnp_deviceinfo_get_interface_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	return 0;
+}
+
+int upnp_deviceinfo_get_will_reboot(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	return 0;
+}
+
+int upnp_deviceinfo_get_will_base_line_reset(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	return 0;
+}
+
+int upnp_deviceinfo_get_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	return 0;
+}
+
+
+int upnp_deviceinfo_set_provisionning_code(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp", "cpe", "provisioning_code", value);
+			return 0;
+	}
+	return 0;
+}
+
+
+/*************************************************
+ *
+ * MultiInstance objects browsing functions
+ *
+ *************************************************/
+
+int upnp_deviceinfo_networkinterface_createinstance(char *refparam, struct dmctx *ctx, void *data, char **instance){
+	char *value = NULL;
+	char *iface_instance = NULL, ib[8], ip_name[32];
+	char *p = ip_name;
+	struct uci_section *iface_sec = NULL;
+
+	iface_instance = get_last_instance("network","interface","upnp_iface_int_instance");
+	sprintf(ib, "%d", iface_instance ? atoi(iface_instance)+1 : 1);
+	dmstrappendstr(p, "ip_interface_");
+	dmstrappendstr(p, ib);
+	dmstrappendend(p);
+	sprintf(ib, "%d", iface_instance ? atoi(iface_instance)+1 : 1);
+	dmuci_add_section_and_rename("network", "interface", &iface_sec, &value);
+	dmuci_set_value("network", ip_name, "", "interface");
+	dmuci_set_value("network", ip_name, "proto", "dhcp");
+	*instance = update_instance(iface_sec, iface_instance, "upnp_iface_int_instance");
+	return 0;
+}
+
+int upnp_deviceinfo_networkinterface_deleteinstance(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action){
+	switch (del_action) {
+	case DEL_INST:
+		dmuci_set_value_by_section(((struct upnp_dvinf_args *)data)->upnp_deviceinfo_sec, "proto", "");
+		dmuci_set_value_by_section(((struct upnp_dvinf_args *)data)->upnp_deviceinfo_sec, "type", "");
+		dmuci_set_value_by_section(((struct upnp_dvinf_args *)data)->upnp_deviceinfo_sec, "bridge_instance", "");
+		dmuci_set_value_by_section(((struct upnp_dvinf_args *)data)->upnp_deviceinfo_sec, "ip_int_instance", "");
+		dmuci_set_value_by_section(((struct upnp_dvinf_args *)data)->upnp_deviceinfo_sec, "ipv4_instance", "");
+		dmuci_set_value_by_section(((struct upnp_dvinf_args *)data)->upnp_deviceinfo_sec, "ipv6_instance", "");
+		dmuci_set_value_by_section(((struct upnp_dvinf_args *)data)->upnp_deviceinfo_sec, "ifname", "");
+		dmuci_set_value_by_section(((struct upnp_dvinf_args *)data)->upnp_deviceinfo_sec, "ipaddr", "");
+		dmuci_set_value_by_section(((struct upnp_dvinf_args *)data)->upnp_deviceinfo_sec, "ip6addr", "");
+		break;
+	case DEL_ALL:
+		return FAULT_9005;
+	}
+	return 0;
+}
+
+int upnp_browseNetworkInterfaceInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance){
+	struct uci_section *net_sec = NULL;
+	char *iface_int = NULL, *iface_int_last = NULL, *interfaceType = NULL, *macAddress = NULL;
+	struct upnp_dvinf_args curr_upnp_deviceinfo_args = {0};
+	uci_foreach_sections("network", "interface", net_sec) {
+		curr_upnp_deviceinfo_args.upnp_deviceinfo_sec = net_sec;
+		dmuci_get_value_by_section_string(net_sec, "type", &interfaceType);
+		upnp_getMacAddress(section_name(net_sec), &macAddress);
+		dmasprintf(&curr_upnp_deviceinfo_args.systemName, "%s", section_name(net_sec));
+		dmasprintf(&curr_upnp_deviceinfo_args.macAddress, "%s", macAddress);
+		dmasprintf(&curr_upnp_deviceinfo_args.interfaceType, "%s", interfaceType);
+		iface_int = handle_update_instance(1, dmctx, &iface_int_last, update_instance_alias, 3, net_sec, "upnp_iface_int_instance", "upnp_iface_int_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_upnp_deviceinfo_args, iface_int) == DM_STOP) break;
+	}
+}
diff --git a/dmtree/tr064/upnp_deviceinfo.h b/dmtree/tr064/upnp_deviceinfo.h
new file mode 100755
index 0000000000000000000000000000000000000000..ea4dc1096b18a05eca1802011e31029e8ab91f9e
--- /dev/null
+++ b/dmtree/tr064/upnp_deviceinfo.h
@@ -0,0 +1,41 @@
+#ifndef UPNP_DEVICEINFO_H
+#define UPNP_DEVICEINFO_H
+#include "dmcwmp.h"
+
+struct upnp_dvinf_args
+{
+	struct uci_section *upnp_deviceinfo_sec;
+	char* systemName;
+	char* macAddress;
+	char* interfaceType;
+};
+
+int upnp_deviceinfo_get_provisionning_code(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_deviceinfo_get_software_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_deviceinfo_get_software_description(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_deviceinfo_get_up_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_deviceinfo_get_hardware_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_deviceinfo_get_network_interface_number_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_deviceinfo_get_manufacturer_oui(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_deviceinfo_get_product_class(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_deviceinfo_get_serial_number(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_deviceinfo_get_system_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_deviceinfo_get_mac_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_deviceinfo_get_interface_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_deviceinfo_get_will_reboot(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_deviceinfo_get_will_base_line_reset(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_deviceinfo_get_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int upnp_deviceinfo_set_provisionning_code(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int upnp_deviceinfo_networkinterface_createinstance(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int upnp_deviceinfo_networkinterface_deleteinstance(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+extern DMLEAF upnpDeviceIdParams[];
+extern DMLEAF upnpNetworkInterfaceParams[];
+extern DMOBJ upnpPhysicalDeviceObj[];
+extern DMLEAF upnpPhysicalDeviceParams[];
+extern DMLEAF upnpOperatingSystemParams[];
+extern DMLEAF upnpExecutionEnvironmentParams[];
+extern DMOBJ upnpDeviceInfoObj[];
+extern DMLEAF upnpDeviceInfoParams[];
+#endif
diff --git a/dmtree/tr064/upnp_monitoring.c b/dmtree/tr064/upnp_monitoring.c
new file mode 100755
index 0000000000000000000000000000000000000000..0025d80af31a518f39c3c458322d2d80f8d06df4
--- /dev/null
+++ b/dmtree/tr064/upnp_monitoring.c
@@ -0,0 +1,145 @@
+#include "dmcwmp.h"
+#include "upnp_monitoring.h"
+#include "upnp_common.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "dmjson.h"
+#include <time.h>
+
+/**************************************************************************
+*
+* /UPnP/DM/Monitoring/ datamodel tree
+*
+***************************************************************************/
+
+/*** /UPnP/DM/Monitoring/ objects ***/
+DMOBJ upnpMonitoringObj[] = {
+{"OperatingSystem",&DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE, NULL, upnpMonitoringOperatingSystemParams, NULL},
+{"ExecutionEnvironment",&DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE, NULL, upnpMonitoringExecutionEnvironmentParams, NULL},
+{"IPUsage",&DMREAD, NULL, NULL, NULL, upnp_BrowseIPUsage, &DMFINFRM, &DMNONE, NULL, upnpMonitoringIPUsageParams, NULL},
+{0}
+};
+
+/*** /UPnP/DM/Monitoring/ parameters ***/
+DMLEAF upnpMonitoringParams[] = {
+{"IPUsageNumberOfEntries", &DMREAD, DMT_UNINT, upnp_monitoring_get_IPUsageNumberOfEntries, NULL, &DMFINFRM, NULL},
+{0}
+};
+
+/*** /UPnP/DM/Monitoring/OperatingSystem parameters ***/
+DMLEAF upnpMonitoringOperatingSystemParams[] = {
+{"CurrentTime", &DMREAD, DMT_TIME, upnp_monitoring_get_CurrentTime, NULL, &DMFINFRM, NULL},
+{"CPUUsage", &DMREAD, DMT_UNINT, upnp_monitoring_get_CPUUsage, NULL, &DMFINFRM, NULL},
+{"MemoryUsage", &DMREAD, DMT_UNINT, upnp_monitoring_get_MemoryUsage, NULL, &DMFINFRM, NULL},
+{0}
+};
+
+/*** /UPnP/DM/Monitoring/ExecutionEnvironement parameters ***/
+ DMLEAF upnpMonitoringExecutionEnvironmentParams[] = {
+{"CPUUsage", &DMREAD, DMT_UNINT, upnp_monitoring_get_CPUUsage, NULL, &DMFINFRM, NULL},
+{"MemoryUsage", &DMREAD, DMT_UNINT, upnp_monitoring_get_MemoryUsage, NULL, &DMFINFRM, NULL},
+{0}
+};
+
+/*** /UPnP/DM/Monitoring/Usage parameters ***/
+DMLEAF upnpMonitoringIPUsageParams[] = {
+{"SystemName", &DMREAD, DMT_STRING, upnp_monitoring_get_SystemName, NULL, &DMFINFRM, NULL},
+{"Status", &DMREAD, DMT_STRING, upnp_monitoring_get_Status, NULL, &DMFINFRM, NULL},
+{"TotalPacketsSent", &DMREAD, DMT_UNINT, upnp_monitoring_get_TotalPacketsSent, NULL, &DMFINFRM, NULL},
+{"TotalPacketsReceived", &DMREAD, DMT_UNINT, upnp_monitoring_get_TotalPacketsReceived, NULL, &DMFINFRM, NULL},
+{0}
+};
+
+/**************************************************************************
+*
+* /UPnP/DM/Monitoring/* parameters functions
+*
+***************************************************************************/
+int upnp_monitoring_get_IPUsageNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	int n = upnp_get_IPInterfaceNumberOfEntries();
+	dmasprintf(value, "%d", n);
+	return 0;
+}
+
+
+int upnp_monitoring_get_CurrentTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+    time_t rawtime;
+    struct tm * timeinfo = NULL;
+
+    time ( &rawtime );
+    timeinfo = localtime ( &rawtime );
+    dmasprintf(value, "%d:%d:%d", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
+	return 0;
+}
+
+int upnp_monitoring_get_CPUUsage(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	return 0;
+}
+
+int upnp_monitoring_get_MemoryUsage(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	json_object *res = NULL;
+	char *totalmemory = NULL, *freememory = NULL;
+	int total, free;
+
+	dmubus_call("system", "info", UBUS_ARGS{{}}, 0, &res);
+	if(res == NULL) {
+		*value = NULL;
+		return 0;
+	}
+	DM_ASSERT(res, freememory = "");
+	DM_ASSERT(res, totalmemory = "");
+	totalmemory = dmjson_get_value(res, 2, "memory", "total");
+	freememory = dmjson_get_value(res, 2, "memory", "freememory");
+	total = atoi(totalmemory);
+	free = atoi(freememory);
+	dmasprintf(value, "%d", total - free);
+	return 0;
+}
+
+int upnp_monitoring_get_SystemName(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct upnp_ip_usage_args *ipusage_args = (struct upnp_ip_usage_args *)data;
+	if(ipusage_args->systemName != NULL && strlen(ipusage_args->systemName)>0)
+	dmasprintf(value, "%s", ipusage_args->systemName);
+	return 0;
+}
+
+int upnp_monitoring_get_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct upnp_ip_usage_args *ipusage_args = (struct upnp_ip_usage_args *)data;
+	if(ipusage_args->status != NULL && strlen(ipusage_args->status)>0)
+	dmasprintf(value, "%s", ipusage_args->status);
+	return 0;
+}
+
+int upnp_monitoring_get_TotalPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct upnp_ip_usage_args *ipusage_args = (struct upnp_ip_usage_args *)data;
+	if(ipusage_args->totalpacketsent != NULL && strlen(ipusage_args->totalpacketsent)>0)
+	dmasprintf(value, "%s", ipusage_args->totalpacketsent);
+	return 0;
+}
+
+int upnp_monitoring_get_TotalPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct upnp_ip_usage_args *ipusage_args = (struct upnp_ip_usage_args *)data;
+	if(ipusage_args->totalpacketreceived != NULL && strlen(ipusage_args->totalpacketreceived)>0)
+	dmasprintf(value, "%s", ipusage_args->totalpacketreceived);
+	return 0;
+}
+
+int upnp_BrowseIPUsage(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance){
+	struct uci_section *net_sec = NULL;
+	struct upnp_ip_usage_args curr_ip_usage_args = {0};
+	char *iface_int = NULL, *iface_int_last = NULL, *totalPktSnt = NULL, *totalPktRcvd= NULL, *status = NULL;
+	int i = 0;
+	uci_foreach_sections("network", "interface", net_sec) {
+		dmasprintf(&curr_ip_usage_args.systemName, "%s", section_name(net_sec));
+		upnp_getInterfaceStatus(section_name(net_sec), &status);
+		if(status !=NULL) dmasprintf(&curr_ip_usage_args.status, "%s", status); else dmasprintf(&curr_ip_usage_args.status, "");
+		upnp_getInterfaceTotalPacketSent(section_name(net_sec), &totalPktSnt);
+		if(totalPktSnt != NULL) dmasprintf(&curr_ip_usage_args.totalpacketsent, "%s", totalPktSnt); else dmasprintf(&curr_ip_usage_args.totalpacketsent, "");
+		upnp_getInterfaceTotalPacketReceived(section_name(net_sec), &totalPktRcvd);
+		if(totalPktRcvd !=NULL) dmasprintf(&curr_ip_usage_args.totalpacketreceived, "%s", totalPktRcvd); else dmasprintf(&curr_ip_usage_args.totalpacketreceived, "");
+		iface_int = handle_update_instance(1, dmctx, &iface_int_last, update_instance_alias, 3, net_sec, "upnp_ip_usage_instance", "upnp_ip_usage_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_ip_usage_args, iface_int) == DM_STOP) break;
+		i++;
+	}
+	return 0;
+}
diff --git a/dmtree/tr064/upnp_monitoring.h b/dmtree/tr064/upnp_monitoring.h
new file mode 100755
index 0000000000000000000000000000000000000000..260da80a4ba1edea3029573ed1d596a609312194
--- /dev/null
+++ b/dmtree/tr064/upnp_monitoring.h
@@ -0,0 +1,34 @@
+#ifndef UPNP_MONITORING_H
+#define UPNP_MONITORING_H
+#include "dmcwmp.h"
+struct upnp_ip_usage_args{
+	char *systemName;
+	char *status;
+	char *totalpacketsent;
+	char *totalpacketreceived;
+};
+
+int upnp_monitoring_get_IPUsageNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_monitoring_get_StorageNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_monitoring_get_CurrentTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_monitoring_get_CPUUsage(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_monitoring_get_MemoryUsage(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_monitoring_get_SystemName(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_monitoring_get_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_monitoring_get_TotalPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int upnp_monitoring_get_TotalPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int upnp_BrowseIPUsage(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int upnp_CreateIPUsageInstance(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int upnp_DeleteIPUsageInstance(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int upnp_BrowseStorage(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int upnp_CreateStorageInstance(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int upnp_DeleteStorageInstance(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+extern DMLEAF upnpMonitoringOperatingSystemParams[];
+extern DMLEAF upnpMonitoringExecutionEnvironmentParams[];
+extern DMLEAF upnpMonitoringIPUsageParams[];
+extern DMLEAF upnpMonitoringStorageParams[];
+extern DMOBJ upnpMonitoringObj[];
+extern DMLEAF upnpMonitoringParams[];
+#endif
diff --git a/dmtree/tr104/voice_services.c b/dmtree/tr104/voice_services.c
new file mode 100644
index 0000000000000000000000000000000000000000..34b36091a5686e3e66982fc11aae2aaa5e6fea21
--- /dev/null
+++ b/dmtree/tr104/voice_services.c
@@ -0,0 +1,2459 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2012-2014 PIVA SOFTWARE (www.pivasoftware.com)
+ *		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *		Author: Omar Kallel <omar.kallel@pivasoftware.com>
+ */
+
+#include <ctype.h>
+#include <uci.h>
+#include <unistd.h>
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "voice_services.h"
+#include "dmjson.h"
+
+/*** DMROOT.Services. ****/
+DMOBJ tServiceObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"VoiceService", &DMREAD, NULL, NULL, NULL, browseVoiceServiceInst, NULL, NULL, tVoiceServiceObj, tVoiceServiceParam, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}. ****/
+DMOBJ tVoiceServiceObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Capabilities", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tCapabilitiesObj, tCapabilitiesParams, NULL, BBFDM_BOTH},
+{"VoiceProfile", &DMWRITE, add_profile_object, delete_profile_object, NULL, browseProfileInst, NULL, NULL, tProfileObj, tProfileParam, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tVoiceServiceParam[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_service_alias, set_service_alias, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.Capabilities. ****/
+DMOBJ tCapabilitiesObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"SIP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tSIPParams, NULL, BBFDM_BOTH},
+{"Codecs", &DMREAD, NULL, NULL, NULL, browseCodecsInst, NULL, NULL, NULL, tCodecsParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tCapabilitiesParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"MaxProfileCount", &DMREAD, DMT_UNINT, get_max_profile_count, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxLineCount", &DMREAD, DMT_UNINT, get_max_line_count, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxSessionsPerLine", &DMREAD, DMT_UNINT, get_true_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxSessionCount", &DMREAD, DMT_UNINT, get_max_session_count, NULL, NULL, NULL, BBFDM_BOTH},
+{"SignalingProtocols", &DMREAD, DMT_STRING, get_signal_protocols, NULL, NULL, NULL, BBFDM_BOTH},
+{"Regions", &DMREAD, DMT_STRING, get_regions, NULL, NULL, NULL, BBFDM_BOTH},
+{"RTCP", &DMREAD, DMT_BOOL, get_true_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"SRTP", &DMREAD, DMT_BOOL, get_true_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"RTPRedundancy", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"PSTNSoftSwitchOver", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"FaxT38", &DMREAD, DMT_BOOL, get_true_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"FaxPassThrough", &DMREAD, DMT_BOOL, get_true_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"ModemPassThrough", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"ToneGeneration", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"ToneDescriptionsEditable", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"PatternBasedToneGeneration", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"FileBasedToneGeneration", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"ToneFileFormats", &DMREAD, DMT_STRING, get_empty, NULL, NULL, NULL, BBFDM_BOTH},
+{"RingGeneration", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"RingDescriptionsEditable", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"PatternBasedRingGeneration", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"RingPatternEditable", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"FileBasedRingGeneration", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"RingFileFormats", &DMREAD, DMT_STRING, get_empty, NULL, NULL, NULL, BBFDM_BOTH},
+{"DigitMap", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"NumberingPlan", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"ButtonMap", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"VoicePortTests", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.Capabilities.SIP. ****/
+DMLEAF tSIPParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Role", &DMREAD, DMT_STRING, get_sip_role, NULL, NULL, NULL, BBFDM_BOTH},
+{"Extensions", &DMREAD, DMT_STRING, get_sip_extension, NULL, NULL, NULL, BBFDM_BOTH},
+{"Transports", &DMREAD, DMT_STRING, get_sip_transport, NULL, NULL, NULL, BBFDM_BOTH},
+{"URISchemes", &DMREAD, DMT_STRING, get_empty, NULL, NULL, NULL, BBFDM_BOTH},
+{"EventSubscription", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"ResponseMap", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"TLSAuthenticationProtocols", &DMREAD, DMT_STRING, get_sip_tls_auth_protocols, NULL, NULL, NULL, BBFDM_BOTH},
+{"TLSEncryptionProtocols", &DMREAD, DMT_STRING, get_sip_tls_enc_protocols, NULL, NULL, NULL, BBFDM_BOTH},
+{"TLSKeyExchangeProtocols", &DMREAD, DMT_STRING, get_sip_tls_key_protocols, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.Capabilities.Codecs.{i}. ****/
+DMLEAF tCodecsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_cap_codec_alias, set_cap_codec_alias, NULL, NULL, BBFDM_BOTH},
+{"EntryID", &DMREAD, DMT_UNINT, get_entry_id, NULL, NULL, NULL, BBFDM_BOTH},
+{"Codec", &DMREAD, DMT_STRING, get_capabilities_sip_codec, NULL, NULL, NULL, BBFDM_BOTH},
+{"BitRate", &DMREAD, DMT_UNINT, get_capabilities_sip_bitrate, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketizationPeriod", &DMREAD, DMT_STRING, get_capabilities_sip_pperiod, NULL, NULL, NULL, BBFDM_BOTH},
+{"SilenceSuppression", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.VoiceProfile.{i}. ****/
+DMOBJ tProfileObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"SIP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tProfileSIPParams, NULL, BBFDM_BOTH},
+{"ServiceProviderInfo", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tServiceProviderInfoParams, NULL, BBFDM_BOTH},
+{"FaxT38", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tFaxT38Params, NULL, BBFDM_BOTH},
+{"RTP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tRTPObj, tRTPParams, NULL, BBFDM_BOTH},
+{"Line", &DMWRITE, add_line_object, delete_line_object, NULL, browseLineInst, NULL, NULL, tLineObj, tLineParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tProfileParam[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_voice_profile_alias, set_voice_profile_alias, NULL, NULL, BBFDM_BOTH},
+{"Enable", &DMWRITE, DMT_STRING, get_voice_profile_enable, set_voice_profile_enable, NULL, NULL, BBFDM_BOTH},
+{"Reset", &DMWRITE, DMT_BOOL, get_false_value, set_voice_profile_reset, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMREAD, DMT_STRING, get_voice_profile_name, NULL, NULL, NULL, BBFDM_BOTH},
+{"SignalingProtocol", &DMWRITE, DMT_STRING, get_voice_profile_signalprotocol, set_voice_profile_signaling_protocol, NULL, NULL, BBFDM_BOTH},
+{"MaxSessions", &DMREAD, DMT_UNINT, get_voice_profile_max_sessions, NULL, NULL, NULL, BBFDM_BOTH},
+{"NumberOfLines", &DMREAD, DMT_UNINT, get_voice_profile_number_of_lines, NULL, NULL, NULL, BBFDM_BOTH},
+{"DTMFMethod", &DMWRITE, DMT_STRING, get_voice_profile_sip_dtmfmethod, set_voice_profile_sip_dtmfmethod, NULL, NULL, BBFDM_BOTH},
+{"Region", &DMWRITE, DMT_STRING, get_sip_profile_region, set_sip_profile_region, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.VoiceProfile.{i}.SIP. ***/
+DMLEAF tProfileSIPParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"ProxyServer", &DMWRITE, DMT_STRING, get_voice_profile_sip_proxyserver, set_voice_profile_sip_proxyserver, NULL, NULL, BBFDM_BOTH},
+{"ProxyServerPort", &DMWRITE, DMT_UNINT, get_empty, set_sip_proxy_server_port, NULL, NULL, BBFDM_BOTH},
+{"ProxyServerTransport", &DMWRITE, DMT_STRING, get_sip_proxy_server_transport, set_sip_proxy_server_transport, NULL, NULL, BBFDM_BOTH},
+{"RegistrarServer", &DMWRITE, DMT_STRING, get_voice_profile_sip_registerserver, set_voice_profile_sip_registerserver, NULL, NULL, BBFDM_BOTH},
+{"RegistrarServerPort", &DMWRITE, DMT_UNINT, get_voice_profile_sip_registerserverport, set_voice_profile_sip_registerserverport, NULL, NULL, BBFDM_BOTH},
+{"RegistrarServerTransport", &DMWRITE, DMT_STRING, get_sip_registrar_server_transport, set_sip_registrar_server_transport, NULL, NULL, BBFDM_BOTH},
+{"UserAgentDomain", &DMWRITE, DMT_STRING, get_sip_user_agent_domain, set_sip_user_agent_domain, NULL, NULL, BBFDM_BOTH},
+{"UserAgentPort", &DMWRITE, DMT_UNINT, get_sip_user_agent_port, set_sip_user_agent_port, NULL, NULL, BBFDM_BOTH},
+{"UserAgentTransport", &DMWRITE, DMT_STRING, get_sip_user_agent_transport, set_sip_user_agent_transport, NULL, NULL, BBFDM_BOTH},
+{"OutboundProxy", &DMWRITE, DMT_STRING, get_sip_outbound_proxy, set_sip_outbound_proxy, NULL, NULL, BBFDM_BOTH},
+{"OutboundProxyPort", &DMWRITE, DMT_UNINT, get_sip_outbound_proxy_port, set_sip_outbound_proxy_port, NULL, NULL, BBFDM_BOTH},
+{"RegistrationPeriod", &DMWRITE, DMT_UNINT, get_sip_registration_period, set_sip_registration_period, NULL, NULL, BBFDM_BOTH, BBFDM_BOTH},
+{"ReInviteExpires", &DMWRITE, DMT_UNINT, get_sip_re_invite_expires, set_sip_re_invite_expires, NULL, NULL, BBFDM_BOTH},
+{"RegisterExpires", &DMWRITE, DMT_UNINT, get_sip_re_invite_expires, set_sip_re_invite_expires, NULL, NULL, BBFDM_BOTH},
+{"RegisterRetryInterval", &DMWRITE, DMT_UNINT, get_sip_re_invite_expires, set_sip_re_invite_expires, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"CallLines", &DMWRITE, DMT_STRING, get_sip_call_lines, set_sip_call_lines, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.VoiceProfile.{i}.ServiceProviderInfo. ***/
+DMLEAF tServiceProviderInfoParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Name", &DMWRITE, DMT_STRING, get_voice_service_serviceproviderinfo_name, set_voice_service_serviceproviderinfo_name, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.VoiceProfile.{i}.FaxT38. ***/
+DMLEAF tFaxT38Params[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_sip_fax_t38_enable, set_sip_fax_t38_enable, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.VoiceProfile.{i}.RTP. ***/
+DMOBJ tRTPObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"RTCP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tRTCPParams, NULL, BBFDM_BOTH},
+{"SRTP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tSRTPParam, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tRTPParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"LocalPortMin", &DMWRITE, DMT_UNINT, get_voice_service_vp_rtp_portmin, set_voice_service_vp_rtp_portmin, NULL, NULL, BBFDM_BOTH},
+{"LocalPortMax", &DMWRITE, DMT_UNINT, get_voice_service_vp_rtp_portmax, set_voice_profile_rtp_localportmax, NULL, NULL, BBFDM_BOTH},
+{"DSCPMark", &DMWRITE, DMT_UNINT, get_voice_service_vp_rtp_dscp, set_voice_service_vp_rtp_dscp, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.VoiceProfile.{i}.RTP.RTCP. ***/
+DMLEAF tRTCPParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMREAD, DMT_BOOL, get_voice_service_vp_rtp_rtcp_enable, NULL, NULL, NULL, BBFDM_BOTH},
+{"TxRepeatInterval", &DMWRITE, DMT_UNINT, get_voice_service_vp_rtp_rtcp_txrepeatinterval, set_voice_service_vp_rtp_rtcp_txrepeatinterval, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.VoiceProfile.{i}.RTP.SRTP. ***/
+DMLEAF tSRTPParam[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_voice_service_vp_rtp_srtp_enable, set_voice_service_vp_rtp_srtp_enable, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.VoiceProfile.{i}.Line.{i}. ***/
+DMOBJ tLineObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"VoiceProcessing", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tVoiceProcessingParams, NULL, BBFDM_BOTH},
+{"CallingFeatures", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tCallingFeaturesParams, NULL, BBFDM_BOTH},
+{"SIP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tLineSIPParams, NULL, BBFDM_BOTH},
+{"Codec", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tLineCodecObj, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tLineParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_line_alias, set_line_alias, NULL, NULL, BBFDM_BOTH},
+{"Enable", &DMWRITE, DMT_STRING, get_voice_profile_line_enable, set_voice_profile_line_enable, NULL, NULL, BBFDM_BOTH},
+{"DirectoryNumber", &DMWRITE, DMT_STRING, get_line_directory_number, set_line_directory_number, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_voice_profile_line_status, set_line_alias, NULL, NULL, BBFDM_BOTH},
+{"CallState", &DMREAD, DMT_STRING, get_voice_profile_line_callstate, set_line_alias, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"LineProfile", &DMWRITE, DMT_STRING, get_line_line_profile, set_line_line_profile, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"TELLine", &DMWRITE, DMT_STRING, get_line_tel_line, set_line_tel_line, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"Confort_Noise_Enable", &DMWRITE, DMT_BOOL, get_line_confort_noise_enable, set_line_confort_noise_enable, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.VoiceProfile.{i}.Line.{i}.VoiceProcessing. ***/
+DMLEAF tVoiceProcessingParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"EchoCancellationEnable", &DMWRITE, DMT_BOOL, get_line_voice_processing_cancellation_enable, set_line_voice_processing_cancellation_enable, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.VoiceProfile.{i}.Line.{i}.CallingFeatures. ***/
+DMLEAF tCallingFeaturesParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"CallerIDName", &DMWRITE, DMT_STRING, get_line_calling_features_caller_id_name, set_line_calling_features_caller_id_name, NULL, NULL, BBFDM_BOTH},
+{"CallWaitingEnable", &DMWRITE, DMT_BOOL, get_line_calling_features_callwaiting, set_line_calling_features_callwaiting, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.VoiceProfile.{i}.Line.{i}.SIP. ***/
+DMLEAF tLineSIPParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"AuthUserName", &DMWRITE, DMT_STRING, get_line_sip_auth_username, set_line_sip_auth_username, NULL, NULL, BBFDM_BOTH},
+{"AuthPassword", &DMWRITE, DMT_STRING, get_empty, set_line_sip_auth_password, NULL, NULL, BBFDM_BOTH},
+{"URI", &DMWRITE, DMT_STRING, get_line_sip_uri, set_line_sip_uri, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Codec. ***/
+DMOBJ tLineCodecObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"List", &DMREAD, NULL, NULL, NULL, browseLineCodecListInst, NULL, NULL, NULL, tLineCodecListParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Codec.List.{i}. ***/
+DMLEAF tLineCodecListParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_line_codec_list_alias, set_line_codec_list_alias, NULL, NULL, BBFDM_BOTH},
+{"EntryID", &DMREAD, DMT_UNINT, get_codec_entry_id, NULL, NULL, NULL, BBFDM_BOTH},
+{"Codec", &DMREAD, DMT_STRING, capabilities_sip_codecs_get_codec, NULL, NULL, NULL, BBFDM_BOTH},
+{"BitRate", &DMREAD, DMT_UNINT, capabilities_sip_codecs_get_bitrate, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketizationPeriod", &DMWRITE, DMT_STRING, get_capabilities_sip_codecs_pperiod, set_line_codec_list_packetization, NULL, NULL, BBFDM_BOTH},
+{"SilenceSuppression", &DMREAD, DMT_BOOL, get_false_value, NULL, NULL, NULL, BBFDM_BOTH},
+{"Enable", &DMWRITE, DMT_BOOL, get_line_codec_list_enable, set_line_codec_list_enable, NULL, NULL, BBFDM_BOTH},
+{"Priority", &DMWRITE, DMT_UNINT, get_line_codec_list_priority, set_line_codec_list_priority, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+#define MAX_ALLOWED_SIP_CODECS 20
+int available_sip_codecs = 0;
+struct allow_sip_codec allowed_sip_codecs[MAX_ALLOWED_SIP_CODECS];
+char *codec_option_array[5] = {"codec0", "codec1", "codec2", "codec3", "codec4"};
+struct cap_sip_codec capabilities_sip_codecs[] = {
+	{SIP_CODEC_G723, "g723", "G.723.1", "6451", "30-300", "30"},
+	{SIP_CODEC_GSM, "gsm", "GSM-FR", "13312", "20-300", "20"},
+	{SIP_CODEC_ULAW, "ulaw", "G.711MuLaw","65536", "10-150", "20"},
+	{SIP_CODEC_ALAW, "alaw", "G.711ALaw", "65536", "10-150", "20"},
+	{SIP_CODEC_G726AAL2, "g726aal2","g726aal2 ", "32768", "10-300", "20"},
+	{SIP_CODEC_ADPCM, "adpcm", "adpcm", "32768", "10-300", "20"},
+	{SIP_CODEC_SLIN, "slin", "slin", "0", "10-70", "20"},
+	{SIP_CODEC_LPC10, "lpc10", "lpc10", "2457", "20-20", "20"},
+	{SIP_CODEC_G729, "g729", "G.729a", "8192", "10-230", "20"},
+	{SIP_CODEC_SPEEX, "speex", "speex", "49152", "10-60", "20"},
+	{SIP_CODEC_ILBC, "ilbc", "iLBC", "8192", "30-30", "30"},
+	{SIP_CODEC_G726, "g726", "G.726", "32768", "10-300", "20"},
+	{SIP_CODEC_G722, "g722", "G.722", "65536", "0-0", "0"},
+	{SIP_CODEC_SIREN7, "siren7", "G.722.1", "32768", "0-0", "0"},
+	{SIP_CODEC_SIREN14, "siren14", "siren14 ", "0", "0-0", "0"},
+	{SIP_CODEC_SLIN16, "slin16", "slin16", "0", "0-0", "0"},
+	{SIP_CODEC_G719, "g719", "g719", "0", "0-0", "0"},
+	{SIP_CODEC_SPEEX16, "speex16", "speex16", "0", "0-0", "0"},
+	{SIP_CODEC_TESTLAW, "testlaw", "testlaw", "0", "0-0", "0"}
+};
+struct region capabilities_regions[] = {
+	{"AUS", "AU"},
+	{"BEL", "BE"},
+	{"BRA", "BR"},
+	{"CHL", "CL"},
+	{"CHN", "CN"},
+	{"CZE", "CZ"},
+	{"DNK", "DK"},
+	{"FIN", "FI"},
+	{"FRA", "FR"},
+	{"DEU", "DE"},
+	{"HUN", "HU"},
+	{"IND", "IN"},
+	{"ITA", "IT"},
+	{"JPN", "JP"},
+	{"NLD", "NL"},
+	{"NZL", "NZ"},
+	{"USA", "US"},
+	{"ESP", "ES"},
+	{"SWE", "SE"},
+	{"CHE", "CH"},
+	{"NOR", "NO"},
+	{"TWN", "TW"},
+	{"GBR", "GB"},
+	{"ARE", "AE"},
+	{"ETS", "ET"},
+	{"T57", "T5"}
+};
+struct rtp_tos list_rtp_tos[] = {
+	{"CS0", "0"},
+	{"CS1", "32"},
+	{"AF11", "40"},
+	{"AF12", "48"},
+	{"AF13", "56"},
+	{"CS2", "64"},
+	{"AF21", "72"},
+	{"AF22", "80"},
+	{"AF23", "88"},
+	{"CS3", "96"},
+	{"AF31", "104"},
+	{"AF32", "112"},
+	{"AF33", "120"},
+	{"CS4", "128"},
+	{"AF41", "136"},
+	{"AF42", "144"},
+	{"AF43", "152"},
+	{"CS5", "160"},
+	{"EF", "184"},
+	{"CS6", "192"},
+	{"CS7", "224"}
+};
+
+///////////////////////////////INIT ARGS//////////////////
+void wait_voice_service_up(void)
+{
+	json_object *res;
+	int i = 0;
+	while (i++ < 10) {
+		dmubus_call("voice.asterisk", "status", UBUS_ARGS{}, 0, &res);
+		if (res)
+			return;
+	}
+}
+
+static inline int init_allowed_sip_codecs()
+{
+	json_object *res = NULL;
+	char id[8], priority[24], ptime[24];
+	int i;
+	available_sip_codecs = 0;
+	dmubus_call("voice.asterisk", "codecs", UBUS_ARGS{}, 0, &res);
+	if(res) {
+		json_object_object_foreach(res, key, val) {
+			for (i = 0; i < ARRAY_SIZE(capabilities_sip_codecs); i++) {
+				if(strcmp(capabilities_sip_codecs[i].c1, key) == 0) {
+					allowed_sip_codecs[available_sip_codecs].enumid = capabilities_sip_codecs[i].enumid;
+					break;
+				}
+			}
+			sprintf(id, "%d", available_sip_codecs + 1);
+			sprintf(priority, "priority_%s", key);
+			sprintf(ptime, "ptime_%s", key);
+			allowed_sip_codecs[available_sip_codecs].id = dmstrdup(id);
+			allowed_sip_codecs[available_sip_codecs].allowed_cdc = key;
+			allowed_sip_codecs[available_sip_codecs].priority_cdc = dmstrdup(priority);
+			allowed_sip_codecs[available_sip_codecs].ptime_cdc = dmstrdup(ptime);
+			available_sip_codecs++;
+		}
+	}	
+	return 0;
+}
+
+int init_sip_args(struct sip_args *args, struct uci_section *section, char *profile_num)
+{
+	args->sip_section = section;
+	args->profile_num = profile_num;
+	return 0;
+}
+
+int init_codec_args(struct codec_args *args, char *cdc, char *id, int enumid,  struct uci_section *s)
+{
+	args->cdc = dmstrdup(cdc);
+	args->id = dmstrdup(id);
+	args->enumid = enumid;
+	args->codec_section = s;
+	return 0;
+}
+
+int fini_codec_args(struct codec_args *args)
+{
+	dmfree(args->cdc);
+	dmfree(args->id);
+	return 0;
+}
+
+int init_line_code_args(struct line_codec_args *args, int i, struct uci_section *s, struct uci_section *codec_sec)
+{
+	args->cdc = allowed_sip_codecs[i].allowed_cdc;
+	args->id = allowed_sip_codecs[i].id;
+	args->sip_section = s;
+	args->priority_cdc = allowed_sip_codecs[i].priority_cdc;
+	args->enumid = allowed_sip_codecs[i].enumid;
+	args->ptime_cdc = allowed_sip_codecs[i].ptime_cdc;
+	args->codec_sec = codec_sec;
+	return 0;
+}
+
+int init_tel_args(struct tel_args *args, struct uci_section *section, struct uci_section *section2, char *instance)
+{
+	args->tel_section = section;
+	args->sip_section = section2;
+	args->profile_num = instance;
+	return 0;
+}
+
+/**************************ADD/DEL OBJECT *********************************/
+int get_cfg_sipidx(void)
+{
+	char *si;
+	int idx = 0, max = -1;
+	struct uci_section *s = NULL;
+
+	uci_foreach_sections("voice_client", "sip_service_provider", s) {
+		si = section_name(s) + sizeof("sip") - 1;
+		idx = atoi(si);
+		if (idx > max)
+			max = idx;
+	}
+	return (max + 1);
+}
+
+int add_profile_object(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{
+	char sname[8];
+	char account[16];
+	char bufinst[4];
+	int sipidx;
+	char *add_value, *instance, *max_instance, *v;
+	struct uci_section *voice_profile_section= NULL, *dmmap_voice_section= NULL;
+	
+	check_create_dmmap_package("dmmap_voice_client");
+	sipidx = get_cfg_sipidx();
+	sprintf(sname, "sip%d", sipidx);
+	sprintf(account, "Account %d", sipidx);
+	dmuci_set_value("voice_client", sname, NULL, "sip_service_provider");
+	dmuci_set_value("voice_client", sname, "name", account);
+	dmuci_set_value("voice_client", sname, "enabled", "0");
+	dmuci_set_value("voice_client", sname, "codec0", "ulaw");
+	dmuci_set_value("voice_client", sname, "codec1", "alaw");
+	dmuci_set_value("voice_client", sname, "codec2", "g729");
+	dmuci_set_value("voice_client", sname, "codec3", "g726");
+	dmuci_set_value("voice_client", sname, "cfim_on", "*21*");
+	dmuci_set_value("voice_client", sname, "cfim_off", "#21#");
+	dmuci_set_value("voice_client", sname, "cfbs_on", "*61*");
+	dmuci_set_value("voice_client", sname, "cfbs_off", "#61#");
+	dmuci_set_value("voice_client", sname, "call_return", "*69");
+	dmuci_set_value("voice_client", sname, "redial", "*66");
+	dmuci_set_value("voice_client", sname, "cbbs_key", "5");
+	dmuci_set_value("voice_client", sname, "cbbs_maxretry", "5");
+	dmuci_set_value("voice_client", sname, "cbbs_retrytime", "300");
+	dmuci_set_value("voice_client", sname, "cbbs_waittime", "30");
+	instance = get_last_instance_icwmpd("dmmap_voice_client", "sip_service_provider", "profileinstance");
+
+	dmuci_add_section_icwmpd("dmmap_voice_client", "sip_service_provider", &dmmap_voice_section, &v);
+	dmuci_set_value_by_section(dmmap_voice_section, "section_name", sname);
+	*instancepara = update_instance_icwmpd(dmmap_voice_section, instance, "profileinstance");
+
+	return 0;
+}
+
+int delete_associated_line_instances(char *sip_id, char* profile_key)
+{
+	struct uci_section *s;
+	char *stmp;
+
+	uci_foreach_option_eq("voice_client", "tel_line", "sip_account", sip_id, s) {
+		dmuci_set_value_by_section(s, "sip_account", "-");
+	}
+	uci_path_foreach_option_eq_safe(icwmpd, "dmmap_voice_client", "tel_line", "voice_profile_key", profile_key, stmp, s) {
+		dmuci_delete_by_section(s, NULL, NULL);
+	}
+	return 0;
+}
+
+int delete_profile_object(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	int found = 0;
+	struct uci_section *s, *ss = NULL, *sss = NULL;
+	struct sip_args *sipargs = (struct sip_args *)data;
+	struct uci_section *dmmap_section;
+	char *v= NULL;
+	
+	switch (del_action) {
+		case DEL_INST:
+			get_dmmap_section_of_config_section("dmmap_voice_client", "sip_service_provider", section_name(sipargs->sip_section), &dmmap_section);
+			dmuci_get_value_by_section_string(dmmap_section, "profileinstance", &v);
+			dmuci_delete_by_section(dmmap_section, NULL, NULL);
+			delete_associated_line_instances(section_name(sipargs->sip_section), v);
+			dmuci_delete_by_section(sipargs->sip_section, NULL, NULL);
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("voice_client", "sip_service_provider", s) {
+				if (found != 0) {
+					get_dmmap_section_of_config_section("dmmap_voice_client", "sip_service_provider", section_name(ss), &dmmap_section);
+					dmuci_get_value_by_section_string(dmmap_section, "profileinstance", &v);
+					if(dmmap_section != NULL)
+						dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					delete_associated_line_instances(section_name(ss), v);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL) {
+				get_dmmap_section_of_config_section("dmmap_voice_client", "sip_service_provider", section_name(ss), &dmmap_section);
+				dmuci_get_value_by_section_string(dmmap_section, "profileinstance", &v);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				delete_associated_line_instances(section_name(ss), v);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			uci_foreach_sections("voice_client", "tel_line", sss) {
+				dmuci_set_value_by_section(sss, "sip_account", "-");
+			}
+			break;
+	}
+	
+	return 0;
+}
+
+/*********/
+int get_line_max_instance(struct uci_section **tel_section)
+{
+	struct uci_section *s;
+	int line_number, i = 0, found = 0;
+	char *value;
+	
+	line_number = get_voice_service_max_line();
+	
+	uci_foreach_sections("voice_client", "tel_line", s) {
+		i++;
+		dmuci_get_value_by_section_string(s, "sip_account", &value);
+
+		if (strcmp(value, "-") == 0)
+		{
+			found=1;
+			break;
+		}
+		else if (i >= line_number) {
+			i = 0;
+			break;
+		}
+	}
+	if (found == 1)
+		*tel_section = s;
+	else {
+		i=0;
+		*tel_section = NULL;
+	}
+	return i;
+}
+
+char *update_vp_line_instance(struct uci_section *tel_s, char *sipx)
+{
+	struct uci_section *s = NULL, *dmmap_section= NULL, *dmmap_dup= NULL;
+	int last_instance = 0, i_instance;
+	char *instance, buf[8];
+	get_dmmap_section_of_config_section("dmmap_voice_client", "tel_line", section_name(tel_s), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "lineinstance", &instance);
+	if(instance[0] != '\0'){
+		return instance;
+	}
+	uci_foreach_option_eq("voice_client", "tel_line", "sip_account", sipx, s) {
+		get_dmmap_section_of_config_section("dmmap_voice_client", "tel_line", section_name(s), &dmmap_dup);
+		dmuci_get_value_by_section_string(dmmap_dup, "lineinstance", &instance);
+		if (instance[0] != '\0') {
+			i_instance = atoi(instance);
+			if ( i_instance > last_instance)
+				last_instance = i_instance;
+		}
+	}
+	sprintf(buf, "%d", last_instance + 1);
+	instance = dmuci_set_value_by_section(dmmap_section, "lineinstance", buf);
+	return instance;
+}
+
+char *update_vp_line_instance_alias(int action, char **last_inst, void *argv[])
+{
+	struct uci_section *s = NULL;
+	int last_instance = 0, i_instance;
+	char *instance, *alias, buf[64];
+
+	struct uci_section *tel_s = (struct uci_section *) argv[0];
+	char *sipx = (char *) argv[1];
+
+	dmuci_get_value_by_section_string(tel_s, "lineinstance", &instance);
+	if (instance[0] == '\0') {
+		uci_foreach_option_eq("voice_client", "tel_line", "sip_account", sipx, s) {
+			dmuci_get_value_by_section_string(s, "lineinstance", &instance);
+			if (instance[0] != '\0') {
+				i_instance = atoi(instance);
+				if ( i_instance > last_instance)
+					last_instance = i_instance;
+			}
+		}
+		sprintf(buf, "%d", last_instance + 1);
+		instance = dmuci_set_value_by_section(tel_s, "lineinstance", buf);
+	}
+	*last_inst = instance;
+	if (action == INSTANCE_MODE_ALIAS) {
+		dmuci_get_value_by_section_string(tel_s, "linealias", &alias);
+		if (alias[0] == '\0') {
+			sprintf(buf, "cpe-%s", instance);
+			alias = dmuci_set_value_by_section(tel_s, "linealias", buf);
+		}
+		sprintf(buf, "[%s]", alias);
+		instance = dmstrdup(buf);
+	}
+	return instance;
+}
+/*******/
+
+int add_line(struct uci_section *s, char *s_name)
+{
+	dmuci_set_value_by_section(s, "sip_account", s_name);
+	return 0;
+}
+
+int add_line_object(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{	
+	int i;
+	char *value, *v, *voice_profile_key;
+	char instance[4];
+	char call_lines[16] = {0};
+	struct uci_section *s = NULL;
+	struct sip_args *sipargs = (struct sip_args *)data;
+	struct uci_section *dmmap_voice_line_section, *dmmap_section;
+	int last_instance;
+
+	check_create_dmmap_package("dmmap_voice_client");
+	i = get_line_max_instance(&s);
+	if (i == 0)
+		return FAULT_9004;
+	add_line(s, section_name(sipargs->sip_section));
+	dmuci_add_section_icwmpd("dmmap_voice_client", "tel_line", &dmmap_voice_line_section, &v);
+	dmuci_set_value_by_section(dmmap_voice_line_section, "section_name", section_name(s));
+	get_dmmap_section_of_config_section("dmmap_voice_client", "sip_service_provider", section_name(sipargs->sip_section), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "profileinstance", &voice_profile_key);
+	dmuci_set_value_by_section(dmmap_voice_line_section, "voice_profile_key", voice_profile_key);
+	*instancepara = update_vp_line_instance(s, section_name(sipargs->sip_section)); //TODO: To Check
+	dmuci_get_value_by_section_string(sipargs->sip_section, "call_lines", &value);
+	if (value[0] == '\0') {
+		sprintf(call_lines, "%d", i - 1);
+	}
+	else {
+		sprintf(call_lines, "%s %d", value, i - 1);
+	}
+	dmuci_set_value_by_section(sipargs->sip_section, "call_lines", call_lines);
+	return 0;
+}
+
+int delete_line(struct uci_section *line_section, struct uci_section *sip_section)
+{
+	int len, found =0;
+	char *section_name, *line_id, *value = NULL;
+	char *pch, *spch, *call_lines, *p, new_call_lines[34] = {0};
+	
+	section_name = section_name(line_section);
+	line_id = section_name + strlen(section_name) - 1;
+	dmuci_set_value_by_section(line_section, "sip_account", "-");
+	dmuci_set_value_by_section(line_section, "lineinstance", "");
+	dmuci_set_value_by_section(line_section, "linealias", "");
+	dmuci_get_value_by_section_string(sip_section, "call_lines", &value);
+	call_lines = dmstrdup(value);
+	pch = strtok_r(call_lines, " ", &spch);
+	p = new_call_lines;
+	while (pch != NULL) {
+		if (strcmp(pch, line_id) != 0) {
+			if (new_call_lines[0] == '\0') {
+				dmstrappendstr(p, pch);
+			}
+			else {
+				dmstrappendchr(p, ' ');
+				dmstrappendstr(p, pch);
+			}
+		}
+		pch = strtok_r(NULL, " ", &spch);
+	}
+	dmstrappendend(p);
+	dmuci_set_value_by_section(sip_section, "call_lines", new_call_lines);
+	return 0;
+}
+
+int delete_line_object(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	int found = 0;
+	char *s_name;
+	struct uci_section *s;
+	struct sip_args *sipargs;
+	struct tel_args *bargs; //profile_num must be added to tel_args
+	struct uci_section *dmmap_section;
+	
+	switch (del_action) {
+		case DEL_INST:
+			bargs = (struct tel_args *)data;
+			get_dmmap_section_of_config_section("dmmap_voice_client", "tel_line", section_name(bargs->tel_section), &dmmap_section);
+			dmuci_delete_by_section(dmmap_section, NULL, NULL);
+			delete_line(bargs->tel_section, bargs->sip_section);
+			break;
+		case DEL_ALL:
+			sipargs = (struct sip_args *)data;
+			s_name = section_name(sipargs->sip_section);
+			uci_foreach_option_eq("voice_client", "tel_line", "sip_account", s_name, s) {
+				get_dmmap_section_of_config_section("dmmap_voice_client", "tel_line", section_name(s), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				delete_line(s, sipargs->sip_section);
+			}
+			break;
+	}
+
+	return 0;
+}
+/**************************Function for root entry *************************/
+int get_max_profile_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "8";
+	return 0;
+}
+
+int get_max_line_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "6";
+	return 0;
+}
+
+int get_max_session_per_line(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int get_max_session_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "6";
+	return 0;
+}
+
+int get_signal_protocols(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "SIP";
+	return 0;
+}
+
+int get_regions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "AU, BE, BR, CL, CN, CZ, DK, FI, FR, DE, HU, IN, IT, JP, NL, NZ, US, ES, SE, CH, NO, TW, GB, AE, ET, T5";
+	return 0;
+}
+
+int get_true_value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int get_false_value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	return 0;
+}
+/*******************end root ***************************/
+
+/**************SIP CAPABILITIES ************************/
+int get_sip_role (char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "BackToBackUserAgents";
+	return 0;
+}
+
+int get_sip_extension(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH";
+	return 0;
+}
+
+int get_sip_transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "UDP, TCP, TLS";
+	return 0;
+}
+
+int get_sip_tls_auth_protocols(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "MD5";
+	return 0;
+}
+
+int get_sip_tls_enc_protocols(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "RC4, RC2, DES, 3DES";
+	return 0;
+}
+
+int get_sip_tls_key_protocols(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "RSA, DSS";
+	return 0;
+}
+/*******************Capabilities.Codecs.***********************************/
+int get_entry_id(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct codec_args *codecs = (struct codec_args *)data;
+	*value = dmstrdup(codecs->id);
+	return 0;
+}
+
+int get_capabilities_sip_codec(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	int i;
+	struct codec_args *cdcargs = (struct codec_args *)data;
+	bool sep = false;
+	for (i = 0; i < ARRAY_SIZE(capabilities_sip_codecs); i++) {
+		if(capabilities_sip_codecs[i].enumid == cdcargs->enumid) {
+			*value = capabilities_sip_codecs[i].c2;
+			break;
+		}
+	}
+	return 0;
+}
+
+int get_capabilities_sip_bitrate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	int i;
+	struct codec_args *cdcargs = (struct codec_args *)data;
+	for (i = 0; i < ARRAY_SIZE(capabilities_sip_codecs); i++) {
+		if(capabilities_sip_codecs[i].enumid == cdcargs->enumid) {
+			*value = capabilities_sip_codecs[i].c3;
+			break;
+		}
+	}
+	return 0;
+}
+
+int get_capabilities_sip_pperiod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	int i;
+	struct codec_args *cdcargs = (struct codec_args *)data;
+	for (i = 0; i < ARRAY_SIZE(capabilities_sip_codecs); i++) {
+		if(capabilities_sip_codecs[i].enumid == cdcargs->enumid) {
+			*value = capabilities_sip_codecs[i].c4;
+			break;
+		}
+	}
+	return 0;
+}
+
+/*******************Voiceprofile END **********************************/
+int get_voice_service_max_line()
+{
+	char *num_lines = NULL;
+
+	db_get_value_string("hw", "board", "VoicePorts", &num_lines);
+	if(num_lines)
+		return atoi(num_lines);
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.Enable!UCI:voice_client/sip_service_provider,@i-1/enabled*/
+int get_voice_profile_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *tmp;
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	dmuci_get_value_by_section_string(sipargs->sip_section, "enabled", &tmp);
+	
+	if(strcmp(tmp, "0") == 0)
+		*value = "Disabled";
+	else
+		*value = "Enabled";
+	return 0;
+}
+
+int set_voice_profile_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if(strcmp(value, "Enabled") == 0)
+				dmuci_set_value_by_section(sipargs->sip_section, "enabled", "1");
+			else
+				dmuci_set_value_by_section(sipargs->sip_section, "enabled", "0");
+			return 0;
+	}
+	return 0;
+}
+
+int set_voice_profile_reset(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b) {
+				dmubus_call_set("uci", "commit", UBUS_ARGS{{"config", "voice_client"}}, 1);
+				return 0;
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.Name!UCI:voice_client/sip_service_provider,@i-1/name*/
+int get_voice_profile_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	dmuci_get_value_by_section_string(sipargs->sip_section, "name", value);
+	return 0;
+}
+
+int get_voice_profile_signalprotocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "SIP";
+	return 0;
+}
+
+int set_voice_profile_signaling_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.MaxSessions!UBUS:voice.asterisk/lines//num_lines*/
+int get_voice_profile_max_sessions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	char *sub_channel = NULL, *num_lines = NULL;
+	dmubus_call("voice.asterisk", "lines", UBUS_ARGS{}, 0, &res);
+	DM_ASSERT(res, *value = "");
+	sub_channel = dm_ubus_get_value(res, 1, "num_subchannels");
+	num_lines =  dm_ubus_get_value(res, 1, "num_lines");
+	dmasprintf(value, "%d", atoi(sub_channel) * atoi(num_lines)); // MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.NumberOfLines!UBUS:voice.asterisk/status//tel.@Name*/
+int get_voice_profile_number_of_lines(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	int num = 0;
+	json_object *res = NULL, *jobj = NULL;
+	struct uci_section *b_section = NULL;
+	struct sip_args *sipargs = (struct sip_args *)data;
+
+	*value = "0";
+	dmubus_call("voice.asterisk", "status", UBUS_ARGS{}, 0, &res);
+	if (!res)
+		return 0;
+	uci_foreach_option_eq("voice_client", "tel_line", "sip_account", section_name(sipargs->sip_section), b_section) {
+		jobj = dmjson_get_obj(res, 2, "tel", section_name(b_section));
+		if (jobj)
+			num++;
+	}
+	dmasprintf(value, "%d", num); // MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.SIP.ProxyServer!UCI:voice_client/sip_advanced,SIP/sip_proxy*/
+int get_voice_profile_sip_proxyserver(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("voice_client", "SIP", "sip_proxy", value);
+	return 0;
+}
+
+int set_voice_profile_sip_proxyserver(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("voice_client", "SIP", "sip_proxy", value);
+			return 0;
+	}
+	return 0;
+}
+
+int set_sip_proxy_server_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			//TODO: not implemented in old scripts
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.SIP.ProxyServerTransport!UCI:voice_client/sip_service_provider,@i-1/transport*/
+int get_sip_proxy_server_transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+		
+	dmuci_get_value_by_section_string(sipargs->sip_section, "transport", value);
+	return 0;
+}
+
+int set_sip_proxy_server_transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(sipargs->sip_section, "transport", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.SIP.RegistrarServer!UCI:voice_client/sip_service_provider,@i-1/host*/
+int get_voice_profile_sip_registerserver(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	dmuci_get_value_by_section_string(sipargs->sip_section, "host", value);
+	return 0;
+}
+
+int set_voice_profile_sip_registerserver(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(sipargs->sip_section, "host", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.SIP.RegistrarServerPort!UCI:voice_client/sip_service_provider,@i-1/port*/
+int get_voice_profile_sip_registerserverport(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	dmuci_get_value_by_section_string(sipargs->sip_section, "port", value);
+	return 0;
+}
+
+int set_voice_profile_sip_registerserverport(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(sipargs->sip_section, "port", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.SIP.RegistrarServerTransport!UCI:voice_client/sip_service_provider,@i-1/transport*/
+int get_sip_registrar_server_transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	dmuci_get_value_by_section_string(sipargs->sip_section, "transport", value);
+	return 0;
+}
+
+int set_sip_registrar_server_transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(sipargs->sip_section, "transport", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.SIP.UserAgentDomain!UCI:voice_client/sip_service_provider,@i-1/domain*/
+int get_sip_user_agent_domain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	dmuci_get_value_by_section_string(sipargs->sip_section, "domain", value);
+	return 0;
+}
+
+int set_sip_user_agent_domain(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(sipargs->sip_section, "domain", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.SIP.UserAgentPort!UCI:voice_client/sip_advanced,SIP/bindport*/
+int get_sip_user_agent_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("voice_client", "SIP", "bindport", value);
+	return 0;
+}
+
+int set_sip_user_agent_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("voice_client", "SIP", "bindport", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.SIP.UserAgentTransport!UCI:voice_client/sip_service_provider,@i-1/transport*/
+int get_sip_user_agent_transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *tmp;
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	dmuci_get_value_by_section_string(sipargs->sip_section, "transport", &tmp);
+	if (tmp[0] == '\0')
+		*value = "udp";
+	else
+		*value = tmp;
+	return 0;
+}
+
+int set_sip_user_agent_transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcasecmp(value, "udp")==0) dmuci_set_value_by_section(sipargs->sip_section, "transport", "");
+			else dmuci_set_value_by_section(sipargs->sip_section, "transport", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.SIP.OutboundProxy!UCI:voice_client/sip_service_provider,@i-1/outboundproxy*/
+int get_sip_outbound_proxy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	dmuci_get_value_by_section_string(sipargs->sip_section, "outboundproxy", value);
+	return 0;
+}
+
+int set_sip_outbound_proxy(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(sipargs->sip_section, "outboundproxy", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.SIP.OutboundProxyPort!UCI:voice_client/sip_service_provider,@i-1/outboundproxyport*/
+int get_sip_outbound_proxy_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	dmuci_get_value_by_section_string(sipargs->sip_section, "outboundproxyport", value);
+	return 0;
+}
+
+int set_sip_outbound_proxy_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(sipargs->sip_section, "outboundproxyport", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.SIP.RegistrationPeriod!UCI:voice_client/sip_advanced,SIP/defaultexpiry*/
+int get_sip_registration_period(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("voice_client", "SIP", "defaultexpiry", value);
+	return 0;
+}
+
+int set_sip_registration_period(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("voice_client", "SIP", "defaultexpiry", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.SIP.ReInviteExpires!UCI:voice_client/sip_advanced,SIP/registertimeout*/
+int get_sip_re_invite_expires(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("voice_client", "SIP", "registertimeout", value);
+	return 0;
+}
+
+int set_sip_re_invite_expires(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("voice_client", "SIP", "registertimeout", value);
+			return 0;
+	}
+	return 0;
+}
+
+
+int get_sip_call_lines(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	dmuci_get_value_by_section_string(sipargs->sip_section, "call_lines", value);
+	return 0;
+}
+
+int set_sip_call_lines(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(sipargs->sip_section, "call_lines", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.DTMFMethod!UCI:voice_client/sip_advanced,SIP/dtmfmode*/
+int get_voice_profile_sip_dtmfmethod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *tmp;
+	
+	dmuci_get_option_value_string("voice_client", "SIP", "dtmfmode", &tmp);
+	if(strcmp(tmp, "inband") == 0)
+		*value = "InBand";
+	else if(strcmp(tmp, "rfc2833") == 0)
+		*value = "RFC2833";
+	else if(strcmp(tmp, "info") == 0)
+		*value = "SIPInfo";
+	else
+		*value = tmp;
+	return 0;
+}
+
+int set_voice_profile_sip_dtmfmethod(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if(strcmp(value, "InBand") == 0)
+				dmuci_set_value("voice_client", "SIP", "dtmfmode", "inband");
+			else if(strcmp(value, "RFC2833") == 0)
+				dmuci_set_value("voice_client", "SIP", "dtmfmode", "rfc2833");
+			else if(strcmp(value, "SIPInfo") == 0)
+				dmuci_set_value("voice_client", "SIP", "dtmfmode", "info");
+			return 0;
+	}
+	return 0;
+}
+
+int get_sip_profile_region(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	int i;
+	
+	dmuci_get_option_value_string("voice_client", "TEL", "country", value);
+	for (i = 0; i < ARRAY_SIZE(capabilities_regions); i++) {
+		if(strcmp(*value, capabilities_regions[i].country) == 0){
+			*value = capabilities_regions[i].id;
+			return 0;
+		}
+	}
+	return 0;
+}
+
+int set_sip_profile_region(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	int i;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			for (i = 0; i < ARRAY_SIZE(capabilities_regions); i++) {
+				if(strcasecmp(value, capabilities_regions[i].id) == 0){
+					dmuci_set_value("voice_client", "TEL", "country", capabilities_regions[i].country);
+					break;
+				}
+			}
+			return 0;
+		}
+	return 0;
+}
+
+int get_voice_service_serviceproviderinfo_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	dmuci_get_value_by_section_string(sipargs->sip_section, "provider_name", value);
+	if(*value[0] == '\0') {
+		dmuci_get_value_by_section_string(sipargs->sip_section, "domain", value);
+	}
+	return 0;
+}
+
+int set_voice_service_serviceproviderinfo_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(sipargs->sip_section, "provider_name", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_sip_fax_t38_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	dmuci_get_value_by_section_string(sipargs->sip_section, "is_fax", value);
+	return 0;
+}
+
+int set_sip_fax_t38_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				value = "1";
+			else
+				value = "0";
+
+			dmuci_set_value_by_section(sipargs->sip_section, "is_fax", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_voice_service_vp_rtp_portmin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *tmp; 
+	
+	dmuci_get_option_value_string("voice_client", "SIP", "rtpstart", &tmp);
+	if(tmp[0] == '\0')
+		*value = "5000";
+	else
+		*value = tmp;
+	return 0;
+}
+
+int set_voice_service_vp_rtp_portmin(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("voice_client", "SIP", "rtpstart", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_voice_service_vp_rtp_portmax(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *tmp;
+	
+	dmuci_get_option_value_string("voice_client", "SIP", "rtpend", &tmp);
+	if(tmp[0] == '\0')
+		*value = "31000";
+	else
+		*value = tmp;
+	return 0;
+}
+
+int set_voice_profile_rtp_localportmax(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("voice_client", "SIP", "rtpend", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_voice_service_vp_rtp_dscp(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	int i;
+	char *tmp;
+	*value = "0";
+
+	dmuci_get_option_value_string("voice_client", "SIP", "tos_audio", &tmp);
+	for (i = 0; i < ARRAY_SIZE(list_rtp_tos); i++) {
+		if(strcmp(tmp, list_rtp_tos[i].key) == 0){
+			*value = list_rtp_tos[i].val;
+			break;
+		}
+	}
+	return 0;
+}
+
+int set_voice_service_vp_rtp_dscp(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	int i;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			for (i = 0; i < ARRAY_SIZE(list_rtp_tos); i++) {
+				if(strcmp(value, list_rtp_tos[i].val) == 0){
+					dmuci_set_value("voice_client", "SIP", "tos_audio", list_rtp_tos[i].key);
+					break;
+				}
+			}
+		return 0;
+	}
+	return 0;
+}
+
+int get_voice_service_vp_rtp_rtcp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	pid_t pid; 
+	
+	pid = get_pid("asterisk");
+	if(pid < 0)
+		*value = "0";
+	else
+		*value = "1";
+	return 0;
+}
+
+int get_voice_service_vp_rtp_rtcp_txrepeatinterval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *tmp;
+	
+	dmuci_get_option_value_string("voice_client", "SIP", "rtcpinterval", &tmp);
+	if(tmp[0] == '\0')
+		*value = "5000";
+	else
+		*value = tmp;
+	return 0;
+}
+
+int set_voice_service_vp_rtp_rtcp_txrepeatinterval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("voice_client", "SIP", "rtcpinterval", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_voice_service_vp_rtp_srtp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *tmp;
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	dmuci_get_value_by_section_string(sipargs->sip_section, "encryption", &tmp);
+	if(strcasecmp(tmp, "yes") == 0)
+		*value = "1";
+	else
+		*value = "0";
+	return 0;
+}
+
+int set_voice_service_vp_rtp_srtp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct sip_args *sipargs = (struct sip_args *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section(sipargs->sip_section, "encryption", "yes");
+			else
+				dmuci_set_value_by_section(sipargs->sip_section, "encryption", "");
+			return 0;
+	}
+	return 0;
+}
+
+/*******************LINE **********************************/
+int get_voice_profile_line_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *tmp;
+	struct tel_args *telargs = (struct tel_args *)data;
+
+	dmuci_get_value_by_section_string(telargs->sip_section, "enabled", &tmp);
+
+	if(strcmp(tmp, "0") == 0)
+		*value = "Disabled";
+	else
+		*value = "Enabled";
+	return 0;
+}
+
+int set_voice_profile_line_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct tel_args *telargs = (struct tel_args *)data;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if(strcmp(value, "Enabled") == 0)
+				dmuci_set_value_by_section(telargs->sip_section, "enabled", "1");
+			else
+				dmuci_set_value_by_section(telargs->sip_section, "enabled", "0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_line_directory_number(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct tel_args *telargs = (struct tel_args *)data;
+	
+	dmuci_get_value_by_section_string(telargs->tel_section, "extension", value);
+	return 0;
+}
+
+int set_line_directory_number(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct tel_args *telargs = (struct tel_args *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(telargs->tel_section, "extension", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_voice_profile_line_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *status, *sip_name, *q;
+		json_object *res;
+		char buf[64];
+		struct tel_args *telargs = (struct tel_args *)data;
+		*value = "Disabled";
+		sip_name = section_name(telargs->sip_section);
+		q = buf;
+		dmstrappendstr(q, "asterisk");
+		dmstrappendchr(q, '.');
+		dmstrappendstr(q, "sip");
+		dmstrappendchr(q, '.');
+		dmstrappendstr(q, section_name(telargs->sip_section) + 3);
+		dmstrappendend(q);
+		dmubus_call(buf, "status", UBUS_ARGS{}, 0, &res);
+		DM_ASSERT(res, *value = "Disabled");
+		if(res) {
+			status = dmjson_get_value(res, 1, "registered");
+			if (strcasecmp(status, "true") == 0) {
+				*value = "Up";
+			}
+			else {
+				status = dmjson_get_value(res, 1, "registry_request_sent");
+				if(strcasecmp(status, "true") == 0)
+					*value = "Registering";
+				else
+					*value = "Disabled";
+			}
+		}
+		return 0;
+}
+
+int get_voice_profile_line_callstate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{	
+	char *tmp, *line_name;
+	struct tel_args *telargs = (struct tel_args *)data;
+
+	line_name = section_name(telargs->tel_section);
+	dmuci_get_varstate_string("chan_tel", line_name, "subchannel_0", &tmp);
+	if (strcmp(tmp, "ONHOOK") == 0)
+		*value = "idle";
+	else if (strcmp(tmp, "OFFHOOK") == 0)
+		*value = "Disconnecting";
+	else if (strcmp(tmp, "DIALING") == 0)
+		*value = "Calling";
+	else if (strcmp(tmp, "INCALL") == 0)
+		*value = "InCall";
+	else if (strcmp(tmp, "RINGING") == 0)
+		*value = "Ringing";
+	else
+		*value = "";
+	return 0;
+}
+
+int get_line_line_profile(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct tel_args *telargs = (struct tel_args *)data;
+
+	*value = telargs->profile_num;
+	return 0;
+}
+
+int set_line_line_profile(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char call_lines[32];
+	char *str;
+	struct uci_section *sip_s;
+	struct tel_args *telargs = (struct tel_args *)data;
+			
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			uci_foreach_option_eq("voice_client", "sip_service_provider", "profileinstance", value, sip_s) {
+				break;
+			}
+			if (!sip_s || strcmp(telargs->profile_num, value) == 0)
+				return 0;
+
+			delete_line(telargs->tel_section, telargs->sip_section);
+			str = update_vp_line_instance(telargs->tel_section, section_name(sip_s));
+			add_line(telargs->tel_section, section_name(sip_s));
+
+			dmuci_get_value_by_section_string(sip_s, "call_lines", &value);
+			if (value[0] == '\0') {
+				value = section_name(telargs->tel_section) + strlen(section_name(telargs->tel_section)) - 1;
+				dmuci_set_value_by_section(sip_s, "call_lines", value);
+			}
+			else {
+				str = (section_name(telargs->tel_section) + strlen(section_name(telargs->tel_section)) - 1);
+				sprintf(call_lines, "%s %s", value, str);
+				dmuci_set_value_by_section(sip_s, "call_lines", call_lines);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_line_tel_line(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *line_name;
+	struct tel_args *telargs = (struct tel_args *)data;
+	
+	line_name = section_name(telargs->tel_section);
+	*value = dmstrdup(line_name + strlen(line_name) - 1); //  MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+int set_line_tel_line(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	int error;
+	char line_name[8], bname[8], *stype = NULL, *sipaccount = NULL, *lineinstance = NULL, *linealias = NULL, *voice_profile_key = NULL, *v;
+	struct tel_args *telargs = (struct tel_args *)data;
+	struct uci_section *dmmap_section = NULL, *dmmap_tel_line_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			memset(line_name, '\0', sizeof(line_name));
+			strncpy(line_name, section_name(telargs->tel_section), strlen(section_name(telargs->tel_section)) - 1);
+			sprintf(bname, "%s%s", line_name, value);
+			error = dmuci_get_section_type("voice_client", bname, &stype);
+			if(error)
+				return 0;
+			dmuci_get_option_value_string("voice_client", bname, "sip_account", &sipaccount);
+			if ((sipaccount[0] != '\0' && sipaccount[0] != '-'))
+				return 0;
+			dmuci_get_value_by_section_string(telargs->tel_section, "sip_account", &sipaccount);
+			dmuci_set_value_by_section(telargs->tel_section, "sip_account", "-");
+			get_dmmap_section_of_config_section("dmmap_voice_client", "tel_line", section_name(telargs->tel_section), &dmmap_section);
+			if(dmmap_section != NULL) {
+				dmuci_get_value_by_section_string(dmmap_section, "voice_profile_key", &voice_profile_key);
+				dmuci_get_value_by_section_string(dmmap_section, "lineinstance", &lineinstance);
+				dmuci_get_value_by_section_string(dmmap_section, "linealias", &linealias);
+				dmuci_delete_by_section(dmmap_section, NULL, NULL);
+			}
+			dmuci_set_value("voice_client", bname, "sip_account", sipaccount);
+			dmuci_add_section_icwmpd("dmmap_voice_client", "tel_line", &dmmap_tel_line_section, &v);
+			if(dmmap_section != NULL) {
+				dmuci_set_value_by_section(dmmap_tel_line_section, "section_name", bname);
+				dmuci_set_value_by_section(dmmap_tel_line_section, "voice_profile_key", voice_profile_key);
+				dmuci_set_value_by_section(dmmap_tel_line_section, "lineinstance", lineinstance);
+				dmuci_set_value_by_section(dmmap_tel_line_section, "linealias", linealias);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_line_confort_noise_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct tel_args *telargs = (struct tel_args *)data;
+
+	dmuci_get_value_by_section_string(telargs->tel_section, "noise", value);
+	return 0;
+}
+
+int set_line_confort_noise_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct tel_args *telargs = (struct tel_args *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			if(string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section(telargs->tel_section, "noise", "1");
+			else
+				dmuci_set_value_by_section(telargs->tel_section, "noise", "0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_line_voice_processing_cancellation_enable(char *refparam, struct dmctx *ctx,  void *data, char *instance, char **value)
+{
+	struct tel_args *telargs = (struct tel_args *)data;
+
+	dmuci_get_value_by_section_string(telargs->tel_section, "echo_cancel", value);
+	return 0;
+}
+
+
+int set_line_voice_processing_cancellation_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct tel_args *telargs = (struct tel_args *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			if(string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section(telargs->tel_section, "echo_cancel", "1");
+			else
+				dmuci_set_value_by_section(telargs->tel_section, "echo_cancel", "0");
+			return 0;
+	}
+	return 0;
+}
+
+
+int get_line_calling_features_caller_id_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct tel_args *telargs = (struct tel_args *)data;
+	
+	dmuci_get_value_by_section_string(telargs->sip_section, "displayname", value);
+	return 0;
+}
+
+int set_line_calling_features_caller_id_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct tel_args *telargs = (struct tel_args *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(telargs->sip_section, "displayname", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_line_calling_features_callwaiting(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct tel_args *telargs = (struct tel_args *)data;
+	
+	dmuci_get_value_by_section_string(telargs->tel_section, "callwaiting", value);
+	if((*value)[0] == '\0')
+		*value = "0";
+	return 0;
+}
+
+int set_line_calling_features_callwaiting(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct tel_args *telargs = (struct tel_args *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			if(string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section(telargs->tel_section, "callwaiting", "1");
+			else
+				dmuci_set_value_by_section(telargs->tel_section, "callwaiting", "");
+			return 0;
+	}
+	return 0;
+}
+
+int get_line_sip_auth_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct tel_args *telargs = (struct tel_args *)data;
+	
+	dmuci_get_value_by_section_string(telargs->sip_section, "authuser", value);
+	return 0;
+}
+
+int set_line_sip_auth_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct tel_args *telargs = (struct tel_args *)data;
+	
+  switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(telargs->sip_section, "authuser", value);
+			return 0;
+	}
+	return 0;
+}
+
+int set_line_sip_auth_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct tel_args *telargs = (struct tel_args *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(telargs->sip_section, "secret", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_line_sip_uri(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *domain = NULL, *user = NULL;
+	struct tel_args *telargs = (struct tel_args *)data;
+
+	dmuci_get_value_by_section_string(telargs->sip_section, "domain", &domain);
+	dmuci_get_value_by_section_string(telargs->sip_section, "user", &user);
+	if (user && domain)
+		dmasprintf(value, "%s@%s", user, domain); // MEM WILL BE FREED IN DMMEMCLEAN
+	else
+		*value = "";
+  return 0;
+}
+
+int set_line_sip_uri(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *pch, *spch, *str1;
+	struct tel_args *telargs = (struct tel_args *)data;
+	
+  switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			str1 = dmstrdup(value);
+			pch = strtok_r(str1, "@", &spch);
+			dmuci_set_value_by_section(telargs->sip_section, "user", pch);
+			pch = strtok_r(NULL, "@", &spch);
+			dmuci_set_value_by_section(telargs->sip_section, "domain", pch);
+			dmfree(str1);
+			return 0;
+	}
+	return 0;
+}
+
+/******************Line codec ***************************************/
+
+int codec_compare(const void *s1, const void *s2)
+{
+	struct codec *sc1 = (struct codec *)s1;
+	struct codec *sc2 = (struct codec *)s2;
+	if (!sc1->priority) return 1;
+	if (!sc2->priority) return -1;
+	return (atoi(sc1->priority) - atoi(sc2->priority));
+}
+
+void codec_priority_sort(struct uci_section *sip_section, char *new_codec)
+{
+	int j, k = 0, h = 0, size = ARRAY_SIZE(codec_option_array);
+	char *ucodec, *coption, *poption;
+	bool found;
+	struct codec sipcodec[ARRAY_SIZE(codec_option_array)+1] = {0};
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_voice_client", "sip_service_provider", section_name(sip_section), &dmmap_section);
+	for (j = 0; j < ARRAY_SIZE(codec_option_array); j++) {
+		dmuci_get_value_by_section_string(sip_section, codec_option_array[j], &ucodec);
+		if(ucodec[0] != '\0') {
+			found = false;
+			for (k = 0; k < available_sip_codecs; k++) {
+				if(strcmp(ucodec, allowed_sip_codecs[k].allowed_cdc) == 0) {
+					found = true;
+					break;
+				}
+			}
+			if (found) {
+				sipcodec[j].cdc = allowed_sip_codecs[k].allowed_cdc;
+				dmuci_get_value_by_section_string(dmmap_section, allowed_sip_codecs[k].priority_cdc, &(sipcodec[j].priority));
+			}
+			sipcodec[j].id = codec_option_array[j];
+		}
+		else {
+			sipcodec[j].id = codec_option_array[j];
+		}
+	}
+	if (new_codec) {
+		sipcodec[size].id = "codec5";
+		found = false;
+		for (k = 0; k < available_sip_codecs; k++) {
+			if(strcmp(new_codec, allowed_sip_codecs[k].allowed_cdc) == 0) {
+				found = true;
+				break;
+			}
+		}
+		if (found) {
+			sipcodec[size].cdc = allowed_sip_codecs[k].allowed_cdc;
+			dmuci_get_value_by_section_string(dmmap_section, allowed_sip_codecs[k].priority_cdc, &(sipcodec[size].priority));
+		}
+	}
+	qsort(sipcodec, ARRAY_SIZE(sipcodec), sizeof(struct codec), codec_compare);
+
+	for (j = 0; j < ARRAY_SIZE(codec_option_array); j++) {
+		dmuci_set_value_by_section(sip_section, codec_option_array[j], sipcodec[j].cdc ? sipcodec[j].cdc : "");
+	}
+}
+
+void codec_priority_update(struct uci_section *sip_section)
+{
+	bool found;
+	int i, j;
+	char *priority = NULL;
+	char *codec;
+	char pid[4] = "1";
+	struct uci_section *dmmap_section = NULL;
+
+	get_dmmap_section_of_config_section("dmmap_voice_client", "sip_service_provider", section_name(sip_section), &dmmap_section);
+
+	for (i = 0; i < available_sip_codecs; i++) {
+		dmuci_get_value_by_section_string(dmmap_section, allowed_sip_codecs[i].priority_cdc, &priority);
+		if( priority[0] != '\0')
+			continue;
+		found = false;
+		for (j = 0; j < ARRAY_SIZE(codec_option_array); j++) {
+			dmuci_get_value_by_section_string(sip_section, codec_option_array[j], &codec);
+			if(strcmp(codec, allowed_sip_codecs[i].allowed_cdc) == 0) {
+				found = true;
+				break;
+			}
+		}
+		if (found)
+			sprintf(pid, "%d", j+1);
+		dmuci_set_value_by_section(dmmap_section, allowed_sip_codecs[i].priority_cdc, pid);
+	}
+	codec_priority_sort(sip_section, NULL);
+}
+
+int get_codec_entry_id(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct line_codec_args *line_codecargs = (struct line_codec_args *)data;
+	
+	*value = line_codecargs->id;
+	return 0;
+}
+
+int capabilities_sip_codecs_get_codec(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	int i;
+	struct line_codec_args *line_codecargs = (struct line_codec_args *)data;
+	
+	for (i = 0; i < ARRAY_SIZE(capabilities_sip_codecs); i++) {
+		if(capabilities_sip_codecs[i].enumid == line_codecargs->enumid) {
+			*value = capabilities_sip_codecs[i].c2;
+			break;
+		}
+	}
+	return 0;
+}
+
+int capabilities_sip_codecs_get_bitrate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	int i;
+	struct line_codec_args *line_codecargs = (struct line_codec_args *)data;
+	
+	for (i = 0; i < ARRAY_SIZE(capabilities_sip_codecs); i++) {
+		if(capabilities_sip_codecs[i].enumid == line_codecargs->enumid) {
+			*value = capabilities_sip_codecs[i].c3;
+			break;
+		}
+	}
+	return 0;
+}
+
+int get_capabilities_sip_codecs_pperiod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	int i;
+	struct line_codec_args *line_codecargs = (struct line_codec_args *)data;
+	dmuci_get_value_by_section_string(line_codecargs->sip_section, line_codecargs->ptime_cdc, value);
+	if ((*value)[0] != '\0')
+		return 0;
+	for (i = 0; i < ARRAY_SIZE(capabilities_sip_codecs); i++) {
+		if(capabilities_sip_codecs[i].enumid == line_codecargs->enumid) {
+			*value = capabilities_sip_codecs[i].c5;
+			break;
+		}
+	}
+	return 0;
+}
+
+int get_line_codec_list_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	int i;
+	char *val;
+	struct line_codec_args *line_codecargs = (struct line_codec_args *)data;
+	
+	for (i =0; i < ARRAY_SIZE(codec_option_array); i++) {
+		dmuci_get_value_by_section_string(line_codecargs->sip_section, codec_option_array[i], &val);
+		if (strcmp(val, line_codecargs->cdc) == 0) {
+			*value = "1";
+			return 0;
+		}
+	}
+	*value = "0";
+	return 0;
+}
+
+int get_line_codec_list_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct line_codec_args *line_codecargs = (struct line_codec_args *)data;
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_voice_client", "sip_service_provider", section_name(line_codecargs->sip_section), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, line_codecargs->priority_cdc, value);
+	return 0;
+}
+
+int set_line_codec_list_packetization(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct line_codec_args *line_codecargs = (struct line_codec_args *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(line_codecargs->sip_section, line_codecargs->ptime_cdc, value);
+			return 0;
+	}
+	return 0;
+}
+
+int set_line_codec_list_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	int j;
+	char *codec;
+	struct line_codec_args *line_codecargs = (struct line_codec_args *)data;
+	int error = string_to_bool(value, &b);
+
+	switch (action) {
+		case VALUECHECK:
+			if (error)
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			if (b) {
+				for (j = 0; j < ARRAY_SIZE(codec_option_array); j++) {
+					dmuci_get_value_by_section_string(line_codecargs->sip_section, codec_option_array[j], &codec);
+					if(strcmp(codec, line_codecargs->cdc) == 0) {
+						return 0;
+					}
+				}
+				codec_priority_sort(line_codecargs->sip_section, line_codecargs->cdc);
+			}
+			else {
+				for (j = 0; j < ARRAY_SIZE(codec_option_array); j++) {
+					dmuci_get_value_by_section_string(line_codecargs->sip_section, codec_option_array[j], &codec);
+					if(strcmp(codec, line_codecargs->cdc) == 0) {
+						dmuci_set_value_by_section(line_codecargs->sip_section, codec_option_array[j], "");
+					}
+				}
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int set_line_codec_list_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	int i;
+	char *val;
+	struct line_codec_args *line_codecargs = (struct line_codec_args *)data;
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_voice_client", "sip_service_provider", section_name(line_codecargs->sip_section), &dmmap_section);
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, line_codecargs->priority_cdc, value);
+			for (i =0; i < ARRAY_SIZE(codec_option_array); i++) {
+				dmuci_get_value_by_section_string(line_codecargs->sip_section, codec_option_array[i], &val);
+				if (strcmp(val, line_codecargs->cdc) == 0) {
+					codec_priority_sort(line_codecargs->sip_section, NULL);
+					return 0;
+				}
+			}
+			return 0;
+	}
+	return 0;
+}
+
+//////////////ENABLE SET////////////////
+bool dm_service_enable_set(void)
+{
+	if( access("/etc/init.d/asterisk", F_OK ) != -1 ) {
+		return true;
+	} else {
+		return false;
+	}
+}
+void codec_update_id()
+{
+	int i = 0;
+	int found = 0;
+	struct uci_section *s = NULL;
+	struct uci_section *ss = NULL;
+
+	for (i = 0; i < available_sip_codecs; i++) {
+		update_section_list(DMMAP,"codec_id", "id", 1, allowed_sip_codecs[i].id, NULL, NULL, NULL, NULL);
+	}
+	if(i == 0)
+	{
+		uci_path_foreach_sections(icwmpd, "dmmap", "codec_id", s) {
+			if (found != 0) {
+				DMUCI_DELETE_BY_SECTION(icwmpd, ss, NULL, NULL);
+			}
+			ss = s;
+			found++;
+		}
+		if (ss != NULL) {
+			DMUCI_DELETE_BY_SECTION(icwmpd, ss, NULL, NULL);
+		}
+	}
+}
+////////////////////////SET AND GET ALIAS/////////////////////////////////
+int get_service_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *service_section = (struct uci_section *)data;
+	dmuci_get_value_by_section_string(service_section, "vsalias", value);
+	return 0;
+}
+
+int set_service_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *service_section = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(service_section, "vsalias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_cap_codec_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct codec_args *cur_codec_args = (struct codec_args *)data;
+	dmuci_get_value_by_section_string(cur_codec_args->codec_section, "codecalias", value);
+	return 0;
+}
+
+int set_cap_codec_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct codec_args *cur_codec_args = (struct codec_args *)data;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(cur_codec_args->codec_section, "codecalias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_voice_profile_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_voice_client", "sip_service_provider", section_name(sipargs->sip_section), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "profilealias", value);
+	return 0;
+}
+
+int set_voice_profile_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct sip_args *sipargs = (struct sip_args *)data;
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_voice_client", "sip_service_provider", section_name(sipargs->sip_section), &dmmap_section);
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, "profilealias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_line_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct tel_args *telarg = (struct tel_args *)data;
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_voice_client", "tel_line", section_name(telarg->tel_section), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "linealias", value);
+	return 0;
+}
+
+int set_line_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct tel_args *telarg = (struct tel_args *)data;
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_voice_client", "tel_line", section_name(telarg->tel_section), &dmmap_section);
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, "linealias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_line_codec_list_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct line_codec_args *)data)->codec_sec, "codecalias", value);
+	return 0;
+}
+
+int set_line_codec_list_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct line_codec_args *)data)->codec_sec, "codecalias", value);
+			return 0;
+	}
+	return 0;
+}
+///////////////////////////////////////
+void set_voice_profile_key_of_line(struct uci_section *dmmap_line_section, char* prev_instance){
+	DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_line_section, "voice_profile_key", prev_instance);
+}
+
+int browseVoiceServiceInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL;
+	char *vs = NULL, *vs_last = NULL;
+
+	update_section_list(DMMAP,"voice_service", NULL, 1, NULL, NULL, NULL, NULL, NULL);
+	uci_path_foreach_sections(icwmpd, "dmmap", "voice_service", s) {
+		vs = handle_update_instance(1, dmctx, &vs_last, update_instance_alias_icwmpd, 3, s, "vsinstance", "vsalias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)s, vs) == DM_STOP)
+			break;
+	}
+	return 0;
+}
+
+int browseCodecsInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	int i = 0;
+	char *id, *id_last = NULL;
+	struct uci_section *code_sec;
+	struct codec_args curr_codec_args = {0};
+
+	init_allowed_sip_codecs();
+	codec_update_id();
+	uci_path_foreach_sections(icwmpd, "dmmap", "codec_id", code_sec) {
+		init_codec_args(&curr_codec_args, allowed_sip_codecs[i].allowed_cdc, allowed_sip_codecs[i].id, allowed_sip_codecs[i].enumid, code_sec);
+		id = handle_update_instance(2, dmctx, &id_last, update_instance_alias_icwmpd, 3, code_sec, "codecinstance", "codecalias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_codec_args, id) == DM_STOP) {
+			fini_codec_args(&curr_codec_args);
+			break;
+		}
+		fini_codec_args(&curr_codec_args);
+		i++;
+	}
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.!UCI:voice_client/sip_service_provider/dmmap_voice_client*/
+int browseProfileInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *sip_section;
+	char *profile_num = NULL, *profile_num_last = NULL;
+	struct sip_args curr_sip_args = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+	wait_voice_service_up();
+	synchronize_specific_config_sections_with_dmmap("voice_client", "sip_service_provider", "dmmap_voice_client", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		profile_num = handle_update_instance(2, dmctx, &profile_num_last, update_instance_alias_icwmpd, 3, p->dmmap_section, "profileinstance", "profilealias");
+		init_sip_args(&curr_sip_args, p->config_section, profile_num_last);
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_sip_args, profile_num) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+/*#Device.Services.VoiceService.{i}.VoiceProfile.{i}.Line.{i}.!UCI:voice_client/tel_line/dmmap_voice_client*/
+int browseLineInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	int maxLine, line_id = 0;
+	char *line_num = NULL, *last_inst = NULL;
+	struct uci_section *b_section = NULL;
+	json_object *res, *jobj;
+	struct sip_args *sipargs = (struct sip_args *)prev_data;
+	struct tel_args curr_tel_args = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	maxLine = get_voice_service_max_line();
+
+	synchronize_specific_config_sections_with_dmmap_eq("voice_client", "tel_line", "dmmap_voice_client", "sip_account", section_name(sipargs->sip_section), &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		line_id = atoi(section_name(p->config_section) + strlen(section_name(p->config_section)) - 1);
+		if ( line_id >= maxLine )
+			continue;
+		set_voice_profile_key_of_line(p->dmmap_section, prev_instance);
+		line_num = handle_update_instance(3, dmctx, &last_inst, update_instance_alias_icwmpd, 3, p->dmmap_section, "lineinstance", "linealias");
+		init_tel_args(&curr_tel_args, p->config_section, sipargs->sip_section, sipargs->profile_num); //check difference between sipargs->profile_num and profile_num
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_tel_args, line_num) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+int browseLineCodecListInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	int i = 0;
+	char *id = NULL , *id_last = NULL;
+	struct tel_args *telargs = (struct tel_args *)prev_data;
+	struct uci_section *code_sec = NULL;
+	struct line_codec_args curr_line_codec_args = {0};
+
+	init_allowed_sip_codecs();
+	codec_update_id();
+	codec_priority_update(telargs->sip_section);
+	uci_path_foreach_sections(icwmpd, "dmmap", "codec_id", code_sec) {
+		init_line_code_args(&curr_line_codec_args, i, telargs->sip_section, code_sec);
+		id = handle_update_instance(4, dmctx, &id_last, update_instance_alias_icwmpd, 3, code_sec, "codecinstance", "codecalias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_line_codec_args, id) == DM_STOP)
+			break;
+		i++;
+	}
+	return 0;
+}
diff --git a/dmtree/tr104/voice_services.h b/dmtree/tr104/voice_services.h
new file mode 100644
index 0000000000000000000000000000000000000000..8949f5213f0defefd3af3850a6e07075ecf1d7fe
--- /dev/null
+++ b/dmtree/tr104/voice_services.h
@@ -0,0 +1,262 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2012-2014 PIVA SOFTWARE (www.pivasoftware.com)
+*		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *		Author: Feten Besbes <feten.besbes@pivasoftware.com>
+ *		Author: Mohamed Kallel <mohamed.kallel@pivasoftware.com>
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ */
+
+#ifndef __VOICE_H
+#define __VOICE_H
+
+extern DMOBJ tServiceObj[];
+extern DMOBJ tVoiceServiceObj[];
+extern DMLEAF tVoiceServiceParam[];
+extern DMLEAF tCapabilitiesParams[];
+extern DMOBJ tCapabilitiesObj[];
+extern DMLEAF tSIPParams[];
+extern DMLEAF tCodecsParams[] ;
+extern DMOBJ tProfileObj[] ;
+extern DMLEAF tProfileSIPParams[];
+extern DMLEAF tServiceProviderInfoParams[];
+extern DMLEAF tProfileParam[];
+extern DMOBJ tLineObj[];
+extern DMOBJ tLineCodecObj[];
+extern DMLEAF tLineCodecListParams[];
+extern DMLEAF tLineSIPParams[];
+extern DMLEAF tVoiceProcessingParams[];
+extern DMLEAF tCallingFeaturesParams[];
+extern DMLEAF tLineParams[];
+extern DMLEAF tRTPParams[];
+extern DMOBJ tRTPObj[];
+extern DMLEAF tSRTPParam[];
+extern DMLEAF tRTCPParams[];
+extern DMLEAF tFaxT38Params[];
+
+struct codec_args
+{
+	char *cdc;
+	char *id;
+	int enumid;
+	struct uci_section *codec_section;
+};
+
+struct rtp_tos
+{
+	char *key;
+	char *val;
+};
+
+struct cap_sip_codec
+{
+	int enumid;
+	char *c1;
+	char *c2;
+	char *c3;
+	char *c4;
+	char *c5;
+};
+
+struct sip_args
+{
+	struct uci_section *sip_section;
+	char *profile_num;
+};
+
+struct tel_args
+{
+	struct uci_section *tel_section;
+	struct uci_section *sip_section;
+	char *profile_num;
+};
+
+struct allow_sip_codec
+{
+	int enumid;
+	char *id;
+	char *allowed_cdc;
+	char *priority_cdc;
+	char *ptime_cdc;
+};
+
+struct line_codec_args
+{
+	int enumid;
+	char *sip_id;
+	char *cdc;
+	char *id;
+	char *priority_cdc;
+	char *ptime_cdc;
+	struct uci_section *sip_section;
+	struct uci_section *codec_sec;
+};
+
+struct region
+{
+	char *country;
+	char *id;
+};
+
+struct codec
+{
+	char *cdc;
+	char *id;
+	char *priority;
+};
+
+enum enum_cap_sip_codecs {
+	SIP_CODEC_G723,
+	SIP_CODEC_GSM,
+	SIP_CODEC_ULAW,
+	SIP_CODEC_ALAW,
+	SIP_CODEC_G726AAL2,
+	SIP_CODEC_ADPCM,
+	SIP_CODEC_SLIN,
+	SIP_CODEC_LPC10,
+	SIP_CODEC_G729,
+	SIP_CODEC_SPEEX,
+	SIP_CODEC_ILBC,
+	SIP_CODEC_G726,
+	SIP_CODEC_G722,
+	SIP_CODEC_SIREN7,
+	SIP_CODEC_SIREN14,
+	SIP_CODEC_SLIN16,
+	SIP_CODEC_G719,
+	SIP_CODEC_SPEEX16,
+	SIP_CODEC_TESTLAW
+};
+
+bool dm_service_enable_set(void);
+int browseVoiceServiceInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseCodecsInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseProfileInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseLineInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseLineCodecListInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int add_profile_object(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_profile_object(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int add_line_object(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_line_object(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_service_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_max_profile_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_max_line_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_true_value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_max_session_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_signal_protocols(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_regions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_false_value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_role(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_extension(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_tls_auth_protocols(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_tls_enc_protocols(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_tls_key_protocols(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_cap_codec_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_entry_id(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_capabilities_sip_codec(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_capabilities_sip_bitrate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_capabilities_sip_pperiod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_profile_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_profile_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_profile_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_profile_signalprotocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_profile_max_sessions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_profile_number_of_lines(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_profile_sip_dtmfmethod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_profile_region(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_profile_sip_proxyserver(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_proxy_server_transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_profile_sip_registerserver(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_profile_sip_registerserverport(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_registrar_server_transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_user_agent_domain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_user_agent_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_user_agent_transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_outbound_proxy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_outbound_proxy_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_registration_period(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_re_invite_expires(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_call_lines(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_service_serviceproviderinfo_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_sip_fax_t38_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_service_vp_rtp_portmin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_service_vp_rtp_portmax(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_service_vp_rtp_dscp(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_service_vp_rtp_rtcp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_service_vp_rtp_rtcp_txrepeatinterval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_service_vp_rtp_srtp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_line_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_profile_line_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_profile_line_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_voice_profile_line_callstate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_line_line_profile(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_line_tel_line(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_line_confort_noise_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_line_voice_processing_cancellation_enable(char *refparam, struct dmctx *ctx,  void *data, char *instance, char **value);
+int get_line_calling_features_caller_id_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_line_calling_features_callwaiting(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_line_sip_auth_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_line_sip_uri(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_line_codec_list_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_codec_entry_id(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int capabilities_sip_codecs_get_codec(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int capabilities_sip_codecs_get_bitrate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_capabilities_sip_codecs_pperiod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_line_codec_list_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_line_codec_list_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_line_directory_number(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int set_service_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_cap_codec_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_voice_profile_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_voice_profile_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_voice_profile_reset(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_voice_profile_signaling_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_voice_profile_sip_dtmfmethod(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_voice_profile_sip_proxyserver(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_sip_proxy_server_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_sip_proxy_server_transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_voice_profile_sip_registerserver(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_voice_profile_sip_registerserverport(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_sip_registrar_server_transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_sip_user_agent_domain(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_sip_user_agent_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_sip_user_agent_transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_sip_outbound_proxy(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_sip_outbound_proxy_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_sip_registration_period(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_sip_re_invite_expires(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_sip_call_lines(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_voice_service_serviceproviderinfo_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_sip_fax_t38_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_voice_service_vp_rtp_portmin(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_voice_profile_rtp_localportmax(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_voice_service_vp_rtp_dscp(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_voice_service_vp_rtp_rtcp_txrepeatinterval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_voice_service_vp_rtp_srtp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_line_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_voice_profile_line_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_line_directory_number(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_line_line_profile(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_line_tel_line(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_line_confort_noise_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_line_calling_features_caller_id_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_line_voice_processing_cancellation_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_line_calling_features_callwaiting(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_line_sip_auth_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_line_sip_auth_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_line_sip_uri(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_line_codec_list_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_line_codec_list_packetization(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_line_codec_list_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_line_codec_list_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_sip_profile_region(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_voice_service_max_line();
+
+#endif
diff --git a/dmtree/tr143/diagnostics.c b/dmtree/tr143/diagnostics.c
new file mode 100644
index 0000000000000000000000000000000000000000..5e52480986d0a6292babcd1460368773e96ced9b
--- /dev/null
+++ b/dmtree/tr143/diagnostics.c
@@ -0,0 +1,2469 @@
+/*
+*	This program is free software: you can redistribute it and/or modify
+*	it under the terms of the GNU General Public License as published by
+*	the Free Software Foundation, either version 2 of the License, or
+*	(at your option) any later version.
+*
+*	Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*
+*/
+
+#include <uci.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "dmjson.h"
+#include "dmentry.h"
+#include "diagnostics.h"
+
+/* *** Device.IP.Diagnostics. *** */
+DMOBJ tIPDiagnosticsObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"IPPing", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tIPDiagnosticsIPPingParams, NULL, BBFDM_CWMP},
+{"TraceRoute", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tIPDiagnosticsTraceRouteObj, tIPDiagnosticsTraceRouteParams, NULL, BBFDM_CWMP},
+{"DownloadDiagnostics", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tIPDiagnosticsDownloadDiagnosticsObj, tIPDiagnosticsDownloadDiagnosticsParams, NULL, BBFDM_CWMP},
+{"UploadDiagnostics", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tIPDiagnosticsUploadDiagnosticsObj, tIPDiagnosticsUploadDiagnosticsParams, NULL, BBFDM_CWMP},
+{"UDPEchoConfig", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tIPDiagnosticsUDPEchoConfigParams, NULL, BBFDM_CWMP},
+{"UDPEchoDiagnostics", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tIPDiagnosticsUDPEchoDiagnosticsParams, NULL, BBFDM_CWMP},
+{"ServerSelectionDiagnostics", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tIPDiagnosticsServerSelectionDiagnosticsParams, NULL, BBFDM_CWMP},
+{0}
+};
+
+DMLEAF tIPDiagnosticsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"IPv4PingSupported", &DMREAD, DMT_BOOL, get_diag_enable_true, NULL, NULL, NULL, BBFDM_CWMP},
+{"IPv6PingSupported", &DMREAD, DMT_BOOL, get_diag_enable_true, NULL, NULL, NULL, BBFDM_CWMP},
+{"IPv4TraceRouteSupported", &DMREAD, DMT_BOOL, get_diag_enable_true, NULL, NULL, NULL, BBFDM_CWMP},
+{"IPv6TraceRouteSupported", &DMREAD, DMT_BOOL, get_diag_enable_true, NULL, NULL, NULL, BBFDM_CWMP},
+{"IPv4DownloadDiagnosticsSupported", &DMREAD, DMT_BOOL, get_diag_enable_true, NULL, NULL, NULL, BBFDM_CWMP},
+{"IPv6DownloadDiagnosticsSupported", &DMREAD, DMT_BOOL, get_diag_enable_true, NULL, NULL, NULL, BBFDM_CWMP},
+{"IPv4UploadDiagnosticsSupported", &DMREAD, DMT_BOOL, get_diag_enable_true, NULL, NULL, NULL, BBFDM_CWMP},
+{"IPv6UploadDiagnosticsSupported", &DMREAD, DMT_BOOL, get_diag_enable_true, NULL, NULL, NULL, BBFDM_CWMP},
+{"IPv4UDPEchoDiagnosticsSupported", &DMREAD, DMT_BOOL, get_diag_enable_true, NULL, NULL, NULL, BBFDM_CWMP},
+{"IPv6UDPEchoDiagnosticsSupported", &DMREAD, DMT_BOOL, get_diag_enable_true, NULL, NULL, NULL, BBFDM_CWMP},
+{"IPv4ServerSelectionDiagnosticsSupported", &DMREAD, DMT_BOOL, get_diag_enable_true, NULL, NULL, NULL, BBFDM_CWMP},
+{"IPv6ServerSelectionDiagnosticsSupported", &DMREAD, DMT_BOOL, get_diag_enable_true, NULL, NULL, NULL, BBFDM_CWMP},
+{0}
+};
+
+/* *** Device.IP.Diagnostics.IPPing. *** */
+DMLEAF tIPDiagnosticsIPPingParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"DiagnosticsState", &DMWRITE, DMT_STRING, get_ip_ping_diagnostics_state, set_ip_ping_diagnostics_state, NULL, NULL, BBFDM_CWMP},
+{"Interface", &DMWRITE, DMT_STRING, get_ip_ping_interface, set_ip_ping_interface, NULL, NULL, BBFDM_CWMP},
+{"ProtocolVersion", &DMWRITE, DMT_STRING, get_ip_ping_protocolversion, set_ip_ping_protocolversion, NULL, NULL, BBFDM_CWMP},
+{"Host", &DMWRITE, DMT_STRING, get_ip_ping_host, set_ip_ping_host, NULL, NULL, BBFDM_CWMP},
+{"NumberOfRepetitions", &DMWRITE, DMT_UNINT, get_ip_ping_repetition_number, set_ip_ping_repetition_number, NULL, NULL, BBFDM_CWMP},
+{"Timeout", &DMWRITE, DMT_UNINT, get_ip_ping_timeout, set_ip_ping_timeout, NULL, NULL, BBFDM_CWMP},
+{"DataBlockSize", &DMWRITE, DMT_UNINT, get_ip_ping_block_size, set_ip_ping_block_size, NULL, NULL, BBFDM_CWMP},
+{"DSCP", &DMWRITE, DMT_UNINT, get_ip_ping_DSCP, set_ip_ping_DSCP, NULL, NULL, BBFDM_CWMP},
+{"SuccessCount", &DMREAD, DMT_UNINT, get_ip_ping_success_count, NULL, NULL, NULL, BBFDM_CWMP},
+{"FailureCount", &DMREAD, DMT_UNINT, get_ip_ping_failure_count, NULL, NULL, NULL, BBFDM_CWMP},
+{"AverageResponseTime", &DMREAD, DMT_UNINT, get_ip_ping_average_response_time, NULL, NULL, NULL, BBFDM_CWMP},
+{"MinimumResponseTime", &DMREAD, DMT_UNINT, get_ip_ping_min_response_time, NULL, NULL, NULL, BBFDM_CWMP},
+{"MaximumResponseTime", &DMREAD, DMT_UNINT, get_ip_ping_max_response_time, NULL, NULL, NULL, BBFDM_CWMP},
+{"AverageResponseTimeDetailed", &DMREAD, DMT_UNINT, get_ip_ping_AverageResponseTimeDetailed, NULL, NULL, NULL, BBFDM_CWMP},
+{"MinimumResponseTimeDetailed", &DMREAD, DMT_UNINT, get_ip_ping_MinimumResponseTimeDetailed, NULL, NULL, NULL, BBFDM_CWMP},
+{"MaximumResponseTimeDetailed", &DMREAD, DMT_UNINT, get_ip_ping_MaximumResponseTimeDetailed, NULL, NULL, NULL, BBFDM_CWMP},
+{0}
+};
+
+/* *** Device.IP.Diagnostics.TraceRoute. *** */
+DMOBJ tIPDiagnosticsTraceRouteObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"RouteHops", &DMREAD, NULL, NULL, NULL, browseIPDiagnosticsTraceRouteRouteHopsInst, NULL, NULL, NULL, tIPDiagnosticsTraceRouteRouteHopsParams, NULL, BBFDM_CWMP},
+{0}
+};
+
+DMLEAF tIPDiagnosticsTraceRouteParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"DiagnosticsState", &DMWRITE, DMT_STRING, get_IPDiagnosticsTraceRoute_DiagnosticsState, set_IPDiagnosticsTraceRoute_DiagnosticsState, NULL, NULL, BBFDM_CWMP},
+{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsTraceRoute_Interface, set_IPDiagnosticsTraceRoute_Interface, NULL, NULL, BBFDM_CWMP},
+{"ProtocolVersion", &DMWRITE, DMT_STRING, get_IPDiagnosticsTraceRoute_ProtocolVersion, set_IPDiagnosticsTraceRoute_ProtocolVersion, NULL, NULL, BBFDM_CWMP},
+{"Host", &DMWRITE, DMT_STRING, get_IPDiagnosticsTraceRoute_Host, set_IPDiagnosticsTraceRoute_Host, NULL, NULL, BBFDM_CWMP},
+{"NumberOfTries", &DMWRITE, DMT_UNINT, get_IPDiagnosticsTraceRoute_NumberOfTries, set_IPDiagnosticsTraceRoute_NumberOfTries, NULL, NULL, BBFDM_CWMP},
+{"Timeout", &DMWRITE, DMT_UNINT, get_IPDiagnosticsTraceRoute_Timeout, set_IPDiagnosticsTraceRoute_Timeout, NULL, NULL, BBFDM_CWMP},
+{"DataBlockSize", &DMWRITE, DMT_UNINT, get_IPDiagnosticsTraceRoute_DataBlockSize, set_IPDiagnosticsTraceRoute_DataBlockSize, NULL, NULL, BBFDM_CWMP},
+{"DSCP", &DMWRITE, DMT_UNINT, get_IPDiagnosticsTraceRoute_DSCP, set_IPDiagnosticsTraceRoute_DSCP, NULL, NULL, BBFDM_CWMP},
+{"MaxHopCount", &DMWRITE, DMT_UNINT, get_IPDiagnosticsTraceRoute_MaxHopCount, set_IPDiagnosticsTraceRoute_MaxHopCount, NULL, NULL, BBFDM_CWMP},
+{"ResponseTime", &DMREAD, DMT_UNINT, get_IPDiagnosticsTraceRoute_ResponseTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"RouteHopsNumberOfEntries", &DMREAD, DMT_UNINT, get_IPDiagnosticsTraceRoute_RouteHopsNumberOfEntries, NULL, NULL, NULL, BBFDM_CWMP},
+{0}
+};
+
+/* *** Device.IP.Diagnostics.TraceRoute.RouteHops.{i}. *** */
+DMLEAF tIPDiagnosticsTraceRouteRouteHopsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Host", &DMREAD, DMT_STRING, get_IPDiagnosticsTraceRouteRouteHops_Host, NULL, NULL, NULL, BBFDM_CWMP},
+{"HostAddress", &DMREAD, DMT_STRING, get_IPDiagnosticsTraceRouteRouteHops_HostAddress, NULL, NULL, NULL, BBFDM_CWMP},
+{"ErrorCode", &DMREAD, DMT_UNINT, get_IPDiagnosticsTraceRouteRouteHops_ErrorCode, NULL, NULL, NULL, BBFDM_CWMP},
+{"RTTimes", &DMREAD, DMT_STRING, get_IPDiagnosticsTraceRouteRouteHops_RTTimes, NULL, NULL, NULL, BBFDM_CWMP},
+{0}
+};
+
+/* *** Device.IP.Diagnostics.DownloadDiagnostics. *** */
+DMOBJ tIPDiagnosticsDownloadDiagnosticsObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"PerConnectionResult", &DMREAD, NULL, NULL, NULL, browseIPDiagnosticsDownloadDiagnosticsPerConnectionResultInst, NULL, NULL, NULL, tIPDiagnosticsDownloadDiagnosticsPerConnectionResultParams, NULL, BBFDM_CWMP},
+{0}
+};
+
+DMLEAF tIPDiagnosticsDownloadDiagnosticsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"DiagnosticsState", &DMWRITE, DMT_STRING, get_IPDiagnosticsDownloadDiagnostics_DiagnosticsState, set_IPDiagnosticsDownloadDiagnostics_DiagnosticsState, NULL, NULL, BBFDM_CWMP},
+{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsDownloadDiagnostics_Interface, set_IPDiagnosticsDownloadDiagnostics_Interface, NULL, NULL, BBFDM_CWMP},
+{"DownloadURL", &DMWRITE, DMT_STRING, get_IPDiagnosticsDownloadDiagnostics_DownloadURL, set_IPDiagnosticsDownloadDiagnostics_DownloadURL, NULL, NULL, BBFDM_CWMP},
+{"DownloadTransports", &DMREAD, DMT_STRING, get_IPDiagnosticsDownloadDiagnostics_DownloadTransports, NULL, NULL, NULL, BBFDM_CWMP},
+{"DownloadDiagnosticMaxConnections", &DMREAD, DMT_UNINT, get_IPDiagnosticsDownloadDiagnostics_DownloadDiagnosticMaxConnections, NULL, NULL, NULL, BBFDM_CWMP},
+{"DSCP", &DMWRITE, DMT_UNINT, get_IPDiagnosticsDownloadDiagnostics_DSCP, set_IPDiagnosticsDownloadDiagnostics_DSCP, NULL, NULL, BBFDM_CWMP},
+{"EthernetPriority", &DMWRITE, DMT_UNINT, get_IPDiagnosticsDownloadDiagnostics_EthernetPriority, set_IPDiagnosticsDownloadDiagnostics_EthernetPriority, NULL, NULL, BBFDM_CWMP},
+{"ProtocolVersion", &DMWRITE, DMT_STRING, get_IPDiagnosticsDownloadDiagnostics_ProtocolVersion, set_IPDiagnosticsDownloadDiagnostics_ProtocolVersion, NULL, NULL, BBFDM_CWMP},
+{"NumberOfConnections", &DMWRITE, DMT_UNINT, get_IPDiagnosticsDownloadDiagnostics_NumberOfConnections, set_IPDiagnosticsDownloadDiagnostics_NumberOfConnections, NULL, NULL, BBFDM_CWMP},
+{"ROMTime", &DMREAD, DMT_TIME, get_IPDiagnosticsDownloadDiagnostics_ROMTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"BOMTime", &DMREAD, DMT_TIME, get_IPDiagnosticsDownloadDiagnostics_BOMTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"EOMTime", &DMREAD, DMT_TIME, get_IPDiagnosticsDownloadDiagnostics_EOMTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"TestBytesReceived", &DMREAD, DMT_UNINT, get_IPDiagnosticsDownloadDiagnostics_TestBytesReceived, NULL, NULL, NULL, BBFDM_CWMP},
+{"TotalBytesReceived", &DMREAD, DMT_UNINT, get_IPDiagnosticsDownloadDiagnostics_TotalBytesReceived, NULL, NULL, NULL, BBFDM_CWMP},
+{"TotalBytesSent", &DMREAD, DMT_UNINT, get_IPDiagnosticsDownloadDiagnostics_TotalBytesSent, NULL, NULL, NULL, BBFDM_CWMP},
+{"TestBytesReceivedUnderFullLoading", &DMREAD, DMT_UNINT, get_IPDiagnosticsDownloadDiagnostics_TestBytesReceivedUnderFullLoading, NULL, NULL, NULL, BBFDM_CWMP},
+{"TotalBytesReceivedUnderFullLoading", &DMREAD, DMT_UNINT, get_IPDiagnosticsDownloadDiagnostics_TotalBytesReceivedUnderFullLoading, NULL, NULL, NULL, BBFDM_CWMP},
+{"TotalBytesSentUnderFullLoading", &DMREAD, DMT_UNINT, get_IPDiagnosticsDownloadDiagnostics_TotalBytesSentUnderFullLoading, NULL, NULL, NULL, BBFDM_CWMP},
+{"PeriodOfFullLoading", &DMREAD, DMT_UNINT, get_IPDiagnosticsDownloadDiagnostics_PeriodOfFullLoading, NULL, NULL, NULL, BBFDM_CWMP},
+{"TCPOpenRequestTime", &DMREAD, DMT_TIME, get_IPDiagnosticsDownloadDiagnostics_TCPOpenRequestTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"TCPOpenResponseTime", &DMREAD, DMT_TIME, get_IPDiagnosticsDownloadDiagnostics_TCPOpenResponseTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"PerConnectionResultNumberOfEntries", &DMREAD, DMT_UNINT, get_IPDiagnosticsDownloadDiagnostics_PerConnectionResultNumberOfEntries, NULL, NULL, NULL, BBFDM_CWMP},
+{"EnablePerConnectionResults", &DMWRITE, DMT_BOOL, get_IPDiagnosticsDownloadDiagnostics_EnablePerConnectionResults, set_IPDiagnosticsDownloadDiagnostics_EnablePerConnectionResults, NULL, NULL, BBFDM_CWMP},
+{0}
+};
+
+/* *** Device.IP.Diagnostics.DownloadDiagnostics.PerConnectionResult.{i}. *** */
+DMLEAF tIPDiagnosticsDownloadDiagnosticsPerConnectionResultParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"ROMTime", &DMREAD, DMT_TIME, get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_ROMTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"BOMTime", &DMREAD, DMT_TIME, get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_BOMTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"EOMTime", &DMREAD, DMT_TIME, get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_EOMTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"TestBytesReceived", &DMREAD, DMT_UNINT, get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_TestBytesReceived, NULL, NULL, NULL, BBFDM_CWMP},
+{"TotalBytesReceived", &DMREAD, DMT_UNINT, get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_TotalBytesReceived, NULL, NULL, NULL, BBFDM_CWMP},
+{"TotalBytesSent", &DMREAD, DMT_UNINT, get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_TotalBytesSent, NULL, NULL, NULL, BBFDM_CWMP},
+{"TCPOpenRequestTime", &DMREAD, DMT_TIME, get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_TCPOpenRequestTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"TCPOpenResponseTime", &DMREAD, DMT_TIME, get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_TCPOpenResponseTime, NULL, NULL, NULL, BBFDM_CWMP},
+{0}
+};
+
+/* *** Device.IP.Diagnostics.UploadDiagnostics. *** */
+DMOBJ tIPDiagnosticsUploadDiagnosticsObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"PerConnectionResult", &DMREAD, NULL, NULL, NULL, browseIPDiagnosticsUploadDiagnosticsPerConnectionResultInst, NULL, NULL, NULL, tIPDiagnosticsUploadDiagnosticsPerConnectionResultParams, NULL, BBFDM_CWMP},
+{0}
+};
+
+DMLEAF tIPDiagnosticsUploadDiagnosticsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"DiagnosticsState", &DMWRITE, DMT_STRING, get_IPDiagnosticsUploadDiagnostics_DiagnosticsState, set_IPDiagnosticsUploadDiagnostics_DiagnosticsState, NULL, NULL, BBFDM_CWMP},
+{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsUploadDiagnostics_Interface, set_IPDiagnosticsUploadDiagnostics_Interface, NULL, NULL, BBFDM_CWMP},
+{"UploadURL", &DMWRITE, DMT_STRING, get_IPDiagnosticsUploadDiagnostics_UploadURL, set_IPDiagnosticsUploadDiagnostics_UploadURL, NULL, NULL, BBFDM_CWMP},
+{"UploadTransports", &DMREAD, DMT_STRING, get_IPDiagnosticsUploadDiagnostics_UploadTransports, NULL, NULL, NULL, BBFDM_CWMP},
+{"DSCP", &DMWRITE, DMT_UNINT, get_IPDiagnosticsUploadDiagnostics_DSCP, set_IPDiagnosticsUploadDiagnostics_DSCP, NULL, NULL, BBFDM_CWMP},
+{"EthernetPriority", &DMWRITE, DMT_UNINT, get_IPDiagnosticsUploadDiagnostics_EthernetPriority, set_IPDiagnosticsUploadDiagnostics_EthernetPriority, NULL, NULL, BBFDM_CWMP},
+{"TestFileLength", &DMWRITE, DMT_UNINT, get_IPDiagnosticsUploadDiagnostics_TestFileLength, set_IPDiagnosticsUploadDiagnostics_TestFileLength, NULL, NULL, BBFDM_CWMP},
+{"ProtocolVersion", &DMWRITE, DMT_STRING, get_IPDiagnosticsUploadDiagnostics_ProtocolVersion, set_IPDiagnosticsUploadDiagnostics_ProtocolVersion, NULL, NULL, BBFDM_CWMP},
+{"NumberOfConnections", &DMWRITE, DMT_UNINT, get_IPDiagnosticsUploadDiagnostics_NumberOfConnections, set_IPDiagnosticsUploadDiagnostics_NumberOfConnections, NULL, NULL, BBFDM_CWMP},
+{"ROMTime", &DMREAD, DMT_TIME, get_IPDiagnosticsUploadDiagnostics_ROMTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"BOMTime", &DMREAD, DMT_TIME, get_IPDiagnosticsUploadDiagnostics_BOMTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"EOMTime", &DMREAD, DMT_TIME, get_IPDiagnosticsUploadDiagnostics_EOMTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"TestBytesSent", &DMREAD, DMT_UNINT, get_IPDiagnosticsUploadDiagnostics_TestBytesSent, NULL, NULL, NULL, BBFDM_CWMP},
+{"TotalBytesReceived", &DMREAD, DMT_UNINT, get_IPDiagnosticsUploadDiagnostics_TotalBytesReceived, NULL, NULL, NULL, BBFDM_CWMP},
+{"TotalBytesSent", &DMREAD, DMT_UNINT, get_IPDiagnosticsUploadDiagnostics_TotalBytesSent, NULL, NULL, NULL, BBFDM_CWMP},
+{"TestBytesSentUnderFullLoading", &DMREAD, DMT_UNINT, get_IPDiagnosticsUploadDiagnostics_TestBytesSentUnderFullLoading, NULL, NULL, NULL, BBFDM_CWMP},
+{"TotalBytesReceivedUnderFullLoading", &DMREAD, DMT_UNINT, get_IPDiagnosticsUploadDiagnostics_TotalBytesReceivedUnderFullLoading, NULL, NULL, NULL, BBFDM_CWMP},
+{"TotalBytesSentUnderFullLoading", &DMREAD, DMT_UNINT, get_IPDiagnosticsUploadDiagnostics_TotalBytesSentUnderFullLoading, NULL, NULL, NULL, BBFDM_CWMP},
+{"PeriodOfFullLoading", &DMREAD, DMT_UNINT, get_IPDiagnosticsUploadDiagnostics_PeriodOfFullLoading, NULL, NULL, NULL, BBFDM_CWMP},
+{"TCPOpenRequestTime", &DMREAD, DMT_TIME, get_IPDiagnosticsUploadDiagnostics_TCPOpenRequestTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"TCPOpenResponseTime", &DMREAD, DMT_TIME, get_IPDiagnosticsUploadDiagnostics_TCPOpenResponseTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"PerConnectionResultNumberOfEntries", &DMREAD, DMT_UNINT, get_IPDiagnosticsUploadDiagnostics_PerConnectionResultNumberOfEntries, NULL, NULL, NULL, BBFDM_CWMP},
+{"EnablePerConnectionResults", &DMWRITE, DMT_BOOL, get_IPDiagnosticsUploadDiagnostics_EnablePerConnectionResults, set_IPDiagnosticsUploadDiagnostics_EnablePerConnectionResults, NULL, NULL, BBFDM_CWMP},
+{0}
+};
+
+/* *** Device.IP.Diagnostics.UploadDiagnostics.PerConnectionResult.{i}. *** */
+DMLEAF tIPDiagnosticsUploadDiagnosticsPerConnectionResultParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"ROMTime", &DMREAD, DMT_TIME, get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_ROMTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"BOMTime", &DMREAD, DMT_TIME, get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_BOMTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"EOMTime", &DMREAD, DMT_TIME, get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_EOMTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"TestBytesSent", &DMREAD, DMT_UNINT, get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TestBytesSent, NULL, NULL, NULL, BBFDM_CWMP},
+{"TotalBytesReceived", &DMREAD, DMT_UNINT, get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TotalBytesReceived, NULL, NULL, NULL, BBFDM_CWMP},
+{"TotalBytesSent", &DMREAD, DMT_UNINT, get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TotalBytesSent, NULL, NULL, NULL, BBFDM_CWMP},
+{"TCPOpenRequestTime", &DMREAD, DMT_TIME, get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TCPOpenRequestTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"TCPOpenResponseTime", &DMREAD, DMT_TIME, get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TCPOpenResponseTime, NULL, NULL, NULL, BBFDM_CWMP},
+{0}
+};
+
+/* *** Device.IP.Diagnostics.UDPEchoConfig. *** */
+DMLEAF tIPDiagnosticsUDPEchoConfigParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_IPDiagnosticsUDPEchoConfig_Enable, set_IPDiagnosticsUDPEchoConfig_Enable, NULL, NULL, BBFDM_CWMP},
+{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsUDPEchoConfig_Interface, set_IPDiagnosticsUDPEchoConfig_Interface, NULL, NULL, BBFDM_CWMP},
+{"SourceIPAddress", &DMWRITE, DMT_STRING, get_IPDiagnosticsUDPEchoConfig_SourceIPAddress, set_IPDiagnosticsUDPEchoConfig_SourceIPAddress, NULL, NULL, BBFDM_CWMP},
+{"UDPPort", &DMWRITE, DMT_UNINT, get_IPDiagnosticsUDPEchoConfig_UDPPort, set_IPDiagnosticsUDPEchoConfig_UDPPort, NULL, NULL, BBFDM_CWMP},
+{"EchoPlusEnabled", &DMWRITE, DMT_BOOL, get_IPDiagnosticsUDPEchoConfig_EchoPlusEnabled, set_IPDiagnosticsUDPEchoConfig_EchoPlusEnabled, NULL, NULL, BBFDM_CWMP},
+{"EchoPlusSupported", &DMREAD, DMT_BOOL, get_IPDiagnosticsUDPEchoConfig_EchoPlusSupported, NULL, NULL, NULL, BBFDM_CWMP},
+{"PacketsReceived", &DMREAD, DMT_UNINT, get_IPDiagnosticsUDPEchoConfig_PacketsReceived, NULL, NULL, NULL, BBFDM_CWMP},
+{"PacketsResponded", &DMREAD, DMT_UNINT, get_IPDiagnosticsUDPEchoConfig_PacketsResponded, NULL, NULL, NULL, BBFDM_CWMP},
+{"BytesReceived", &DMREAD, DMT_UNINT, get_IPDiagnosticsUDPEchoConfig_BytesReceived, NULL, NULL, NULL, BBFDM_CWMP},
+{"BytesResponded", &DMREAD, DMT_UNINT, get_IPDiagnosticsUDPEchoConfig_BytesResponded, NULL, NULL, NULL, BBFDM_CWMP},
+{"TimeFirstPacketReceived", &DMREAD, DMT_TIME, get_IPDiagnosticsUDPEchoConfig_TimeFirstPacketReceived, NULL, NULL, NULL, BBFDM_CWMP},
+{"TimeLastPacketReceived", &DMREAD, DMT_TIME, get_IPDiagnosticsUDPEchoConfig_TimeLastPacketReceived, NULL, NULL, NULL, BBFDM_CWMP},
+{0}
+};
+
+/* *** Device.IP.Diagnostics.UDPEchoDiagnostics. *** */
+DMLEAF tIPDiagnosticsUDPEchoDiagnosticsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"DiagnosticsState", &DMWRITE, DMT_STRING, get_IPDiagnosticsUDPEchoDiagnostics_DiagnosticsState, set_IPDiagnosticsUDPEchoDiagnostics_DiagnosticsState, NULL, NULL, BBFDM_CWMP},
+{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsUDPEchoDiagnostics_Interface, set_IPDiagnosticsUDPEchoDiagnostics_Interface, NULL, NULL, BBFDM_CWMP},
+{"Host", &DMWRITE, DMT_STRING, get_IPDiagnosticsUDPEchoDiagnostics_Host, set_IPDiagnosticsUDPEchoDiagnostics_Host, NULL, NULL, BBFDM_CWMP},
+{"Port", &DMWRITE, DMT_UNINT, get_IPDiagnosticsUDPEchoDiagnostics_Port, set_IPDiagnosticsUDPEchoDiagnostics_Port, NULL, NULL, BBFDM_CWMP},
+{"NumberOfRepetitions", &DMWRITE, DMT_UNINT, get_IPDiagnosticsUDPEchoDiagnostics_NumberOfRepetitions, set_IPDiagnosticsUDPEchoDiagnostics_NumberOfRepetitions, NULL, NULL, BBFDM_CWMP},
+{"Timeout", &DMWRITE, DMT_UNINT, get_IPDiagnosticsUDPEchoDiagnostics_Timeout, set_IPDiagnosticsUDPEchoDiagnostics_Timeout, NULL, NULL, BBFDM_CWMP},
+{"DataBlockSize", &DMWRITE, DMT_UNINT, get_IPDiagnosticsUDPEchoDiagnostics_DataBlockSize, set_IPDiagnosticsUDPEchoDiagnostics_DataBlockSize, NULL, NULL, BBFDM_CWMP},
+{"DSCP", &DMWRITE, DMT_UNINT, get_IPDiagnosticsUDPEchoDiagnostics_DSCP, set_IPDiagnosticsUDPEchoDiagnostics_DSCP, NULL, NULL, BBFDM_CWMP},
+{"InterTransmissionTime", &DMWRITE, DMT_UNINT, get_IPDiagnosticsUDPEchoDiagnostics_InterTransmissionTime, set_IPDiagnosticsUDPEchoDiagnostics_InterTransmissionTime, NULL, NULL, BBFDM_CWMP},
+{"ProtocolVersion", &DMWRITE, DMT_STRING, get_IPDiagnosticsUDPEchoDiagnostics_ProtocolVersion, set_IPDiagnosticsUDPEchoDiagnostics_ProtocolVersion, NULL, NULL, BBFDM_CWMP},
+{"SuccessCount", &DMREAD, DMT_UNINT, get_IPDiagnosticsUDPEchoDiagnostics_SuccessCount, NULL, NULL, NULL, BBFDM_CWMP},
+{"FailureCount", &DMREAD, DMT_UNINT, get_IPDiagnosticsUDPEchoDiagnostics_FailureCount, NULL, NULL, NULL, BBFDM_CWMP},
+{"AverageResponseTime", &DMREAD, DMT_UNINT, get_IPDiagnosticsUDPEchoDiagnostics_AverageResponseTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"MinimumResponseTime", &DMREAD, DMT_UNINT, get_IPDiagnosticsUDPEchoDiagnostics_MinimumResponseTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"MaximumResponseTime", &DMREAD, DMT_UNINT, get_IPDiagnosticsUDPEchoDiagnostics_MaximumResponseTime, NULL, NULL, NULL, BBFDM_CWMP},
+{0}
+};
+
+/* *** Device.IP.Diagnostics.ServerSelectionDiagnostics. *** */
+DMLEAF tIPDiagnosticsServerSelectionDiagnosticsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"DiagnosticsState", &DMWRITE, DMT_STRING, get_IPDiagnosticsServerSelectionDiagnostics_DiagnosticsState, set_IPDiagnosticsServerSelectionDiagnostics_DiagnosticsState, NULL, NULL, BBFDM_CWMP},
+{"Interface", &DMWRITE, DMT_STRING, get_IPDiagnosticsServerSelectionDiagnostics_Interface, set_IPDiagnosticsServerSelectionDiagnostics_Interface, NULL, NULL, BBFDM_CWMP},
+{"ProtocolVersion", &DMWRITE, DMT_STRING, get_IPDiagnosticsServerSelectionDiagnostics_ProtocolVersion, set_IPDiagnosticsServerSelectionDiagnostics_ProtocolVersion, NULL, NULL, BBFDM_CWMP},
+{"Protocol", &DMWRITE, DMT_STRING, get_IPDiagnosticsServerSelectionDiagnostics_Protocol, set_IPDiagnosticsServerSelectionDiagnostics_Protocol, NULL, NULL, BBFDM_CWMP},
+{"Port", &DMWRITE, DMT_UNINT, get_IPDiagnosticsServerSelectionDiagnostics_Port, set_IPDiagnosticsServerSelectionDiagnostics_Port, NULL, NULL, BBFDM_CWMP},
+{"HostList", &DMWRITE, DMT_STRING, get_IPDiagnosticsServerSelectionDiagnostics_HostList, set_IPDiagnosticsServerSelectionDiagnostics_HostList, NULL, NULL, BBFDM_CWMP},
+{"NumberOfRepetitions", &DMWRITE, DMT_UNINT, get_IPDiagnosticsServerSelectionDiagnostics_NumberOfRepetitions, set_IPDiagnosticsServerSelectionDiagnostics_NumberOfRepetitions, NULL, NULL, BBFDM_CWMP},
+{"Timeout", &DMWRITE, DMT_UNINT, get_IPDiagnosticsServerSelectionDiagnostics_Timeout, set_IPDiagnosticsServerSelectionDiagnostics_Timeout, NULL, NULL, BBFDM_CWMP},
+{"FastestHost", &DMREAD, DMT_STRING, get_IPDiagnosticsServerSelectionDiagnostics_FastestHost, NULL, NULL, NULL, BBFDM_CWMP},
+{"MinimumResponseTime", &DMREAD, DMT_UNINT, get_IPDiagnosticsServerSelectionDiagnostics_MinimumResponseTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"AverageResponseTime", &DMREAD, DMT_UNINT, get_IPDiagnosticsServerSelectionDiagnostics_AverageResponseTime, NULL, NULL, NULL, BBFDM_CWMP},
+{"MaximumResponseTime", &DMREAD, DMT_UNINT, get_IPDiagnosticsServerSelectionDiagnostics_MaximumResponseTime, NULL, NULL, NULL, BBFDM_CWMP},
+{0}
+};
+
+int get_diag_enable_true(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+/*
+ * *** Device.IP.Diagnostics.IPPing. ***
+ */
+
+static inline char *ipping_get(char *option, char *def)
+{
+	char *tmp;
+	dmuci_get_varstate_string("cwmp", "@ippingdiagnostic[0]", option, &tmp);
+	if(tmp && tmp[0] == '\0')
+		return dmstrdup(def);
+	else
+		return tmp;
+}
+
+int get_ip_ping_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ipping_get("DiagnosticState", "None");
+	return 0;
+}
+
+int set_ip_ping_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "Requested") == 0) {
+				IPPING_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "ippingdiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "ippingdiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@ippingdiagnostic[0]", "DiagnosticState", value);
+				cwmp_set_end_session(END_SESSION_IPPING_DIAGNOSTIC);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_ip_ping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_varstate_string("cwmp", "@ippingdiagnostic[0]", "interface", value);
+	return 0;
+}
+
+int set_ip_ping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			IPPING_STOP
+			curr_section = dmuci_walk_state_section("cwmp", "ippingdiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "ippingdiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@ippingdiagnostic[0]", "interface", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_ip_ping_protocolversion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ipping_get("ProtocolVersion", "Any");
+	return 0;
+}
+
+int set_ip_ping_protocolversion(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "IPv4") == 0 || strcmp(value, "IPv6") == 0) {
+				IPPING_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "ippingdiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "ippingdiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@ippingdiagnostic[0]", "ProtocolVersion", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_ip_ping_host(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_varstate_string("cwmp", "@ippingdiagnostic[0]", "Host", value);
+	return 0;
+}
+
+int set_ip_ping_host(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			IPPING_STOP
+			curr_section = dmuci_walk_state_section("cwmp", "ippingdiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "ippingdiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@ippingdiagnostic[0]", "Host", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_ip_ping_repetition_number(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ipping_get("NumberOfRepetitions", "3");
+	return 0;
+}
+
+int set_ip_ping_repetition_number(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (atoi(value) >= 1) {
+				IPPING_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "ippingdiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "ippingdiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@ippingdiagnostic[0]", "NumberOfRepetitions", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_ip_ping_timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ipping_get("Timeout", "1000");
+	return 0;
+}
+
+int set_ip_ping_timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (atoi(value) >= 1) {
+				IPPING_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "ippingdiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "ippingdiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@ippingdiagnostic[0]", "Timeout", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_ip_ping_block_size(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ipping_get("DataBlockSize", "64");
+
+	return 0;
+}
+
+int set_ip_ping_block_size(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if ((atoi(value) >= 1) && (atoi(value) <= 65535)) {
+				IPPING_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "ippingdiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "ippingdiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@ippingdiagnostic[0]", "DataBlockSize", value);
+			}
+	}
+	return 0;
+}
+
+int get_ip_ping_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ipping_get("DSCP", "0");
+	return 0;
+}
+
+int set_ip_ping_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if ((atoi(value) >= 0) && (atoi(value) <= 63)) {
+				TRACEROUTE_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "ippingdiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "ippingdiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@ippingdiagnostic[0]", "DSCP", value);
+				return 0;
+			}
+	}
+	return 0;
+}
+
+int get_ip_ping_success_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ipping_get("SuccessCount", "0");
+	return 0;
+}
+
+int get_ip_ping_failure_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ipping_get("FailureCount", "0");
+	return 0;
+}
+
+int get_ip_ping_average_response_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ipping_get("AverageResponseTime", "0");
+	return 0;
+}
+
+int get_ip_ping_min_response_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ipping_get("MinimumResponseTime", "0");
+	return 0;
+}
+
+int get_ip_ping_max_response_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ipping_get("MaximumResponseTime", "0");
+	return 0;
+}
+
+int get_ip_ping_AverageResponseTimeDetailed(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ipping_get("AverageResponseTimeDetailed", "0");
+	return 0;
+}
+
+int get_ip_ping_MinimumResponseTimeDetailed(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ipping_get("MinimumResponseTimeDetailed", "0");
+	return 0;
+}
+
+int get_ip_ping_MaximumResponseTimeDetailed(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ipping_get("MaximumResponseTimeDetailed", "0");
+	return 0;
+}
+
+/*
+ * *** Device.IP.Diagnostics.TraceRoute. ***
+ */
+
+static inline char *traceroute_get(char *option, char *def)
+{
+	char *tmp;
+	dmuci_get_varstate_string("cwmp", "@traceroutediagnostic[0]", option, &tmp);
+	if(tmp && tmp[0] == '\0')
+		return dmstrdup(def);
+	else
+		return tmp;
+}
+
+int get_IPDiagnosticsTraceRoute_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = traceroute_get("DiagnosticState", "None");
+	return 0;
+}
+
+int set_IPDiagnosticsTraceRoute_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "Requested") == 0) {
+				TRACEROUTE_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "traceroutediagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "traceroutediagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@traceroutediagnostic[0]", "DiagnosticState", value);
+				cwmp_set_end_session(END_SESSION_TRACEROUTE_DIAGNOSTIC);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsTraceRoute_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_varstate_string("cwmp", "@traceroutediagnostic[0]", "interface", value);
+	return 0;
+}
+
+int set_IPDiagnosticsTraceRoute_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			TRACEROUTE_STOP
+			curr_section = dmuci_walk_state_section("cwmp", "traceroutediagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "traceroutediagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@traceroutediagnostic[0]", "interface", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsTraceRoute_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = traceroute_get("ProtocolVersion", "Any");
+	return 0;
+}
+
+int set_IPDiagnosticsTraceRoute_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "IPv4") == 0 || strcmp(value, "IPv6") == 0) {
+				TRACEROUTE_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "traceroutediagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "traceroutediagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@traceroutediagnostic[0]", "ProtocolVersion", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsTraceRoute_Host(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_varstate_string("cwmp", "@traceroutediagnostic[0]", "Host", value);
+	return 0;
+}
+
+int set_IPDiagnosticsTraceRoute_Host(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			TRACEROUTE_STOP
+			curr_section = dmuci_walk_state_section("cwmp", "traceroutediagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "traceroutediagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@traceroutediagnostic[0]", "Host", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsTraceRoute_NumberOfTries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = traceroute_get("NumberOfTries", "3");
+	return 0;
+}
+
+int set_IPDiagnosticsTraceRoute_NumberOfTries(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if ((atoi(value) >= 1) && (atoi(value) <= 3)) {
+				TRACEROUTE_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "traceroutediagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "traceroutediagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@traceroutediagnostic[0]", "NumberOfTries", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsTraceRoute_Timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = traceroute_get("Timeout", "5000");
+	return 0;
+}
+
+int set_IPDiagnosticsTraceRoute_Timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (atoi(value) >= 1) {
+				TRACEROUTE_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "traceroutediagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "traceroutediagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@traceroutediagnostic[0]", "Timeout", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsTraceRoute_DataBlockSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = traceroute_get("DataBlockSize", "38");
+	return 0;
+}
+
+int set_IPDiagnosticsTraceRoute_DataBlockSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if ((atoi(value) >= 1) && (atoi(value) <= 65535)) {
+				TRACEROUTE_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "traceroutediagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "traceroutediagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@traceroutediagnostic[0]", "DataBlockSize", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsTraceRoute_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = traceroute_get("DSCP", "0");
+	return 0;
+}
+
+int set_IPDiagnosticsTraceRoute_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if ((atoi(value) >= 0) && (atoi(value) <= 63)) {
+				TRACEROUTE_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "traceroutediagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "traceroutediagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@traceroutediagnostic[0]", "DSCP", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsTraceRoute_MaxHopCount(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = traceroute_get("MaxHops", "30");
+	return 0;
+}
+
+int set_IPDiagnosticsTraceRoute_MaxHopCount(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if ((atoi(value) >= 1) && (atoi(value) <= 64)) {
+				TRACEROUTE_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "traceroutediagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "traceroutediagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@traceroutediagnostic[0]", "MaxHops", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsTraceRoute_ResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = traceroute_get("ResponseTime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsTraceRoute_RouteHopsNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = traceroute_get("NumberOfHops", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsTraceRouteRouteHops_Host(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "host", value);
+	return 0;
+}
+
+int get_IPDiagnosticsTraceRouteRouteHops_HostAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "ip", value);
+	return 0;
+}
+
+int get_IPDiagnosticsTraceRouteRouteHops_ErrorCode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	return 0;
+}
+
+int get_IPDiagnosticsTraceRouteRouteHops_RTTimes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "time", value);
+	return 0;
+}
+
+/*
+ * *** Device.IP.Diagnostics.DownloadDiagnostics. ***
+ */
+
+static inline char *download_get(char *option, char *def)
+{
+	char *tmp;
+	dmuci_get_varstate_string("cwmp", "@downloaddiagnostic[0]", option, &tmp);
+	if(tmp && tmp[0] == '\0')
+		return dmstrdup(def);
+	else
+		return tmp;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("DiagnosticState", "None");
+	return 0;
+}
+
+int set_IPDiagnosticsDownloadDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "Requested") == 0) {
+				DOWNLOAD_DIAGNOSTIC_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "downloaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "downloaddiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@downloaddiagnostic[0]", "DiagnosticState", value);
+				cwmp_set_end_session(END_SESSION_DOWNLOAD_DIAGNOSTIC);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *linker;
+	dmuci_get_varstate_string("cwmp", "@downloaddiagnostic[0]", "interface", &linker);
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+int set_IPDiagnosticsDownloadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *linker = NULL, *tmp, *device = NULL;
+	struct uci_section *curr_section = NULL;
+	json_object *res;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			adm_entry_get_linker_value(ctx, value, &linker);
+			if (linker) {
+				dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", linker, String}}, 1, &res);
+				device = dmjson_get_value(res, 1, "device");
+				if (device) {
+					DOWNLOAD_DIAGNOSTIC_STOP
+					curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "downloaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+					if(!curr_section)
+					{
+						dmuci_add_state_section("cwmp", "downloaddiagnostic", &curr_section, &tmp);
+					}
+					dmuci_set_varstate_value("cwmp", "@downloaddiagnostic[0]", "interface", linker);
+					dmuci_set_varstate_value("cwmp", "@downloaddiagnostic[0]", "device", device);
+				}
+				dmfree(linker);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_DownloadURL(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_varstate_string("cwmp", "@downloaddiagnostic[0]", "url", value);
+	return 0;
+}
+
+int set_IPDiagnosticsDownloadDiagnostics_DownloadURL(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			DOWNLOAD_DIAGNOSTIC_STOP
+			curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "downloaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "downloaddiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@downloaddiagnostic[0]", "url", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_DownloadTransports(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "HTTP,FTP";
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_DownloadDiagnosticMaxConnections(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("DSCP", "0");
+	return 0;
+}
+
+int set_IPDiagnosticsDownloadDiagnostics_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			DOWNLOAD_DIAGNOSTIC_STOP
+			curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "downloaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "downloaddiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@downloaddiagnostic[0]", "DSCP", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_EthernetPriority(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("ethernetpriority", "");
+	return 0;
+}
+
+int set_IPDiagnosticsDownloadDiagnostics_EthernetPriority(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			DOWNLOAD_DIAGNOSTIC_STOP
+			curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "downloaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "downloaddiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@downloaddiagnostic[0]", "ethernetpriority", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("ProtocolVersion", "Any");
+	return 0;
+}
+
+int set_IPDiagnosticsDownloadDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "IPv4") == 0 || strcmp(value, "IPv6") == 0) {
+				DOWNLOAD_DIAGNOSTIC_STOP
+				curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "downloaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "downloaddiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@downloaddiagnostic[0]", "ProtocolVersion", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_NumberOfConnections(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("NumberOfConnections", "1");
+	return 0;
+}
+
+int set_IPDiagnosticsDownloadDiagnostics_NumberOfConnections(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "1") == 0) {
+				DOWNLOAD_DIAGNOSTIC_STOP
+				curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "downloaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "downloaddiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@downloaddiagnostic[0]", "NumberOfConnections", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_ROMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("ROMtime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_BOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("BOMtime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_EOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("EOMtime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_TestBytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("TestBytesReceived", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_TotalBytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("TotalBytesReceived", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_TotalBytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("TotalBytesSent", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_TestBytesReceivedUnderFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("TestBytesReceived", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_TotalBytesReceivedUnderFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("TotalBytesReceived", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_TotalBytesSentUnderFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("TotalBytesSent", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_PeriodOfFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("PeriodOfFullLoading", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_TCPOpenRequestTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("TCPOpenRequestTime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_TCPOpenResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("TCPOpenResponseTime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_PerConnectionResultNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *tmp;
+	bool b;
+	dmuci_get_varstate_string("cwmp", "@downloaddiagnostic[0]", "EnablePerConnection", &tmp);
+	string_to_bool(tmp, &b);
+	*value = (b) ? "1" : "0";
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnostics_EnablePerConnectionResults(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("EnablePerConnection", "0");
+	return 0;
+}
+
+int set_IPDiagnosticsDownloadDiagnostics_EnablePerConnectionResults(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			DOWNLOAD_DIAGNOSTIC_STOP
+			curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "downloaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "downloaddiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@downloaddiagnostic[0]", "EnablePerConnection", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_ROMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("ROMtime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_BOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("BOMtime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_EOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("EOMtime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_TestBytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("TestBytesReceived", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_TotalBytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "TotalBytesReceived", value);
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_TotalBytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "TotalBytesSent", value);
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_TCPOpenRequestTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("TCPOpenRequestTime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_TCPOpenResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = download_get("TCPOpenResponseTime", "0");
+	return 0;
+}
+
+/*
+ * *** Device.IP.Diagnostics.UploadDiagnostics. ***
+ */
+
+static inline char *upload_get(char *option, char *def)
+{
+	char *tmp;
+	dmuci_get_varstate_string("cwmp", "@uploaddiagnostic[0]", option, &tmp);
+	if(tmp && tmp[0] == '\0')
+		return dmstrdup(def);
+	else
+		return tmp;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("DiagnosticState", "None");
+	return 0;
+}
+
+int set_IPDiagnosticsUploadDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "Requested") == 0) {
+				UPLOAD_DIAGNOSTIC_STOP
+				curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "uploaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "uploaddiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@uploaddiagnostic[0]", "DiagnosticState", value);
+				cwmp_set_end_session(END_SESSION_UPLOAD_DIAGNOSTIC);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *linker;
+	dmuci_get_varstate_string("cwmp", "@uploaddiagnostic[0]", "interface", &linker);
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+int set_IPDiagnosticsUploadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *linker = NULL, *tmp, *device= NULL;
+	struct uci_section *curr_section = NULL;
+	json_object *res;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			adm_entry_get_linker_value(ctx, value, &linker);
+			if (linker) {
+				dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", linker, String}}, 1, &res);
+				device = dmjson_get_value(res, 1, "device");
+				if (device) {
+					UPLOAD_DIAGNOSTIC_STOP
+					curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "uploaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+					if(!curr_section)
+					{
+						dmuci_add_state_section("cwmp", "uploaddiagnostic", &curr_section, &tmp);
+					}
+					dmuci_set_varstate_value("cwmp", "@uploaddiagnostic[0]", "interface", linker);
+					dmuci_set_varstate_value("cwmp", "@uploaddiagnostic[0]", "device", device);
+				}
+				dmfree(linker);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_UploadURL(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_varstate_string("cwmp", "@uploaddiagnostic[0]", "url", value);
+	return 0;
+}
+
+int set_IPDiagnosticsUploadDiagnostics_UploadURL(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			UPLOAD_DIAGNOSTIC_STOP
+			curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "uploaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "uploaddiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@uploaddiagnostic[0]", "url", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_UploadTransports(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "HTTP,FTP";
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("DSCP", "0");
+	return 0;
+}
+
+int set_IPDiagnosticsUploadDiagnostics_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			UPLOAD_DIAGNOSTIC_STOP
+			curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "uploaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "uploaddiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@uploaddiagnostic[0]", "DSCP", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_EthernetPriority(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("ethernetpriority", "0");
+	return 0;
+}
+
+int set_IPDiagnosticsUploadDiagnostics_EthernetPriority(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			UPLOAD_DIAGNOSTIC_STOP
+			curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "uploaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "uploaddiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@uploaddiagnostic[0]", "ethernetpriority", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_TestFileLength(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("TestFileLength", "0");
+	return 0;
+}
+
+int set_IPDiagnosticsUploadDiagnostics_TestFileLength(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			UPLOAD_DIAGNOSTIC_STOP
+			curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "uploaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "uploaddiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@uploaddiagnostic[0]", "TestFileLength", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("ProtocolVersion", "Any");
+	return 0;
+}
+
+int set_IPDiagnosticsUploadDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "IPv4") == 0 || strcmp(value, "IPv6") == 0) {
+				UPLOAD_DIAGNOSTIC_STOP
+				curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "uploaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "uploaddiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@uploaddiagnostic[0]", "ProtocolVersion", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_NumberOfConnections(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("NumberOfConnections", "1");
+	return 0;
+}
+
+int set_IPDiagnosticsUploadDiagnostics_NumberOfConnections(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "1") == 0) {
+				UPLOAD_DIAGNOSTIC_STOP
+				curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "uploaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "uploaddiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@uploaddiagnostic[0]", "NumberOfConnections", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_ROMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("ROMtime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_BOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("BOMtime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_EOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("EOMtime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_TestBytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("TestBytesSent", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_TotalBytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("TotalBytesReceived", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_TotalBytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("TotalBytesSent", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_TestBytesSentUnderFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("TestBytesSent", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_TotalBytesReceivedUnderFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("TotalBytesReceived", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_TotalBytesSentUnderFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("TotalBytesSent", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_PeriodOfFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("PeriodOfFullLoading", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_TCPOpenRequestTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("TCPOpenRequestTime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_TCPOpenResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("TCPOpenResponseTime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_PerConnectionResultNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *tmp;
+	bool b;
+	dmuci_get_varstate_string("cwmp", "@uploaddiagnostic[0]", "EnablePerConnection", &tmp);
+	string_to_bool(tmp, &b);
+	*value = (b) ? "1" : "0";
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnostics_EnablePerConnectionResults(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("EnablePerConnection", "0");
+	return 0;
+}
+
+int set_IPDiagnosticsUploadDiagnostics_EnablePerConnectionResults(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			UPLOAD_DIAGNOSTIC_STOP
+			curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "uploaddiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "uploaddiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@uploaddiagnostic[0]", "EnablePerConnection", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_ROMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("ROMtime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_BOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("BOMtime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_EOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("EOMtime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TestBytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "TestBytesSent", value);
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TotalBytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "TotalBytesReceived", value);
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TotalBytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "TotalBytesSent", value);
+	return 0;
+
+}
+
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TCPOpenRequestTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("TCPOpenRequestTime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TCPOpenResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = upload_get("TCPOpenResponseTime", "0");
+	return 0;
+}
+
+/*
+ * *** Device.IP.Diagnostics.UDPEchoConfig. ***
+ */
+
+int get_IPDiagnosticsUDPEchoConfig_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp_udpechoserver", "udpechoserver", "enable", value);
+	return 0;
+}
+
+int set_IPDiagnosticsUDPEchoConfig_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	char file[32] = "/var/state/cwmp_udpechoserver";
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b) {
+				if( access( file, F_OK ) != -1 )
+					dmcmd("/bin/rm", 1, file);
+				dmuci_set_value("cwmp_udpechoserver", "udpechoserver", "enable", "1");
+			}
+			else
+				dmuci_set_value("cwmp_udpechoserver", "udpechoserver", "enable", "0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoConfig_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp_udpechoserver", "udpechoserver", "interface", value);
+	return 0;
+}
+
+int set_IPDiagnosticsUDPEchoConfig_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp_udpechoserver", "udpechoserver", "interface", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoConfig_SourceIPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp_udpechoserver", "udpechoserver", "address", value);
+	return 0;
+}
+
+int set_IPDiagnosticsUDPEchoConfig_SourceIPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp_udpechoserver", "udpechoserver", "address", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoConfig_UDPPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp_udpechoserver", "udpechoserver", "server_port", value);
+	return 0;
+}
+
+int set_IPDiagnosticsUDPEchoConfig_UDPPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp_udpechoserver", "udpechoserver", "server_port", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoConfig_EchoPlusEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp_udpechoserver", "udpechoserver", "plus", value);
+	return 0;
+}
+
+int set_IPDiagnosticsUDPEchoConfig_EchoPlusEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value("cwmp_udpechoserver", "udpechoserver", "plus", "1");
+			else
+				dmuci_set_value("cwmp_udpechoserver", "udpechoserver", "plus", "0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoConfig_EchoPlusSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "true";
+	return 0;
+}
+
+static inline char *udpechoconfig_get(char *option, char *def)
+{
+	char *tmp;
+	dmuci_get_varstate_string("cwmp_udpechoserver", "udpechoserver", option, &tmp);
+	if(tmp && tmp[0] == '\0')
+		return dmstrdup(def);
+	else
+		return tmp;
+}
+
+int get_IPDiagnosticsUDPEchoConfig_PacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechoconfig_get("PacketsReceived", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoConfig_PacketsResponded(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechoconfig_get("PacketsResponded", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoConfig_BytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechoconfig_get("BytesReceived", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoConfig_BytesResponded(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechoconfig_get("BytesResponded", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoConfig_TimeFirstPacketReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechoconfig_get("TimeFirstPacketReceived", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoConfig_TimeLastPacketReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechoconfig_get("TimeLastPacketReceived", "0");
+	return 0;
+}
+
+/*
+ * *** Device.IP.Diagnostics.UDPEchoDiagnostics. ***
+ */
+
+static inline char *udpechodiagnostics_get(char *option, char *def)
+{
+	char *tmp;
+	dmuci_get_varstate_string("cwmp", "@udpechodiagnostic[0]", option, &tmp);
+	if(tmp && tmp[0] == '\0')
+		return dmstrdup(def);
+	else
+		return tmp;
+}
+
+int get_IPDiagnosticsUDPEchoDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechodiagnostics_get("DiagnosticState", "None");
+	return 0;
+}
+
+int set_IPDiagnosticsUDPEchoDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "Requested") == 0) {
+				UDPECHO_STOP;
+				curr_section = dmuci_walk_state_section("cwmp", "udpechodiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "udpechodiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@udpechodiagnostic[0]", "DiagnosticState", value);
+				cwmp_set_end_session(END_SESSION_UDPECHO_DIAGNOSTIC);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_varstate_string("cwmp", "@udpechodiagnostic[0]", "Interface", value);
+	return 0;
+}
+
+int set_IPDiagnosticsUDPEchoDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			UDPECHO_STOP;
+			curr_section = dmuci_walk_state_section("cwmp", "udpechodiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "udpechodiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@udpechodiagnostic[0]", "Interface", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoDiagnostics_Host(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_varstate_string("cwmp", "@udpechodiagnostic[0]", "Host", value);
+	return 0;
+}
+
+int set_IPDiagnosticsUDPEchoDiagnostics_Host(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			UDPECHO_STOP;
+			curr_section = dmuci_walk_state_section("cwmp", "udpechodiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "udpechodiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@udpechodiagnostic[0]", "Host", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoDiagnostics_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_varstate_string("cwmp", "@udpechodiagnostic[0]", "port", value);
+	return 0;
+}
+
+int set_IPDiagnosticsUDPEchoDiagnostics_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (atoi(value) >= 1 && atoi(value) <= 65535) {
+				UDPECHO_STOP;
+				curr_section = dmuci_walk_state_section("cwmp", "udpechodiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "udpechodiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@udpechodiagnostic[0]", "port", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoDiagnostics_NumberOfRepetitions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechodiagnostics_get("NumberOfRepetitions", "1");
+	return 0;
+}
+
+int set_IPDiagnosticsUDPEchoDiagnostics_NumberOfRepetitions(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			UDPECHO_STOP;
+			curr_section = dmuci_walk_state_section("cwmp", "udpechodiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "udpechodiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@udpechodiagnostic[0]", "NumberOfRepetitions", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoDiagnostics_Timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechodiagnostics_get("Timeout", "5000");
+	return 0;
+}
+
+int set_IPDiagnosticsUDPEchoDiagnostics_Timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			UDPECHO_STOP;
+			curr_section = dmuci_walk_state_section("cwmp", "udpechodiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "udpechodiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@udpechodiagnostic[0]", "Timeout", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoDiagnostics_DataBlockSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechodiagnostics_get("DataBlockSize", "24");
+	return 0;
+}
+
+int set_IPDiagnosticsUDPEchoDiagnostics_DataBlockSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (atoi(value) >= 1 && atoi(value) <= 65535) {
+				UDPECHO_STOP;
+				curr_section = dmuci_walk_state_section("cwmp", "udpechodiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "udpechodiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@udpechodiagnostic[0]", "DataBlockSize", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoDiagnostics_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechodiagnostics_get("DSCP", "0");
+	return 0;
+}
+
+int set_IPDiagnosticsUDPEchoDiagnostics_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (atoi(value) >= 0 && atoi(value) <= 63) {
+				UDPECHO_STOP;
+				curr_section = dmuci_walk_state_section("cwmp", "udpechodiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "udpechodiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@udpechodiagnostic[0]", "DSCP", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoDiagnostics_InterTransmissionTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechodiagnostics_get("InterTransmissionTime", "1000");
+	return 0;
+}
+
+int set_IPDiagnosticsUDPEchoDiagnostics_InterTransmissionTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (atoi(value) >= 1 && atoi(value) <= 65535) {
+				UDPECHO_STOP;
+				curr_section = dmuci_walk_state_section("cwmp", "udpechodiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "udpechodiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@udpechodiagnostic[0]", "InterTransmissionTime", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechodiagnostics_get("ProtocolVersion", "Any");
+	return 0;
+}
+
+int set_IPDiagnosticsUDPEchoDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "IPv4") == 0 || strcmp(value, "IPv6") == 0) {
+				UDPECHO_STOP;
+				curr_section = dmuci_walk_state_section("cwmp", "udpechodiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "udpechodiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@udpechodiagnostic[0]", "ProtocolVersion", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoDiagnostics_SuccessCount(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechodiagnostics_get("SuccessCount", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoDiagnostics_FailureCount(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechodiagnostics_get("FailureCount", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoDiagnostics_AverageResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechodiagnostics_get("AverageResponseTime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoDiagnostics_MinimumResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechodiagnostics_get("MinimumResponseTime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsUDPEchoDiagnostics_MaximumResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = udpechodiagnostics_get("MaximumResponseTime", "0");
+	return 0;
+}
+
+/*
+ * *** Device.IP.Diagnostics.ServerSelectionDiagnostics. ***
+ */
+
+static inline char *serverselection_get(char *option, char *def)
+{
+	char *tmp;
+	dmuci_get_varstate_string("cwmp", "@serverselectiondiagnostic[0]", option, &tmp);
+	if(tmp && tmp[0] == '\0')
+		return dmstrdup(def);
+	else
+		return tmp;
+}
+
+int get_IPDiagnosticsServerSelectionDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = serverselection_get("DiagnosticState", "None");
+	return 0;
+}
+
+int set_IPDiagnosticsServerSelectionDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "Requested") == 0) {
+				SERVERSELECTION_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "serverselectiondiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "serverselectiondiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@serverselectiondiagnostic[0]", "DiagnosticState", value);
+				cwmp_set_end_session(END_SESSION_SERVERSELECTION_DIAGNOSTIC);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsServerSelectionDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_varstate_string("cwmp", "@serverselectiondiagnostic[0]", "interface", value);
+	return 0;
+}
+
+int set_IPDiagnosticsServerSelectionDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			SERVERSELECTION_STOP
+			curr_section = dmuci_walk_state_section("cwmp", "serverselectiondiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "serverselectiondiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@serverselectiondiagnostic[0]", "interface", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsServerSelectionDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = serverselection_get("ProtocolVersion", "Any");
+	return 0;
+}
+
+int set_IPDiagnosticsServerSelectionDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "IPv4") == 0 || strcmp(value, "IPv6") == 0) {
+				SERVERSELECTION_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "serverselectiondiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "serverselectiondiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@serverselectiondiagnostic[0]", "ProtocolVersion", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsServerSelectionDiagnostics_Protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = serverselection_get("Protocol", "ICMP");
+	return 0;
+}
+
+int set_IPDiagnosticsServerSelectionDiagnostics_Protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "ICMP") == 0 || strcmp(value, "UDP Echo") == 0) {
+				SERVERSELECTION_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "serverselectiondiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "serverselectiondiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@serverselectiondiagnostic[0]", "Protocol", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsServerSelectionDiagnostics_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_varstate_string("cwmp", "@serverselectiondiagnostic[0]", "port", value);
+	return 0;
+}
+
+int set_IPDiagnosticsServerSelectionDiagnostics_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (atoi(value) >= 1 && atoi(value) <= 65535) {
+				SERVERSELECTION_STOP;
+				curr_section = dmuci_walk_state_section("cwmp", "serverselectiondiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "serverselectiondiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@serverselectiondiagnostic[0]", "port", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsServerSelectionDiagnostics_HostList(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_varstate_string("cwmp", "@serverselectiondiagnostic[0]", "HostList", value);
+	return 0;
+}
+
+int set_IPDiagnosticsServerSelectionDiagnostics_HostList(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			SERVERSELECTION_STOP
+			curr_section = dmuci_walk_state_section("cwmp", "serverselectiondiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "serverselectiondiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@serverselectiondiagnostic[0]", "HostList", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsServerSelectionDiagnostics_NumberOfRepetitions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = serverselection_get("NumberOfRepetitions", "3");
+	return 0;
+}
+
+int set_IPDiagnosticsServerSelectionDiagnostics_NumberOfRepetitions(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (atoi(value) >= 1) {
+				SERVERSELECTION_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "serverselectiondiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "serverselectiondiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@serverselectiondiagnostic[0]", "NumberOfRepetitions", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsServerSelectionDiagnostics_Timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = serverselection_get("Timeout", "1000");
+	return 0;
+}
+
+int set_IPDiagnosticsServerSelectionDiagnostics_Timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (atoi(value) >= 1) {
+				SERVERSELECTION_STOP
+				curr_section = dmuci_walk_state_section("cwmp", "serverselectiondiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "serverselectiondiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@serverselectiondiagnostic[0]", "Timeout", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPDiagnosticsServerSelectionDiagnostics_FastestHost(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = serverselection_get("FastestHost", "");
+	return 0;
+}
+
+int get_IPDiagnosticsServerSelectionDiagnostics_MinimumResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = serverselection_get("MinimumResponseTime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsServerSelectionDiagnostics_AverageResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = serverselection_get("AverageResponseTime", "0");
+	return 0;
+}
+
+int get_IPDiagnosticsServerSelectionDiagnostics_MaximumResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = serverselection_get("MaximumResponseTime", "0");
+	return 0;
+}
+
+int browseIPDiagnosticsTraceRouteRouteHopsInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL;
+	char *instance, *idx_last = NULL;
+
+	uci_foreach_sections_state("cwmp", "RouteHops", s)
+	{
+		instance = handle_update_instance(2, dmctx, &idx_last, update_instance_alias, 3, (void *)s, "routehop_instance", "routehop_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)s, instance) == DM_STOP)
+			break;
+	}
+	return 0;
+}
+
+int browseIPDiagnosticsDownloadDiagnosticsPerConnectionResultInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL;
+	char *instance, *idx_last = NULL;
+
+	uci_foreach_sections_state("cwmp", "DownloadPerConnection", s)
+	{
+		instance = handle_update_instance(2, dmctx, &idx_last, update_instance_alias, 3, (void *)s, "perconnection_instance", "perconnection_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)s, instance) == DM_STOP)
+			break;
+	}
+	return 0;
+}
+
+int browseIPDiagnosticsUploadDiagnosticsPerConnectionResultInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL;
+	char *instance, *idx_last = NULL;
+
+	uci_foreach_sections_state("cwmp", "UploadPerConnection", s)
+	{
+		instance = handle_update_instance(2, dmctx, &idx_last, update_instance_alias, 3, (void *)s, "perconnection_instance", "perconnection_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)s, instance) == DM_STOP)
+			break;
+	}
+	return 0;
+}
diff --git a/dmtree/tr143/diagnostics.h b/dmtree/tr143/diagnostics.h
new file mode 100644
index 0000000000000000000000000000000000000000..9d0b4f7819cf97688c8676266190dba811d6761c
--- /dev/null
+++ b/dmtree/tr143/diagnostics.h
@@ -0,0 +1,232 @@
+/*
+*	This program is free software: you can redistribute it and/or modify
+*	it under the terms of the GNU General Public License as published by
+*	the Free Software Foundation, either version 2 of the License, or
+*	(at your option) any later version.
+*
+*	Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*
+*/
+
+#ifndef __DIAGNOSTICS_H
+#define __DIAGNOSTICS_H
+
+extern DMOBJ tIPDiagnosticsObj[];
+extern DMLEAF tIPDiagnosticsParams[];
+extern DMLEAF tIPDiagnosticsIPPingParams[];
+extern DMOBJ tIPDiagnosticsTraceRouteObj[];
+extern DMLEAF tIPDiagnosticsTraceRouteParams[];
+extern DMLEAF tIPDiagnosticsTraceRouteRouteHopsParams[];
+extern DMOBJ tIPDiagnosticsDownloadDiagnosticsObj[];
+extern DMLEAF tIPDiagnosticsDownloadDiagnosticsParams[];
+extern DMLEAF tIPDiagnosticsDownloadDiagnosticsPerConnectionResultParams[];
+extern DMOBJ tIPDiagnosticsUploadDiagnosticsObj[];
+extern DMLEAF tIPDiagnosticsUploadDiagnosticsParams[];
+extern DMLEAF tIPDiagnosticsUploadDiagnosticsPerConnectionResultParams[];
+extern DMLEAF tIPDiagnosticsUDPEchoConfigParams[];
+extern DMLEAF tIPDiagnosticsUDPEchoDiagnosticsParams[];
+extern DMLEAF tIPDiagnosticsServerSelectionDiagnosticsParams[];
+
+int browseIPDiagnosticsTraceRouteRouteHopsInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseIPDiagnosticsDownloadDiagnosticsPerConnectionResultInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseIPDiagnosticsUploadDiagnosticsPerConnectionResultInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int get_diag_enable_true(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_ping_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_ip_ping_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_ip_ping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_ip_ping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_ip_ping_protocolversion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_ip_ping_protocolversion(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_ip_ping_host(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_ip_ping_host(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_ip_ping_repetition_number(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_ip_ping_repetition_number(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_ip_ping_timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_ip_ping_timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_ip_ping_block_size(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_ip_ping_block_size(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_ip_ping_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_ip_ping_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_ip_ping_success_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_ping_failure_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_ping_average_response_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_ping_min_response_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_ping_max_response_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_ping_AverageResponseTimeDetailed(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_ping_MinimumResponseTimeDetailed(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_ping_MaximumResponseTimeDetailed(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_IPDiagnosticsTraceRoute_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsTraceRoute_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsTraceRoute_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsTraceRoute_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsTraceRoute_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsTraceRoute_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsTraceRoute_Host(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsTraceRoute_Host(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsTraceRoute_NumberOfTries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsTraceRoute_NumberOfTries(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsTraceRoute_Timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsTraceRoute_Timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsTraceRoute_DataBlockSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsTraceRoute_DataBlockSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsTraceRoute_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsTraceRoute_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsTraceRoute_MaxHopCount(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsTraceRoute_MaxHopCount(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsTraceRoute_ResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsTraceRoute_RouteHopsNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsTraceRouteRouteHops_Host(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsTraceRouteRouteHops_HostAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsTraceRouteRouteHops_ErrorCode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsTraceRouteRouteHops_RTTimes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_IPDiagnosticsDownloadDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsDownloadDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsDownloadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsDownloadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsDownloadDiagnostics_DownloadURL(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsDownloadDiagnostics_DownloadURL(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsDownloadDiagnostics_DownloadTransports(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnostics_DownloadDiagnosticMaxConnections(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnostics_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsDownloadDiagnostics_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsDownloadDiagnostics_EthernetPriority(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsDownloadDiagnostics_EthernetPriority(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsDownloadDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsDownloadDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsDownloadDiagnostics_NumberOfConnections(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsDownloadDiagnostics_NumberOfConnections(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsDownloadDiagnostics_ROMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnostics_BOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnostics_EOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnostics_TestBytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnostics_TotalBytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnostics_TotalBytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnostics_TestBytesReceivedUnderFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnostics_TotalBytesReceivedUnderFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnostics_TotalBytesSentUnderFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnostics_PeriodOfFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnostics_TCPOpenRequestTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnostics_TCPOpenResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnostics_PerConnectionResultNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnostics_EnablePerConnectionResults(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsDownloadDiagnostics_EnablePerConnectionResults(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_ROMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_BOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_EOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_TestBytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_TotalBytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_TotalBytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_TCPOpenRequestTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsDownloadDiagnosticsPerConnectionResult_TCPOpenResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_IPDiagnosticsUploadDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUploadDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUploadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUploadDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUploadDiagnostics_UploadURL(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUploadDiagnostics_UploadURL(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUploadDiagnostics_UploadTransports(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnostics_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUploadDiagnostics_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUploadDiagnostics_EthernetPriority(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUploadDiagnostics_EthernetPriority(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUploadDiagnostics_TestFileLength(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUploadDiagnostics_TestFileLength(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUploadDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUploadDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUploadDiagnostics_NumberOfConnections(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUploadDiagnostics_NumberOfConnections(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUploadDiagnostics_ROMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnostics_BOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnostics_EOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnostics_TestBytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnostics_TotalBytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnostics_TotalBytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnostics_TestBytesSentUnderFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnostics_TotalBytesReceivedUnderFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnostics_TotalBytesSentUnderFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnostics_PeriodOfFullLoading(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnostics_TCPOpenRequestTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnostics_TCPOpenResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnostics_PerConnectionResultNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnostics_EnablePerConnectionResults(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUploadDiagnostics_EnablePerConnectionResults(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_ROMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_BOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_EOMTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TestBytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TotalBytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TotalBytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TCPOpenRequestTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TCPOpenResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_IPDiagnosticsUDPEchoConfig_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUDPEchoConfig_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUDPEchoConfig_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUDPEchoConfig_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUDPEchoConfig_SourceIPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUDPEchoConfig_SourceIPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUDPEchoConfig_UDPPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUDPEchoConfig_UDPPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUDPEchoConfig_EchoPlusEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUDPEchoConfig_EchoPlusEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUDPEchoConfig_EchoPlusSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUDPEchoConfig_PacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUDPEchoConfig_PacketsResponded(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUDPEchoConfig_BytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUDPEchoConfig_BytesResponded(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUDPEchoConfig_TimeFirstPacketReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUDPEchoConfig_TimeLastPacketReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_IPDiagnosticsUDPEchoDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUDPEchoDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUDPEchoDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUDPEchoDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUDPEchoDiagnostics_Host(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUDPEchoDiagnostics_Host(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUDPEchoDiagnostics_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUDPEchoDiagnostics_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUDPEchoDiagnostics_NumberOfRepetitions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUDPEchoDiagnostics_NumberOfRepetitions(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUDPEchoDiagnostics_Timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUDPEchoDiagnostics_Timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUDPEchoDiagnostics_DataBlockSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUDPEchoDiagnostics_DataBlockSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUDPEchoDiagnostics_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUDPEchoDiagnostics_DSCP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUDPEchoDiagnostics_InterTransmissionTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUDPEchoDiagnostics_InterTransmissionTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUDPEchoDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsUDPEchoDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsUDPEchoDiagnostics_SuccessCount(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUDPEchoDiagnostics_FailureCount(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUDPEchoDiagnostics_AverageResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUDPEchoDiagnostics_MinimumResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsUDPEchoDiagnostics_MaximumResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_IPDiagnosticsServerSelectionDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsServerSelectionDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsServerSelectionDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsServerSelectionDiagnostics_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsServerSelectionDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsServerSelectionDiagnostics_ProtocolVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsServerSelectionDiagnostics_Protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsServerSelectionDiagnostics_Protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsServerSelectionDiagnostics_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsServerSelectionDiagnostics_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsServerSelectionDiagnostics_HostList(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsServerSelectionDiagnostics_HostList(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsServerSelectionDiagnostics_NumberOfRepetitions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsServerSelectionDiagnostics_NumberOfRepetitions(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsServerSelectionDiagnostics_Timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPDiagnosticsServerSelectionDiagnostics_Timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPDiagnosticsServerSelectionDiagnostics_FastestHost(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsServerSelectionDiagnostics_MinimumResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsServerSelectionDiagnostics_AverageResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPDiagnosticsServerSelectionDiagnostics_MaximumResponseTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+#endif
\ No newline at end of file
diff --git a/dmtree/tr181/atm.c b/dmtree/tr181/atm.c
new file mode 100644
index 0000000000000000000000000000000000000000..f4124041588f32248ebc9309bfbdc7bd11760042
--- /dev/null
+++ b/dmtree/tr181/atm.c
@@ -0,0 +1,375 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2016 PIVA SOFTWARE (www.pivasoftware.com)
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *
+ */
+
+#include <ctype.h>
+#include <uci.h>
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "atm.h"
+#include "dmjson.h"
+#include "dmentry.h"
+
+/*** ATM. ***/
+DMOBJ tATMObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Link", &DMWRITE, add_atm_link, delete_atm_link, NULL, browseAtmLinkInst, NULL, NULL, tATMLinkObj, tATMLinkParams, get_atm_linker, BBFDM_BOTH},
+{0}
+};
+
+/*** ATM.Link. ***/
+DMOBJ tATMLinkObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tATMLinkStatsParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tATMLinkParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING,  get_atm_alias, set_atm_alias, NULL, NULL, BBFDM_BOTH},
+{"Enable", &DMREAD, DMT_BOOL, get_atm_enable, NULL, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMREAD, DMT_STRING, get_atm_link_name, NULL, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_atm_enable, NULL, NULL, NULL, BBFDM_BOTH},
+{"LowerLayers", &DMREAD, DMT_STRING, get_atm_lower_layer, NULL, NULL, NULL, BBFDM_BOTH},
+{"LinkType", &DMWRITE, DMT_STRING, get_atm_link_type, set_atm_link_type, NULL, NULL, BBFDM_BOTH},
+{"DestinationAddress", &DMWRITE, DMT_STRING, get_atm_destination_address, set_atm_destination_address, NULL, NULL, BBFDM_BOTH},
+{"Encapsulation", &DMWRITE, DMT_STRING, get_atm_encapsulation, set_atm_encapsulation, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** ATM.Link.Stats. ***/
+DMLEAF tATMLinkStatsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"BytesSent", &DMREAD, DMT_UNINT, get_atm_stats_bytes_sent, NULL, NULL, NULL, BBFDM_BOTH},
+{"BytesReceived", &DMREAD, DMT_UNINT, get_atm_stats_bytes_received, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsSent", &DMREAD, DMT_UNINT, get_atm_stats_pack_sent, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsReceived", &DMREAD, DMT_UNINT, get_atm_stats_pack_received, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/**************************************************************************
+* LINKER
+***************************************************************************/
+int get_atm_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) {
+	if (data && ((struct atm_args *)data)->ifname) {
+		*linker =  ((struct atm_args *)data)->ifname;
+		return 0;
+	}
+	*linker = "" ;
+	return 0;
+}
+
+/**************************************************************************
+* INIT
+***************************************************************************/
+inline int init_atm_link(struct atm_args *args, struct uci_section *s, char *ifname)
+{
+	args->atm_sec = s;
+	args->ifname = ifname;
+	return 0;
+}
+
+/**************************************************************************
+* SET & GET DSL LINK PARAMETERS
+***************************************************************************/
+/*#Device.ATM.Link.{i}.DestinationAddress!UCI:dsl/atm-device,@i-1/vpi*/
+int get_atm_destination_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *vpi, *vci;
+
+	dmuci_get_value_by_section_string(((struct atm_args *)data)->atm_sec, "vpi", &vpi);
+	dmuci_get_value_by_section_string(((struct atm_args *)data)->atm_sec, "vci", &vci);
+	dmasprintf(value, "PVC: %s/%s", vpi, vci); // MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+int set_atm_destination_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *vpi = NULL, *vci = NULL, *spch, *val;
+	struct uci_section *s;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+				if (strstr(value, "PVC: "))
+					value += 5;
+				else
+					return 0;
+				val = dmstrdup(value);
+				vpi = strtok_r(val, "/", &spch);
+				if (vpi) {
+					vci = strtok_r(NULL, "/", &spch);
+				}
+				if (vpi && vci) {
+					dmuci_set_value_by_section(((struct atm_args *)data)->atm_sec, "vpi", vpi);
+					dmuci_set_value_by_section(((struct atm_args *)data)->atm_sec, "vci", vci);
+				}
+				dmfree(val);
+				break;
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ATM.Link.{i}.Name!UCI:dsl/atm-device,@i-1/name*/
+int get_atm_link_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct atm_args *)data)->atm_sec, "name", value);
+	return 0;
+}
+
+/*#Device.ATM.Link.{i}.Encapsulation!UCI:dsl/atm-device,@i-1/encapsulation*/
+int get_atm_encapsulation(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *encapsulation;
+
+	dmuci_get_value_by_section_string(((struct atm_args *)data)->atm_sec, "encapsulation", &encapsulation);
+	if (strcasecmp(encapsulation, "vcmux") == 0) {
+		*value = "VCMUX";
+	}
+	else if (strcasecmp(encapsulation, "llc") == 0) {
+		*value = "LLC";
+	} else {
+		*value = "";
+	}
+	return 0;
+}
+
+int set_atm_encapsulation(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *encapsulation;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "VCMUX") == 0)
+				encapsulation = "vcmux";
+			else if (strcmp(value, "LLC") == 0)
+				encapsulation = "llc";
+			else
+				return 0;
+
+			dmuci_set_value_by_section(((struct atm_args *)data)->atm_sec, "encapsulation", encapsulation);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ATM.Link.{i}.LinkType!UCI:dsl/atm-device,@i-1/link_type*/
+int get_atm_link_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "";
+	dmuci_get_value_by_section_string(((struct atm_args *)data)->atm_sec, "link_type", value);
+	return 0;
+}
+
+int set_atm_link_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct atm_args *)data)->atm_sec, "link_type", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_atm_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char linker[16];
+	sprintf(linker, "channel_%d", atoi(instance)-1);
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cDSL%cChannel%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+inline int ubus_atm_stats(json_object *res, char **value, char *stat_mod, void *data)
+{
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct atm_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", stat_mod);
+	return 0;
+}
+
+/*#Device.ATM.Link.{i}.Stats.BytesReceived!UBUS:network.device/status/name,@Name/statistics.rx_bytes*/
+int get_atm_stats_bytes_received(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_atm_stats(res, value, "rx_bytes", data);
+	return 0;
+}
+
+/*#Device.ATM.Link.{i}.Stats.BytesSent!UBUS:network.device/status/name,@Name/statistics.tx_bytes*/
+int get_atm_stats_bytes_sent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_atm_stats(res, value, "tx_bytes", data);
+	return 0;
+}
+
+/*#Device.ATM.Link.{i}.Stats.PacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_packets*/
+int get_atm_stats_pack_received(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_atm_stats(res, value, "rx_packets", data);
+	return 0;
+}
+
+/*#Device.ATM.Link.{i}.Stats.PacketsSent!UBUS:network.device/status/name,@Name/statistics.tx_packets*/
+int get_atm_stats_pack_sent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_atm_stats(res, value, "tx_packets", data);
+	return 0;
+}
+
+int get_atm_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "true";
+	return 0;
+}
+
+/*************************************************************
+ * ADD OBJ
+/*************************************************************/
+int add_atm_link(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{
+	char *instance = NULL, *atm_device = NULL, *v = NULL, *instance_update = NULL;
+	struct uci_section *dmmap_atm = NULL;
+
+	check_create_dmmap_package("dmmap_dsl");
+	instance = get_last_instance_icwmpd("dmmap_dsl", "atm-device", "atmlinkinstance");
+	dmasprintf(&atm_device, "atm%d", instance ? atoi(instance) : 0);
+	dmasprintf(&instance_update, "%d", instance ? atoi(instance)+ 1 : 1);
+	dmuci_set_value("dsl", atm_device, "", "atm-device");
+	dmuci_set_value("dsl", atm_device, "name", "ATM");
+	dmuci_set_value("dsl", atm_device, "vpi", "8");
+	dmuci_set_value("dsl", atm_device, "vci", "35");
+	dmuci_set_value("dsl", atm_device, "device", atm_device);
+	dmuci_set_value("dsl", atm_device, "link_type", "eoa");
+	dmuci_set_value("dsl", atm_device, "encapsulation", "llc");
+	dmuci_set_value("dsl", atm_device, "qos_class", "ubr");
+	dmuci_add_section_icwmpd("dmmap_dsl", "atm-device", &dmmap_atm, &v);
+	dmuci_set_value_by_section(dmmap_atm, "section_name", atm_device);
+	*instancepara = update_instance_icwmpd(dmmap_atm, instance, "atmlinkinstance");
+	return 0;
+}
+
+int delete_atm_link(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *s = NULL, *ss = NULL, *ns = NULL, *nss = NULL, *dmmap_section= NULL;
+	char *ifname;
+
+	switch (del_action) {
+		case DEL_INST:
+			get_dmmap_section_of_config_section("dmmap_dsl", "atm-device", section_name(((struct atm_args *)data)->atm_sec), &dmmap_section);
+			if(dmmap_section != NULL)
+				dmuci_delete_by_section(dmmap_section, NULL, NULL);
+			dmuci_delete_by_section(((struct atm_args *)data)->atm_sec, NULL, NULL);
+			uci_foreach_option_cont("network", "interface", "ifname", ((struct atm_args *)data)->ifname, s) {
+				if (ss && ifname!=NULL)
+					wan_remove_dev_interface(ss, ((struct atm_args *)data)->ifname);
+				ss = s;
+			}
+			if (ss != NULL && ifname!=NULL)
+				wan_remove_dev_interface(ss, ((struct atm_args *)data)->ifname);
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("dsl", "atm-device", s) {
+				if (ss){
+					get_dmmap_section_of_config_section("dmmap_dsl", "atm-device", section_name(ss), &dmmap_section);
+					if(dmmap_section != NULL)
+						dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					dmuci_get_value_by_section_string(ss, "device", &ifname);
+					dmuci_delete_by_section(ss, NULL, NULL);
+					uci_foreach_option_cont("network", "interface", "ifname", ifname, ns) {
+						if (nss && ifname!=NULL)
+							wan_remove_dev_interface(nss, ifname);
+						nss = ns;
+					}
+					if (nss != NULL && ifname!=NULL)
+						wan_remove_dev_interface(nss, ifname);
+				}
+				ss = s;
+			}
+			if (ss != NULL) {
+				get_dmmap_section_of_config_section("dmmap_dsl", "atm-device", section_name(ss), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_get_value_by_section_string(ss, "device", &ifname);
+				dmuci_delete_by_section(ss, NULL, NULL);
+				uci_foreach_option_cont("network", "interface", "ifname", ifname, ns) {
+					if (nss && ifname!=NULL)
+						wan_remove_dev_interface(nss, ifname);
+					nss = ns;
+				}
+				if (nss != NULL && ifname!=NULL)
+					wan_remove_dev_interface(nss, ifname);
+			}
+			break;
+	}
+	return 0;
+}
+
+/*************************************************************
+ * SET AND GET ALIAS
+/*************************************************************/
+int get_atm_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_dsl", "atm-device", section_name(((struct atm_args *)data)->atm_sec), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "atmlinkalias", value);
+	return 0;
+}
+
+int set_atm_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			get_dmmap_section_of_config_section("dmmap_dsl", "atm-device", section_name(((struct atm_args *)data)->atm_sec), &dmmap_section);
+			dmuci_set_value_by_section(dmmap_section, "atmlinkalias", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*************************************************************
+ * ENTRY METHOD
+/*************************************************************/
+/*#Device.ATM.Link.{i}.!UCI:dsl/atm-device/dmmap_dsl*/
+int browseAtmLinkInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *wnum = NULL, *channel_last = NULL, *ifname;
+	struct atm_args curr_atm_args = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("dsl", "atm-device", "dmmap_dsl", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		dmuci_get_value_by_section_string(p->config_section, "device", &ifname);
+		init_atm_link(&curr_atm_args, p->config_section, ifname);
+		wnum = handle_update_instance(1, dmctx, &channel_last, update_instance_alias, 3, p->dmmap_section, "atmlinkinstance", "atmlinkalias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_atm_args, wnum) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
diff --git a/dmtree/tr181/atm.h b/dmtree/tr181/atm.h
new file mode 100644
index 0000000000000000000000000000000000000000..0f5cee2e9af732ec924ffb33fe88a8170904da4b
--- /dev/null
+++ b/dmtree/tr181/atm.h
@@ -0,0 +1,50 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2016 Inteno Broadband Technology AB
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *
+ */
+
+#ifndef __ATM_H
+#define __ATM_H
+
+struct atm_args
+{
+	struct uci_section *atm_sec;
+	char *ifname;
+};
+
+extern DMOBJ tATMObj[];
+extern DMOBJ tATMLinkObj[];
+extern DMLEAF tATMLinkParams[];
+extern DMLEAF tATMLinkStatsParams[] ;
+
+int browseAtmLinkInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int add_atm_link(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_atm_link(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_atm_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_atm_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_atm_link_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_atm_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_atm_link_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_atm_destination_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_atm_encapsulation(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_atm_stats_bytes_sent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_atm_stats_bytes_received(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_atm_stats_pack_sent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_atm_stats_pack_received(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int set_atm_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_atm_link_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_atm_destination_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_atm_encapsulation(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int get_atm_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+
+#endif
diff --git a/dmtree/tr181/bridging.c b/dmtree/tr181/bridging.c
new file mode 100644
index 0000000000000000000000000000000000000000..842416ce0cf5c3b4da8a6339f3bdc10c27db5eaa
--- /dev/null
+++ b/dmtree/tr181/bridging.c
@@ -0,0 +1,1848 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2019 iopsys Software Solutions AB
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#include <ctype.h>
+#include <uci.h>
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "bridging.h"
+#include "dmjson.h"
+#include "dmentry.h"
+
+static char *wan_baseifname = NULL;
+
+/*** Bridging. ***/
+DMOBJ tBridgingObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Bridge", &DMWRITE, add_bridge, delete_bridge, NULL, browseBridgeInst, NULL, NULL, tBridgingBridgeObj, tBridgingBridgeParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tBridgingParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"MaxBridgeEntries", &DMREAD, DMT_UNINT, get_Max_Bridge_Entries, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxDBridgeEntries", &DMREAD, DMT_UNINT, get_Max_DBridge_Entries, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxQBridgeEntries", &DMREAD, DMT_UNINT, get_Max_QBridge_Entries, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxVLANEntries", &DMREAD, DMT_UNINT, get_Max_VLAN_Entries, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxProviderBridgeEntries", &DMREAD, DMT_UNINT, get_Max_Provider_Bridge_Entries, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxFilterEntries", &DMREAD, DMT_UNINT, get_Max_Filter_Entries, NULL, NULL, NULL, BBFDM_BOTH},
+{"BridgeNumberOfEntries", &DMREAD, DMT_UNINT, get_Bridge_Number_Of_Entries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** Bridging.Bridge.{i}. ***/
+DMOBJ tBridgingBridgeObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Port", &DMWRITE, add_br_port, delete_br_port, NULL, browseBridgePortInst, NULL, NULL, tBridgingBridgePortObj, tBridgingBridgePortParams, get_linker_br_port, BBFDM_BOTH},
+{"VLAN", &DMWRITE, add_br_vlan, delete_br_vlan, NULL, browseBridgeVlanInst, NULL, NULL, NULL, tBridgingBridgeVLANParams, get_linker_br_vlan, BBFDM_BOTH},
+{"VLANPort", &DMREAD, NULL, NULL, NULL, browseBridgeVlanPortInst, NULL, NULL, NULL, tBridgingBridgeVLANPortParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tBridgingBridgeParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_br_enable, set_br_enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_br_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_br_alias, set_br_alias, NULL, NULL, BBFDM_BOTH},
+{"Standard", &DMWRITE, DMT_STRING, get_br_standard, set_br_standard, NULL, NULL, BBFDM_BOTH},
+{"PortNumberOfEntries", &DMREAD, DMT_UNINT, get_br_port_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{"VLANNumberOfEntries", &DMREAD, DMT_UNINT, get_br_vlan_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{"VLANPortNumberOfEntries", &DMREAD, DMT_UNINT, get_br_vlan_port_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"AssociatedInterfaces", &DMWRITE, DMT_STRING, get_br_associated_interfaces, set_br_associated_interfaces, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** Bridging.Bridge.{i}.Port.{i}. ***/
+DMOBJ tBridgingBridgePortObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tBridgingBridgePortStatsParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tBridgingBridgePortParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_br_port_enable, set_br_port_enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_br_port_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_br_port_alias, set_br_port_alias, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMREAD, DMT_STRING, get_br_port_name, NULL, NULL, NULL, BBFDM_BOTH},
+{"LastChange", &DMREAD, DMT_UNINT, get_br_port_last_change, NULL, NULL, NULL, BBFDM_BOTH},
+{"LowerLayers", &DMWRITE, DMT_STRING, get_port_lower_layer, set_port_lower_layer, NULL, NULL, BBFDM_BOTH},
+{"ManagementPort", &DMWRITE, DMT_STRING, get_br_port_management, set_br_port_management, NULL, NULL, BBFDM_BOTH},
+{"Type", &DMWRITE, DMT_STRING, get_br_port_type, set_br_port_type, NULL, NULL, BBFDM_BOTH},
+{"DefaultUserPriority", &DMWRITE, DMT_UNINT, get_br_port_default_user_priority, set_br_port_default_user_priority, NULL, NULL, BBFDM_BOTH},
+{"PriorityRegeneration", &DMWRITE, DMT_STRING, get_br_port_priority_regeneration, set_br_port_priority_regeneration, NULL, NULL, BBFDM_BOTH},
+{"PortState", &DMREAD, DMT_STRING, get_br_port_port_state, NULL, NULL, NULL, BBFDM_BOTH},
+{"PVID", &DMWRITE, DMT_INT, get_br_port_pvid, set_br_port_pvid, NULL, NULL, BBFDM_BOTH},
+{"TPID", &DMWRITE, DMT_UNINT, get_br_port_tpid, set_br_port_tpid, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** Bridging.Bridge.{i}.Port.{i}.Stats. ***/
+DMLEAF tBridgingBridgePortStatsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"BytesSent", &DMREAD, DMT_UNINT, get_br_port_stats_tx_bytes, NULL, NULL, NULL, BBFDM_BOTH},
+{"BytesReceived", &DMREAD, DMT_UNINT, get_br_port_stats_rx_bytes, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsSent", &DMREAD, DMT_UNINT, get_br_port_stats_tx_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsReceived", &DMREAD, DMT_UNINT, get_br_port_stats_rx_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsSent", &DMREAD, DMT_UNINT, get_br_port_stats_tx_errors, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsReceived", &DMREAD, DMT_UNINT, get_br_port_stats_rx_errors, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnicastPacketsSent", &DMREAD, DMT_UNINT, get_br_port_stats_tx_unicast_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnicastPacketsReceived", &DMREAD, DMT_UNINT, get_br_port_stats_rx_unicast_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsSent", &DMREAD, DMT_UNINT, get_br_port_stats_tx_discard_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsReceived", &DMREAD, DMT_UNINT, get_br_port_stats_rx_discard_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"MulticastPacketsSent", &DMREAD, DMT_UNINT, get_br_port_stats_tx_multicast_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"MulticastPacketsReceived", &DMREAD, DMT_UNINT, get_br_port_stats_rx_multicast_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"BroadcastPacketsSent", &DMREAD, DMT_UNINT, get_br_port_stats_tx_broadcast_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"BroadcastPacketsReceived", &DMREAD, DMT_UNINT, get_br_port_stats_rx_broadcast_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnknownProtoPacketsReceived", &DMREAD, DMT_UNINT, get_br_port_stats_rx_unknown_proto_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** Bridging.Bridge.{i}.VLAN.{i}. ***/
+DMLEAF tBridgingBridgeVLANParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_br_vlan_enable, set_br_vlan_enable, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING,get_br_vlan_alias, set_br_vlan_alias, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMWRITE, DMT_STRING, get_br_vlan_name, set_br_vlan_name, NULL, NULL, BBFDM_BOTH},
+{"VLANID", &DMWRITE, DMT_STRING, get_br_vlan_vid, set_br_vlan_vid, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"VLANPriority", &DMWRITE, DMT_STRING, get_br_vlan_priority, set_br_vlan_priority, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** Bridging.Bridge.{i}.VLANPort.{i}. ***/
+DMLEAF tBridgingBridgeVLANPortParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_br_vlan_enable, set_br_vlan_enable, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING,  get_br_vlan_alias, set_br_vlan_alias, NULL, NULL, BBFDM_BOTH},
+{"VLAN", &DMWRITE, DMT_STRING,  get_vlan_port_vlan_ref, set_vlan_port_vlan_ref, NULL, NULL, BBFDM_BOTH},
+{"Port", &DMWRITE, DMT_STRING, get_vlan_port_port_ref, set_vlan_port_port_ref, NULL, NULL, BBFDM_BOTH},
+{"Untagged", &DMWRITE, DMT_BOOL, get_br_vlan_untagged, set_br_vlan_untagged, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/**************************************************************************
+* LINKER
+***************************************************************************/
+int get_linker_br_port(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) {
+	if(data && ((struct bridging_port_args *)data)->bridge_port_sec) {
+		dmasprintf(linker,"%s+%s", section_name(((struct bridging_port_args *)data)->bridge_port_sec), ((struct bridging_port_args *)data)->ifname);
+		return 0;
+	}
+	*linker = "";
+	return 0;
+}
+
+int get_linker_br_vlan(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) {
+	if(data && ((struct bridging_vlan_args *)data)->vlan_port) {
+		dmasprintf(linker,"vlan%s_%s", ((struct bridging_vlan_args *)data)->vlan_port, ((struct bridging_vlan_args *)data)->br_inst);
+		return 0;
+	}
+	*linker = "";
+	return 0;
+}
+/**************************************************************************
+* INIT
+***************************************************************************/
+inline int init_bridging_args(struct bridging_args *args, struct uci_section *s, char *last_instance, char *ifname, char *br_instance)
+{
+	args->bridge_sec = s;
+	args->br_key = last_instance;
+	args->ifname = ifname;
+	args->br_inst = br_instance;
+	return 0;
+}
+
+inline int init_bridging_port_args(struct bridging_port_args *args, struct uci_section *s, struct uci_section *bs, bool vlan, char *ifname)
+{
+	args->bridge_port_sec = s;
+	args->bridge_sec = bs;
+	args->vlan = vlan;
+	args->ifname = ifname;
+	return 0;
+}
+
+inline int init_bridging_vlan_args(struct bridging_vlan_args *args, struct uci_section *s, struct uci_section *bs, char *vlan_port, char *br_inst)
+{
+	args->bridge_vlan_sec = s;
+	args->bridge_sec = bs;
+	args->vlan_port = vlan_port;
+	args->br_inst = br_inst;
+	return 0;
+}
+
+/**************************************************************************
+* INSTANCE MG
+***************************************************************************/
+char *get_last_vid(void)
+{
+	struct uci_section *vlan_s;
+	char *vid = NULL, *type;
+	int num_vid = 0;
+
+	uci_foreach_sections("network", "device", vlan_s) {
+		if(!vlan_s)
+			break;
+		dmuci_get_value_by_section_string(vlan_s, "type", &type);
+		if (strcmp(type, "untagged")==0)
+			continue;
+		dmuci_get_value_by_section_string(vlan_s, "vid", &vid);
+		if( atoi(vid)> num_vid )
+			num_vid = atoi(vid);
+		dmasprintf(&vid, "%d", num_vid);
+	}
+	return vid;
+}
+
+int check_ifname_exist_in_br_ifname_list(char *ifname)
+{
+	char *br_ifname_list, *br_ifname_dup, *pch, *spch;
+	struct uci_section *s;
+	uci_foreach_option_eq("network", "interface", "type", "bridge", s) {
+		dmuci_get_value_by_section_string(s, "ifname", &br_ifname_list);
+		if(br_ifname_list[0] == '\0')
+			return 0;
+		br_ifname_dup = dmstrdup(br_ifname_list);
+		for (pch = strtok_r(br_ifname_dup, " ", &spch); pch != NULL; pch = strtok_r(NULL, " ", &spch)) {
+			if (strcmp(pch, ifname) == 0)
+				return 1;
+		}
+	}
+	return 0;
+}
+
+int get_br_port_last_inst(char *br_key)
+{
+	char *tmp;
+	int max=1;
+	struct uci_section *s;
+	int instance;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap_bridge_port", "bridge_port", "bridge_key", br_key, s) {
+		dmuci_get_value_by_section_string(s, "bridge_port_instance", &tmp);
+		if (tmp[0] == '\0')
+			continue;
+		instance = atoi(tmp);
+		if(instance>max) max=instance;
+	}
+	return max;
+}
+
+int reset_br_port(char *br_key)
+{
+	struct uci_section *s, *prev_s = NULL;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap_bridge_port", "bridge_port", "bridge_key", br_key, s){
+		if (prev_s)
+			dmuci_delete_by_section(prev_s, NULL, NULL);
+		prev_s = s;
+	}
+
+	if (prev_s)
+		dmuci_delete_by_section(prev_s, NULL, NULL);
+	return 0;
+}
+
+int check_ifname_is_not_lan_port(char *ifname)
+{
+	struct uci_section *s;
+	if (!strstr(ifname, wan_baseifname)) {
+		uci_foreach_option_eq("ports", "ethport", "ifname", ifname, s) {
+			return 0;
+		}
+	}
+	return 1;
+}
+
+int update_port_parameters(char *linker, char *br_key, char *br_pt_inst, char *mg_port)
+{
+	struct uci_section *s, *dmmap_section;
+	if (check_ifname_is_vlan(linker)) {
+		uci_foreach_option_eq("network", "device", "ifname", linker, s) {
+			get_dmmap_section_of_config_section("dmmap_bridge_port", "bridge_port", section_name(s), &dmmap_section);
+			dmuci_set_value_by_section(dmmap_section, "bridge_key", br_key);
+			dmuci_set_value_by_section(dmmap_section, "bridge_port_instance", br_pt_inst);
+			dmuci_set_value_by_section(dmmap_section, "mg_port", mg_port);
+			break;
+		}
+	} else if (strncmp(linker, "ptm", 3) == 0) {
+		uci_foreach_option_eq("dsl", "ptm-device", "device", linker, s) {
+			get_dmmap_section_of_config_section("dmmap_bridge_port", "bridge_port", section_name(s), &dmmap_section);
+			dmuci_set_value_by_section(dmmap_section, "bridge_key", br_key);
+			dmuci_set_value_by_section(dmmap_section, "bridge_port_instance", br_pt_inst);
+			dmuci_set_value_by_section(dmmap_section, "mg_port", mg_port);
+			break;
+		}
+	} else if (strncmp(linker, "atm", 3) == 0) {
+		uci_foreach_option_eq("dsl", "atm-device", "device", linker, s) {
+			get_dmmap_section_of_config_section("dmmap_bridge_port", "bridge_port", section_name(s), &dmmap_section);
+			dmuci_set_value_by_section(dmmap_section, "bridge_key", br_key);
+			dmuci_set_value_by_section(dmmap_section, "bridge_port_instance", br_pt_inst);
+			dmuci_set_value_by_section(dmmap_section, "mg_port", mg_port);
+			break;
+		}
+	} else if (strncmp(linker, "wl", 2) == 0) {
+		uci_foreach_option_eq("wireless", "wifi-iface", "ifname", linker, s) {
+			get_dmmap_section_of_config_section("dmmap_bridge_port", "bridge_port", section_name(s), &dmmap_section);
+			dmuci_set_value_by_section(dmmap_section, "bridge_key", br_key);
+			dmuci_set_value_by_section(dmmap_section, "bridge_port_instance", br_pt_inst);
+			dmuci_set_value_by_section(dmmap_section, "mg_port", mg_port);
+			break;
+		}
+	} else if (strncmp(linker, "eth0", 4) == 0) {
+		uci_foreach_option_eq("network", "device", "name", linker, s) {
+			get_dmmap_section_of_config_section("dmmap_bridge_port", "bridge_port", section_name(s), &dmmap_section);
+			dmuci_set_value_by_section(dmmap_section, "bridge_key", br_key);
+			dmuci_set_value_by_section(dmmap_section, "bridge_port_instance", br_pt_inst);
+			dmuci_set_value_by_section(dmmap_section, "mg_port", mg_port);
+			break;
+		}
+	} else {
+		uci_foreach_option_eq("ports", "ethport", "ifname", linker, s) {
+			get_dmmap_section_of_config_section("dmmap_bridge_port", "bridge_port", section_name(s), &dmmap_section);
+			dmuci_set_value_by_section(dmmap_section, "bridge_key", br_key);
+			dmuci_set_value_by_section(dmmap_section, "bridge_port_instance", br_pt_inst);
+			dmuci_set_value_by_section(dmmap_section, "mg_port", mg_port);
+			break;
+		}
+	}
+	return 0;
+}
+
+static int is_br_port_enabled(struct bridging_port_args *curr_arg)
+{
+	struct uci_section *vlan_sec = curr_arg->bridge_port_sec, *br_sec = curr_arg->bridge_sec;
+	char *ifname, *br_ifname, *ifname_dup;
+
+	dmuci_get_value_by_section_string(br_sec, "ifname", &br_ifname);
+	dmuci_get_value_by_section_string(vlan_sec, "name", &ifname);
+	ifname_dup = dmstrdup(br_ifname);
+	if(ifname != NULL && ifname[0] != '\0') {
+		if (is_strword_in_optionvalue(ifname_dup, ifname))
+			return 1;
+	}
+	return 0;
+}
+
+static int update_br_port_ifname(struct bridging_port_args *curr_arg, int status)
+{
+	char ifname_dup[128], *ptr, *baseifname, *ifname, *start, *end;
+	struct uci_section *vlan_sec = curr_arg->bridge_port_sec, *br_sec = curr_arg->bridge_sec;
+	int pos=0;
+	dmuci_get_value_by_section_string(br_sec, "ifname", &ifname);
+	dmuci_get_value_by_section_string(vlan_sec, "name", &baseifname);
+	ptr = ifname_dup;
+	dmstrappendstr(ptr, ifname);
+	dmstrappendend(ptr);
+	if(status){
+		if (is_strword_in_optionvalue(ifname_dup, baseifname)) return 0;
+		if (ifname_dup[0] != '\0') dmstrappendchr(ptr, ' ');
+		dmstrappendstr(ptr, baseifname);
+		dmstrappendend(ptr);
+	}else{
+		if (is_strword_in_optionvalue(ifname_dup, baseifname)){
+			start = strstr(ifname_dup, baseifname);
+			end = start + strlen(baseifname);
+			if(start != ifname_dup){
+				start--;
+				pos=1;
+			}
+			memmove(start, start + strlen(baseifname)+pos, strlen(end) + 1);
+		}
+	}
+	dmuci_set_value_by_section(br_sec, "ifname", ifname_dup);
+	return 0;
+}
+
+/**************************************************************************
+*SET & GET BRIDGING PARAMETERS
+***************************************************************************/
+int get_Max_Bridge_Entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "20";
+	return 0;
+}
+
+int get_Max_DBridge_Entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "20";
+	return 0;
+}
+
+int get_Max_QBridge_Entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "20";
+	return 0;
+}
+
+int get_Max_VLAN_Entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "20";
+	return 0;
+}
+
+int get_Max_Provider_Bridge_Entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	return 0;
+}
+
+int get_Max_Filter_Entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	return 0;
+}
+
+/*#Device.Bridging.BridgeNumberOfEntries!UCI:network/interface/*/
+int get_Bridge_Number_Of_Entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	uci_foreach_option_eq("network", "interface", "type", "bridge", s)
+	{
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.Enable!UBUS:network.interface/status/interface,@Name/up*/
+int get_br_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(((struct bridging_args *)data)->bridge_sec), String}}, 1, &res);
+	DM_ASSERT(res, *value = "false");
+	*value = dmjson_get_value(res, 1, "up");
+	return 0;
+}
+
+int set_br_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmubus_call_set("network.interface", b ? "up" : "down", UBUS_ARGS{{"interface", section_name(((struct bridging_args *)data)->bridge_sec), String}}, 1);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.Status!UBUS:network.interface/status/interface,@Name/up*/
+int get_br_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(((struct bridging_args *)data)->bridge_sec), String}}, 1, &res);
+	DM_ASSERT(res, *value = "Disabled");
+	*value = dmjson_get_value(res, 1, "up");
+	if(strcmp(*value, "true") == 0)
+		*value = "Enabled";
+	else
+		*value = "Disabled";
+	return 0;
+}
+
+int get_br_standard(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "802.1Q-2011";
+	return 0;
+}
+
+int set_br_standard(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			return 0;
+	}
+	return 0;
+}
+
+int get_br_port_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap_bridge_port", "bridge_port", "bridge_key", instance, s)
+	{
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+int get_br_vlan_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap_network", "device", "bridge_key", instance, s)
+	{
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+int get_br_vlan_port_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap_network", "device", "bridge_key", instance, s)
+	{
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+int get_br_associated_interfaces(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct bridging_args *)data)->bridge_sec, "ifname", value);
+	return 0;
+}
+
+int set_br_associated_interfaces(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct bridging_args *)data)->bridge_sec, "ifname", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.Port.{i}.Enable!UBUS:network.device/status/name,@Name/speed*/
+int get_br_port_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	char *speed, *val;
+	struct uci_section *wifi_device_s;
+
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "ifname", value);
+	if(strncmp(*value, "wl", 2) == 0 || strncmp(*value, "ra", 2) == 0 || strncmp(*value, "apclii", 6) == 0) {
+		uci_foreach_option_eq("wireless", "wifi-iface", "ifname", *value, wifi_device_s) {
+			dmuci_get_value_by_section_string(wifi_device_s, "disabled", &val);
+			if ((val[0] == '\0') || (val[0] == '0'))
+				*value = "true";
+			else
+				*value = "false";
+			return 0;
+		}
+	}
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", *value, String}}, 1, &res);
+	DM_ASSERT(res, *value = "false");
+	speed = dmjson_get_value(res, 1, "speed");
+	if(*speed != '\0')
+		*value = "true";
+	else
+		*value = "false";
+	return 0;
+}
+
+int set_br_port_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.Port.{i}.Status!UBUS:network.device/status/name,@Name/speed*/
+int get_br_port_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	bool b;
+	get_br_port_enable(refparam, ctx, data, instance, value);
+	string_to_bool(*value, &b);
+	if (b)
+		*value = "Up";
+	else
+		*value = "Down";
+	return 0;
+}
+
+int get_br_port_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "name", value);
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.Port.{i}.LastChange!UBUS:network.interface/status/interface,@Name/uptime*/
+int get_br_port_last_change(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(((struct bridging_port_args *)data)->bridge_sec), String}}, 1, &res);
+	DM_ASSERT(res, *value = "0");
+	*value = dmjson_get_value(res, 1, "uptime");
+	if((*value)[0] == '\0')
+		*value = "0";
+	return 0;
+}
+
+int get_br_port_management(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section= NULL;
+
+	get_dmmap_section_of_config_section("dmmap_bridge_port", "bridge_port", section_name(((struct bridging_port_args *)data)->bridge_port_sec), &dmmap_section);
+	if(dmmap_section==NULL || dmmap_section==0)
+		dmmap_section= ((struct bridging_port_args *)data)->bridge_port_sec;
+	dmuci_get_value_by_section_string(dmmap_section, "mg_port", value);
+	return 0;
+}
+
+int set_br_port_management(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			return 0;
+	}
+	return 0;
+}
+
+static struct uci_section *check_if_ifname_is_tagged(char *ifname)
+{
+	struct uci_section *s;
+	uci_foreach_option_eq("network", "device", "name", ifname, s) {
+		return s;
+	}
+	return NULL;
+}
+
+int get_br_port_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *name;
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "name", &name);
+	if(check_if_ifname_is_tagged(name) != NULL)
+		*value = "CustomerVLANPort";
+	else
+		*value = "";
+	return 0;
+}
+
+int set_br_port_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			return 0;
+	}
+	return 0;
+}
+
+int get_br_port_default_user_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	char *name, *type, *priority;
+
+	*value = "";
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "name", &name);
+	s = check_if_ifname_is_tagged(name);
+	if(s != NULL) {
+		dmuci_get_value_by_section_string(s, "type", &type);
+		if(strcmp(type, "untagged") != 0)
+			dmuci_get_value_by_section_string(s, "priority", value);
+	}
+	return 0;
+}
+
+int set_br_port_default_user_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *s = NULL;
+	char *name, *type, *priority;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "name", &name);
+			s = check_if_ifname_is_tagged(name);
+			if(s != NULL) {
+				dmuci_get_value_by_section_string(s, "type", &type);
+				if(strcmp(type, "untagged") != 0)
+					dmuci_set_value_by_section(s, "priority", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_br_port_priority_regeneration(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0,1,2,3,4,5,6,7";
+	return 0;
+}
+
+int set_br_port_priority_regeneration(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			return 0;
+	}
+	return 0;
+}
+
+int get_br_port_port_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *name;
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "name", &name);
+	if(check_if_ifname_is_tagged(name) != NULL)
+		*value = "Forwarding";
+	else
+		*value = "Disabled";
+	return 0;
+}
+
+int get_br_port_pvid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	char *name, *type, *priority;
+
+	*value = "1";
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "name", &name);
+	s = check_if_ifname_is_tagged(name);
+	if(s != NULL) {
+		dmuci_get_value_by_section_string(s, "type", &type);
+		if(strcmp(type, "untagged") != 0)
+			dmuci_get_value_by_section_string(s, "vid", value);
+	}
+	return 0;
+}
+
+int set_br_port_pvid(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *s = NULL;
+	char *name, *type, *priority, *ifname, *new_name;
+	int is_enabled;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "name", &name);
+			s = check_if_ifname_is_tagged(name);
+			if(s != NULL) {
+				dmuci_get_value_by_section_string(s, "type", &type);
+				if(strcmp(type, "untagged") != 0) {
+					dmuci_set_value_by_section(s, "vid", value);
+					dmuci_get_value_by_section_string(s, "ifname", &ifname);
+					dmasprintf(&new_name, "%s.%s", ifname, value);
+					is_enabled = is_br_port_enabled((struct bridging_port_args *)data);
+					if(is_enabled)
+						update_br_port_ifname((struct bridging_port_args *)data, 0);
+					dmuci_set_value_by_section(s, "name", new_name);
+					if(is_enabled)
+						update_br_port_ifname((struct bridging_port_args *)data, 1);
+					dmfree(new_name);
+				}
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_br_port_tpid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *type;
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "type", &type);
+	if (strcmp(type, "8021q") == 0 || strcmp(type, "untagged") == 0)
+		*value = "33024";
+	else if (strcmp(type, "8021ad") == 0)
+		*value = "34984";
+	else
+		*value = "";
+	return 0;
+}
+
+int set_br_port_tpid(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "33024") == 0)
+				dmuci_set_value_by_section(((struct bridging_port_args *)data)->bridge_port_sec, "type", "8021q");
+			else if (strcmp(value, "34984") == 0)
+				dmuci_set_value_by_section(((struct bridging_port_args *)data)->bridge_port_sec, "type", "8021ad");
+			return 0;
+	}
+	return 0;
+}
+
+/**************************************************************************
+* GET STAT
+***************************************************************************/
+inline int get_bridge_port_statistics(void *data, char *stat_mod, char **value)
+{
+	json_object *res;
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "ifname", value);
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", *value, String}}, 1, &res);
+	DM_ASSERT(res, *value = "0");
+	*value = dmjson_get_value(res, 2, "statistics", stat_mod);
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.Port.{i}.Stats.BytesSent!UBUS:network.device/status/name,@Name/statistics.tx_bytes*/
+int get_br_port_stats_tx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	get_bridge_port_statistics(data, "tx_bytes", value);
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.Port.{i}.Stats.BytesSent!UBUS:network.device/status/name,@Name/statistics.rx_bytes*/
+int get_br_port_stats_rx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	get_bridge_port_statistics(data, "rx_bytes", value);
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.Port.{i}.Stats.PacketsSent!UBUS:network.device/status/name,@Name/statistics.tx_packets*/
+int get_br_port_stats_tx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	get_bridge_port_statistics(data, "tx_packets", value);
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.Port.{i}.Stats.PacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_packets*/
+int get_br_port_stats_rx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	get_bridge_port_statistics(data, "rx_packets", value);
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.Port.{i}.Stats.ErrorsSent!UBUS:network.device/status/name,@Name/statistics.tx_errors*/
+int get_br_port_stats_tx_errors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	get_bridge_port_statistics(data, "tx_errors", value);
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.Port.{i}.Stats.ErrorsReceived!UBUS:network.device/status/name,@Name/statistics.rx_errors*/
+int get_br_port_stats_rx_errors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	get_bridge_port_statistics(data, "rx_errors", value);
+	return 0;
+}
+
+int get_br_port_stats_tx_unicast_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ifname;
+	*value = "0";
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "ifname", &ifname);
+	if(ifname[0] != '\0' && !strstr(ifname, "atm") && !strstr(ifname, "ptm"))
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(ifname, "TX", "unicast"));
+	return 0;
+}
+
+int get_br_port_stats_rx_unicast_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ifname;
+	*value = "0";
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "ifname", &ifname);
+	if(ifname[0] != '\0' && !strstr(ifname, "atm") && !strstr(ifname, "ptm"))
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(ifname, "RX", "unicast"));
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.Port.{i}.Stats.DiscardPacketsSent!UBUS:network.device/status/name,@Name/statistics.tx_dropped*/
+int get_br_port_stats_tx_discard_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	get_bridge_port_statistics(data, "tx_dropped", value);
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.Port.{i}.Stats.DiscardPacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_dropped*/
+int get_br_port_stats_rx_discard_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	get_bridge_port_statistics(data, "rx_dropped", value);
+	return 0;
+}
+
+int get_br_port_stats_tx_multicast_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ifname;
+	*value = "0";
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "ifname", &ifname);
+	if(ifname[0] != '\0' && !strstr(ifname, "atm") && !strstr(ifname, "ptm"))
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(ifname, "TX", "multicast"));
+	return 0;
+}
+
+int get_br_port_stats_rx_multicast_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ifname;
+	*value = "0";
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "ifname", &ifname);
+	if(ifname[0] != '\0' && !strstr(ifname, "atm") && !strstr(ifname, "ptm"))
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(ifname, "RX", "multicast"));
+	return 0;
+}
+
+int get_br_port_stats_tx_broadcast_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ifname;
+	*value = "0";
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "ifname", &ifname);
+	if(ifname[0] != '\0' && !strstr(ifname, "atm") && !strstr(ifname, "ptm"))
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(ifname, "TX", "broadcast"));
+	return 0;
+}
+
+int get_br_port_stats_rx_broadcast_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ifname;
+	*value = "0";
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "ifname", &ifname);
+	if(ifname[0] != '\0' && !strstr(ifname, "atm") && !strstr(ifname, "ptm"))
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(ifname, "RX", "broadcast"));
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.Port.{i}.Stats.UnknownProtoPacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_over_errors*/
+int get_br_port_stats_rx_unknown_proto_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	get_bridge_port_statistics(data, "rx_over_errors", value);
+	return 0;
+}
+
+static int is_bridge_vlan_enabled(struct bridging_vlan_args *curr_arg)
+{
+	struct uci_section *vlan_sec = curr_arg->bridge_vlan_sec, *br_sec = curr_arg->bridge_sec;
+	char *ifname, *br_ifname, *ifname_dup, *pch, *spch;
+
+	dmuci_get_value_by_section_string(br_sec, "ifname", &br_ifname);
+	dmuci_get_value_by_section_string(vlan_sec, "name", &ifname);
+	ifname_dup = dmstrdup(br_ifname);
+	if(ifname!=NULL && ifname[0]!='\0'){
+		if (is_strword_in_optionvalue(ifname_dup, ifname))
+			return 1;
+	}
+	return 0;
+}
+
+static int update_br_vlan_ifname(struct bridging_vlan_args *curr_arg, int status)
+{
+	char ifname_dup[128], *ptr, *baseifname, *ifname, *start, *end;
+	struct uci_section *vlan_sec = curr_arg->bridge_vlan_sec, *br_sec = curr_arg->bridge_sec;
+	int pos=0;
+	dmuci_get_value_by_section_string(br_sec, "ifname", &ifname);
+	dmuci_get_value_by_section_string(vlan_sec, "name", &baseifname);
+	ptr = ifname_dup;
+	dmstrappendstr(ptr, ifname);
+	dmstrappendend(ptr);
+	if(status){
+		if (is_strword_in_optionvalue(ifname_dup, baseifname)) return 0;
+		if (ifname_dup[0] != '\0') dmstrappendchr(ptr, ' ');
+		dmstrappendstr(ptr, baseifname);
+		dmstrappendend(ptr);
+	}else{
+		if (is_strword_in_optionvalue(ifname_dup, baseifname)){
+			start = strstr(ifname_dup, baseifname);
+			end = start + strlen(baseifname);
+			if(start != ifname_dup){
+				start--;
+				pos=1;
+			}
+			memmove(start, start + strlen(baseifname)+pos, strlen(end) + 1);
+		}
+	}
+	dmuci_set_value_by_section(br_sec, "ifname", ifname_dup);
+	return 0;
+}
+
+int get_br_vlan_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "false";
+	int status;
+	status = is_bridge_vlan_enabled((struct bridging_vlan_args *)data);
+	if (status)
+		*value = "true";
+	return 0;
+}
+
+int set_br_vlan_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	char *vlan_ifname, *br_ifname, *vid, *p;
+	char new_ifname[256];
+	char pr_linker[32];
+	int is_enabled;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			is_enabled = is_bridge_vlan_enabled((struct bridging_vlan_args *)data);
+			if (b && !is_enabled) {
+				update_br_vlan_ifname((struct bridging_vlan_args *)data, 1);
+			}
+			if (!b && is_enabled){
+				update_br_vlan_ifname((struct bridging_vlan_args *)data, 0);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_br_vlan_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "";
+	*value = dmstrdup(section_name(((struct bridging_vlan_args *)data)->bridge_vlan_sec));
+	return 0;
+}
+
+int set_br_vlan_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			 dmuci_rename_section_by_section(((struct bridging_vlan_args *)data)->bridge_vlan_sec,value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_br_vlan_vid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	dmuci_get_value_by_section_string(((struct bridging_vlan_args *)data)->bridge_vlan_sec, "vid", value);
+	return 0;
+}
+
+int set_br_vlan_vid(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *name, *br_ifname, *ifname;
+	int is_enabled;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct bridging_vlan_args *)data)->bridge_vlan_sec, "vid", value);
+			dmuci_get_value_by_section_string(((struct bridging_vlan_args *)data)->bridge_vlan_sec, "ifname", &ifname);
+			dmasprintf(&name, "%s.%s", ifname, value);
+			is_enabled = is_bridge_vlan_enabled((struct bridging_vlan_args *)data);
+			if(is_enabled)
+				update_br_vlan_ifname((struct bridging_vlan_args *)data, 0);
+			dmuci_set_value_by_section(((struct bridging_vlan_args *)data)->bridge_vlan_sec, "name", name);
+			if(is_enabled)
+				update_br_vlan_ifname((struct bridging_vlan_args *)data, 1);
+			dmfree(name);
+			return 0;
+	}
+	return 0;
+}
+
+int get_br_vlan_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	dmuci_get_value_by_section_string(((struct bridging_vlan_args *)data)->bridge_vlan_sec, "priority", value);
+	return 0;
+}
+
+int set_br_vlan_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct bridging_vlan_args *)data)->bridge_vlan_sec, "priority", value);
+			return 0;
+	}
+	return 0;
+}
+/*************************************************************
+ * GET SET ALIAS
+/*************************************************************/
+int get_br_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(((struct bridging_args *)data)->bridge_sec), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "bridge_alias", value);
+	return 0;
+}
+
+int set_br_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(((struct bridging_args *)data)->bridge_sec), &dmmap_section);
+			dmuci_set_value_by_section(dmmap_section, "bridge_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_br_port_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section= NULL;
+
+	get_dmmap_section_of_config_section("dmmap_bridge_port", "bridge_port", section_name(((struct bridging_port_args *)data)->bridge_port_sec), &dmmap_section);
+	if(dmmap_section==NULL || dmmap_section==0)
+		dmmap_section= ((struct bridging_port_args *)data)->bridge_port_sec;
+
+	dmuci_get_value_by_section_string(dmmap_section, "bridge_port_alias", value);
+	return 0;
+}
+
+int set_br_port_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section= NULL;
+
+	get_dmmap_section_of_config_section("dmmap_bridge_port", "bridge_port", section_name(((struct bridging_port_args *)data)->bridge_port_sec), &dmmap_section);
+	if(dmmap_section==NULL || dmmap_section==0)
+		dmmap_section= ((struct bridging_port_args *)data)->bridge_port_sec;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, "bridge_port_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_br_vlan_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_network", "device", section_name(((struct bridging_vlan_args *)data)->bridge_vlan_sec), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "bridge_vlan_alias", value);
+	return 0;
+}
+
+int set_br_vlan_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			get_dmmap_section_of_config_section("dmmap_network", "device", section_name(((struct bridging_vlan_args *)data)->bridge_vlan_sec), &dmmap_section);
+			dmuci_set_value_by_section(dmmap_section, "bridge_vlan_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*************************************************************
+ * ADD DELETE OBJECT
+/*************************************************************/
+int add_bridge(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	char *last_inst, *v;
+	char bridge_name[16], ib[8];
+	char *p = bridge_name;
+	struct uci_section* dmmap_bridge= NULL;
+
+	last_inst = get_last_instance_lev2_icwmpd("network", "interface", "dmmap_network", "bridge_instance", "type", "bridge");
+	sprintf(ib, "%d", last_inst ? atoi(last_inst)+1 : 1);
+	dmstrappendstr(p, "bridge_0_");
+	dmstrappendstr(p, ib);
+	dmstrappendend(p);
+	dmuci_set_value("network", bridge_name, "", "interface");
+	dmuci_set_value("network", bridge_name, "type", "bridge");
+	dmuci_set_value("network", bridge_name, "proto", "dhcp");
+
+	dmuci_add_section_icwmpd("dmmap_network", "interface", &dmmap_bridge, &v);
+	dmuci_set_value_by_section(dmmap_bridge, "section_name", bridge_name);
+	*instance = update_instance_icwmpd(dmmap_bridge, last_inst, "bridge_instance");
+
+	update_section_list(DMMAP,"bridge_port", "bridge_key", 1, ib, "mg_port", "true", "bridge_port_instance", "1");
+	return 0;
+}
+
+int delete_bridge(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *s = NULL, *prev_s = NULL;
+	struct uci_section *bridge_s, *vlan_s, *dmmap_section= NULL;
+	char *bridgekey = NULL;
+
+	switch (del_action) {
+		case DEL_INST:
+			get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(((struct bridging_args *)data)->bridge_sec), &dmmap_section);
+			dmuci_set_value_by_section(((struct bridging_args *)data)->bridge_sec, "type", "");
+			dmuci_set_value_by_section(dmmap_section, "bridge_instance", "");
+			dmuci_set_value_by_section(dmmap_section, "ip_int_instance", "");
+			dmuci_set_value_by_section(dmmap_section, "ipv4_instance", "");
+			uci_path_foreach_option_eq(icwmpd, "dmmap", "bridge_port", "bridge_key", ((struct bridging_args *)data)->br_key, s) {
+				if (prev_s)
+					DMUCI_DELETE_BY_SECTION(icwmpd, prev_s, NULL, NULL);
+				prev_s = s;
+			}
+			if (prev_s)
+				DMUCI_DELETE_BY_SECTION(icwmpd, prev_s, NULL, NULL);
+			reset_br_port( ((struct bridging_args *)data)->br_key);
+			dmuci_set_value_by_section(((struct bridging_args *)data)->bridge_sec, "ifname", "");
+			break;
+		case DEL_ALL:
+			uci_foreach_option_eq("network", "interface", "type", "bridge", bridge_s) {
+				get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(bridge_s), &dmmap_section);
+				dmuci_set_value_by_section(bridge_s, "type", "");
+				dmuci_get_value_by_section_string(dmmap_section, "bridge_instance", &bridgekey);
+				dmuci_set_value_by_section(dmmap_section, "bridge_instance", "");
+				dmuci_set_value_by_section(dmmap_section, "ip_int_instance", "");
+				dmuci_set_value_by_section(dmmap_section, "ipv4_instance", "");
+				uci_path_foreach_option_eq(icwmpd, "dmmap", "bridge_port", "bridge_key", bridgekey, s) {
+					prev_s = s;
+				}
+				if (prev_s)
+					DMUCI_DELETE_BY_SECTION(icwmpd, prev_s, NULL, NULL);
+				reset_br_port(bridgekey);
+				dmuci_set_value_by_section(bridge_s, "ifname", "");
+			}
+			break;
+	}
+	return 0;
+}
+
+int add_br_vlan(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	char *value, *last_instance, *v, *vlan_name, *name, *last_vid, *vid;
+	struct uci_section *vlan_s, *dmmap_bridge_vlan;
+
+	check_create_dmmap_package("dmmap_network");
+	last_instance = get_last_instance_lev2_icwmpd_dmmap_opt("dmmap_network", "device", "bridge_vlan_instance", "bridge_key", ((struct bridging_args *)data)->br_key);
+	dmasprintf(&vlan_name, "vlan%d", last_instance ? atoi(last_instance)+ 1 : 1);
+	last_vid = get_last_vid();
+	dmasprintf(&name, "%s.%d", wan_baseifname, last_vid ? atoi(last_vid)+ 1 : 1001);
+	dmasprintf(&vid, "%d", last_vid ? atoi(last_vid)+ 1 : 1001);
+	dmuci_add_section_and_rename("network", "device", &vlan_s, &value);
+	dmuci_rename_section_by_section(vlan_s, vlan_name);
+	dmuci_set_value_by_section(vlan_s, "priority", "0");
+	dmuci_set_value_by_section(vlan_s, "type", "8021q");
+	dmuci_set_value_by_section(vlan_s, "vid", vid);
+	dmuci_set_value_by_section(vlan_s, "name", name);
+	dmuci_set_value_by_section(vlan_s, "ifname", wan_baseifname);
+	dmfree(name);
+	dmfree(vid);
+
+	dmuci_add_section_icwmpd("dmmap_network", "device", &dmmap_bridge_vlan, &v);
+	dmuci_set_value_by_section(dmmap_bridge_vlan, "section_name", vlan_name);
+	dmuci_set_value_by_section(dmmap_bridge_vlan, "bridge_key", ((struct bridging_args *)data)->br_key);
+	*instance = update_instance_icwmpd(dmmap_bridge_vlan, last_instance, "bridge_vlan_instance");
+	return 0;
+}
+
+int delete_br_vlan(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	char *vid, *ifname, *type;
+	struct uci_section *prev_s = NULL, *vlan_s=NULL, *dmmap_section;
+	char new_ifname[128];
+	int is_enabled;
+
+	switch (del_action) {
+	case DEL_INST:
+		is_enabled = is_bridge_vlan_enabled((struct bridging_vlan_args *)data);
+		if(is_enabled)
+			update_br_vlan_ifname((struct bridging_vlan_args *)data, 0);
+		get_dmmap_section_of_config_section("dmmap_network", "device", section_name(((struct bridging_vlan_args *)data)->bridge_vlan_sec), &dmmap_section);
+		dmuci_delete_by_section(dmmap_section, NULL, NULL);
+		dmuci_delete_by_section(((struct bridging_vlan_args *)data)->bridge_vlan_sec, NULL, NULL);
+		break;
+	case DEL_ALL:
+		uci_foreach_sections("network", "device", vlan_s) {
+			dmuci_get_value_by_section_string(vlan_s, "type", &type);
+			if (strcmp(type, "untagged")==0)
+				continue;
+			dmuci_get_value_by_section_string(vlan_s, "vid", &vid);
+			dmuci_get_value_by_section_string(((struct bridging_args *)data)->bridge_sec, "ifname", &ifname);
+			if(ifname[0] != '\0' && vid[0] != '\0'){
+				remove_vid_interfaces_from_ifname(vid, ifname, new_ifname);
+				dmuci_set_value_by_section(((struct bridging_args *)data)->bridge_sec, "ifname", new_ifname);
+			}
+			if (prev_s != NULL){
+				get_dmmap_section_of_config_section("dmmap_network", "device", section_name(prev_s), &dmmap_section);
+				dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(prev_s, NULL, NULL);
+			}
+			prev_s = vlan_s;
+		}
+		if (prev_s != NULL){
+			get_dmmap_section_of_config_section("dmmap_network", "device", section_name(prev_s), &dmmap_section);
+			dmuci_delete_by_section(dmmap_section, NULL, NULL);
+			dmuci_delete_by_section(prev_s, NULL, NULL);
+		}
+		break;
+	}
+	return 0;
+}
+
+int add_br_port(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	char *value;
+	struct uci_section *br_port_s;
+
+	int m = get_br_port_last_inst(((struct bridging_args *)data)->br_key);
+	dmasprintf(instance, "%d", m+1);
+	DMUCI_ADD_SECTION(icwmpd, "dmmap_bridge_port", "bridge_port", &br_port_s, &value);
+	dmuci_set_value_by_section(br_port_s, "bridge_key", ((struct bridging_args *)data)->br_key);
+	dmuci_set_value_by_section(br_port_s, "bridge_port_instance", *instance);
+	dmuci_set_value_by_section(br_port_s, "mg_port", "false");
+	return 0;
+}
+
+int delete_br_port(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	char *ifname;
+	char new_ifname[128];
+	struct uci_section *s = NULL, *prev_s = NULL, *dmmap_section= NULL;
+
+	switch (del_action) {
+	case DEL_INST:
+		get_dmmap_section_of_config_section("dmmap_bridge_port", "bridge_port", section_name(((struct bridging_port_args *)data)->bridge_port_sec), &dmmap_section);
+		if(dmmap_section==NULL || dmmap_section==0){
+			dmmap_section= ((struct bridging_port_args *)data)->bridge_port_sec;
+			dmuci_delete_by_section_unnamed_icwmpd(dmmap_section, NULL, NULL);
+		}
+		else{
+			dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_sec, "ifname", &ifname);
+			if(ifname[0] != '\0'){
+				remove_interface_from_ifname(((struct bridging_port_args *)data)->ifname, ifname, new_ifname);
+				dmuci_set_value_by_section(((struct bridging_port_args *)data)->bridge_sec, "ifname", new_ifname);
+			}
+			get_dmmap_section_of_config_section("dmmap_bridge_port", "bridge_port", section_name(((struct bridging_port_args *)data)->bridge_port_sec), &dmmap_section);
+			dmuci_delete_by_section_unnamed_icwmpd(dmmap_section, NULL, NULL);
+		}
+		break;
+	case DEL_ALL:
+		uci_path_foreach_option_eq(icwmpd, "dmmap_bridge_port", "bridge_port", "bridge_key", ((struct bridging_args *)data)->br_key, s) {
+			if (prev_s)
+				DMUCI_DELETE_BY_SECTION(icwmpd, prev_s, NULL, NULL);
+			prev_s = s;
+		}
+		if (prev_s)
+			DMUCI_DELETE_BY_SECTION(icwmpd, prev_s, NULL, NULL);
+		dmuci_set_value_by_section(((struct bridging_args *)data)->bridge_sec, "ifname", ""); // TO CHECK
+		break;
+	}
+	return 0;
+}
+
+/*************************************************************
+ * LOWER LAYER
+/*************************************************************/
+int check_port_with_ifname (char *ifname, struct uci_section **ss)
+{
+	struct uci_section *sss, *s;
+	char *file_config_name;
+	char *atm_device, *ptm_device;
+
+	dmasprintf(&file_config_name, "%s","/etc/config/dsl");
+
+	if (check_ifname_is_vlan(ifname)) {
+		uci_foreach_option_eq("network", "device", "name", ifname, s) {
+			*ss = s;
+			break;
+		}
+	}
+	else if (strncmp(ifname, "ptm", 3) == 0) {
+		if(access( file_config_name, F_OK ) != -1){
+			uci_foreach_sections("dsl", "ptm-device", sss) {
+				dmuci_get_value_by_section_string(sss, "device", &ptm_device);
+				dmasprintf(&ptm_device, "%s.1", ptm_device);
+				if(strcmp(ifname, ptm_device)==0) {
+					uci_foreach_option_eq("network", "device", "name", ifname, s) {
+						*ss = s;
+						break;
+					}
+				}
+			}
+		}
+	}
+	else if (strncmp(ifname, "atm", 3) == 0) {
+		if(access( file_config_name, F_OK ) != -1){
+			uci_foreach_sections("dsl", "atm-device", sss) {
+				dmuci_get_value_by_section_string(sss, "device", &atm_device);
+				dmasprintf(&atm_device, "%s.1", atm_device);
+				if(strcmp(ifname, atm_device)==0) {
+					uci_foreach_option_eq("network", "device", "name", ifname, s) {
+						*ss = s;
+						break;
+					}
+				}
+			}
+		}
+	}
+	else if(strncmp(ifname, wan_baseifname, strlen(wan_baseifname))==0) {
+		uci_foreach_option_eq("network", "device", "name", ifname, s) {
+			*ss = s;
+			break;
+		}
+	}
+	else if(strncmp(ifname, "wl", 2) == 0 || strncmp(ifname, "ra", 2) == 0 || strncmp(ifname, "apclii", 6) == 0) {
+		uci_foreach_option_eq("wireless", "wifi-iface", "ifname", ifname, s) {
+			*ss = s;
+			break;
+		}
+	}
+	else {
+		uci_foreach_option_eq("ports", "ethport", "ifname", ifname, s) {
+			*ss = s;
+			break;
+		}
+	}
+	return 0;
+}
+
+int get_port_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *mg_port, *pch, *spch, *ifname, *ifname_dup, *p, *linker = "";
+	char buf[16], plinker[32], lbuf[512];
+	struct uci_section *s = NULL;
+
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "mg_port", &mg_port);
+	dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_sec, "ifname", &ifname);
+	if (ifname[0] != '\0' && strcmp(mg_port, "true") ==  0) {
+		ifname_dup = dmstrdup(ifname);
+		p = lbuf;
+		for (pch = strtok_r(ifname_dup, " ", &spch); pch != NULL; pch = strtok_r(NULL, " ", &spch)) {
+			check_port_with_ifname(pch, &s);
+			if(s == NULL)
+				continue;
+			sprintf(plinker, "%s+%s", section_name(s), pch);
+			adm_entry_get_linker_param(ctx, dm_print_path("%s%cBridging%cBridge%c", dmroot, dm_delim, dm_delim, dm_delim), plinker, value);
+			if (*value == NULL)
+				*value = "";
+			dmstrappendstr(p, *value);
+			dmstrappendchr(p, ',');
+		}
+		p = p -1;
+		dmstrappendend(p);
+		*value = dmstrdup(lbuf);
+		return 0;
+	} else {
+		dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "ifname", &linker);
+		if (strcmp(linker, wan_baseifname) == 0) {
+			dmasprintf(&linker, "%s.1", linker);
+		}
+		if(((struct bridging_port_args *)data)->vlan) {
+			strncpy(buf, linker, 5);
+			buf[5] = '\0';
+			strcat(buf, "1");
+			linker = buf;
+		}
+	}
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cEthernet%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value);
+	if (*value == NULL)
+		adm_entry_get_linker_param(ctx,dm_print_path("%s%cWiFi%cSSID%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value);
+	if (*value == NULL)
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cATM%cLink%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value);
+	if (*value == NULL)
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cPTM%cLink%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value);
+
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+int set_port_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *linker, *iface, *ifname, *p, *br_key, *br_pt_inst = "", *mg_port = "false", *br_port_ifname, *vid = NULL;
+	char *newvalue= NULL;
+	char new_ifname[256];
+	char tmp[16];
+	char pr_linker[32];
+	struct uci_section *s;
+	struct uci_section *dmmap_section= NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			get_dmmap_section_of_config_section("dmmap_bridge_port", "bridge_port", section_name(((struct bridging_port_args *)data)->bridge_port_sec), &dmmap_section);
+			dmuci_get_value_by_section_string(dmmap_section, "mg_port", &mg_port);
+			if (value[strlen(value)-1]!='.') {
+				dmasprintf(&newvalue, "%s.", value);
+				adm_entry_get_linker_value(ctx, newvalue, &linker);
+			} else
+				adm_entry_get_linker_value(ctx, value, &linker);
+			if (strcmp(mg_port, "false")!=0 && linker && !check_ifname_exist_in_br_ifname_list(linker))
+				return FAULT_9001;
+			return 0;
+		case VALUESET:
+			if (value[strlen(value)-1]!='.') {
+				dmasprintf(&newvalue, "%s.", value);
+				adm_entry_get_linker_value(ctx, newvalue, &linker);
+			} else
+				adm_entry_get_linker_value(ctx, value, &linker);
+			 //check ifname(linker) doesn't exit in bridges
+			if (linker && check_ifname_exist_in_br_ifname_list(linker)) {
+				//save param of current port and copy it to new port
+				dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "bridge_key", &br_key);
+				dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "bridge_port_instance", &br_pt_inst);
+				dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_port_sec, "mg_port", &mg_port);
+				//remove old port (ifname) from bridge
+				if (((struct bridging_port_args *)data)->ifname[0] != 0 && strcmp(((struct bridging_port_args *)data)->ifname, linker) != 0) {
+					delete_br_port(NULL, ctx, data, instance, DEL_INST);
+				}
+				// check if the current port is already linked with VLAN
+				sprintf(pr_linker,"%s+%s", section_name(((struct bridging_port_args *)data)->bridge_port_sec), ((struct bridging_port_args *)data)->ifname);
+				uci_foreach_option_eq("network", "device", "br_port_linker", pr_linker, s) {
+					dmuci_get_value_by_section_string(s, "vlan8021q", &vid);
+					break;
+				}
+				dmuci_get_value_by_section_string(((struct bridging_port_args *)data)->bridge_sec, "ifname", &ifname);
+				p = new_ifname;
+				if (ifname[0] != '\0') {
+					dmstrappendstr(p, ifname);
+					dmstrappendchr(p, ' ');
+				}
+				if(vid && check_ifname_is_not_lan_port(linker) && !strstr (linker, "wl")) {
+					strncpy(tmp, linker, 5);
+					tmp[5] = '\0';
+					strcat(tmp, vid);
+					linker = tmp;
+					dmstrappendstr(p, tmp);
+					dmstrappendend(p);
+					uci_foreach_option_eq("network", "device", "br_port_linker", pr_linker, s) {
+						sprintf(pr_linker,"%s+%s", section_name(s), linker);
+						dmuci_set_value_by_section(s, "br_port_linker", pr_linker);
+						dmuci_set_value_by_section(s, "ifname", linker);
+						dmuci_set_value_by_section(s, "penable", "1");
+					}
+				} else {
+					dmstrappendstr(p, linker);
+					dmstrappendend(p);
+				}
+				dmuci_set_value_by_section(((struct bridging_port_args *)data)->bridge_sec, "ifname", new_ifname);
+				//remove old br_port param to the new one
+				update_port_parameters(linker, br_key, br_pt_inst, mg_port);
+				if(((struct bridging_port_args *)data)->ifname[0] == '\0')
+					DMUCI_DELETE_BY_SECTION(icwmpd,((struct bridging_port_args *)data)->bridge_port_sec, NULL, NULL);// delete dmmap section after remove br_port_instance to adequate config
+			} else {
+				return FAULT_9005;
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_vlan_port_vlan_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char linker[8];
+	sprintf(linker,"vlan%s_%s", ((struct bridging_vlan_args *)data)->vlan_port, ((struct bridging_vlan_args *)data)->br_inst);
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cBridging%cBridge%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+int set_vlan_port_vlan_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			return 0;
+	}
+	return 0;
+}
+
+int get_vlan_port_port_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char linker[16], *name;
+	dmuci_get_value_by_section_string(((struct bridging_vlan_args *)data)->bridge_vlan_sec, "name", &name);
+	sprintf(linker,"%s+%s", section_name(((struct bridging_vlan_args *)data)->bridge_vlan_sec), name);
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cBridging%cBridge%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+int set_vlan_port_port_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *linker = NULL, *vid, *enable, *vifname, tmp[8], *pch, *p, *br_ifname;
+	char new_ifname[16];
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			adm_entry_get_linker_value(ctx, value, &linker);
+			if (!linker) {
+				dmuci_set_value_by_section(((struct bridging_vlan_args *)data)->bridge_vlan_sec, "br_port_linker", "");
+				set_br_vlan_enable(refparam, ctx, data, instance, "false", action);
+				return 0;
+			}
+			dmuci_set_value_by_section(((struct bridging_vlan_args *)data)->bridge_vlan_sec, "br_port_linker", linker);
+			dmuci_get_value_by_section_string(((struct bridging_vlan_args *)data)->bridge_vlan_sec, "vlan8021q", &vid);
+			pch = strchr(linker, '+') + 1;
+			if (pch[0] == '\0') {
+				dmfree(linker);
+				return 0;
+			}
+			if (vid[0] == '\0') {
+				if (strstr(pch, "atm") || strstr(pch, "ptm") || strstr(pch, wan_baseifname)) {
+					strncpy(tmp, pch, 4);
+					tmp[4] ='\0';
+					dmuci_set_value_by_section(((struct bridging_vlan_args *)data)->bridge_vlan_sec, "ifname", tmp);
+				}
+			} else {
+				if (strstr(pch, "atm") || strstr(pch, "ptm") || strstr(pch, wan_baseifname)) {
+					p = new_ifname;
+					strncpy(tmp, pch, 4);
+					tmp[4] ='\0';
+					dmuci_set_value_by_section(((struct bridging_vlan_args *)data)->bridge_vlan_sec, "ifname", tmp);
+					dmstrappendstr(p,  tmp);
+					dmstrappendchr(p, '.');
+					dmstrappendstr(p, vid);
+					dmstrappendend(p);
+					dmuci_set_value_by_section(((struct bridging_vlan_args *)data)->bridge_vlan_sec, "ifname", new_ifname);
+					dmuci_get_value_by_section_string(((struct bridging_vlan_args *)data)->bridge_vlan_sec, "penable", &enable);///TO CHECK
+					// add to bridge ifname if enable = 1
+					if (enable[0] == '1') {
+						vifname = dmstrdup(new_ifname);
+						dmuci_get_value_by_section_string(((struct bridging_vlan_args *)data)->bridge_sec, "ifname", &br_ifname);
+						p = new_ifname;
+						if (br_ifname[0] != '\0') {
+							dmstrappendstr(p, br_ifname);
+							dmstrappendchr(p, ' ');
+						}
+						dmstrappendstr(p, vifname);
+						dmstrappendend(p);
+						dmuci_set_value_by_section(((struct bridging_vlan_args *)data)->bridge_sec, "ifname", new_ifname);
+						dmfree(vifname);
+					}
+				}
+			}
+			dmfree(linker);
+			return 0;
+	}
+	return 0;
+}
+
+int get_br_vlan_untagged(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int set_br_vlan_untagged(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			return 0;
+	}
+	return 0;
+}
+
+/*************************************************************
+ * ENTRY METHOD
+/*************************************************************/
+/*#Device.Bridging.Bridge.{i}.!UCI:network/interface/dmmap_network*/
+int browseBridgeInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *br_inst = NULL, *br_inst_last = NULL, *ifname;
+	struct bridging_args curr_bridging_args = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	dmuci_get_option_value_string("ports", "WAN", "ifname", &wan_baseifname);
+
+	synchronize_specific_config_sections_with_dmmap_eq("network", "interface", "dmmap_network", "type", "bridge", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		br_inst = handle_update_instance(1, dmctx, &br_inst_last, update_instance_alias, 3, p->dmmap_section, "bridge_instance", "bridge_alias");
+		dmuci_get_value_by_section_string(p->config_section, "ifname", &ifname);
+		init_bridging_args(&curr_bridging_args, p->config_section, br_inst_last, ifname, br_inst);
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_bridging_args, br_inst) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+static void set_bridge_port_parameters(struct uci_section *dmmap_section, char* bridge_key)
+{
+	DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_section, "bridge_key", bridge_key);
+	DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_section, "mg_port", "false");
+	DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_section, "penable", "1");
+	DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_section, "is_dmmap", "false");
+}
+
+int browseBridgePortInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance){
+	struct uci_section *new_port = NULL, *ss_atm = NULL, *ss_ptm = NULL;
+	char *port = NULL, *port_last = NULL, *ifname_dup = NULL, *pch, *spch, *is_dmmap, *file_config_name, *deviceatm, *deviceptm, *atm_device, *ptm_device;
+	bool find_max = true, found = false;
+	struct bridging_port_args curr_bridging_port_args = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	dmasprintf(&file_config_name, "%s","/etc/config/dsl");
+	check_create_dmmap_package("dmmap_bridge_port");
+	update_section_list_icwmpd("dmmap_bridge_port","bridge_port", "bridge_key", 1, ((struct bridging_args *)prev_data)->br_key, "mg_port", "true", "bridge_port_instance", "1");
+	uci_path_foreach_option_eq(icwmpd, "dmmap_bridge_port", "bridge_port", "bridge_key", ((struct bridging_args *)prev_data)->br_key, new_port) {
+		dmuci_get_value_by_section_string(new_port, "is_dmmap", &is_dmmap);
+		if(strcmp(is_dmmap, "false") !=0 ) {
+			init_bridging_port_args(&curr_bridging_port_args, new_port, ((struct bridging_args *)prev_data)->bridge_sec, false, "");
+			port = handle_update_instance(2, dmctx, &port_last, update_instance_alias_icwmpd, 5, new_port, "bridge_port_instance", "bridge_port_alias",  &find_max, ((struct bridging_args *)prev_data)->br_key);
+			if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_bridging_port_args, port) == DM_STOP)
+				goto end;
+		}
+	}
+
+	if (((struct bridging_args *)prev_data)->ifname[0] == '\0')
+		return 0;
+	ifname_dup = dmstrdup(((struct bridging_args *)prev_data)->ifname);
+	for (pch = strtok_r(ifname_dup, " ", &spch); pch != NULL; pch = strtok_r(NULL, " ", &spch)) {
+		found = false;
+
+		if(!found)
+			found= synchronize_multi_config_sections_with_dmmap_eq("ports", "ethport", "dmmap_bridge_port", "bridge_port", "ifname", pch, pch, &dup_list);
+
+		if(!found)
+			found= synchronize_multi_config_sections_with_dmmap_eq("wireless", "wifi-iface", "dmmap_bridge_port", "bridge_port", "ifname", pch, pch, &dup_list);
+
+		if(access( file_config_name, F_OK ) != -1) {
+			uci_foreach_sections("dsl", "atm-device", ss_atm) {
+				dmuci_get_value_by_section_string(ss_atm, "device", &deviceatm);
+				dmasprintf(&atm_device, "%s.1", deviceatm);
+				if(!found) {
+					if(strncmp(pch, atm_device, strlen(atm_device))==0) {
+						found= synchronize_multi_config_sections_with_dmmap_eq("network", "device", "dmmap_bridge_port", "bridge_port", "name", pch, pch, &dup_list);
+					}
+				}
+			}
+
+			uci_foreach_sections("dsl", "ptm-device", ss_ptm) {
+				dmuci_get_value_by_section_string(ss_ptm, "device", &deviceptm);
+				dmasprintf(&ptm_device, "%s.1", deviceptm);
+				if(!found) {
+					if(strncmp(pch, ptm_device, strlen(ptm_device))==0) {
+						found= synchronize_multi_config_sections_with_dmmap_eq("network", "device", "dmmap_bridge_port", "bridge_port", "name", pch, pch, &dup_list);
+					}
+				}
+			}
+		}
+
+		if(!found){
+			if(strncmp(pch, wan_baseifname, strlen(wan_baseifname))==0) {
+				found= synchronize_multi_config_sections_with_dmmap_eq("network", "device", "dmmap_bridge_port", "bridge_port", "name", pch, pch, &dup_list);
+			}
+		}
+
+		if(!found){
+			if(strncmp(pch, wan_baseifname, 4) == 0 || strncmp(pch, "ptm", 3) == 0 || strncmp(pch, "atm", 3) == 0){
+				found= synchronize_multi_config_sections_with_dmmap_eq_diff("network", "device", "dmmap_bridge_port", "bridge_port", "name", pch, "type", "untagged", pch, &dup_list);
+			}
+		}
+	}
+
+	list_for_each_entry(p, &dup_list, list) {
+		set_bridge_port_parameters(p->dmmap_section, ((struct bridging_args *)prev_data)->br_key);
+		init_bridging_port_args(&curr_bridging_port_args, p->config_section, ((struct bridging_args *)prev_data)->bridge_sec, false, (char*)p->additional_attribute);
+		port = handle_update_instance(2, dmctx, &port_last, update_instance_alias_icwmpd, 5, p->dmmap_section, "bridge_port_instance", "bridge_port_alias", &find_max, ((struct bridging_args *)prev_data)->br_key);
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_bridging_port_args, port) == DM_STOP)
+			goto end;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+end:
+	dmfree(ifname_dup);
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.VLAN.!UCI:network/device/dmmap_network*/
+int browseBridgeVlanInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *vlan = NULL, *vlan_last = NULL, *type, *is_lan = NULL;
+	struct bridging_vlan_args curr_bridging_vlan_args = {0};
+	struct bridging_args *br_args = (struct bridging_args *)prev_data;
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	dmuci_get_value_by_section_string(br_args->bridge_sec, "is_lan", &is_lan);
+	if(is_lan == NULL || strcmp(is_lan, "1") != 0) {
+		synchronize_specific_config_sections_with_dmmap("network", "device", "dmmap_network", &dup_list);
+		list_for_each_entry(p, &dup_list, list) {
+			if(!p->config_section)
+				goto end;
+			//Check if VLAN or NOT
+			dmuci_get_value_by_section_string(p->config_section, "type", &type);
+			if (strcmp(type, "untagged") != 0) {
+				dmuci_set_value_by_section(p->dmmap_section, "bridge_key", br_args->br_key);
+				vlan =  handle_update_instance(2, dmctx, &vlan_last, update_instance_alias, 3, p->dmmap_section, "bridge_vlan_instance", "bridge_vlan_alias");
+				init_bridging_vlan_args(&curr_bridging_vlan_args, p->config_section, br_args->bridge_sec, vlan_last, br_args->br_key);
+				if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_bridging_vlan_args, vlan) == DM_STOP)
+					goto end;
+			}
+		}
+		free_dmmap_config_dup_list(&dup_list);
+	}
+end:
+	return 0;
+}
+
+/*#Device.Bridging.Bridge.{i}.VLANPort.!UCI:network/device/dmmap_network*/
+int browseBridgeVlanPortInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *vlan = NULL, *vlan_last = NULL, *type, *is_lan = NULL;
+	struct bridging_vlan_args curr_bridging_vlan_args = {0};
+	struct bridging_args *br_args = (struct bridging_args *)prev_data;
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	dmuci_get_value_by_section_string(br_args->bridge_sec, "is_lan", &is_lan);
+	if(is_lan==NULL || strcmp(is_lan, "1") != 0){
+		synchronize_specific_config_sections_with_dmmap("network", "device", "dmmap_network", &dup_list);
+		list_for_each_entry(p, &dup_list, list) {
+			if(!p->config_section)
+				goto end;
+			//Check if VLAN or NOT
+			dmuci_get_value_by_section_string(p->config_section, "type", &type);
+			if (strcmp(type, "untagged") != 0) {
+				dmuci_set_value_by_section(p->dmmap_section, "bridge_key", br_args->br_key);
+				vlan =  handle_update_instance(2, dmctx, &vlan_last, update_instance_alias, 3, p->dmmap_section, "bridge_vlan_instance", "bridge_vlan_alias");
+				init_bridging_vlan_args(&curr_bridging_vlan_args, p->config_section, br_args->bridge_sec, vlan_last, br_args->br_key);
+				if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_bridging_vlan_args, vlan) == DM_STOP)
+					goto end;
+			}
+		}
+		free_dmmap_config_dup_list(&dup_list);
+	}
+end:
+	return 0;
+}
diff --git a/dmtree/tr181/bridging.h b/dmtree/tr181/bridging.h
new file mode 100644
index 0000000000000000000000000000000000000000..edc796519a1642147c44cbceb4ed97b97a7d7085
--- /dev/null
+++ b/dmtree/tr181/bridging.h
@@ -0,0 +1,144 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2019 iopsys Software Solutions AB
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#ifndef __BRIDGING_H
+#define __BRIDGING_H
+
+struct bridging_args
+{
+	struct uci_section *bridge_sec;
+	char *br_key;
+	char *ifname;
+	char *br_inst;
+};
+
+struct bridging_port_args
+{
+	struct uci_section *bridge_port_sec;
+	struct uci_section *bridge_sec;
+	bool vlan;
+	char *ifname;
+};
+
+struct bridging_vlan_args
+{
+	struct uci_section *bridge_vlan_sec;
+	struct uci_section *bridge_sec;
+	char *vlan_port;
+	char *br_inst;
+	char *ifname;
+};
+
+extern DMOBJ tBridgingObj[];
+extern DMLEAF tBridgingParams[];
+extern DMOBJ tBridgingBridgeObj[];
+extern DMLEAF tBridgingBridgeParams[];
+extern DMLEAF tBridgingBridgeVLANParams[];
+extern DMLEAF tBridgingBridgePortParams[];
+extern DMLEAF tBridgingBridgeVLANPortParams[];
+extern DMOBJ tBridgingBridgePortObj[];
+extern DMLEAF tBridgingBridgePortStatsParams[];
+
+int browseBridgeVlanPortInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseBridgeVlanInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseBridgePortInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseBridgeInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int get_linker_br_port(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+int get_linker_br_vlan(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+
+int add_bridge(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delete_bridge(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int add_br_vlan(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delete_br_vlan(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int add_br_port(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delete_br_port(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_Max_Bridge_Entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_Max_DBridge_Entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_Max_QBridge_Entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_Max_VLAN_Entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_Max_Provider_Bridge_Entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_Max_Filter_Entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_Bridge_Number_Of_Entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_br_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_br_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_br_standard(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_standard(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_br_port_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_vlan_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_vlan_port_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_associated_interfaces(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_associated_interfaces(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int get_br_port_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_port_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_br_port_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_port_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_br_port_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_last_change(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_management(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_port_management(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_br_port_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_port_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_br_port_default_user_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_port_default_user_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_br_port_priority_regeneration(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_port_priority_regeneration(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_br_port_port_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_pvid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_port_pvid(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_br_port_tpid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_port_tpid(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_port_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_port_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int get_br_port_stats_tx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_stats_rx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_stats_tx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_stats_rx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_stats_tx_errors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_stats_rx_errors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_stats_tx_unicast_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_stats_rx_unicast_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_stats_tx_discard_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_stats_rx_discard_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_stats_tx_multicast_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_stats_rx_multicast_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_stats_tx_broadcast_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_stats_rx_broadcast_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_br_port_stats_rx_unknown_proto_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_br_vlan_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_vlan_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_br_vlan_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_vlan_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_br_vlan_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_vlan_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_br_vlan_vid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_vlan_vid(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_br_vlan_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_vlan_priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int get_vlan_port_vlan_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_vlan_port_vlan_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_vlan_port_port_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_vlan_port_port_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_br_vlan_untagged(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_br_vlan_untagged(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif
diff --git a/dmtree/tr181/device.c b/dmtree/tr181/device.c
new file mode 100644
index 0000000000000000000000000000000000000000..84adc0d98d44b06f245eb2588488c566f4c5ab2a
--- /dev/null
+++ b/dmtree/tr181/device.c
@@ -0,0 +1,109 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*      Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+*		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*/
+
+#include "dmuci.h"
+#include "dmcwmp.h"
+#include "device.h"
+#include "deviceinfo.h"
+#include "managementserver.h"
+#include "times.h"
+#include "upnp.h"
+#include "x_iopsys_eu_ice.h"
+#include "x_iopsys_eu_igmp.h"
+#include "x_iopsys_eu_ipacccfg.h"
+#include "x_iopsys_eu_logincfg.h"
+#include "x_iopsys_eu_power_mgmt.h"
+#include "x_iopsys_eu_syslog.h"
+#include "softwaremodules.h"
+#include "xmpp.h"
+#include "x_iopsys_eu_owsd.h"
+#include "x_iopsys_eu_dropbear.h"
+#include "x_iopsys_eu_buttons.h"
+#include "x_iopsys_eu_wifilife.h"
+#include "ip.h"
+#include "ethernet.h"
+#include "bridging.h"
+#include "wifi.h"
+#include "atm.h"
+#include "ptm.h"
+#include "dhcpv4.h"
+#include "hosts.h"
+#include "nat.h"
+#include "ppp.h"
+#include "routing.h"
+#include "userinterface.h"
+#include "firewall.h"
+#include "dns.h"
+#include "users.h"
+#include "dsl.h"
+#include "dhcpv6.h"
+#include "interfacestack.h"
+#include "qos.h"
+#ifdef BBF_TR104
+#include "voice_services.h"
+#endif
+
+/* *** CWMP *** */
+DMOBJ tEntry181Obj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{(char *)&dmroot, &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE, tRoot_181_Obj, tRoot_181_Params, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tRoot_181_Params[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"InterfaceStackNumberOfEntries", &DMREAD, DMT_UNINT, get_Device_InterfaceStackNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMOBJ tRoot_181_Obj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"DeviceInfo", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,tDeviceInfoObj, tDeviceInfoParams, NULL, BBFDM_BOTH},
+{"ManagementServer", &DMREAD, NULL, NULL, NULL, NULL, &DMFINFRM, &DMNONE,NULL, tManagementServerParams, NULL, BBFDM_BOTH},
+{"Time", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,NULL, tTimeParams, NULL, BBFDM_BOTH},
+{"UPnP", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,tUPnPObj, NULL, NULL, BBFDM_BOTH},
+#ifdef BBF_TR104
+{"Services", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,tServiceObj, NULL, NULL, BBFDM_BOTH},
+#endif
+{CUSTOM_PREFIX"ICE", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,NULL, tSe_IceParam, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"IGMP", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,NULL, tSe_IgmpParam, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"IpAccCfg", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,tSe_IpAccObj, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"LoginCfg", &DMREAD, NULL, NULL, NULL, NULL,NULL, &DMNONE,NULL, tSe_LoginCfgParam, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"PowerManagement", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,NULL, tSe_PowerManagementParam, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"SyslogCfg", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,NULL, tSe_SyslogCfgParam, NULL, BBFDM_BOTH},
+{"SoftwareModules", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,tSoftwareModulesObj, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"Owsd", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE,XIopsysEuOwsdObj, XIopsysEuOwsdParams, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"Dropbear", &DMWRITE, add_dropbear_instance, delete_dropbear_instance, NULL, browseXIopsysEuDropbear, NULL, &DMNONE, NULL, X_IOPSYS_EU_DropbearParams, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"Buttons", &DMREAD, NULL, NULL, NULL, browseXIopsysEuButton, NULL, &DMNONE, NULL, X_IOPSYS_EU_ButtonParams, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"WiFiLife", &DMREAD, NULL, NULL, NULL, NULL, NULL, &DMNONE, X_IOPSYS_EU_WiFiLifeObj, X_IOPSYS_EU_WiFiLifeParams, NULL, BBFDM_BOTH},
+{"Bridging",&DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tBridgingObj, tBridgingParams, NULL, BBFDM_BOTH},
+{"WiFi",&DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiObj, tWiFiParams, NULL, BBFDM_BOTH},
+{"IP",&DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tIPObj, tIPParams, NULL, BBFDM_BOTH},
+{"Ethernet", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tEthernetObj, tEthernetParams, NULL, BBFDM_BOTH},
+{"DSL",&DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDSLObj, tDSLParams, NULL, BBFDM_BOTH},
+{"ATM",&DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tATMObj, NULL, NULL, BBFDM_BOTH},
+{"PTM", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tPTMObj, NULL, NULL, BBFDM_BOTH},
+{"DHCPv4", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDhcpv4Obj, tDHCPv4Params, NULL, BBFDM_BOTH},
+{"DHCPv6", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDHCPv6Obj, tDHCPv6Params, NULL, BBFDM_BOTH},
+{"Hosts", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tHostsObj, tHostsParams, NULL, BBFDM_BOTH},
+{"NAT", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tNATObj, tNATParams, NULL, BBFDM_BOTH},
+{"PPP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tPPPObj, tPPPParams, NULL, BBFDM_BOTH},
+{"Routing", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tRoutingObj, tRoutingParams, NULL, BBFDM_BOTH},
+{"UserInterface", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tUserInterfaceObj, NULL, NULL, BBFDM_BOTH},
+{"Firewall", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tFirewallObj, tFirewallParams, NULL, BBFDM_BOTH},
+{"DNS", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDNSObj, tDNSParams, NULL, BBFDM_BOTH},
+{"Users", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tUsersObj, tUsersParams, NULL, BBFDM_BOTH},
+{"InterfaceStack", &DMREAD, NULL, NULL, NULL, browseInterfaceStackInst, NULL, NULL, NULL, tInterfaceStackParams, NULL, BBFDM_BOTH},
+//{"QoS", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tQoSObj, tQoSParams, NULL, BBFDM_BOTH},
+{"XMPP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL,tXMPPObj, tXMPPParams, NULL, BBFDM_BOTH},
+{0}
+};
diff --git a/dmtree/tr181/device.h b/dmtree/tr181/device.h
new file mode 100644
index 0000000000000000000000000000000000000000..e418783e7088613bac63572dc9b496b5ea4de2b6
--- /dev/null
+++ b/dmtree/tr181/device.h
@@ -0,0 +1,20 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*      Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+*		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*/
+
+#ifndef __DEVICE_H
+#define __DEVICE_H
+
+extern DMOBJ tEntry181Obj[];
+extern DMOBJ tRoot_181_Obj[];
+extern DMLEAF tRoot_181_Params[];
+
+#endif
diff --git a/dmtree/tr181/deviceinfo.c b/dmtree/tr181/deviceinfo.c
new file mode 100644
index 0000000000000000000000000000000000000000..62ed3113aee35d9b2879b8644b659537aee0b1d5
--- /dev/null
+++ b/dmtree/tr181/deviceinfo.c
@@ -0,0 +1,797 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2012-2014 PIVA SOFTWARE (www.pivasoftware.com)
+ *		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *		Author: Feten Besbes <feten.besbes@pivasoftware.com>
+ */
+
+#include <ctype.h>
+#include <uci.h>
+#include <stdio.h>
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/klog.h>
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "deviceinfo.h"
+#include "dmjson.h"
+
+/* *** Device.DeviceInfo. *** */
+DMOBJ tDeviceInfoObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{CUSTOM_PREFIX"CATV", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tCatTvParams, NULL, BBFDM_BOTH},
+{"VendorConfigFile", &DMREAD, NULL, NULL, NULL, browseVcfInst, NULL, NULL, NULL, tDeviceInfoVendorConfigFileParams, NULL, BBFDM_BOTH},
+{"VendorLogFile", &DMREAD, NULL, NULL, NULL, browseVlfInst, NULL, NULL, NULL, tDeviceInfoVendorLogFileParams, NULL, BBFDM_BOTH},
+{"MemoryStatus", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tDeviceInfoMemoryStatusParams, NULL, BBFDM_BOTH},
+{"ProcessStatus", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDeviceInfoProcessStatusObj, tDeviceInfoProcessStatusParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDeviceInfoParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Manufacturer", &DMREAD, DMT_STRING, get_device_manufacturer, NULL, &DMFINFRM, NULL, BBFDM_BOTH},
+{"ManufacturerOUI", &DMREAD, DMT_STRING, get_device_manufactureroui, NULL, &DMFINFRM, NULL, BBFDM_BOTH},
+{"ModelName", &DMREAD, DMT_STRING, get_device_routermodel, NULL, &DMFINFRM, NULL, BBFDM_BOTH},
+{"ProductClass", &DMREAD, DMT_STRING, get_device_productclass, NULL, &DMFINFRM, NULL, BBFDM_BOTH},
+{"SerialNumber", &DMREAD, DMT_STRING, get_device_serialnumber, NULL,  &DMFINFRM, NULL, BBFDM_BOTH},
+{"HardwareVersion", &DMREAD, DMT_STRING, get_device_hardwareversion, NULL, &DMFINFRM, NULL, BBFDM_BOTH},
+{"SoftwareVersion", &DMREAD, DMT_STRING, get_device_softwareversion, NULL, &DMFINFRM, &DMACTIVE, BBFDM_BOTH},
+{"UpTime", &DMREAD, DMT_UNINT, get_device_info_uptime, NULL, NULL, NULL, BBFDM_BOTH},
+{"DeviceLog", &DMREAD, DMT_STRING, get_device_devicelog, NULL, NULL, NULL, BBFDM_BOTH},
+{"SpecVersion", &DMREAD, DMT_STRING, get_device_specversion, NULL,  &DMFINFRM, NULL, BBFDM_BOTH},
+{"ProvisioningCode", &DMWRITE, DMT_STRING, get_device_provisioningcode, set_device_provisioningcode, &DMFINFRM, &DMACTIVE, BBFDM_BOTH},
+{CUSTOM_PREFIX"BaseMacAddr", &DMREAD, DMT_STRING, get_base_mac_addr, NULL, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"CATVEnabled", &DMWRITE, DMT_STRING, get_catv_enabled, set_device_catvenabled, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"MemoryBank", &DMWRITE, DMT_STRING, get_device_memory_bank, set_device_memory_bank, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DeviceInfo.VendorConfigFile.{i}. *** */
+DMLEAF tDeviceInfoVendorConfigFileParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_vcf_alias, set_vcf_alias, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMREAD, DMT_STRING, get_vcf_name, NULL, NULL, NULL, BBFDM_BOTH},
+{"Version", &DMREAD, DMT_STRING, get_vcf_version, NULL, NULL, NULL, BBFDM_BOTH},
+{"Date", &DMREAD, DMT_TIME, get_vcf_date, NULL, NULL, NULL, BBFDM_BOTH},
+{"Description", &DMREAD, DMT_STRING, get_vcf_desc, NULL, NULL, NULL, BBFDM_BOTH},
+{"UseForBackupRestore", &DMREAD, DMT_BOOL, get_vcf_backup_restore, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DeviceInfo.MemoryStatus. *** */
+DMLEAF tDeviceInfoMemoryStatusParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Total", &DMREAD, DMT_UNINT, get_memory_status_total, NULL, NULL, NULL, BBFDM_BOTH},
+{"Free", &DMREAD, DMT_UNINT, get_memory_status_free, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DeviceInfo.ProcessStatus. *** */
+DMOBJ tDeviceInfoProcessStatusObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Process", &DMREAD, NULL, NULL, NULL, browsePocessEntriesInst, NULL, NULL, NULL, tDeviceInfoProcessStatusProcessParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDeviceInfoProcessStatusParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"CPUUsage", &DMREAD, DMT_UNINT, get_process_cpu_usage, NULL, NULL, NULL, BBFDM_BOTH},
+{"ProcessNumberOfEntries", &DMREAD, DMT_UNINT, get_process_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DeviceInfo.ProcessStatus.Process.{i}. *** */
+DMLEAF tDeviceInfoProcessStatusProcessParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"PID", &DMREAD, DMT_UNINT, get_process_pid, NULL, NULL, NULL, BBFDM_BOTH},
+{"Command", &DMREAD, DMT_STRING, get_process_command, NULL, NULL, NULL, BBFDM_BOTH},
+{"Size", &DMREAD, DMT_UNINT, get_process_size, NULL, NULL, NULL, BBFDM_BOTH},
+{"Priority", &DMREAD, DMT_UNINT, get_process_priority, NULL, NULL, NULL, BBFDM_BOTH},
+{"CPUTime", &DMREAD, DMT_UNINT, get_process_cpu_time, NULL, NULL, NULL, BBFDM_BOTH},
+{"State", &DMREAD, DMT_STRING, get_process_state, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** DeviceInfo.X_IOPSYS_EU_CATV. ***/
+DMLEAF tCatTvParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enabled", &DMWRITE, DMT_STRING, get_catv_enabled, set_device_catvenabled, NULL, NULL, BBFDM_BOTH},
+{"OpticalInputLevel", &DMREAD, DMT_STRING, get_catv_optical_input_level, NULL, NULL, NULL, BBFDM_BOTH},
+{"RFOutputLevel", &DMREAD, DMT_STRING, get_catv_rf_output_level, NULL, NULL, NULL, BBFDM_BOTH},
+{"Temperature", &DMREAD, DMT_STRING, get_catv_temperature, NULL, NULL, NULL, BBFDM_BOTH},
+{"Voltage", &DMREAD, DMT_STRING, get_catv_voltage, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DeviceInfo.VendorLogFile.{i}. *** */
+DMLEAF tDeviceInfoVendorLogFileParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_vlf_alias, set_vlf_alias, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMREAD, DMT_STRING, get_vlf_name, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaximumSize", &DMREAD, DMT_UNINT, get_vlf_max_size, NULL, NULL, NULL, BBFDM_BOTH},
+{"Persistent", &DMREAD, DMT_BOOL, get_vlf_persistent, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*************************************************************
+ * INIT
+/*************************************************************/
+inline int init_process_args(struct process_args *args, char *pid, char *command, char* size, char* priority, char *cputime, char *state)
+{
+	args->pid = pid;
+	args->command= command;
+	args->size= size;
+	args->priority= priority;
+	args->state= state;
+	args->cputime= cputime;
+	return 0;
+}
+
+
+/*
+ *DeviceInfo. functions
+ */
+char *get_deviceid_manufacturer()
+{
+	char *v;
+	dmuci_get_option_value_string("cwmp","cpe","manufacturer", &v);
+	return v;
+}
+
+char *get_deviceid_manufactureroui()
+{
+	char *v;
+	char str[16];
+	char *mac = NULL;	
+	json_object *res;
+	FILE *nvrammac=NULL;
+	char macreadfile[18]={0};
+	
+	dmuci_get_option_value_string("cwmp", "cpe", "override_oui", &v);
+	if (v[0] == '\0')
+	{
+	dmubus_call("router.system", "info", UBUS_ARGS{{}}, 0, &res);
+		if(!(res)){
+			db_get_value_string("hw", "board", "BaseMacAddr", &mac);
+			if(!mac || strlen(mac)==0 ){
+				if ((nvrammac = fopen("/proc/nvram/BaseMacAddr", "r")) == NULL)
+			    {
+					mac = NULL;
+			    }
+				else{
+					fscanf(nvrammac,"%[^\n]", macreadfile);
+					macreadfile[17]='\0';
+					sscanf(macreadfile,"%2c %2c %2c", str, str+2, str+4);
+					str[6]='\0';
+					v = dmstrdup(str); // MEM WILL BE FREED IN DMMEMCLEAN
+					fclose(nvrammac);
+					return v;
+				}
+			}
+		}
+		else
+			mac = dm_ubus_get_value(res, 2, "system", "basemac");
+
+		if(mac)
+		{
+			size_t ln = strlen(mac);
+			if (ln<17) goto not_found;
+			sscanf (mac,"%2c:%2c:%2c",str,str+2,str+4);
+			str[6] = '\0';
+			v = dmstrdup(str); // MEM WILL BE FREED IN DMMEMCLEAN
+			return v;
+		}
+		else
+			goto not_found;
+	}
+	return v;
+not_found:
+	v = "";
+	return v;
+}
+
+char *get_deviceid_productclass()
+{
+	char *v, *tmp, *val;
+	dmuci_get_option_value_string("cwmp", "cpe", "override_productclass", &v);
+	if (v[0] == '\0')
+	{
+		db_get_value_string("hw", "board", "iopVerBoard", &v);
+		tmp = dmstrdup(v);// MEM WILL BE FREED IN DMMEMCLEAN
+		val = tmp;
+		return val;
+	}
+
+	tmp = dmstrdup(v);// MEM WILL BE FREED IN DMMEMCLEAN
+	val = tmp;
+	return val;
+}
+
+
+char *get_deviceid_serialnumber()
+{
+	char *v;
+	db_get_value_string("hw", "board", "serialNumber", &v);
+	return v;
+}
+
+char *get_softwareversion()
+{
+	char *v, *tmp, *val;
+	
+	db_get_value_string("hw", "board", "iopVersion", &v);
+	tmp = dmstrdup(v);// MEM WILL BE FREED IN DMMEMCLEAN
+	val = tmp;
+	return val;
+}
+
+/*#Device.DeviceInfo.Manufacturer!UCI:cwmp/cwmp,cpe/manufacturer*/
+int get_device_manufacturer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_deviceid_manufacturer();
+	return 0;
+}
+
+/*#Device.DeviceInfo.ManufacturerOUI!UCI:cwmp/cwmp,cpe/override_oui*/
+int get_device_manufactureroui(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_deviceid_manufactureroui();
+	return 0;
+}
+
+/*#Device.DeviceInfo.ProductClass!UCI:cwmp/cwmp,cpe/override_productclass*/
+int get_device_productclass(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_deviceid_productclass();
+	return 0;
+}
+
+int get_device_serialnumber(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_deviceid_serialnumber();
+	return 0;
+}
+
+int get_device_softwareversion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_softwareversion();
+	return 0;
+}
+
+int get_device_hardwareversion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	db_get_value_string("hw", "board", "hardwareVersion", value);
+	return 0;
+}
+
+int get_device_routermodel(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	db_get_value_string("hw", "board", "routerModel", value);
+	return 0;
+}
+
+int get_device_info_uptime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	FILE* fp = NULL;
+	char *pch, *spch;
+	char buf[64];
+	*value = "0";
+
+	fp = fopen(UPTIME, "r");
+	if (fp != NULL) {		
+		fgets(buf, 64, fp);
+		pch = strtok_r(buf, ".", &spch);
+		if (pch)
+			*value = dmstrdup(pch); // MEM WILL BE FREED IN DMMEMCLEAN
+		fclose(fp);
+	}
+	return 0;
+}
+
+int get_device_devicelog(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "";
+	int i = 0, nbrlines = 4;
+	char buff[512], *msg = NULL;
+	int len = klogctl(3 , buff, sizeof(buff) - 1); /* read ring buffer */
+	if (len <= 0)
+		return 0;
+	buff[len] = '\0';
+	char *p = buff;
+	while (*p) { //TODO to optimize, we can avoid this if the '<' and '>' does not cause problem in the tests.
+		if (*p == '<') {
+			*p = '(';
+			if (p == buff || *(p-1) == '\n') {
+				if(msg == NULL) msg = p;
+				i++;
+				if (i == nbrlines) {
+					*(p-1) = '\0';
+					break;
+				}
+			}
+		}
+		else if (*p == '>')
+			*p = ')';
+		p++;
+	}
+	if(msg == NULL)
+		*value = "";
+	else
+		*value = dmstrdup(msg);// MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+int get_device_specversion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1.0";
+	return 0;
+}
+
+/*#Device.DeviceInfo.ProvisioningCode!UCI:cwmp/cwmp,cpe/provisioning_code*/
+int get_device_provisioningcode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp", "cpe", "provisioning_code", value);
+	return 0;
+}
+
+int set_device_provisioningcode(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:			
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp", "cpe", "provisioning_code", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_base_mac_addr(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{	
+	json_object *res;
+	
+	dmubus_call("router.system", "info", UBUS_ARGS{{}}, 0, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dm_ubus_get_value(res, 2, "system", "basemac");
+	return 0;
+}
+
+int get_device_memory_bank(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+
+	dmubus_call("router.system", "memory_bank", UBUS_ARGS{{}}, 0, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dm_ubus_get_value(res, 1, "code");
+	return 0;
+}
+
+int set_device_memory_bank(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmubus_call_set("router.system", "memory_bank", UBUS_ARGS{{"bank", value, Integer}}, 1);
+			return 0;
+	}
+	return 0;
+}
+
+int get_catv_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *catv;
+	dmuci_get_option_value_string("catv", "catv", "enable", &catv);
+	if (strcmp(catv, "on") == 0) {
+		*value = "1";
+	} 
+	else 
+		*value = "0";
+	return 0;	
+}
+
+int set_device_catvenabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	char *stat;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				stat = "on";
+			else
+				stat = "off";
+			dmuci_set_value("catv", "catv", "enable", stat);
+			return 0;
+	}
+	return 0;
+}
+
+int get_catv_optical_input_level(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	char *str;
+	*value = "";
+	dmubus_call("catv", "vpd", UBUS_ARGS{}, 0, &res);
+	if (!res)
+		return 0;
+	*value = dm_ubus_get_value(res, 1, "VPD");
+	return 0;
+}
+
+int get_catv_rf_output_level(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	char *str;
+	*value = "";
+	dmubus_call("catv", "rf", UBUS_ARGS{}, 0, &res);
+	if (!res)
+		return 0;
+	*value = dm_ubus_get_value(res, 1, "RF");
+	return 0;
+}
+
+int get_catv_temperature(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	char *str;
+	*value = "";
+	dmubus_call("catv", "temp", UBUS_ARGS{}, 0, &res);
+	if (!res)
+		return 0;
+	*value = dm_ubus_get_value(res, 1, "Temperature");
+	return 0;
+}
+
+int get_catv_voltage(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	char *str;
+	*value = "";
+	dmubus_call("catv", "vcc", UBUS_ARGS{}, 0, &res);
+	if (!res)
+		return 0;
+	*value = dm_ubus_get_value(res, 1, "VCC");
+	return 0;
+}
+
+int get_vcf_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *vcf_sec = (struct uci_section *)data;
+	dmuci_get_value_by_section_string(vcf_sec, "name", value);
+	return 0;
+}
+
+int get_vcf_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *vcf_sec = (struct uci_section *)data;
+	dmuci_get_value_by_section_string(vcf_sec, "version", value);
+	return 0;
+}
+
+int get_vcf_date(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	DIR *dir;
+	struct dirent *d_file;
+	struct stat attr;
+	char path[128];
+	char date[sizeof "AAAA-MM-JJTHH:MM:SS.000Z"];
+	struct uci_section *vcf_sec = (struct uci_section *)data;
+	*value = "";
+	dmuci_get_value_by_section_string(vcf_sec, "name", value);
+	if ((dir = opendir (DEFAULT_CONFIG_DIR)) != NULL) {
+		while ((d_file = readdir (dir)) != NULL) {
+			if(strcmp(*value, d_file->d_name) == 0) {
+				sprintf(path, DEFAULT_CONFIG_DIR"%s", d_file->d_name);
+				stat(path, &attr);
+				strftime(date, sizeof date, "%Y-%m-%dT%H:%M:%S.000Z", localtime(&attr.st_mtime));
+				*value = dmstrdup(date);
+			}
+		}
+	closedir (dir);
+	}
+	return 0;
+}
+
+int get_vcf_backup_restore(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *vcf_sec = (struct uci_section *)data;
+	dmuci_get_value_by_section_string(vcf_sec, "backup_restore", value);
+	return 0;
+}
+
+int get_vcf_desc(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *vcf_sec = (struct uci_section *)data;
+	dmuci_get_value_by_section_string(vcf_sec, "description", value);
+	return 0;
+}
+
+int get_vcf_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *vcf_sec = (struct uci_section *)data;
+	dmuci_get_value_by_section_string(vcf_sec, "vcf_alias", value);
+	return 0;
+}
+
+int set_vcf_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *vcf_sec = (struct uci_section *)data;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(vcf_sec, "vcf_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int lookup_vcf_name(char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	uci_path_foreach_option_eq(icwmpd, DMMAP, "vcf", "vcf_instance", instance, s) {
+		dmuci_get_value_by_section_string(s, "name", value);
+	}
+	return 0;
+}
+
+int check_file_dir(char *name)
+{
+	DIR *dir;
+	struct dirent *d_file;
+	if ((dir = opendir (DEFAULT_CONFIG_DIR)) != NULL) {
+		while ((d_file = readdir (dir)) != NULL) {
+			if(strcmp(name, d_file->d_name) == 0) {
+				closedir(dir);
+				return 1;
+			}
+		}
+	closedir(dir);
+	}
+	return 0;
+}
+
+int get_vlf_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *sys_log_sec = (struct uci_section *)data;
+	dmuci_get_value_by_section_string(sys_log_sec, "vlf_alias", value);
+	return 0;
+}
+
+int set_vlf_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *sys_log_sec = (struct uci_section *)data;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(sys_log_sec, "vlf_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_vlf_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *sys_log_sec = (struct uci_section *)data;
+	dmuci_get_value_by_section_string(sys_log_sec, "log_file", value);
+	return 0;
+}
+
+int get_vlf_max_size (char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *sys_log_sec = (struct uci_section *)data;
+	dmuci_get_value_by_section_string(sys_log_sec, "log_size", value);
+	*value = (**value) ? *value : "0";
+	return 0;
+}
+
+int get_vlf_persistent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	return 0;
+}
+
+/*#Device.DeviceInfo.MemoryStatus.Total!UBUS:router.system/info//memoryKB.total*/
+int get_memory_status_total(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	json_object *res;
+
+	dmubus_call("router.system", "info", UBUS_ARGS{{}}, 0, &res);
+	*value = dm_ubus_get_value(res, 2, "memoryKB", "total");
+	return 0;
+}
+
+/*#Device.DeviceInfo.MemoryStatus.Free!UBUS:router.system/info//memoryKB.free*/
+int get_memory_status_free(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	json_object *res;
+
+	dmubus_call("router.system", "info", UBUS_ARGS{{}}, 0, &res);
+	*value = dm_ubus_get_value(res, 2, "memoryKB", "free");
+	return 0;
+}
+
+/*#Device.DeviceInfo.ProcessStatus.CPUUsage!UBUS:router.system/info//system.cpu_per*/
+int get_process_cpu_usage(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	json_object *res;
+
+	dmubus_call("router.system", "info", UBUS_ARGS{{}}, 0, &res);
+	*value = dm_ubus_get_value(res, 2, "system", "cpu_per");
+	return 0;
+}
+
+int get_process_number_of_entries(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	json_object *res,  *processes;
+	int nbre_process = 0;
+
+	dmubus_call("router.system", "processes", UBUS_ARGS{{}}, 0, &res);
+	processes = json_object_object_get(res, "processes");
+	nbre_process= json_object_array_length(processes);
+	dmasprintf(value,"%d",nbre_process);
+	return 0;
+}
+
+int get_process_pid(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct process_args *proc_args= (struct process_args*) data;
+	*value= proc_args->pid;
+	return 0;
+}
+
+int get_process_command(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct process_args *proc_args= (struct process_args*) data;
+	*value= proc_args->command;
+	return 0;
+}
+
+int get_process_size(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct process_args *proc_args= (struct process_args*) data;
+	if(proc_args->size!=NULL) *value= proc_args->size;
+	else *value= "0";
+	return 0;
+}
+
+int get_process_priority(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct process_args *proc_args= (struct process_args*) data;
+	long val;
+
+	if(proc_args->priority!=NULL) {
+		val = atol(proc_args->priority);
+		if(val<0) val=0;
+		dmasprintf(value, "%ld", val);
+	}
+	else *value= "0";
+	return 0;
+}
+
+int get_process_cpu_time(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct process_args *proc_args= (struct process_args*) data;
+	if(proc_args->cputime!=NULL) *value= proc_args->cputime;
+	return 0;
+}
+
+int get_process_state(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct process_args *proc_args= (struct process_args*) data;
+	if(strchr(proc_args->state, 'S')!=NULL) *value="Sleeping";
+	else if(strchr(proc_args->state, 'R')!=NULL) *value= "Running";
+	else if(strchr(proc_args->state, 'T')!=NULL) *value= "Stopped";
+	else if(strchr(proc_args->state, 'D')!=NULL) *value= "Uninterruptible";
+	else if(strchr(proc_args->state, 'Z')!=NULL) *value= "Zombie";
+	else *value= proc_args->state;
+
+	return 0;
+}
+
+int browsePocessEntriesInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance){
+	json_object *res,  *processes, *fields, *process;
+	char *pid_field, *command_field, *state_field, *mem_size_field, *cpu_time_field, *priority_field, *pid, *command, *mem_size, *state, *cpu_time, *priority, *idx, *idx_last= NULL;
+	int i, id=0;
+	struct process_args proc_args={};
+
+	dmubus_call("router.system", "processes", UBUS_ARGS{{}}, 0, &res);
+	fields = json_object_object_get(res, "fields");
+	processes = json_object_object_get(res, "processes");
+	size_t nbre_process = json_object_array_length(processes);
+	pid_field = (char *)dmjson_get_value_in_array_idx(fields, 0, 0, NULL);
+	command_field = (char *)dmjson_get_value_in_array_idx(fields, 7, 0, NULL);
+	state_field = (char *)dmjson_get_value_in_array_idx(fields, 3, 0, NULL);
+	mem_size_field = (char *)dmjson_get_value_in_array_idx(fields, 4, 0, NULL);
+	priority_field = (char *)dmjson_get_value_in_array_idx(fields, 8, 0, NULL);
+	cpu_time_field = (char *)dmjson_get_value_in_array_idx(fields, 9, 0, NULL);
+
+	if(nbre_process>0){
+		for(i=0; i<nbre_process; i++){
+			process= json_object_array_get_idx(processes, i);
+			pid = dmjson_get_value(process, 1, pid_field);
+			command = dmjson_get_value(process, 1, command_field);
+			state = dmjson_get_value(process, 1, state_field);
+			mem_size= dmjson_get_value(process, 1, mem_size_field);
+			cpu_time= dmjson_get_value(process, 1, cpu_time_field);
+			priority= dmjson_get_value(process, 1, priority_field);
+
+			init_process_args(&proc_args, pid, command, mem_size, priority, cpu_time, state);
+
+			idx = handle_update_instance(2, dmctx, &idx_last, update_instance_without_section, 1, ++id);
+			if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&proc_args, idx) == DM_STOP)
+				break;
+		}
+	}
+	return 0;
+}
+
+int browseVcfInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *vcf = NULL, *vcf_last = NULL, *name;
+	struct uci_section *s = NULL, *del_sec = NULL;
+	DIR *dir;
+	struct dirent *d_file;
+
+	if ((dir = opendir (DEFAULT_CONFIG_DIR)) != NULL) {
+		while ((d_file = readdir (dir)) != NULL) {
+			if(d_file->d_name[0] == '.')
+				continue;
+			update_section_list(DMMAP,"vcf", "name", 1, d_file->d_name, NULL, NULL, "backup_restore", "1");
+		}
+		closedir (dir);
+	}
+	uci_path_foreach_sections(icwmpd, DMMAP, "vcf", s) {
+		dmuci_get_value_by_section_string(s, "name", &name);
+		if(del_sec) {
+			DMUCI_DELETE_BY_SECTION(icwmpd, del_sec, NULL, NULL);
+			del_sec = NULL;
+		}
+		if (check_file_dir(name) == 0) {
+			del_sec = s;
+			continue;
+		}
+		vcf = handle_update_instance(1, dmctx, &vcf_last, update_instance_alias_icwmpd, 3, s, "vcf_instance", "vcf_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)s, vcf) == DM_STOP)
+			break;
+	}
+	if(del_sec)
+		DMUCI_DELETE_BY_SECTION(icwmpd, del_sec, NULL, NULL);
+	return 0;
+}
+
+//Browse VendorLogFile instances
+int browseVlfInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *sys_log_sec, *s, *dm_sec, *del_sec=NULL;
+	char *instance, *last_instance, *log_file,*log_size, *add_value, *lfile;
+	int i=1, n=0;
+	uci_foreach_sections("system", "system", sys_log_sec) {
+		if(!sys_log_sec)
+			break;
+		dmuci_get_value_by_section_string(sys_log_sec, "log_file", &log_file);
+		dmuci_get_value_by_section_string(sys_log_sec, "log_size", &log_size);
+		uci_path_foreach_sections(icwmpd, "dmmap", "vlf", dm_sec) {
+			if(dm_sec)
+				break;
+		}
+		if(!dm_sec){
+			update_section_list(DMMAP,"vlf", NULL, i++, NULL, "log_file", log_file, "log_size", log_size);
+		}
+		else{
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dm_sec, "log_file", log_file);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dm_sec, "log_size", log_size);
+		}
+	}
+	uci_path_foreach_sections(icwmpd, "dmmap", "vlf", dm_sec) {
+		instance = handle_update_instance(1, dmctx, &last_instance, update_instance_alias_icwmpd, 3, dm_sec, "vlf_instance", "vlf_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)dm_sec, instance) == DM_STOP){
+			break;
+		}
+	}
+	return 0;
+}
diff --git a/dmtree/tr181/deviceinfo.h b/dmtree/tr181/deviceinfo.h
new file mode 100644
index 0000000000000000000000000000000000000000..41539d58dab022fb867ae735069819f800de2e57
--- /dev/null
+++ b/dmtree/tr181/deviceinfo.h
@@ -0,0 +1,96 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2012-2014 PIVA SOFTWARE (www.pivasoftware.com)
+ *		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *		Author: Feten Besbes <feten.besbes@pivasoftware.com>
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ */
+
+#ifndef __DEVICE_INFO_H
+#define __DEVICE_INFO_H
+#include "dmcwmp.h"
+
+#define UPTIME "/proc/uptime"
+#define DEFAULT_CONFIG_DIR "/etc/config/"
+extern DMLEAF tDeviceInfoParams[];
+extern DMLEAF tCatTvParams[];
+extern DMLEAF tDeviceInfoVendorConfigFileParams[];
+extern DMLEAF tDeviceInfoVendorLogFileParams[];
+extern DMLEAF tDeviceInfoMemoryStatusParams[];
+extern DMOBJ tDeviceInfoProcessStatusObj[];
+extern DMLEAF tDeviceInfoProcessStatusParams[];
+extern DMOBJ tDeviceInfoObj[];
+extern DMLEAF tDeviceInfoProcessStatusProcessParams[];
+
+struct process_args{
+	char *pid;
+	char *command;
+	char* size;
+	char* priority;
+	char *cputime;
+	char *state;
+};
+
+char *get_deviceid_manufacturer();
+char *get_deviceid_manufactureroui();
+char *get_deviceid_productclass();
+char *get_deviceid_serialnumber();
+char *get_softwareversion();
+int lookup_vcf_name(char *instance, char **value);
+
+int browseVcfInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseVlfInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browsePocessEntriesInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int get_device_manufacturer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_device_manufactureroui(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_device_routermodel(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_device_productclass(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_device_serialnumber(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_device_hardwareversion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_device_softwareversion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_device_info_uptime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_device_devicelog(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_device_specversion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_device_provisioningcode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_base_mac_addr(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_catv_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_device_memory_bank(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_catv_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_catv_optical_input_level(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_catv_rf_output_level(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_catv_temperature(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_catv_voltage(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_vcf_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_vcf_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_vcf_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_vcf_date(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_vcf_desc(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_vcf_backup_restore(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_vlf_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_vlf_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_vlf_max_size(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_vlf_persistent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_memory_status_total(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_memory_status_free(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_process_cpu_usage(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_process_number_of_entries(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_process_pid(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_process_command(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_process_size(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_process_priority(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_process_cpu_time(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_process_state(char* refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int set_device_provisioningcode(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_device_catvenabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_device_memory_bank(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_device_catvenabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_vcf_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_vlf_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif
diff --git a/dmtree/tr181/dhcpv4.c b/dmtree/tr181/dhcpv4.c
new file mode 100644
index 0000000000000000000000000000000000000000..41935a3a61c72b0128871d3dbde1786a3d2d8a61
--- /dev/null
+++ b/dmtree/tr181/dhcpv4.c
@@ -0,0 +1,3445 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2016 Inteno Broadband Technology AB
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *		Author: Omar Kallel <omar.kallel@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <arpa/inet.h>
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "dhcpv4.h"
+#include "dmjson.h"
+#include "dmentry.h"
+#define DELIMITOR ","
+
+/*** DHCPv4. ***/
+DMOBJ tDhcpv4Obj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Client", &DMWRITE, addObjDHCPv4Client, delObjDHCPv4Client, NULL, browseDHCPv4ClientInst, NULL, NULL, tDHCPv4ClientObj, tDHCPv4ClientParams, NULL, BBFDM_BOTH},
+{"Server", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDhcpv4ServerObj, tDHCPv4ServerParams, NULL, BBFDM_BOTH},
+{"Relay", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDHCPv4RelayObj, tDHCPv4RelayParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDHCPv4Params[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"ClientNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv4_ClientNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv4.Client.{i}. *** */
+DMOBJ tDHCPv4ClientObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"SentOption", &DMWRITE, addObjDHCPv4ClientSentOption, delObjDHCPv4ClientSentOption, NULL, browseDHCPv4ClientSentOptionInst, NULL, NULL, NULL, tDHCPv4ClientSentOptionParams, NULL, BBFDM_BOTH},
+{"ReqOption", &DMWRITE, addObjDHCPv4ClientReqOption, delObjDHCPv4ClientReqOption, NULL, browseDHCPv4ClientReqOptionInst, NULL, NULL, NULL, tDHCPv4ClientReqOptionParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDHCPv4ClientParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_DHCPv4Client_Enable, set_DHCPv4Client_Enable, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4Client_Alias, set_DHCPv4Client_Alias, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_DHCPv4Client_Interface, set_DHCPv4Client_Interface, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_DHCPv4Client_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"DHCPStatus", &DMREAD, DMT_STRING, get_DHCPv4Client_DHCPStatus, NULL, NULL, NULL, BBFDM_BOTH},
+{"Renew", &DMWRITE, DMT_BOOL, get_DHCPv4Client_Renew, set_DHCPv4Client_Renew, NULL, NULL, BBFDM_BOTH},
+{"IPAddress", &DMREAD, DMT_STRING, get_DHCPv4Client_IPAddress, NULL, NULL, NULL, BBFDM_BOTH},
+{"SubnetMask", &DMREAD, DMT_STRING, get_DHCPv4Client_SubnetMask, NULL, NULL, NULL, BBFDM_BOTH},
+{"IPRouters", &DMREAD, DMT_STRING, get_DHCPv4Client_IPRouters, NULL, NULL, NULL, BBFDM_BOTH},
+{"DNSServers", &DMREAD, DMT_STRING, get_DHCPv4Client_DNSServers, NULL, NULL, NULL, BBFDM_BOTH},
+{"LeaseTimeRemaining", &DMREAD, DMT_INT, get_DHCPv4Client_LeaseTimeRemaining, NULL, NULL, NULL, BBFDM_BOTH},
+{"DHCPServer", &DMREAD, DMT_STRING, get_DHCPv4Client_DHCPServer, NULL, NULL, NULL, BBFDM_BOTH},
+{"PassthroughEnable", &DMWRITE, DMT_BOOL, get_DHCPv4Client_PassthroughEnable, set_DHCPv4Client_PassthroughEnable, NULL, NULL, BBFDM_BOTH},
+{"PassthroughDHCPPool", &DMWRITE, DMT_STRING, get_DHCPv4Client_PassthroughDHCPPool, set_DHCPv4Client_PassthroughDHCPPool, NULL, NULL, BBFDM_BOTH},
+{"SentOptionNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv4Client_SentOptionNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"ReqOptionNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv4Client_ReqOptionNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv4.Client.{i}.SentOption.{i}. *** */
+DMLEAF tDHCPv4ClientSentOptionParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_DHCPv4ClientSentOption_Enable, set_DHCPv4ClientSentOption_Enable, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4ClientSentOption_Alias, set_DHCPv4ClientSentOption_Alias, NULL, NULL, BBFDM_BOTH},
+{"Tag", &DMWRITE, DMT_UNINT, get_DHCPv4ClientSentOption_Tag, set_DHCPv4ClientSentOption_Tag, NULL, NULL, BBFDM_BOTH},
+{"Value", &DMWRITE, DMT_HEXBIN, get_DHCPv4ClientSentOption_Value, set_DHCPv4ClientSentOption_Value, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv4.Client.{i}.ReqOption.{i}. *** */
+DMLEAF tDHCPv4ClientReqOptionParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_DHCPv4ClientReqOption_Enable, set_DHCPv4ClientReqOption_Enable, NULL, NULL, BBFDM_BOTH},
+{"Order", &DMWRITE, DMT_UNINT, get_DHCPv4ClientReqOption_Order, set_DHCPv4ClientReqOption_Order, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4ClientReqOption_Alias, set_DHCPv4ClientReqOption_Alias, NULL, NULL, BBFDM_BOTH},
+{"Tag", &DMWRITE, DMT_UNINT, get_DHCPv4ClientReqOption_Tag, set_DHCPv4ClientReqOption_Tag, NULL, NULL, BBFDM_BOTH},
+{"Value", &DMREAD, DMT_HEXBIN, get_DHCPv4ClientReqOption_Value, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDHCPv4ServerParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_DHCPv4Server_Enable, set_DHCPv4Server_Enable, NULL, NULL, BBFDM_BOTH},
+{"PoolNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv4Server_PoolNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** DHCPv4.Server. ***/
+DMOBJ tDhcpv4ServerObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Pool", &DMWRITE, add_dhcp_server, delete_dhcp_server, NULL, browseDhcpInst, NULL, NULL, tDhcpServerPoolObj, tDhcpServerPoolParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** DHCPv4.Server.Pool.{i}. ***/
+DMOBJ tDhcpServerPoolObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"StaticAddress", &DMWRITE, add_dhcp_staticaddress, delete_dhcp_staticaddress, NULL, browseDhcpStaticInst, NULL, NULL, NULL, tDhcpServerPoolAddressParams, NULL, BBFDM_BOTH},
+{"Option", &DMWRITE, addObjDHCPv4ServerPoolOption, delObjDHCPv4ServerPoolOption, NULL, browseDHCPv4ServerPoolOptionInst, NULL, NULL, NULL, tDHCPv4ServerPoolOptionParams, NULL, BBFDM_BOTH},
+{"Client", &DMREAD, NULL, NULL, NULL, browseDhcpClientInst, NULL, NULL, tDhcpServerPoolClientObj, tDhcpServerPoolClientParams, get_dhcp_client_linker},
+{0}
+};
+
+/*** DHCPv4.Server.Pool.{i}.Client.{i}. ***/
+DMOBJ tDhcpServerPoolClientObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"IPv4Address", &DMREAD, NULL, NULL, NULL, browseDhcpClientIPv4Inst, NULL, NULL, NULL, tDhcpServerPoolClientIPv4AddressParams, NULL, BBFDM_BOTH},
+{"Option", &DMREAD, NULL, NULL, NULL, browseDHCPv4ServerPoolClientOptionInst, NULL, NULL, NULL, tDHCPv4ServerPoolClientOptionParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDhcpServerPoolParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING,  get_server_pool_alias, set_server_pool_alias, NULL, NULL, BBFDM_BOTH},
+{"DNSServers", &DMWRITE, DMT_STRING,  get_dns_server, set_dns_server, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING,  get_dhcp_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Order", &DMWRITE, DMT_UNINT, get_dhcp_sever_pool_order, set_dhcp_sever_pool_order, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"DHCPServerConfigurable", &DMWRITE, DMT_BOOL, get_dhcp_configurable, set_dhcp_configurable, NULL, NULL, BBFDM_BOTH},
+{"Enable", &DMWRITE, DMT_BOOL,  get_dhcp_enable, set_dhcp_enable, NULL, NULL, BBFDM_BOTH},
+{"MinAddress", &DMWRITE, DMT_STRING, get_dhcp_interval_address_min, set_dhcp_address_min, NULL, NULL, BBFDM_BOTH},
+{"MaxAddress", &DMWRITE, DMT_STRING,get_dhcp_interval_address_max, set_dhcp_address_max, NULL, NULL, BBFDM_BOTH},
+{"ReservedAddresses", &DMWRITE, DMT_STRING, get_dhcp_reserved_addresses, set_dhcp_reserved_addresses, NULL, NULL, BBFDM_BOTH},
+{"SubnetMask", &DMWRITE, DMT_STRING,get_dhcp_subnetmask, set_dhcp_subnetmask, NULL, NULL, BBFDM_BOTH},
+{"IPRouters", &DMWRITE, DMT_STRING, get_dhcp_iprouters, set_dhcp_iprouters, NULL, NULL, BBFDM_BOTH},
+{"LeaseTime", &DMWRITE, DMT_INT, get_dhcp_leasetime, set_dhcp_leasetime, NULL, NULL, BBFDM_BOTH},
+{"DomainName", &DMWRITE, DMT_STRING, get_dhcp_domainname, set_dhcp_domainname, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_dhcp_interface, set_dhcp_interface_linker_parameter, NULL, NULL, BBFDM_BOTH},
+{"StaticAddressNumberOfEntries", &DMWRITE, DMT_UNINT, get_static_address_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{"OptionNumberOfEntries", &DMWRITE, DMT_UNINT, get_option_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{"ClientNumberOfEntries", &DMWRITE, DMT_UNINT, get_clients_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** DHCPv4.Server.Pool.{i}.StaticAddress.{i}. ***/
+DMLEAF tDhcpServerPoolAddressParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_dhcp_static_alias, set_dhcp_static_alias, NULL, NULL, BBFDM_BOTH},
+{"Chaddr", &DMWRITE, DMT_STRING,  get_dhcp_staticaddress_chaddr, set_dhcp_staticaddress_chaddr, NULL, NULL, BBFDM_BOTH},
+{"Yiaddr", &DMWRITE, DMT_STRING,  get_dhcp_staticaddress_yiaddr, set_dhcp_staticaddress_yiaddr, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** DHCPv4.Server.Pool.{i}.Client.{i}. ***/
+DMLEAF tDhcpServerPoolClientParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Chaddr", &DMREAD, DMT_STRING,  get_dhcp_client_chaddr, NULL, NULL, NULL, BBFDM_BOTH},
+{"Active", &DMREAD, DMT_STRING,  get_dhcp_client_active, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** DHCPv4.Server.Pool.{i}.Client.{i}.IPv4Address.{i}. ***/
+DMLEAF tDhcpServerPoolClientIPv4AddressParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"LeaseTimeRemaining", &DMREAD, DMT_TIME,  get_dhcp_client_ipv4address_leasetime, NULL, NULL, NULL, BBFDM_BOTH},
+{"IPAddress", &DMREAD, DMT_TIME,  get_dhcp_client_ipv4address_ip_address, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv4.Server.Pool.{i}.Option.{i}. *** */
+DMLEAF tDHCPv4ServerPoolOptionParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_DHCPv4ServerPoolOption_Enable, set_DHCPv4ServerPoolOption_Enable, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4ServerPoolOption_Alias, set_DHCPv4ServerPoolOption_Alias, NULL, NULL, BBFDM_BOTH},
+{"Tag", &DMWRITE, DMT_UNINT, get_DHCPv4ServerPoolOption_Tag, set_DHCPv4ServerPoolOption_Tag, NULL, NULL, BBFDM_BOTH},
+{"Value", &DMWRITE, DMT_HEXBIN, get_DHCPv4ServerPoolOption_Value, set_DHCPv4ServerPoolOption_Value, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv4.Server.Pool.{i}.Client.{i}.Option.{i}. *** */
+DMLEAF tDHCPv4ServerPoolClientOptionParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Tag", &DMREAD, DMT_UNINT, get_DHCPv4ServerPoolClientOption_Tag, NULL, NULL, NULL, BBFDM_BOTH},
+{"Value", &DMREAD, DMT_HEXBIN, get_DHCPv4ServerPoolClientOption_Value, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv4.Relay. *** */
+DMOBJ tDHCPv4RelayObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker*/
+{"Forwarding", &DMWRITE, addObjDHCPv4RelayForwarding, delObjDHCPv4RelayForwarding, NULL, browseDHCPv4RelayForwardingInst, NULL, NULL, NULL, tDHCPv4RelayForwardingParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDHCPv4RelayParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_DHCPv4Relay_Enable, set_DHCPv4Relay_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_DHCPv4Relay_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"ForwardingNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv4Relay_ForwardingNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+/* *** Device.DHCPv4.Relay.Forwarding.{i}. *** */
+DMLEAF tDHCPv4RelayForwardingParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_DHCPv4RelayForwarding_Enable, set_DHCPv4RelayForwarding_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_DHCPv4RelayForwarding_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_DHCPv4RelayForwarding_Alias, set_DHCPv4RelayForwarding_Alias, NULL, NULL, BBFDM_BOTH},
+{"Order", &DMWRITE, DMT_UNINT, get_DHCPv4RelayForwarding_Order, set_DHCPv4RelayForwarding_Order, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_DHCPv4RelayForwarding_Interface, set_DHCPv4RelayForwarding_Interface, NULL, NULL, BBFDM_BOTH},
+{"VendorClassID", &DMWRITE, DMT_STRING, get_DHCPv4RelayForwarding_VendorClassID, set_DHCPv4RelayForwarding_VendorClassID, NULL, NULL, BBFDM_BOTH},
+{"VendorClassIDExclude", &DMWRITE, DMT_BOOL, get_DHCPv4RelayForwarding_VendorClassIDExclude, set_DHCPv4RelayForwarding_VendorClassIDExclude, NULL, NULL, BBFDM_BOTH},
+{"VendorClassIDMode", &DMWRITE, DMT_STRING, get_DHCPv4RelayForwarding_VendorClassIDMode, set_DHCPv4RelayForwarding_VendorClassIDMode, NULL, NULL, BBFDM_BOTH},
+{"ClientID", &DMWRITE, DMT_HEXBIN, get_DHCPv4RelayForwarding_ClientID, set_DHCPv4RelayForwarding_ClientID, NULL, NULL, BBFDM_BOTH},
+{"ClientIDExclude", &DMWRITE, DMT_BOOL, get_DHCPv4RelayForwarding_ClientIDExclude, set_DHCPv4RelayForwarding_ClientIDExclude, NULL, NULL, BBFDM_BOTH},
+{"UserClassID", &DMWRITE, DMT_HEXBIN, get_DHCPv4RelayForwarding_UserClassID, set_DHCPv4RelayForwarding_UserClassID, NULL, NULL, BBFDM_BOTH},
+{"UserClassIDExclude", &DMWRITE, DMT_BOOL, get_DHCPv4RelayForwarding_UserClassIDExclude, set_DHCPv4RelayForwarding_UserClassIDExclude, NULL, NULL, BBFDM_BOTH},
+{"Chaddr", &DMWRITE, DMT_STRING, get_DHCPv4RelayForwarding_Chaddr, set_DHCPv4RelayForwarding_Chaddr, NULL, NULL, BBFDM_BOTH},
+{"ChaddrMask", &DMWRITE, DMT_STRING, get_DHCPv4RelayForwarding_ChaddrMask, set_DHCPv4RelayForwarding_ChaddrMask, NULL, NULL, BBFDM_BOTH},
+{"ChaddrExclude", &DMWRITE, DMT_BOOL, get_DHCPv4RelayForwarding_ChaddrExclude, set_DHCPv4RelayForwarding_ChaddrExclude, NULL, NULL, BBFDM_BOTH},
+{"LocallyServed", &DMWRITE, DMT_BOOL, get_DHCPv4RelayForwarding_LocallyServed, set_DHCPv4RelayForwarding_LocallyServed, NULL, NULL, BBFDM_BOTH},
+{"DHCPServerIPAddress", &DMWRITE, DMT_STRING, get_DHCPv4RelayForwarding_DHCPServerIPAddress, set_DHCPv4RelayForwarding_DHCPServerIPAddress, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/**************************************************************************
+* LINKER
+***************************************************************************/
+int get_dhcp_client_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) {
+	if (data && ((struct client_args *)data)->key) {
+		*linker = ((struct client_args *)data)->key;
+		return 0;
+	} else {
+		*linker = "";
+		return 0;
+	}
+}
+
+/*************************************************************
+ * INIT
+/*************************************************************/
+inline int init_dhcp_args(struct dhcp_args *args, struct uci_section *s, char *interface)
+{
+	args->interface = interface;
+	args->dhcp_sec = s;
+	return 0;
+}
+inline int init_args_dhcp_host(struct dhcp_static_args *args, struct uci_section *s)
+{
+	args->dhcpsection = s;
+	return 0;
+}
+
+inline int init_dhcp_client_args(struct client_args *args, json_object *client, char *key)
+{
+	args->client = client;
+	args->key = key;
+	return 0;
+}
+
+/*************************************************************
+ * Other functions
+/*************************************************************/
+struct uci_section* exist_other_section_same_order(struct uci_section *dmmap_sect, char * package, char* sect_type, char *order) {
+	struct uci_section *s;
+	uci_path_foreach_option_eq(icwmpd, package, sect_type, "order", order, s) {
+		if(strcmp(section_name(s), section_name(dmmap_sect)) != 0){
+			return s;
+		}
+	}
+	return NULL;
+}
+
+int set_section_order(char *package, char *dmpackage, char* sect_type, struct uci_section *dmmap_sect, struct uci_section *conf, int set_force, char* order)
+{
+	char *v= NULL, *sect_name, *incrorder;
+	struct uci_section *s, *dm;
+	dmuci_get_value_by_section_string(dmmap_sect, "order", &v);
+	if((v!=NULL || strlen(v)>0) && strcmp(v, order) == 0)
+		return 0;
+	DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "order", order);
+	if(conf==NULL){
+		dmuci_get_value_by_section_string(dmmap_sect, "section_name", &sect_name);
+		get_config_section_of_dmmap_section(package, sect_type, sect_name, &s);
+	} else
+		s= conf;
+
+	if(strcmp(order, "1") != 0 && s!=NULL){
+		dmuci_set_value_by_section(s, "force", "");
+	}
+
+	if(set_force==1 && strcmp(order, "1") == 0 && s!=NULL) {
+		dmuci_set_value_by_section(s, "force", "1");
+	}
+
+	if ((dm = exist_other_section_same_order(dmmap_sect, dmpackage, sect_type, order)) != NULL) {
+		dmuci_get_value_by_section_string(dm, "section_name", &sect_name);
+		get_config_section_of_dmmap_section(package, sect_type, sect_name, &s);
+		dmasprintf(&incrorder, "%d", atoi(order)+1);
+		if(s!=NULL && strcmp(order, "1") == 0){
+			dmuci_set_value_by_section(s, "force", "");
+		}
+		set_section_order(package, dmpackage, sect_type, dm, s, set_force, incrorder);
+	}
+	return 0;
+
+}
+
+/*******************ADD-DEL OBJECT*********************/
+int add_dhcp_server(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{
+	char *value, *v;
+	char *instance;
+	struct uci_section *s = NULL, *dmmap_dhcp= NULL;
+	
+	check_create_dmmap_package("dmmap_dhcp");
+	instance = get_last_instance_icwmpd("dmmap_dhcp", "dhcp", "dhcp_instance");
+	dmuci_add_section("dhcp", "dhcp", &s, &value);
+	dmuci_set_value_by_section(s, "start", "100");
+	dmuci_set_value_by_section(s, "leasetime", "12h");
+	dmuci_set_value_by_section(s, "limit", "150");
+
+	dmuci_add_section_icwmpd("dmmap_dhcp", "dhcp", &dmmap_dhcp, &v);
+	dmuci_set_value_by_section(dmmap_dhcp, "section_name", section_name(s));
+	*instancepara = update_instance_icwmpd(dmmap_dhcp, instance, "dhcp_instance");
+	return 0;
+}
+
+int delete_dhcp_server(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	int found = 0;
+	char *lan_name;
+	struct uci_section *s = NULL;
+	struct uci_section *ss = NULL, *dmmap_section= NULL;
+
+	switch (del_action) {
+	case DEL_INST:
+		if(is_section_unnamed(section_name(((struct dhcp_args *)data)->dhcp_sec))){
+			LIST_HEAD(dup_list);
+			delete_sections_save_next_sections("dmmap_dhcp", "dhcp", "dhcp_instance", section_name(((struct dhcp_args *)data)->dhcp_sec), atoi(instance), &dup_list);
+			update_dmmap_sections(&dup_list, "dhcp_instance", "dmmap_dhcp", "dhcp");
+			dmuci_delete_by_section_unnamed(((struct dhcp_args *)data)->dhcp_sec, NULL, NULL);
+		} else {
+			get_dmmap_section_of_config_section("dmmap_dhcp", "dhcp", section_name(((struct dhcp_args *)data)->dhcp_sec), &dmmap_section);
+			if(dmmap_section != NULL)
+				dmuci_delete_by_section_unnamed_icwmpd(dmmap_section, NULL, NULL);
+			dmuci_delete_by_section(((struct dhcp_args *)data)->dhcp_sec, NULL, NULL);
+		}
+
+		break;
+	case DEL_ALL:
+		uci_foreach_sections("dhcp", "dhcp", s) {
+			if (found != 0){
+				get_dmmap_section_of_config_section("dmmap_dhcp", "dhcp", section_name(s), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			ss = s;
+			found++;
+		}
+		if (ss != NULL){
+			get_dmmap_section_of_config_section("dmmap_dhcp", "dhcp", section_name(ss), &dmmap_section);
+			if(dmmap_section != NULL)
+				dmuci_delete_by_section(dmmap_section, NULL, NULL);
+			dmuci_delete_by_section(ss, NULL, NULL);
+		}
+		break;
+	}
+	return 0;
+}
+
+int add_dhcp_staticaddress(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{
+	char *value, *v;
+	char *instance;
+	struct uci_section *s = NULL, *dmmap_dhcp_host= NULL;
+	
+	check_create_dmmap_package("dmmap_dhcp");
+	instance = get_last_instance_lev2_icwmpd("dhcp", "host", "dmmap_dhcp", "ldhcpinstance", "dhcp", ((struct dhcp_args *)data)->interface);
+	dmuci_add_section("dhcp", "host", &s, &value);
+	dmuci_set_value_by_section(s, "dhcp", ((struct dhcp_args *)data)->interface);
+
+
+	dmuci_add_section_icwmpd("dmmap_dhcp", "host", &dmmap_dhcp_host, &v);
+	dmuci_set_value_by_section(dmmap_dhcp_host, "section_name", section_name(s));
+	*instancepara = update_instance_icwmpd(dmmap_dhcp_host, instance, "ldhcpinstance");
+	return 0;
+}
+
+int delete_dhcp_staticaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	int found = 0;
+	char *lan_name;
+	struct uci_section *s = NULL, *dmmap_section = NULL;
+	struct uci_section *ss = NULL;
+	struct dhcp_static_args *dhcpargs = (struct dhcp_static_args *)data;
+	
+	switch (del_action) {
+		case DEL_INST:
+			if(is_section_unnamed(section_name(dhcpargs->dhcpsection))){
+				LIST_HEAD(dup_list);
+				delete_sections_save_next_sections("dmmap_dhcp", "host", "ldhcpinstance", section_name(dhcpargs->dhcpsection), atoi(instance), &dup_list);
+				update_dmmap_sections(&dup_list, "ldhcpinstance", "dmmap_dhcp", "host");
+				dmuci_delete_by_section_unnamed(dhcpargs->dhcpsection, NULL, NULL);
+			} else {
+				get_dmmap_section_of_config_section("dmmap_dhcp", "host", section_name(dhcpargs->dhcpsection), &dmmap_section);
+				dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(dhcpargs->dhcpsection, NULL, NULL);
+			}
+
+			break;
+		case DEL_ALL:
+			uci_foreach_option_eq("dhcp", "host", "dhcp", ((struct dhcp_args *)data)->interface, s) {
+				if (found != 0){
+					get_dmmap_section_of_config_section("dmmap_dhcp", "host", section_name(ss), &dmmap_section);
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL){
+				get_dmmap_section_of_config_section("dmmap_dhcp", "host", section_name(ss), &dmmap_section);
+				dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			break;
+	}
+	return 0;
+}
+
+int addObjDHCPv4Client(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	struct uci_section *s, *dmmap_sect;
+	char *wan_eth, *value, *wanname, *instancepara, *v;
+
+	check_create_dmmap_package("dmmap_dhcp_client");
+	instancepara = get_last_instance_icwmpd("dmmap_dhcp_client", "interface", "cwmp_dhcpv4client_instance");
+	dmuci_get_option_value_string("ports", "WAN", "ifname", &wan_eth);
+	dmasprintf(&wanname, "%s.1", wan_eth);
+	dmuci_add_section("network", "interface", &s, &value);
+	dmuci_set_value_by_section(s, "proto", "dhcp");
+	dmuci_set_value_by_section(s, "ifname", wanname);
+	dmuci_set_value_by_section(s, "type", "anywan");
+	dmuci_add_section_icwmpd("dmmap_dhcp_client", "interface", &dmmap_sect, &v);
+	dmuci_set_value_by_section(dmmap_sect, "section_name", section_name(s));
+	*instance = update_instance_icwmpd(dmmap_sect, instancepara, "cwmp_dhcpv4client_instance");
+	return 0;
+}
+
+int delObjDHCPv4Client(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	struct uci_section *s, *dmmap_section, *stmp;
+	json_object *res, *jobj;
+
+	char *v;
+	char *type, *ipv4addr = "", *ipv6addr = "", *proto, *inst, *mask4;
+
+	switch (del_action) {
+		case DEL_INST:
+			if(dhcp_client_args->dhcp_client_conf != NULL){
+				dmuci_set_value_by_section(dhcp_client_args->dhcp_client_conf, "proto", "static");
+				if(strlen(dhcp_client_args->ip) == 0){
+					dmasprintf(&ipv4addr, "%s.%s.%s.%s", instance, instance, instance, instance);
+					dmasprintf(&mask4, "%s", "255.255.255.0");
+				} else {
+					dmasprintf(&ipv4addr, "%s", dhcp_client_args->ip);
+					dmasprintf(&mask4, "%s", dhcp_client_args->mask);
+				}
+				dmuci_set_value_by_section(dhcp_client_args->dhcp_client_conf, "ipaddr", ipv4addr);
+				dmuci_set_value_by_section(dhcp_client_args->dhcp_client_conf, "netmask", mask4);
+			}
+			dmuci_delete_by_section_unnamed_icwmpd(dhcp_client_args->dhcp_client_dm, NULL, NULL);
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("network", "interface", s) {
+				dmuci_get_value_by_section_string(s, "type", &type);
+				if (strcmp(type, "alias") == 0 || strcmp(section_name(s), "loopback")==0)
+					continue;
+				dmuci_get_value_by_section_string(s, "ipaddr", &ipv4addr);
+				dmuci_get_value_by_section_string(s, "netmask", &mask4);
+				if (ipv4addr[0] == '\0') {
+					dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(s), String}}, 1, &res);
+					if (res)
+					{
+						jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
+						ipv4addr = dmjson_get_value(jobj, 1, "address");
+						mask4= dmjson_get_value(jobj, 1, "mask");
+					}
+				}
+				dmuci_get_value_by_section_string(s, "ip6addr", &ipv6addr);
+				if (ipv6addr[0] == '\0') {
+					dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(s), String}}, 1, &res);
+					if (res)
+					{
+						jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv6-address");
+						ipv6addr = dmjson_get_value(jobj, 1, "address");
+					}
+				}
+				dmuci_get_value_by_section_string(s, "proto", &proto);
+				if (ipv4addr[0] == '\0' && ipv6addr[0] == '\0' && strcmp(proto, "dhcp") != 0 && strcmp(proto, "dhcpv6") != 0 && strcmp(type, "bridge") != 0)
+					continue;
+
+				dmuci_set_value_by_section(s, "proto", "static");
+
+				get_dmmap_section_of_config_section("dmmap_dhcp_client", "interface", section_name(s), &dmmap_section);
+				if(strlen(ipv4addr) == 0){
+					if(dmmap_section != NULL)
+						dmuci_get_value_by_section_string(dmmap_section, "cwmp_dhcpv4client_instance", &v);
+					else
+						dmasprintf(&v, "%d", 0);
+
+					dmasprintf(&ipv4addr, "%s.%s.%s.%s", v, v, v, v);
+					dmasprintf(&mask4, "%s", "255.255.255.0");
+				}
+				dmuci_set_value_by_section(s, "ipaddr", ipv4addr);
+				dmuci_set_value_by_section(s, "netmask", mask4);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+			}
+			uci_path_foreach_sections_safe(icwmpd, "dmmap_dhcp_client", "interface", stmp, s) {
+				dmuci_delete_by_section_unnamed_icwmpd(s, NULL, NULL);
+			}
+			break;
+	}
+	return 0;
+}
+
+int addObjDHCPv4ClientSentOption(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*) data;
+	struct uci_section *s, *dmmap_sect;
+	char *value, *instancepara, *v;
+
+	check_create_dmmap_package("dmmap_dhcp_client");
+	instancepara= get_last_instance_lev2_icwmpd_dmmap_opt("dmmap_dhcp_client", "send_option", "cwmp_dhcpv4_sentopt_instance", "section_name", section_name(dhcp_client_args->dhcp_client_conf));
+	dmuci_add_section_icwmpd("dmmap_dhcp_client", "send_option", &dmmap_sect, &value);
+	if(dhcp_client_args->dhcp_client_conf != NULL)
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section_name", section_name(dhcp_client_args->dhcp_client_conf));
+	DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "option_tag", "0");
+	*instance = update_instance_icwmpd(dmmap_sect, instancepara, "cwmp_dhcpv4_sentopt_instance");
+	return 0;
+}
+
+int delObjDHCPv4ClientSentOption(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *s, *stmp;
+	char *list= NULL, *opt_value= NULL;
+
+	switch (del_action) {
+		case DEL_INST:
+			if(strcmp(((struct dhcp_client_option_args*) data)->option_tag, "0") != 0)
+			{
+				dmasprintf(&opt_value, "%s:%s", ((struct dhcp_client_option_args*) data)->option_tag, ((struct dhcp_client_option_args*) data)->value);
+				dmuci_get_value_by_section_string(((struct dhcp_client_option_args*) data)->client_sect, "sendopts", &list);
+				if(list != NULL){
+					remove_elt_from_str_list(&list, opt_value);
+					dmuci_set_value_by_section(((struct dhcp_client_option_args*) data)->client_sect, "sendopts", list);
+				}
+			}
+			dmuci_delete_by_section_unnamed_icwmpd(((struct dhcp_client_option_args*) data)->opt_sect, NULL, NULL);
+			break;
+		case DEL_ALL:
+			dmuci_set_value_by_section(((struct dhcp_client_args*) data)->dhcp_client_conf, "sendopts", "");
+			uci_path_foreach_sections_safe(icwmpd, "dmmap_dhcp_client", "send_option", stmp, s) {
+				dmuci_delete_by_section_unnamed_icwmpd(s, NULL, NULL);
+			}
+			break;
+	}
+	return 0;
+}
+
+int addObjDHCPv4ClientReqOption(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*) data;
+	struct uci_section *s, *dmmap_sect;
+	char *value, *instancepara, *v;
+
+	check_create_dmmap_package("dmmap_dhcp_client");
+	instancepara= get_last_instance_lev2_icwmpd_dmmap_opt("dmmap_dhcp_client", "req_option", "cwmp_dhcpv4_sentopt_instance", "section_name", section_name(dhcp_client_args->dhcp_client_conf));
+	dmuci_add_section_icwmpd("dmmap_dhcp_client", "req_option", &dmmap_sect, &value);
+	if(dhcp_client_args->dhcp_client_conf != NULL)
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section_name", section_name(dhcp_client_args->dhcp_client_conf));
+	DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "option_tag", "0");
+	*instance = update_instance_icwmpd(dmmap_sect, instancepara, "cwmp_dhcpv4_sentopt_instance");
+	return 0;
+}
+
+int delObjDHCPv4ClientReqOption(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *s, *stmp;
+	char *list= NULL, *opt_value= NULL;
+
+	switch (del_action) {
+		case DEL_INST:
+			if(strcmp(((struct dhcp_client_option_args*) data)->option_tag, "0") != 0)
+			{
+				dmuci_get_value_by_section_string(((struct dhcp_client_option_args*) data)->client_sect, "reqopts", &list);
+				if(list != NULL){
+					remove_elt_from_str_list(&list, ((struct dhcp_client_option_args*) data)->option_tag);
+					dmuci_set_value_by_section(((struct dhcp_client_option_args*) data)->client_sect, "reqopts", list);
+				}
+			}
+			dmuci_delete_by_section_unnamed_icwmpd(((struct dhcp_client_option_args*) data)->opt_sect, NULL, NULL);
+			break;
+		case DEL_ALL:
+			dmuci_set_value_by_section(((struct dhcp_client_args*) data)->dhcp_client_conf, "reqopts", "");
+			uci_path_foreach_sections_safe(icwmpd, "dmmap_dhcp_client", "req_option", stmp, s) {
+				dmuci_delete_by_section_unnamed_icwmpd(s, NULL, NULL);
+			}
+			break;
+	}
+	return 0;
+}
+
+int addObjDHCPv4ServerPoolOption(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	struct dhcp_args *dhcp_arg = (struct dhcp_args*)data;
+	struct uci_section *s, *dmmap_sect;
+	char *value, *instancepara, *v;
+
+	check_create_dmmap_package("dmmap_dhcp");
+	instancepara= get_last_instance_lev2_icwmpd_dmmap_opt("dmmap_dhcp", "servpool_option", "cwmp_dhcpv4_servpool_option_instance", "section_name", section_name(dhcp_arg->dhcp_sec));
+	dmuci_add_section_icwmpd("dmmap_dhcp", "servpool_option", &dmmap_sect, &value);
+	if(dhcp_arg->dhcp_sec != NULL)
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section_name", section_name(dhcp_arg->dhcp_sec));
+	DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "option_tag", "0");
+	*instance = update_instance_icwmpd(dmmap_sect, instancepara, "cwmp_dhcpv4_servpool_option_instance");
+	return 0;
+}
+
+int delObjDHCPv4ServerPoolOption(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *s, *stmp;
+	char *list= NULL, *opt_value= NULL;
+	struct uci_list *dhcp_options_list = NULL;
+
+	switch (del_action) {
+		case DEL_INST:
+			if(strcmp(((struct dhcp_client_option_args*) data)->option_tag, "0") != 0)
+			{
+				dmasprintf(&opt_value, "%s,%s", ((struct dhcp_client_option_args*) data)->option_tag, ((struct dhcp_client_option_args*) data)->value);
+				dmuci_get_value_by_section_list(((struct dhcp_client_option_args*) data)->client_sect, "dhcp_option", &dhcp_options_list);
+				if(dhcp_options_list != NULL){
+					dmuci_del_list_value_by_section(((struct dhcp_client_option_args*) data)->client_sect, "dhcp_option", opt_value);
+				}
+			}
+			dmuci_delete_by_section_unnamed_icwmpd(((struct dhcp_client_option_args*) data)->opt_sect, NULL, NULL);
+			break;
+		case DEL_ALL:
+			dmuci_set_value_by_section(((struct dhcp_args*) data)->dhcp_sec, "dhcp_option", "");
+			uci_path_foreach_sections_safe(icwmpd, "dmmap_dhcp", "servpool_option", stmp, s) {
+				dmuci_delete_by_section_unnamed_icwmpd(s, NULL, NULL);
+			}
+			break;
+	}
+	return 0;
+}
+
+int addObjDHCPv4RelayForwarding(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	struct uci_section *s, *dmmap_sect;
+	char *wan_eth, *value, *bridgerelay, *instancepara, *v;
+
+	check_create_dmmap_package("dmmap_dhcp_relay");
+	instancepara = get_last_instance_icwmpd("dmmap_dhcp_relay", "interface", "cwmp_dhcpv4relay_instance");
+	dmuci_add_section("network", "interface", &s, &value);
+	dmuci_set_value_by_section(s, "proto", "relay");
+	dmuci_add_section_icwmpd("dmmap_dhcp_relay", "interface", &dmmap_sect, &v);
+	dmuci_set_value_by_section(dmmap_sect, "section_name", section_name(s));
+	*instance = update_instance_icwmpd(dmmap_sect, instancepara, "cwmp_dhcpv4relay_instance");
+	return 0;
+}
+
+int delObjDHCPv4RelayForwarding(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct dhcp_client_args *dhcp_relay_args = (struct dhcp_client_args*)data;
+	struct uci_section *s = NULL;
+	struct uci_section *ss = NULL;
+	struct uci_section *dmmap_section;
+	char *proto= NULL;
+	int found= 0;
+
+	switch (del_action) {
+		case DEL_INST:
+			if(is_section_unnamed(section_name(dhcp_relay_args->dhcp_client_conf))){
+				LIST_HEAD(dup_list);
+				delete_sections_save_next_sections("dmmap_dhcp_relay", "interface", "cwmp_dhcpv4relay_instance", section_name(dhcp_relay_args->dhcp_client_conf), atoi(instance), &dup_list);
+				update_dmmap_sections(&dup_list, "cwmp_dhcpv4relay_instance", "dmmap_dhcp_relay", "interface");
+				dmuci_delete_by_section_unnamed(dhcp_relay_args->dhcp_client_conf, NULL, NULL);
+			} else {
+				get_dmmap_section_of_config_section("dmmap_dhcp_relay", "interface", section_name(dhcp_relay_args->dhcp_client_conf), &dmmap_section);
+				dmuci_delete_by_section_unnamed_icwmpd(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(dhcp_relay_args->dhcp_client_conf, NULL, NULL);
+			}
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("network", "interface", s) {
+				if (found != 0){
+					dmuci_get_value_by_section_string(ss, "proto", &proto);
+					if(strcmp(proto, "relay") == 0) {
+						get_dmmap_section_of_config_section("dmmap_dhcp_relay", "interface", section_name(ss), &dmmap_section);
+						if(dmmap_section != NULL)
+							dmuci_delete_by_section(dmmap_section, NULL, NULL);
+						dmuci_delete_by_section(ss, NULL, NULL);
+					}
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL){
+				dmuci_get_value_by_section_string(ss, "proto", &proto);
+				if(strcmp(proto, "relay") == 0) {
+					get_dmmap_section_of_config_section("dmmap_dhcp_relay", "interface", section_name(ss), &dmmap_section);
+					if(dmmap_section != NULL)
+						dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+			}
+			break;
+	}
+	return 0;
+}
+
+/*************************************************************
+ * GET & SET PARAM
+/*************************************************************/
+int get_server_pool_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct dhcp_args *dhcp_arg= (struct dhcp_args*)data;
+	struct uci_section *dmmap_sect;
+
+	get_dmmap_section_of_config_section("dmmap_dhcp", "dhcp", section_name(dhcp_arg->dhcp_sec), &dmmap_sect);
+	if (dmmap_sect)
+		dmuci_get_value_by_section_string(dmmap_sect, "dhcp_alias", value);
+	return 0;
+}
+
+int set_server_pool_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	struct dhcp_args *dhcp_arg= (struct dhcp_args*)data;
+	struct uci_section *dmmap_sect;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			get_dmmap_section_of_config_section("dmmap_dhcp", "dhcp", section_name(dhcp_arg->dhcp_sec), &dmmap_sect);
+			if (dmmap_sect)
+				DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "dhcp_alias", value);
+	}
+	return 0;
+}
+
+/*#Device.DHCPv4.Server.Pool.{i}.DNSServers!UBUBS:network.interface/status/interface,@Name/dns-server*/
+int get_dns_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	int len;
+	struct uci_section *s = NULL;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", ((struct dhcp_args *)data)->interface, String}}, 1, &res);
+	if(res)
+	{
+		*value = dmjson_get_value_array_all(res, DELIMITOR, 1, "dns-server");
+	}
+	else
+		*value = "";
+	if ((*value)[0] == '\0') {
+		dmuci_get_option_value_string("network", ((struct dhcp_args *)data)->interface, "dns", value);
+		*value = dmstrdup(*value); // MEM WILL BE FREED IN DMMEMCLEAN
+		char *p = *value;
+		while (*p) {
+			if (*p == ' ' && p != *value && *(p-1) != ',')
+				*p++ = ',';
+			else
+				p++;
+		}
+	}
+	if ((*value)[0] == '\0') {
+		dmuci_get_option_value_string("network", ((struct dhcp_args *)data)->interface, "ipaddr", value);
+	}
+	return 0;
+}
+
+int set_dns_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *dup, *p;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dup = dmstrdup(value);
+			p = dup;
+			while (*p) {
+				if (*p == ',')
+					*p++ = ' ';
+				else
+					p++;
+			}
+			dmuci_set_value("network", ((struct dhcp_args *)data)->interface, "dns", dup);
+			dmfree(dup);
+			return 0;
+	}
+	return 0;
+}
+
+int get_dhcp_configurable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+
+	uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcp_args *)data)->interface, s) {
+		*value = "1";
+		return 0;
+	}
+	*value = "0";
+	return 0;
+}
+
+int set_dhcp_configurable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct uci_section *s = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcp_args *)data)->interface, s) {
+				if (!b) {
+					dmuci_delete_by_section(s, NULL, NULL);
+				}
+				break;
+			}
+			if (s == NULL && b) {
+				dmuci_set_value("dhcp",((struct dhcp_args *)data)->interface, NULL, "dhcp");
+				dmuci_set_value("dhcp", ((struct dhcp_args *)data)->interface, "interface", ((struct dhcp_args *)data)->interface);
+				dmuci_set_value("dhcp", ((struct dhcp_args *)data)->interface, "start", "100");
+				dmuci_set_value("dhcp", ((struct dhcp_args *)data)->interface, "limit", "150");
+				dmuci_set_value("dhcp", ((struct dhcp_args *)data)->interface, "leasetime", "12h");
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv4.Server.Pool.{i}.Status!UCI:dhcp/interface,@i-1/ignore*/
+int get_dhcp_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	char *v= NULL;
+	uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcp_args *)data)->interface, s) {
+		dmuci_get_value_by_section_string(s, "ignore", &v);
+		*value = (v && *v == '1') ? "Disabled" : "Enabled";
+		return 0;
+	}
+	*value="Error_Misconfigured";
+	return 0;
+}
+
+int get_dhcp_sever_pool_order(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct dhcp_args *dhcp_arg= (struct dhcp_args*)data;
+	struct uci_section *dmmap_sect;
+
+	get_dmmap_section_of_config_section("dmmap_dhcp", "dhcp", section_name(dhcp_arg->dhcp_sec), &dmmap_sect);
+	if (dmmap_sect)
+		dmuci_get_value_by_section_string(dmmap_sect, "order", value);
+	return 0;
+}
+
+int set_dhcp_sever_pool_order(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	struct dhcp_args *dhcp_arg= (struct dhcp_args*)data;
+	struct uci_section *dmmap_sect;
+
+	get_dmmap_section_of_config_section("dmmap_dhcp", "dhcp", section_name(dhcp_arg->dhcp_sec), &dmmap_sect);
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			set_section_order("dhcp", "dmmap_dhcp", "dhcp", dmmap_sect, dhcp_arg->dhcp_sec, 1, value);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv4.Server.Pool.{i}.StaticAddressNumberOfEntries!UCI:dhcp/host/*/
+int get_static_address_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct uci_section *s;
+	int i= 0;
+
+	uci_foreach_sections("dhcp", "host", s){
+		i++;
+	}
+	dmasprintf(value, "%d", i);
+	return 0;
+}
+
+int get_option_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	struct dhcp_args *curr_dhcp_args = (struct dhcp_args*)data;
+	struct uci_list *dhcp_options_list = NULL;
+	struct uci_element *e;
+
+	int i= 0;
+
+	dmuci_get_value_by_section_list(curr_dhcp_args->dhcp_sec, "dhcp_option", &dhcp_options_list);
+	if (dhcp_options_list != NULL) {
+		uci_foreach_element(dhcp_options_list, e) {
+			i++;
+		}
+	}
+	dmasprintf(value, "%d", i);
+	return 0;
+}
+
+int get_clients_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	json_object *res = NULL, *client_obj = NULL;
+	int i= 0;
+	char *dhcp;
+
+	dmubus_call("router.network", "clients", UBUS_ARGS{}, 0, &res);
+	if (res) {
+			json_object_object_foreach(res, key, client_obj) {
+				dhcp = dmjson_get_value(client_obj, 1, "dhcp");
+				if(strcmp(dhcp, "true") == 0)
+					i++;
+			}
+	}
+	dmasprintf(value, "%d", i);
+	return 0;
+}
+
+/*#Device.DHCPv4.Server.Pool.{i}.Enable!UCI:dhcp/interface,@i-1/ignore*/
+int get_dhcp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+
+	uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcp_args *)data)->interface, s) {
+		dmuci_get_value_by_section_string(s, "ignore", value);
+		if ((*value)[0] == '\0')
+			*value = "1";
+		else
+			*value = "0";
+		return 0;
+	}
+	*value = "0";
+	return 0;
+}
+
+int set_dhcp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct uci_section *s = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcp_args *)data)->interface, s) {
+				if (b)
+					dmuci_set_value_by_section(s, "ignore", "");
+				else
+					dmuci_set_value_by_section(s, "ignore", "1");
+				break;
+			}
+			return 0;
+	}
+	return 0;
+}
+
+enum enum_lanip_interval_address {
+	LANIP_INTERVAL_START,
+	LANIP_INTERVAL_END
+};
+
+int get_dhcp_interval_address(struct dmctx *ctx, void *data, char *instance, char **value, int option)
+{
+	json_object *res, *jobj;
+	char *ipaddr = "" , *mask = "", *start , *limit;
+	struct uci_section *s = NULL;
+	char bufipstart[16], bufipend[16];
+
+	*value = "";
+
+	uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcp_args *)data)->interface, s) {
+		dmuci_get_value_by_section_string(s, "start", &start);
+		if (option == LANIP_INTERVAL_END)
+			dmuci_get_value_by_section_string(s, "limit", &limit);
+		break;
+	}
+	if (s == NULL) {
+		return 0;
+	}
+	dmuci_get_option_value_string("network", ((struct dhcp_args *)data)->interface, "ipaddr", &ipaddr);
+	if (ipaddr[0] == '\0') {
+		dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", ((struct dhcp_args *)data)->interface, String}}, 1, &res);
+		if (res)
+		{
+			jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
+			ipaddr = dmjson_get_value(jobj, 1, "address");			
+		}
+	}
+	if (ipaddr[0] == '\0') {
+		return 0;
+	}
+	dmuci_get_option_value_string("network", ((struct dhcp_args *)data)->interface, "netmask", &mask);
+	if (mask[0] == '\0') {
+		dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", ((struct dhcp_args *)data)->interface, String}}, 1, &res);
+		if (res) {
+			jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
+			mask = dmjson_get_value(jobj, 1, "mask");
+			if (mask[0] == '\0') {
+				return 0;
+			}
+			mask = cidr2netmask(atoi(mask));
+		}
+	}
+	if (mask[0] == '\0') {
+		mask = "255.255.255.0";
+	}
+	if (option == LANIP_INTERVAL_START) {
+		ipcalc(ipaddr, mask, start, NULL, bufipstart, NULL);
+		*value = dmstrdup(bufipstart); // MEM WILL BE FREED IN DMMEMCLEAN
+	}
+	else {
+		ipcalc(ipaddr, mask, start, limit, bufipstart, bufipend);
+		*value = dmstrdup(bufipend); // MEM WILL BE FREED IN DMMEMCLEAN
+	}
+	return 0;
+}
+
+/*#Device.DHCPv4.Server.Pool.{i}.MinAddress!UCI:dhcp/interface,@i-1/start*/
+int get_dhcp_interval_address_min(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	get_dhcp_interval_address(ctx, data, instance, value, LANIP_INTERVAL_START);
+	return 0;
+}
+
+/*#Device.DHCPv4.Server.Pool.{i}.MaxAddress!UCI:dhcp/interface,@i-1/limit*/
+int get_dhcp_interval_address_max(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	get_dhcp_interval_address(ctx, data, instance, value, LANIP_INTERVAL_END);
+	return 0;
+}
+
+int set_dhcp_address_min(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	json_object *res, *jobj;
+	char *ipaddr = "", *mask = "", *start , *limit, buf[16];
+	struct uci_section *s = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_option_value_string("network", ((struct dhcp_args *)data)->interface, "ipaddr", &ipaddr);
+			if (ipaddr[0] == '\0') {
+				dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", ((struct dhcp_args *)data)->interface, String}}, 1, &res);
+				if (res) {
+					jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
+					ipaddr = dmjson_get_value(jobj, 1, "address");					
+				}
+			}
+			if (ipaddr[0] == '\0')
+				return 0;
+
+			dmuci_get_option_value_string("network", ((struct dhcp_args *)data)->interface, "netmask", &mask);
+			if (mask[0] == '\0') {
+				dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", ((struct dhcp_args *)data)->interface, String}}, 1, &res);
+				if (res) {
+					jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
+					mask = dmjson_get_value(jobj, 1, "mask");
+					if (mask[0] == '\0')
+						return 0;
+					mask = cidr2netmask(atoi(mask));
+				}
+			}
+			if (mask[0] == '\0')
+				mask = "255.255.255.0";
+
+			ipcalc_rev_start(ipaddr, mask, value, buf);
+			uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcp_args *)data)->interface, s) {
+				dmuci_set_value_by_section(s, "start", buf);
+				break;
+			}
+
+			return 0;
+	}
+	return 0;
+}
+
+int set_dhcp_address_max(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	int i_val;
+	json_object *res, *jobj;
+	char *ipaddr = "", *mask = "", *start, buf[16];
+	struct uci_section *s = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcp_args *)data)->interface, s) {
+				dmuci_get_value_by_section_string(s, "start", &start);
+				break;
+			}
+			if (!s) return 0;
+
+			dmuci_get_option_value_string("network", ((struct dhcp_args *)data)->interface, "ipaddr", &ipaddr);
+			if (ipaddr[0] == '\0') {
+				dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", ((struct dhcp_args *)data)->interface, String}}, 1, &res);
+				if (res) {
+					jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
+					ipaddr = dmjson_get_value(jobj, 1, "address");									}
+			}
+			if (ipaddr[0] == '\0')
+				return 0;
+
+			dmuci_get_option_value_string("network", ((struct dhcp_args *)data)->interface, "netmask", &mask);
+			if (mask[0] == '\0') {
+				dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", ((struct dhcp_args *)data)->interface, String}}, 1, &res);
+				if (res) {
+					jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
+					mask = dmjson_get_value(jobj, 1, "mask");
+					if (mask[0] == '\0')
+						return 0;
+					mask = cidr2netmask(atoi(mask));
+				}
+			}
+			if (mask[0] == '\0')
+				mask = "255.255.255.0";
+
+			ipcalc_rev_end(ipaddr, mask, start, value, buf);
+			dmuci_set_value_by_section(s, "limit", buf);
+			return 0;
+	}
+	return 0;
+}
+
+
+int get_dhcp_reserved_addresses(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char val[512] = {0}, *p;
+	struct uci_section *s = NULL;
+	char *min, *max, *ip, *s_n_ip;
+	unsigned int n_min, n_max, n_ip;
+	*value = "";
+
+	get_dhcp_interval_address(ctx, data, instance, &min, LANIP_INTERVAL_START);
+	get_dhcp_interval_address(ctx, data, instance, &max, LANIP_INTERVAL_END);
+	if (min[0] == '\0' || max[0] == '\0')
+		return 0;
+	n_min = inet_network(min);
+	n_max = inet_network(max);
+	p = val;
+	uci_foreach_sections("dhcp", "host", s) {
+		dmuci_get_value_by_section_string(s, "ip", &ip);
+		if (ip[0] == '\0')
+			continue;
+		n_ip = inet_network(ip);
+		if (n_ip >= n_min && n_ip <= n_max) {
+			if (val[0] != '\0')
+				dmstrappendchr(p, ',');
+			dmstrappendstr(p, ip);
+		}
+	}
+	dmstrappendend(p);
+	*value = dmstrdup(val); // MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+int set_dhcp_reserved_addresses(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *s = NULL;
+	struct uci_section *dhcp_section = NULL;
+	char *min, *max, *ip, *val, *local_value;
+	char *pch, *spch;
+	unsigned int n_min, n_max, n_ip, ipexist= 0;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			get_dhcp_interval_address(ctx, data, instance, &min, LANIP_INTERVAL_START);
+			get_dhcp_interval_address(ctx, data, instance, &max, LANIP_INTERVAL_END);
+			n_min = inet_network(min);
+			n_max = inet_network(max);
+			local_value = dmstrdup(value);
+
+			for (pch = strtok_r(local_value, ",", &spch);
+				pch != NULL;
+				pch = strtok_r(NULL, ",", &spch)) {
+				uci_foreach_option_eq("dhcp", "host", "ip", pch, s) {
+					ipexist= 1;
+				}
+				if(ipexist)
+					continue;
+				n_ip = inet_network(pch);
+
+
+				if (n_ip < n_min || n_ip > n_max)
+					continue;
+
+				dmuci_add_section_and_rename("dhcp", "host", &dhcp_section, &val);
+				dmuci_set_value_by_section(dhcp_section, "dhcp", ((struct dhcp_args *)data)->interface);
+				dmuci_set_value_by_section(dhcp_section, "ip", pch);
+			}
+			dmfree(local_value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv4.Server.Pool.{i}.SubnetMask!UCI:dhcp/interface,@i-1/netmask*/
+int get_dhcp_subnetmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *mask;
+	json_object *res, *jobj;
+	struct uci_section *s = NULL;
+	char *val;
+	*value = "";
+
+	uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcp_args *)data)->interface, s) {
+		dmuci_get_value_by_section_string(s, "netmask", value);
+		break;
+	}
+	if (s == NULL || (*value)[0] == '\0')
+	dmuci_get_option_value_string("network", ((struct dhcp_args *)data)->interface, "netmask", value);
+	if ((*value)[0] == '\0') {
+		dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", ((struct dhcp_args *)data)->interface, String}}, 1, &res);
+		DM_ASSERT(res, *value = "");
+		jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
+		mask = dmjson_get_value(jobj, 1, "mask");
+		int i_mask = atoi(mask);
+		val = cidr2netmask(i_mask);
+		*value = dmstrdup(val);// MEM WILL BE FREED IN DMMEMCLEAN
+	}
+	return 0;
+}
+
+int set_dhcp_subnetmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *s = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcp_args *)data)->interface, s) {
+				dmuci_set_value_by_section(s, "netmask", value);
+				return 0;
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_dhcp_iprouters(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("network", ((struct dhcp_args *)data)->interface, "gateway", value);
+	if ((*value)[0] == '\0') {
+		dmuci_get_option_value_string("network", ((struct dhcp_args *)data)->interface, "ipaddr", value);
+	}
+	return 0;
+}
+
+int set_dhcp_iprouters(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("network", ((struct dhcp_args *)data)->interface, "gateway", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv4.Server.Pool.{i}.LeaseTime!UCI:dhcp/interface,@i-1/leasetime*/
+int get_dhcp_leasetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	int len, mtime = 0;
+	char *ltime = "", *pch, *spch, *ltime_ini, *tmp, *tmp_ini;
+	struct uci_section *s = NULL;
+
+	uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcp_args *)data)->interface, s) {
+		dmuci_get_value_by_section_string(s, "leasetime", &ltime);
+		break;
+	}
+	if (ltime[0] == '\0') {
+		*value = "-1";
+		return 0;
+	}
+	ltime = dmstrdup(ltime);
+	ltime_ini = dmstrdup(ltime);
+	tmp = ltime;
+	tmp_ini = ltime_ini;
+	pch = strtok_r(ltime, "h", &spch);
+	if (strcmp(pch, ltime_ini) != 0) {
+		mtime = 3600 * atoi(pch);
+		if(spch[0] != '\0') {
+			ltime += strlen(pch)+1;
+			ltime_ini += strlen(pch)+1;
+			pch = strtok_r(ltime, "m", &spch);
+			if (strcmp(pch, ltime_ini) != 0) {
+				mtime += 60 * atoi(pch);
+				if(spch[0] !='\0') {
+					ltime += strlen(pch)+1;
+					ltime_ini += strlen(pch)+1;
+					pch = strtok_r(ltime, "s", &spch);
+					if (strcmp(pch, ltime_ini) != 0) {
+						mtime += atoi(pch);
+					}
+				}
+			} else {
+				pch = strtok_r(ltime, "s", &spch);
+	if (strcmp(pch, ltime_ini) != 0)
+				mtime +=  atoi(pch);
+			}
+		}
+	}
+	else {
+		pch = strtok_r(ltime, "m", &spch);
+		if (strcmp(pch, ltime_ini) != 0) {
+		mtime += 60 * atoi(pch);
+			if(spch[0] !='\0') {
+				ltime += strlen(pch)+1;
+				ltime_ini += strlen(pch)+1;
+				pch = strtok_r(ltime, "s", &spch);
+				if (strcmp(pch, ltime_ini) != 0) {
+					mtime += atoi(pch);
+				}
+			}
+		} else {
+			pch = strtok_r(ltime, "s", &spch);
+			if (strcmp(pch, ltime_ini) != 0)
+				mtime +=  atoi(pch);
+		}
+	}
+	dmfree(tmp);
+	dmfree(tmp_ini);
+
+	dmasprintf(value, "%d", mtime); // MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+int set_dhcp_leasetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *s = NULL;
+	char buf[32];
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcp_args *)data)->interface, s) {
+				int val = atoi(value);
+				sprintf(buf, "%ds", val);
+				dmuci_set_value_by_section(s, "leasetime",  buf);
+				break;
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_dhcp_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *linker;
+	linker = dmstrdup(((struct dhcp_args *)data)->interface);
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
+	if (*value == NULL)
+		*value = "";
+	dmfree(linker);
+	return 0;
+}
+
+int set_dhcp_interface_linker_parameter(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *linker;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			adm_entry_get_linker_value(ctx, value, &linker);
+			if (linker) {
+				dmuci_set_value_by_section(((struct dhcp_args *)data)->dhcp_sec, "interface", linker);
+				dmfree(linker);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_dhcp_domainname(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *result, *str;
+	struct uci_list *val;
+	struct uci_element *e = NULL;
+	struct uci_section *s = NULL;
+	*value = "";
+
+	uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcp_args *)data)->interface, s) {
+		dmuci_get_value_by_section_list(s, "dhcp_option", &val);
+		if (val) {
+			uci_foreach_element(val, e)
+			{
+				if ((str = strstr(e->name, "15,"))) {
+					*value = dmstrdup(str + sizeof("15,") - 1); //MEM WILL BE FREED IN DMMEMCLEAN
+					return 0;
+				}
+			}
+		}
+	}
+	return 0;
+}
+
+int set_dhcp_domainname(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *result, *dn, *pch;
+	struct uci_list *val;
+	struct uci_section *s = NULL;
+	struct uci_element *e = NULL, *tmp;
+	char *option = "dhcp_option", buf[64];
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcp_args *)data)->interface, s) {
+				dmuci_get_value_by_section_list(s, option, &val);
+				if (val) {
+					uci_foreach_element_safe(val, e, tmp)
+					{
+						if (strstr(tmp->name, "15,")) {
+							dmuci_del_list_value_by_section(s, "dhcp_option", tmp->name); //TODO test it
+						}
+					}
+				}
+				break;
+			}
+			goto end;
+	}
+end:
+	sprintf(buf, "15,%s", value);
+	dmuci_add_list_value_by_section(((struct dhcp_args *)data)->dhcp_sec, "dhcp_option", buf);
+	return 0;
+}
+
+int get_dhcp_static_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+	get_dmmap_section_of_config_section("dmmap_dhcp", "host", section_name(((struct dhcp_static_args *)data)->dhcpsection), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "ldhcpalias", value);
+	return 0;
+}
+
+int set_dhcp_static_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_dhcp", "host", section_name(((struct dhcp_static_args *)data)->dhcpsection), &dmmap_section);
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, "ldhcpalias", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv4.Server.Pool.{i}.StaticAddress.{i}.Chaddr!UCI:dhcp/host,@i-1/mac*/
+int get_dhcp_staticaddress_chaddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *chaddr;
+	struct dhcp_static_args *dhcpargs = (struct dhcp_static_args *)data;
+	
+	dmuci_get_value_by_section_string(dhcpargs->dhcpsection, "mac", &chaddr);
+	if (strcmp(chaddr, DHCPSTATICADDRESS_DISABLED_CHADDR) == 0)
+		dmuci_get_value_by_section_string(dhcpargs->dhcpsection, "mac_orig", value);
+	else 
+		*value = chaddr;
+	return 0;
+}
+
+int set_dhcp_staticaddress_chaddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{	
+	char *chaddr;
+	struct dhcp_static_args *dhcpargs = (struct dhcp_static_args *)data;
+		
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(dhcpargs->dhcpsection, "mac", &chaddr);
+			if (strcmp(chaddr, DHCPSTATICADDRESS_DISABLED_CHADDR) == 0)
+				dmuci_set_value_by_section(dhcpargs->dhcpsection, "mac_orig", value);
+			else
+				dmuci_set_value_by_section(dhcpargs->dhcpsection, "mac", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv4.Server.Pool.{i}.StaticAddress.{i}.Yiaddr!UCI:dhcp/host,@i-1/ip*/
+int get_dhcp_staticaddress_yiaddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_static_args *dhcpargs = (struct dhcp_static_args *)data;
+	
+	dmuci_get_value_by_section_string(dhcpargs->dhcpsection, "ip", value);
+	return 0;
+}
+
+int set_dhcp_staticaddress_yiaddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_static_args *dhcpargs = (struct dhcp_static_args *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dhcpargs->dhcpsection, "ip", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_dhcp_client_chaddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = dmjson_get_value(((struct client_args *)data)->client, 1, "macaddr");
+	return 0;
+}
+
+int get_dhcp_client_active(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = dmjson_get_value(((struct client_args *)data)->client, 1, "connected");
+	return 0;
+}
+
+int get_dhcp_client_ipv4address_leasetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char time_buf[26] = {0};
+	struct tm *t_tm;
+	struct dhcp_client_ipv4address_args current_dhcp_client_ipv4address_args = *((struct dhcp_client_ipv4address_args*)data);
+
+	*value = "0001-01-01T00:00:00Z";
+	time_t t_time = current_dhcp_client_ipv4address_args.leasetime;
+	t_tm = localtime(&t_time);
+	if (t_tm == NULL)
+		return 0;
+	if(strftime(time_buf, sizeof(time_buf), "%FT%T%z", t_tm) == 0)
+		return 0;
+
+	time_buf[25] = time_buf[24];
+	time_buf[24] = time_buf[23];
+	time_buf[22] = ':';
+	time_buf[26] = '\0';
+
+	*value = dmstrdup(time_buf);
+	return 0;
+}
+
+int get_dhcp_client_ipv4address_ip_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) {
+	struct dhcp_client_ipv4address_args current_dhcp_client_ipv4address_args = *((struct dhcp_client_ipv4address_args*)data);
+
+	if(current_dhcp_client_ipv4address_args.ip != NULL && strlen(current_dhcp_client_ipv4address_args.ip)>0)
+		*value= dmstrdup(current_dhcp_client_ipv4address_args.ip);
+	else
+		*value= "";
+	return 0;
+}
+
+int get_DHCPv4_ClientNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s, *dmmap_sect;
+	int nbre_confs= 0, nbre_dmmaps= 0;
+
+	uci_foreach_option_eq("network", "interface", "proto", "dhcp", s) {
+		nbre_confs++;
+	}
+	uci_path_foreach_sections(icwmpd, "dmmap_dhcp_client", "interface", dmmap_sect) {
+		nbre_dmmaps++;
+	}
+	if(nbre_dmmaps ==0 || nbre_dmmaps < nbre_confs)
+		dmasprintf(value, "%d", nbre_confs);
+	else
+		dmasprintf(value, "%d", nbre_dmmaps);
+	return 0;
+}
+
+/*#Device.DHCPv4.Client.{i}.Enable!UCI:network/interface,@i-1/disabled*/
+int get_DHCPv4Client_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	char *v= NULL;
+
+
+	if(dhcp_client_args->dhcp_client_conf == NULL)
+	{
+		*value= "0";
+		return 0;
+	}
+
+	dmuci_get_value_by_section_string(dhcp_client_args->dhcp_client_conf, "disabled", &v);
+
+	if (v==NULL || strlen(v)==0 || strcmp(v, "1")!=0)
+		*value= "1";
+	else
+		*value= "0";
+
+	return 0;
+}
+
+int set_DHCPv4Client_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct uci_section *s = NULL;
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value_by_section(dhcp_client_args->dhcp_client_conf, "disabled", "0");
+			else
+				dmuci_set_value_by_section(dhcp_client_args->dhcp_client_conf, "disabled", "1");
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4Client_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+
+	dmuci_get_value_by_section_string(dhcp_client_args->dhcp_client_dm, "cwmp_dhcpv4client_alias", value);
+
+	return 0;
+}
+
+int set_DHCPv4Client_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(dhcp_client_args->dhcp_client_dm, "cwmp_dhcpv4client_alias", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4Client_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	if(dhcp_client_args->dhcp_client_conf == NULL)
+	{
+		*value= "";
+
+		return 0;
+	}
+	char *linker= dmstrdup(section_name(dhcp_client_args->dhcp_client_conf));
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim, dm_delim), linker, value);
+
+	return 0;
+}
+
+int set_DHCPv4Client_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	struct uci_section *s;
+	char *linker= NULL, *newvalue= NULL, *v;
+
+	switch (action)	{
+		case VALUECHECK:
+			if(strlen(value) == 0 || strcmp(value, "") == 0)
+				return FAULT_9007;
+
+			if (value[strlen(value)-1]!='.') {
+				dmasprintf(&newvalue, "%s.", value);
+				adm_entry_get_linker_value(ctx, newvalue, &linker);
+			} else
+				adm_entry_get_linker_value(ctx, value, &linker);
+			uci_path_foreach_sections(icwmpd, "dmmap_dhcp_client", "interface", s) {
+				dmuci_get_value_by_section_string(s, "section_name", &v);
+				if(strcmp(v, linker) == 0)
+					return FAULT_9007;
+			}
+			uci_foreach_sections("network", "interface", s) {
+				if(strcmp(section_name(s), linker) == 0){
+					dmuci_get_value_by_section_string(s, "proto", &v);
+					if(strcmp(v, "dhcp") != 0)
+						return FAULT_9007;
+				}
+			}
+			break;
+		case VALUESET:
+			if (value[strlen(value)-1]!='.') {
+				dmasprintf(&newvalue, "%s.", value);
+				adm_entry_get_linker_value(ctx, newvalue, &linker);
+			} else
+				adm_entry_get_linker_value(ctx, value, &linker);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dhcp_client_args->dhcp_client_dm, "section_name", linker);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv4.Client.{i}.Status!UCI:network/interface,@i-1/disabled*/
+int get_DHCPv4Client_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	char *v= "";
+	if(dhcp_client_args->dhcp_client_conf == NULL)
+	{
+		*value= "Error_Misconfigured";
+
+		return 0;
+	}
+
+	dmuci_get_value_by_section_string(dhcp_client_args->dhcp_client_conf, "disabled", &v);
+
+	if (v==NULL || strlen(v)==0 || strcmp(v, "1")!=0)
+		*value= "Enabled";
+	else
+		*value= "Disabled";
+
+	return 0;
+}
+
+/*#Device.DHCPv4.Client.{i}.DHCPStatus!UBUS:network.interface/status/interface,@Name/ipv4-address[@i-1].address*/
+int get_DHCPv4Client_DHCPStatus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	char *ipaddr;
+	json_object *res, *jobj;
+
+	if (dhcp_client_args->dhcp_client_conf == NULL)
+		return 0;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(dhcp_client_args->dhcp_client_conf), String}}, 1, &res);
+	if (res) {
+		jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
+		ipaddr = dmjson_get_value(jobj, 1, "address");
+	}
+
+	if (ipaddr[0] == '\0')
+		*value = "Requesting";
+	else
+		*value = "Bound";
+
+	return 0;
+}
+
+int get_DHCPv4Client_Renew(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+
+	*value = "false";
+
+	return 0;
+}
+
+int set_DHCPv4Client_Renew(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	json_object *res;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			if (dhcp_client_args->dhcp_client_conf == NULL && strcasecmp(value, "true") != 0)
+				return 0;
+
+			dmubus_call("network.interface", "renew", UBUS_ARGS{{"interface", section_name(dhcp_client_args->dhcp_client_conf), String}}, 1, &res);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4Client_IPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+
+	*value= dmstrdup(dhcp_client_args->ip);
+
+	return 0;
+}
+
+int get_DHCPv4Client_SubnetMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+
+	*value= dmstrdup(dhcp_client_args->mask);
+
+	return 0;
+}
+
+/*#Device.DHCPv4.Client.{i}.IPRouters!UBUS:network.interface/status/interface,@Name/route[@i-1].target*/
+int get_DHCPv4Client_IPRouters(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	char *v, buf[256] = "";
+	json_object *jobj= NULL, *res;
+	int i = 0;
+
+	if (dhcp_client_args->dhcp_client_conf == NULL)
+		return 0;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(dhcp_client_args->dhcp_client_conf), String}}, 1, &res);
+
+	while (1) {
+		jobj = dmjson_select_obj_in_array_idx(res, i, 1, "route");
+		i++;
+
+		if (jobj == NULL)
+			break;
+
+		v = dmjson_get_value(jobj, 1, "target");
+		if (*v == '\0')
+			continue;
+		if (strcmp(v, "0.0.0.0") == 0)
+			continue;
+		if (buf[0] != '\0') {
+			strcat(buf, ",");
+		} else
+			strcat(buf, v);
+
+	}
+
+	*value = dmstrdup(buf);
+
+	return 0;
+}
+
+/*#Device.DHCPv4.Client.{i}.DNSServers!UBUS:network.interface/status/interface,@Name/dns-server*/
+int get_DHCPv4Client_DNSServers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	json_object *res;
+
+	if (dhcp_client_args->dhcp_client_conf == NULL)
+		return 0;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(dhcp_client_args->dhcp_client_conf), String}}, 1, &res);
+
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value_array_all(res, DELIMITOR, 1, "dns-server");
+
+	return 0;
+}
+
+/*#Device.DHCPv4.Client.{i}.LeaseTimeRemaining!UBUS:network.interface/status/interface,@Name/data.leasetime*/
+int get_DHCPv4Client_LeaseTimeRemaining(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	json_object *res;
+	char *str;
+
+	if (dhcp_client_args->dhcp_client_conf == NULL)
+		return 0;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(dhcp_client_args->dhcp_client_conf), String}}, 1, &res);
+	if (!res){
+		*value= "";
+		return 0;
+	}
+
+	*value = dmjson_get_value(res, 2, "data", "leasetime");
+	return 0;
+}
+
+int get_DHCPv4Client_DHCPServer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv4Client_PassthroughEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+
+	*value = "0";
+
+	return 0;
+}
+
+int set_DHCPv4Client_PassthroughEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4Client_PassthroughDHCPPool(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "";
+	return 0;
+}
+
+int set_DHCPv4Client_PassthroughDHCPPool(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv4.Client.{i}.SentOptionNumberOfEntries!UCI:network/interface,@i-1/sendopts*/
+int get_DHCPv4Client_SentOptionNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args* dhcp_client_args= (struct dhcp_client_args*)data;
+	char *v= NULL, **sendopts;
+	int length;
+
+	if(dhcp_client_args->dhcp_client_conf != NULL)
+		dmuci_get_value_by_section_string(dhcp_client_args->dhcp_client_conf, "sendopts", &v);
+
+	if(v==NULL){
+		*value= "0";
+		return 0;
+	}
+
+	sendopts= strsplit(v, " ", &length);
+	dmasprintf(value, "%d", length);
+
+	return 0;
+}
+
+/*#Device.DHCPv4.Client.{i}.ReqOptionNumberOfEntries!UCI:network/interface,@i-1/reqopts*/
+int get_DHCPv4Client_ReqOptionNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args* dhcp_client_args= (struct dhcp_client_args*)data;
+	char *v, **sendopts;
+	int length;
+
+	if(dhcp_client_args->dhcp_client_conf != NULL)
+		dmuci_get_value_by_section_string(dhcp_client_args->dhcp_client_conf, "reqopts", &v);
+
+	if(v==NULL){
+		*value= "0";
+		return 0;
+	}
+
+	sendopts= strsplit(v, " ", &length);
+
+	dmasprintf(value, "%d", length);
+
+	return 0;
+}
+
+int get_DHCPv4ClientSentOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+	char *v;
+	char *opttagvalue= NULL;
+
+	if(strcmp(dhcp_client_opt_args->option_tag, "0") == 0){
+		*value= "0";
+		return 0;
+	}
+
+	dmasprintf(&opttagvalue, "%s:%s", dhcp_client_opt_args->option_tag, dhcp_client_opt_args->value);
+	dmuci_get_value_by_section_string(dhcp_client_opt_args->client_sect, "sendopts", &v);
+
+	if(is_elt_exit_in_str_list(v, opttagvalue))
+		*value = "1";
+	else
+		*value= "0";
+
+
+	return 0;
+}
+
+int set_DHCPv4ClientSentOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+	bool b;
+	char *v;
+	char *opttagvalue= NULL;
+
+	switch (action)	{
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmuci_get_value_by_section_string(dhcp_client_opt_args->client_sect, "sendopts", &v);
+
+			if(strcmp(dhcp_client_opt_args->option_tag, "0") == 0)
+				return 0;
+
+			dmasprintf(&opttagvalue, "%s:%s", dhcp_client_opt_args->option_tag, dhcp_client_opt_args->value);
+
+			if (b) {
+				if(!is_elt_exit_in_str_list(v, opttagvalue)){
+					add_elt_to_str_list(&v, opttagvalue);
+					dmuci_set_value_by_section(dhcp_client_opt_args->client_sect, "sendopts", v);
+				}
+			} else {
+				remove_elt_from_str_list(&v, opttagvalue);
+				dmuci_set_value_by_section(dhcp_client_opt_args->client_sect, "sendopts", v);
+			}
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4ClientSentOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+
+	dmuci_get_value_by_section_string(dhcp_client_opt_args->opt_sect, "cwmp_dhcpv4_sentopt_alias", value);
+
+	return 0;
+}
+
+int set_DHCPv4ClientSentOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dhcp_client_opt_args->opt_sect, "cwmp_dhcpv4_sentopt_alias", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4ClientSentOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+	*value= dmstrdup(dhcp_client_opt_args->option_tag);
+
+	return 0;
+}
+
+int set_DHCPv4ClientSentOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+	char *pch, *spch, *list, *v, *opttagvalue, **sendopts, *oldopttagvalue;
+	int length;
+
+	switch (action)	{
+		case VALUECHECK:
+			dmuci_get_value_by_section_string(dhcp_client_opt_args->client_sect, "sendopts", &v);
+			if(v==NULL)
+				return 0;
+
+			list= dmstrdup(v);
+			for (pch = strtok_r(list, " ", &spch); pch != NULL; pch = strtok_r(NULL, " ", &spch)) {
+				sendopts= strsplit(pch, ":", &length);
+				if(strcmp(sendopts[0], value) == 0)
+					return FAULT_9007;
+			}
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string(dhcp_client_opt_args->client_sect, "sendopts", &v);
+			dmasprintf(&oldopttagvalue, "%s:%s", dhcp_client_opt_args->option_tag, dhcp_client_opt_args->value);
+			if (v != NULL && strlen(v)>0)
+				remove_elt_from_str_list(&v, oldopttagvalue);
+			dmasprintf(&opttagvalue, "%s:%s", value, dhcp_client_opt_args->value&&strlen(dhcp_client_opt_args->value)>0?dhcp_client_opt_args->value:"0");
+			add_elt_to_str_list(&v, opttagvalue);
+			dmuci_set_value_by_section(dhcp_client_opt_args->client_sect, "sendopts", v);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dhcp_client_opt_args->opt_sect, "option_tag", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4ClientSentOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+
+	*value= dmstrdup(dhcp_client_opt_args->value);
+
+	return 0;
+}
+
+int set_DHCPv4ClientSentOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+	char *v, *opttagvalue, *oldopttagvalue;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string(dhcp_client_opt_args->client_sect, "sendopts", &v);
+			dmasprintf(&oldopttagvalue, "%s:%s", dhcp_client_opt_args->option_tag, dhcp_client_opt_args->value);
+			remove_elt_from_str_list(&v, oldopttagvalue);
+			dmasprintf(&opttagvalue, "%s:%s", dhcp_client_opt_args->option_tag, value);
+			add_elt_to_str_list(&v, opttagvalue);
+			dmuci_set_value_by_section(dhcp_client_opt_args->client_sect, "sendopts", v);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dhcp_client_opt_args->opt_sect, "option_value", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4ClientReqOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+	char *v;
+	char *opttagvalue= NULL;
+
+	if(strcmp(dhcp_client_opt_args->option_tag, "0") == 0){
+		*value= "0";
+		return 0;
+	}
+
+	dmuci_get_value_by_section_string(dhcp_client_opt_args->client_sect, "reqopts", &v);
+
+	if(is_elt_exit_in_str_list(v, dhcp_client_opt_args->option_tag))
+		*value = "1";
+	else
+		*value= "0";
+
+	return 0;
+}
+
+int set_DHCPv4ClientReqOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+	bool b;
+	char *v;
+
+	switch (action)	{
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmuci_get_value_by_section_string(dhcp_client_opt_args->client_sect, "reqopts", &v);
+
+			if(strcmp(dhcp_client_opt_args->option_tag, "0") == 0)
+				return 0;
+
+			if (b) {
+				if(!is_elt_exit_in_str_list(v,  dhcp_client_opt_args->option_tag)){
+					add_elt_to_str_list(&v,  dhcp_client_opt_args->option_tag);
+					dmuci_set_value_by_section(dhcp_client_opt_args->client_sect, "reqopts", v);
+				}
+			} else {
+				remove_elt_from_str_list(&v,  dhcp_client_opt_args->option_tag);
+				dmuci_set_value_by_section(dhcp_client_opt_args->client_sect, "reqopts", v);
+			}
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4ClientReqOption_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv4ClientReqOption_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4ClientReqOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+
+	dmuci_get_value_by_section_string(dhcp_client_opt_args->opt_sect, "cwmp_dhcpv4_reqtopt_alias", value);
+
+	return 0;
+}
+
+int set_DHCPv4ClientReqOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dhcp_client_opt_args->opt_sect, "cwmp_dhcpv4_reqtopt_alias", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4ClientReqOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+	*value= dmstrdup(dhcp_client_opt_args->option_tag);
+	return 0;
+}
+
+int set_DHCPv4ClientReqOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+
+	char *pch, *spch, *list, *v, *opttagvalue, **sendopts, *oldopttagvalue;
+	int length;
+
+	switch (action)	{
+		case VALUECHECK:
+			dmuci_get_value_by_section_string(dhcp_client_opt_args->client_sect, "reqopts", &v);
+			if(v==NULL)
+				return 0;
+			list= dmstrdup(v);
+			for (pch = strtok_r(list, " ", &spch); pch != NULL; pch = strtok_r(NULL, " ", &spch)) {
+				if(strcmp(pch, value) == 0)
+					return FAULT_9007;
+			}
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string(dhcp_client_opt_args->client_sect, "reqopts", &v);
+			if (v != NULL && strlen(v)>0)
+				remove_elt_from_str_list(&v, dhcp_client_opt_args->option_tag);
+			add_elt_to_str_list(&v, value);
+			dmuci_set_value_by_section(dhcp_client_opt_args->client_sect, "reqopts", v);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dhcp_client_opt_args->opt_sect, "option_tag", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4ClientReqOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv4Server_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv4Server_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4RelayForwarding_DHCPServerIPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_DHCPServerIPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4ServerPoolOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+	char *v;
+	char *opttagvalue= NULL;
+	struct uci_list *dhcp_option_list;
+	struct uci_element *e;
+	char **buf;
+	int length;
+
+	if(strcmp(dhcp_client_opt_args->option_tag, "0") == 0){
+		*value= "0";
+		return 0;
+	}
+
+	dmuci_get_value_by_section_list(dhcp_client_opt_args->client_sect, "dhcp_option", &dhcp_option_list);
+	if (dhcp_option_list != NULL) {
+			uci_foreach_element(dhcp_option_list, e) {
+				buf= strsplit(e->name, ",", &length);
+				if(strcmp(buf[0], dhcp_client_opt_args->option_tag) == 0) {
+					*value= "1";
+					return 0;
+				}
+			}
+	}
+
+	*value= "0";
+	return 0;
+}
+
+int set_DHCPv4ServerPoolOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+	struct uci_list *dhcp_option_list;
+	struct uci_element *e;
+	char **buf, *opt_value;
+	int length;
+	bool test= false, b;
+
+	switch (action)	{
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+
+			if(strcmp(dhcp_client_opt_args->option_tag, "0") == 0)
+				return 0;
+
+
+			dmuci_get_value_by_section_list(dhcp_client_opt_args->client_sect, "dhcp_option", &dhcp_option_list);
+			dmasprintf(&opt_value, "%s,%s", dhcp_client_opt_args->option_tag, dhcp_client_opt_args->value);
+
+			if (dhcp_option_list != NULL) {
+					uci_foreach_element(dhcp_option_list, e) {
+						buf= strsplit(e->name, ",", &length);
+						if(strcmp(buf[0], dhcp_client_opt_args->option_tag) == 0) {
+							test= true;
+							if(!b)
+								dmuci_del_list_value_by_section(dhcp_client_opt_args->client_sect, "dhcp_option", opt_value);
+							break;
+						}
+					}
+			}
+			if(!test && b)
+				dmuci_add_list_value_by_section(dhcp_client_opt_args->client_sect, "dhcp_option", opt_value);
+
+	}
+	return 0;
+}
+
+int get_DHCPv4Server_PoolNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	int i= 0;
+
+	uci_foreach_sections("dhcp", "dhcp", s) {
+		i++;
+	}
+	dmasprintf(value, "%d", i);
+	return 0;
+}
+
+int get_DHCPv4ServerPoolOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+
+	dmuci_get_value_by_section_string(dhcp_client_opt_args->opt_sect, "cwmp_dhcpv4_servpool_option_alias", value);
+	return 0;
+}
+
+int set_DHCPv4ServerPoolOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dhcp_client_opt_args->opt_sect, "cwmp_dhcpv4_servpool_option_alias", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4ServerPoolOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+	*value= dmstrdup(dhcp_client_opt_args->option_tag);
+	return 0;
+}
+
+int set_DHCPv4ServerPoolOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+	char *opttagvalue, **option, *oldopttagvalue;
+	int length;
+	struct uci_list *dhcp_option_list= NULL;
+	struct uci_element *e;
+
+	switch (action)	{
+		case VALUECHECK:
+			dmuci_get_value_by_section_list(dhcp_client_opt_args->client_sect, "dhcp_option", &dhcp_option_list);
+
+			if(dhcp_option_list==NULL)
+				return 0;
+
+			uci_foreach_element(dhcp_option_list, e) {
+				option= strsplit(e->name, ",", &length);
+				if (strcmp(option[0], value)==0)
+					return FAULT_9007;
+			}
+			break;
+		case VALUESET:
+			dmasprintf(&oldopttagvalue, "%s,%s", dhcp_client_opt_args->option_tag, dhcp_client_opt_args->value);
+			dmasprintf(&opttagvalue, "%s,%s", value, dhcp_client_opt_args->value);
+			dmuci_get_value_by_section_list(dhcp_client_opt_args->client_sect, "dhcp_option", &dhcp_option_list);
+			dmuci_del_list_value_by_section(dhcp_client_opt_args->client_sect, "dhcp_option", oldopttagvalue);
+			dmuci_add_list_value_by_section(dhcp_client_opt_args->client_sect, "dhcp_option", opttagvalue);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dhcp_client_opt_args->opt_sect, "option_tag", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4ServerPoolOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+	*value= dmstrdup(dhcp_client_opt_args->value);
+	return 0;
+}
+
+int set_DHCPv4ServerPoolOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_option_args* dhcp_client_opt_args= (struct dhcp_client_option_args*)data;
+	char *opttagvalue, **option, *oldopttagvalue;
+	int length;
+	struct uci_list *dhcp_option_list= NULL;
+	struct uci_element *e;
+
+	switch (action)	{
+		case VALUECHECK:
+			dmuci_get_value_by_section_list(dhcp_client_opt_args->client_sect, "dhcp_option", &dhcp_option_list);
+
+			if(dhcp_option_list==NULL)
+				return 0;
+
+			uci_foreach_element(dhcp_option_list, e) {
+				option= strsplit(e->name, ",", &length);
+				if (strcmp(option[0], value)==0)
+					return FAULT_9007;
+			}
+			break;
+		case VALUESET:
+			dmasprintf(&oldopttagvalue, "%s,%s", dhcp_client_opt_args->option_tag, dhcp_client_opt_args->value);
+			dmasprintf(&opttagvalue, "%s,%s", dhcp_client_opt_args->option_tag, value);
+			dmuci_get_value_by_section_list(dhcp_client_opt_args->client_sect, "dhcp_option", &dhcp_option_list);
+			dmuci_del_list_value_by_section(dhcp_client_opt_args->client_sect, "dhcp_option", oldopttagvalue);
+			dmuci_add_list_value_by_section(dhcp_client_opt_args->client_sect, "dhcp_option", opttagvalue);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dhcp_client_opt_args->opt_sect, "option_value", value);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv4.Relay.Forwarding.{i}.Enable!UCI:network/interface,@i-1/disabled*/
+int get_DHCPv4RelayForwarding_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	char *v= NULL;
+
+
+	if(dhcp_client_args->dhcp_client_conf == NULL)
+	{
+		*value= "0";
+		return 0;
+	}
+
+	dmuci_get_value_by_section_string(dhcp_client_args->dhcp_client_conf, "disabled", &v);
+
+	if (v==NULL || strlen(v)==0 || strcmp(v, "1")!=0)
+		*value= "1";
+	else
+		*value= "0";
+
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct uci_section *s = NULL;
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value_by_section(dhcp_client_args->dhcp_client_conf, "disabled", "0");
+			else
+				dmuci_set_value_by_section(dhcp_client_args->dhcp_client_conf, "disabled", "1");
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4RelayForwarding_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	struct uci_section *dmmap_section;
+	char *v;
+
+	dmuci_get_value_by_section_string(dhcp_client_args->dhcp_client_dm, "cwmp_dhcpv4relay_alias", value);
+
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	struct uci_section *dmmap_section;
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(dhcp_client_args->dhcp_client_dm, "cwmp_dhcpv4relay_alias", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4RelayForwarding_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4RelayForwarding_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	if(dhcp_client_args->dhcp_client_conf == NULL)
+	{
+		*value= "";
+
+		return 0;
+	}
+	char *linker= dmstrdup(section_name(dhcp_client_args->dhcp_client_conf));
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim, dm_delim), linker, value);
+
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	struct uci_section *s;
+	char *linker= NULL, *newvalue= NULL, *v;
+
+	switch (action)	{
+		case VALUECHECK:
+			if(strlen(value) == 0 || strcmp(value, "") == 0)
+				return FAULT_9007;
+
+			if (value[strlen(value)-1]!='.') {
+				dmasprintf(&newvalue, "%s.", value);
+				adm_entry_get_linker_value(ctx, newvalue, &linker);
+			} else
+				adm_entry_get_linker_value(ctx, value, &linker);
+			if(linker == NULL)
+				return FAULT_9007;
+			uci_path_foreach_sections(icwmpd, "dmmap_dhcp_relay", "interface", s) {
+				dmuci_get_value_by_section_string(s, "section_name", &v);
+				if(strcmp(v, linker) == 0)
+					return FAULT_9007;
+			}
+			uci_foreach_sections("network", "interface", s) {
+				if(strcmp(section_name(s), linker) == 0){
+					dmuci_get_value_by_section_string(s, "proto", &v);
+					if(strcmp(v, "relay") != 0)
+						return FAULT_9007;
+				}
+			}
+			break;
+		case VALUESET:
+			if (value[strlen(value)-1]!='.') {
+				dmasprintf(&newvalue, "%s.", value);
+				adm_entry_get_linker_value(ctx, newvalue, &linker);
+			} else
+				adm_entry_get_linker_value(ctx, value, &linker);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dhcp_client_args->dhcp_client_dm, "section_name", linker);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv4.Relay.Forwarding.{i}.VendorClassID!UCI:network/interface,@i-1/vendorclass*/
+int get_DHCPv4RelayForwarding_VendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_relay_args = (struct dhcp_client_args*)data;
+	char *vendorclass;
+	if(dhcp_relay_args->vendorclassidclassifier == NULL)
+		return 0;
+	dmuci_get_value_by_section_string(dhcp_relay_args->vendorclassidclassifier, "vendorclass", value);
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_VendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_args *dhcp_relay_args = (struct dhcp_client_args*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			if(dhcp_relay_args->vendorclassidclassifier == NULL)
+				return 0;
+			dmuci_set_value_by_section(dhcp_relay_args->vendorclassidclassifier, "vendorclass", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4RelayForwarding_VendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value="false";
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_VendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4RelayForwarding_VendorClassIDMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value= "Prefix";
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_VendorClassIDMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv4.Relay.Forwarding.{i}.Chaddr!UCI:network/interface,@i-1/mac*/
+int get_DHCPv4RelayForwarding_Chaddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_relay_args = (struct dhcp_client_args*)data;
+	char *mac, *mac1, *mac2, *mac3, *mac4, *mac5, *mac6, **macarray, *res= NULL, *tmp= "";
+	int length, i;
+
+	if(dhcp_relay_args->macclassifier == NULL) {
+		*value= "";
+		return 0;
+	}
+	dmuci_get_value_by_section_string(dhcp_relay_args->macclassifier, "mac", &mac);
+	macarray= strsplit(mac, ":", &length);
+	res= (char*)dmcalloc(18, sizeof(char));
+	tmp=res;
+	for(i= 0; i<6; i++){
+		if(strcmp(macarray[i], "*") == 0) {
+			sprintf(tmp, "%s", "00");
+		} else{
+			sprintf(tmp, "%s", macarray[i]);
+		}
+		tmp+=2;
+
+		if(i<5){
+			sprintf(tmp, "%s", ":");
+			tmp++;
+		}
+	}
+	dmasprintf(value, "%s", res);
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_Chaddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv4.Relay.Forwarding.{i}.ChaddrMask!UCI:network/interface,@i-1/mac*/
+int get_DHCPv4RelayForwarding_ChaddrMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_relay_args = (struct dhcp_client_args*)data;
+	char *mac, *mac1, *mac2, *mac3, *mac4, *mac5, *mac6, **macarray, *res= NULL, *tmp= "";
+	int length, i;
+
+	if(dhcp_relay_args->macclassifier == NULL) {
+		*value= "";
+		return 0;
+	}
+	dmuci_get_value_by_section_string(dhcp_relay_args->macclassifier, "mac", &mac);
+	macarray= strsplit(mac, ":", &length);
+	res= (char*)dmcalloc(18, sizeof(char));
+	tmp=res;
+	for(i= 0; i<6; i++){
+		if(strcmp(macarray[i], "*") == 0) {
+			sprintf(tmp, "%s", "00");
+		} else{
+			sprintf(tmp, "%s", "FF");
+		}
+		tmp+=2;
+
+		if(i<5){
+			sprintf(tmp, "%s", ":");
+			tmp++;
+		}
+	}
+	dmasprintf(value, "%s", res);
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_ChaddrMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4RelayForwarding_ChaddrExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value="true";
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_ChaddrExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4RelayForwarding_LocallyServed(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_LocallyServed(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4ServerPoolClientOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+/*#Device.DHCPv4.Relay.Forwarding.{i}.Status!UCI:network/interface,@i-1/disabled*/
+int get_DHCPv4RelayForwarding_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data;
+	char *v= NULL;
+	if(dhcp_client_args->dhcp_client_conf == NULL)
+	{
+		*value= "Error_Misconfigured";
+
+		return 0;
+	}
+	dmuci_get_value_by_section_string(dhcp_client_args->dhcp_client_conf, "disabled", &v);
+	if (v==NULL || strlen(v)==0 || strcmp(v, "1")!=0)
+		*value= "Enabled";
+	else
+		*value= "Disabled";
+
+	return 0;
+}
+
+int get_DHCPv4RelayForwarding_ClientID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_ClientID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4RelayForwarding_ClientIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value= "true";
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_ClientIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv4.Relay.Forwarding.{i}.UserClassID!UCI:network/interface,@i-1/userclass*/
+int get_DHCPv4RelayForwarding_UserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcp_client_args *dhcp_relay_args = (struct dhcp_client_args*)data;
+	char *vendorclass;
+	if(dhcp_relay_args->userclassclassifier == NULL)
+		return 0;
+	dmuci_get_value_by_section_string(dhcp_relay_args->userclassclassifier, "userclass", value);
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_UserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcp_client_args *dhcp_relay_args = (struct dhcp_client_args*)data;
+	char *user;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			if(dhcp_relay_args->userclassclassifier == NULL)
+				return 0;
+			dmuci_set_value_by_section(dhcp_relay_args->userclassclassifier, "userclass", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4RelayForwarding_UserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value= "false";
+	return 0;
+}
+
+int set_DHCPv4RelayForwarding_UserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4ServerPoolClientOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv4Relay_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *path = "/etc/rc.d/*relayd";
+	if (check_file(path))
+		*value = "1";
+	else
+		*value = "0";
+	return 0;
+}
+
+int set_DHCPv4Relay_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action)	{
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmcmd("/etc/init.d/relayd", 1, "enable");
+			else
+				dmcmd("/etc/init.d/relayd", 1, "disable");
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv4Relay_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *path = "/etc/rc.d/*relayd";
+	if (check_file(path))
+		*value = "Enabled";
+	else
+		*value = "Disabled";
+	return 0;
+}
+
+int get_DHCPv4Relay_ForwardingNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s, *dmmap_sect;
+	int nbre_confs= 0, nbre_dmmaps= 0;
+
+	uci_foreach_option_eq("network", "interface", "proto", "relay", s) {
+		nbre_confs++;
+	}
+	uci_path_foreach_sections(icwmpd, "dmmap_dhcp_relay", "interface", dmmap_sect) {
+		nbre_dmmaps++;
+	}
+	if(nbre_dmmaps ==0 || nbre_dmmaps < nbre_confs)
+		dmasprintf(value, "%d", nbre_confs);
+	else
+		dmasprintf(value, "%d", nbre_dmmaps);
+	return 0;
+}
+
+/*************************************************************
+ * ENTRY METHOD
+/*************************************************************/
+/*#Device.DHCPv4.Server.Pool.{i}.!UCI:dhcp/dhcp/dmmap_dhcp*/
+int browseDhcpInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s;
+	char *interface, *idhcp = NULL, *idhcp_last = NULL, *v;
+	struct dhcp_args curr_dhcp_args = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("dhcp", "dhcp", "dmmap_dhcp", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		dmuci_get_value_by_section_string(p->config_section, "interface", &interface);
+		init_dhcp_args(&curr_dhcp_args, p->config_section, interface);
+		idhcp = handle_update_instance(1, dmctx, &idhcp_last, update_instance_alias_icwmpd, 3, p->dmmap_section, "dhcp_instance", "dhcp_alias");
+		dmuci_get_value_by_section_string(p->dmmap_section, "order", &v);
+		if(v==NULL || strlen(v) == 0)
+			set_section_order("dhcp", "dmmap_dhcp", "dhcp", p->dmmap_section, p->config_section, 0, idhcp);
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_dhcp_args, idhcp) == DM_STOP)
+			break;
+	}
+
+	free_dmmap_config_dup_list(&dup_list);
+
+	return 0;
+}
+
+/*#Device.DHCPv4.Server.Pool.{i}.StaticAddress.{i}.!UCI:dhcp/host/dmmap_dhcp*/
+int browseDhcpStaticInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *sss = NULL;
+	char *idhcp = NULL, *idhcp_last = NULL;
+	struct dhcp_static_args curr_dhcp_staticargs = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap_cont("dhcp", "host", "dmmap_dhcp", "dhcp", ((struct dhcp_args *)prev_data)->interface, &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		idhcp = handle_update_instance(2, dmctx, &idhcp_last, update_instance_alias_icwmpd, 3, p->dmmap_section, "ldhcpinstance", "ldhcpalias");
+		init_args_dhcp_host(&curr_dhcp_staticargs, p->config_section);
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_dhcp_staticargs, idhcp) == DM_STOP)
+			break;
+	}
+
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+int browseDhcpClientInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *sss = NULL;
+	char *idx = NULL, *idx_last = NULL;
+	json_object *res = NULL, *client_obj = NULL;
+	char *dhcp, *network;
+	int id = 0;
+	struct client_args curr_dhcp_client_args = {0};
+
+	dmubus_call("router.network", "clients", UBUS_ARGS{}, 0, &res);
+	if (res) {
+		json_object_object_foreach(res, key, client_obj) {
+			dhcp = dmjson_get_value(client_obj, 1, "dhcp");
+			if(strcmp(dhcp, "true") == 0)
+			{
+				network = dmjson_get_value(client_obj, 1, "network");
+				if(strcmp(network, ((struct dhcp_args *)prev_data)->interface) == 0)
+				{
+					init_dhcp_client_args(&curr_dhcp_client_args, client_obj, key);
+					idx = handle_update_instance(2, dmctx, &idx_last, update_instance_without_section, 1, ++id);
+					if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_dhcp_client_args, idx) == DM_STOP)
+						break;
+				}
+			}
+		}
+	}
+	return 0;
+}
+
+int browseDhcpClientIPv4Inst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	unsigned int leasetime;
+	char *macaddr;
+	char mac[32], ip[32], buf[512];
+	json_object *passed_args;
+	FILE *fp;
+	struct dhcp_client_ipv4address_args current_dhcp_client_ipv4address_args = {0};
+	int id = 0;
+	char *idx = NULL, *idx_last = NULL;
+
+	fp = fopen(DHCP_LEASES_FILE, "r");
+	if (fp == NULL)
+		return 0;
+	while (fgets (buf , 256 , fp) != NULL) {
+		sscanf(buf, "%u %s %s", &leasetime, mac, ip);
+		passed_args= ((struct client_args*)prev_data)->client;
+		macaddr=dmjson_get_value(passed_args, 1, "macaddr");
+		if(!strcmp(mac, macaddr)){
+			current_dhcp_client_ipv4address_args.ip= dmstrdup(ip);
+			current_dhcp_client_ipv4address_args.mac= dmstrdup(macaddr);
+			current_dhcp_client_ipv4address_args.leasetime= leasetime;
+
+			idx = handle_update_instance(2, dmctx, &idx_last, update_instance_without_section, 1, ++id);
+			if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&current_dhcp_client_ipv4address_args, idx) == DM_STOP)
+				break;
+		}
+	}
+
+	return 0;
+}
+
+/*#Device.DHCPv4.Client.{i}.!UCI:network/interface/dmmap_dhcp_client*/
+int browseDHCPv4ClientInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL;
+	char *instance, *instnbr = NULL, *v;
+	struct dmmap_dup *p;
+	char *type, *ipv4addr = "", *ipv6addr = "", *proto, *inst, *mask4= NULL;
+	json_object *res, *jobj;
+	struct dhcp_client_args dhcp_client_arg = {0};
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap_eq_no_delete("network", "interface", "dmmap_dhcp_client", "proto", "dhcp", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+
+		if(p->config_section != NULL){
+
+			dmuci_get_value_by_section_string(p->config_section, "type", &type);
+			if (strcmp(type, "alias") == 0 || strcmp(section_name(p->config_section), "loopback")==0)
+				continue;
+
+			dmuci_get_value_by_section_string(p->config_section, "ipaddr", &ipv4addr);
+			dmuci_get_value_by_section_string(p->config_section, "netmask", &mask4);
+			if (ipv4addr[0] == '\0') {
+				dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(p->config_section), String}}, 1, &res);
+				if (res)
+				{
+					jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
+					ipv4addr = dmjson_get_value(jobj, 1, "address");
+					mask4= dmjson_get_value(jobj, 1, "mask");
+				}
+			}
+
+			dmuci_get_value_by_section_string(p->config_section, "ip6addr", &ipv6addr);
+			if (ipv6addr[0] == '\0') {
+				dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(p->config_section), String}}, 1, &res);
+				if (res)
+				{
+					jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv6-address");
+					ipv6addr = dmjson_get_value(jobj, 1, "address");
+				}
+			}
+
+			dmuci_get_value_by_section_string(p->config_section, "proto", &proto);
+			dmuci_get_value_by_section_string(p->config_section, "ip_int_instance", &inst);
+
+			if (ipv4addr[0] == '\0' && ipv6addr[0] == '\0' && strcmp(proto, "dhcp") != 0 && strcmp(proto, "dhcpv6") != 0 && strcmp(inst, "") == 0 && strcmp(type, "bridge") != 0) {
+				p->config_section=NULL;
+				DMUCI_SET_VALUE_BY_SECTION(icwmpd, p->dmmap_section, "section_name", "");
+			}
+		}
+
+		if (ipv4addr == NULL || strlen(ipv4addr)==0)
+			dhcp_client_arg.ip = dmstrdup("");
+		else
+			dhcp_client_arg.ip = dmstrdup(ipv4addr);
+		if (mask4 == NULL || strlen(mask4)==0)
+			dhcp_client_arg.mask = dmstrdup("");
+		else
+			dhcp_client_arg.mask = dmstrdup(mask4);
+
+		dhcp_client_arg.dhcp_client_conf = p->config_section;
+		dhcp_client_arg.dhcp_client_dm= p->dmmap_section;
+
+		instance= handle_update_instance(1, dmctx, &instnbr, update_instance_alias_icwmpd, 3, (void *)p->dmmap_section, "cwmp_dhcpv4client_instance", "cwmp_dhcpv4client_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, &dhcp_client_arg, instance) == DM_STOP)
+			break;
+	}
+	return 0;
+}
+
+int browseDHCPv4ClientSentOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)prev_data;
+	struct uci_section *dmmap_sect;
+	struct dhcp_client_option_args dhcp_client_opt_args = {0};
+	char *instance, *instnbr = NULL, *v1, *v2, **sentopts, **buf= NULL, *tmp, *optionvalue, *v= NULL;
+	int length= 0, lgh2, i, j;
+
+	if(dhcp_client_args->dhcp_client_conf != NULL)
+		dmuci_get_value_by_section_string(dhcp_client_args->dhcp_client_conf, "sendopts", &v);
+
+	if(v != NULL)
+		sentopts= strsplit(v, " ", &length);
+
+	check_create_dmmap_package("dmmap_dhcp_client");
+
+	for (i= 0; i<length; i++){
+		buf= strsplit(sentopts[i], ":", &lgh2);
+		if ((dmmap_sect = get_dup_section_in_dmmap_eq("dmmap_dhcp_client", "send_option", section_name(dhcp_client_args->dhcp_client_conf), "option_tag", buf[0])) == NULL) {
+			dmuci_add_section_icwmpd("dmmap_dhcp_client", "send_option", &dmmap_sect, &v);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "option_tag", buf[0]);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section_name", section_name(dhcp_client_args->dhcp_client_conf));
+		}
+		optionvalue=dmstrdup(buf[1]);
+		if(lgh2>2){
+			for(j=2; j<lgh2; j++){
+				tmp=dmstrdup(optionvalue);
+				free(optionvalue);
+				optionvalue= NULL;
+				dmasprintf(&optionvalue, "%s:%s", tmp, buf[j]);
+				free(tmp);
+				tmp= NULL;
+			}
+		}
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "option_value", optionvalue);
+	}
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap_dhcp_client", "send_option", "section_name", dhcp_client_args->dhcp_client_conf?section_name(dhcp_client_args->dhcp_client_conf):"", dmmap_sect) {
+		dmuci_get_value_by_section_string(dmmap_sect, "option_tag", &v1);
+		dmuci_get_value_by_section_string(dmmap_sect, "option_value", &v2);
+		dhcp_client_opt_args.client_sect= dhcp_client_args->dhcp_client_conf;
+		dhcp_client_opt_args.option_tag= dmstrdup(v1);
+		dhcp_client_opt_args.value= dmstrdup(v2);
+		dhcp_client_opt_args.opt_sect= dmmap_sect;
+
+		instance= handle_update_instance(1, dmctx, &instnbr, update_instance_alias_icwmpd, 3, dmmap_sect, "cwmp_dhcpv4_sentopt_instance", "cwmp_dhcpv4_sentopt_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, &dhcp_client_opt_args, instance) == DM_STOP)
+			break;
+	}
+	return 0;
+}
+
+int browseDHCPv4ClientReqOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)prev_data;
+	struct uci_section *dmmap_sect;
+	struct dhcp_client_option_args dhcp_client_opt_args = {0};
+	char *instance, *instnbr = NULL, *v1, **reqtopts, *v= NULL;
+	int length= 0, lgh2, i, j;
+
+	if (dhcp_client_args->dhcp_client_conf != NULL)
+		dmuci_get_value_by_section_string(dhcp_client_args->dhcp_client_conf, "reqopts", &v);
+	if (v!= NULL)
+		reqtopts= strsplit(v, " ", &length);
+
+	check_create_dmmap_package("dmmap_dhcp_client");
+	for (i= 0; i<length; i++){
+		if ((dmmap_sect = get_dup_section_in_dmmap_eq("dmmap_dhcp_client", "req_option", section_name(dhcp_client_args->dhcp_client_conf), "option_tag", reqtopts[i])) == NULL) {
+			dmuci_add_section_icwmpd("dmmap_dhcp_client", "req_option", &dmmap_sect, &v);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "option_tag", reqtopts[i]);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section_name", section_name(dhcp_client_args->dhcp_client_conf));
+		}
+	}
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap_dhcp_client", "req_option", "section_name", dhcp_client_args->dhcp_client_conf?section_name(dhcp_client_args->dhcp_client_conf):"", dmmap_sect) {
+		dmuci_get_value_by_section_string(dmmap_sect, "option_tag", &v1);
+		dhcp_client_opt_args.client_sect= dhcp_client_args->dhcp_client_conf;
+		dhcp_client_opt_args.option_tag= dmstrdup(v1);
+		dhcp_client_opt_args.value= dmstrdup("");
+		dhcp_client_opt_args.opt_sect= dmmap_sect;
+
+		instance= handle_update_instance(1, dmctx, &instnbr, update_instance_alias_icwmpd, 3, dmmap_sect, "cwmp_dhcpv4_reqtopt_instance", "cwmp_dhcpv4_reqtopt_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, &dhcp_client_opt_args, instance) == DM_STOP)
+			break;
+	}
+	return 0;
+}
+
+int browseDHCPv4ServerPoolOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_list *dhcp_options_list = NULL;
+	struct uci_element *e;
+	struct dhcp_args *curr_dhcp_args = (struct dhcp_args*)prev_data;
+	struct uci_section *dmmap_sect;
+	char **tagvalue= NULL;
+	char *instance, *instnbr = NULL, *optionvalue= NULL, *tmp, *v1, *v2, *v;
+	int length, j;
+	struct dhcp_client_option_args dhcp_client_opt_args = {0};
+
+	dmuci_get_value_by_section_list(curr_dhcp_args->dhcp_sec, "dhcp_option", &dhcp_options_list);
+	if (dhcp_options_list != NULL) {
+		uci_foreach_element(dhcp_options_list, e) {
+			tagvalue= strsplit(e->name, ",", &length);
+			if ((dmmap_sect = get_dup_section_in_dmmap_eq("dmmap_dhcp", "servpool_option", section_name(curr_dhcp_args->dhcp_sec), "option_tag", tagvalue[0])) == NULL) {
+				dmuci_add_section_icwmpd("dmmap_dhcp", "servpool_option", &dmmap_sect, &v);
+				DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "option_tag", tagvalue[0]);
+				DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section_name", section_name(curr_dhcp_args->dhcp_sec));
+			}
+			optionvalue=dmstrdup(tagvalue[1]);
+			if(length>2){
+				for(j=2; j<length; j++){
+					tmp=dmstrdup(optionvalue);
+					free(optionvalue);
+					optionvalue= NULL;
+					dmasprintf(&optionvalue, "%s,%s", tmp, tagvalue[j]);
+					free(tmp);
+					tmp= NULL;
+				}
+			}
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "option_value", optionvalue);
+		}
+	}
+	uci_path_foreach_option_eq(icwmpd, "dmmap_dhcp", "servpool_option", "section_name", section_name(curr_dhcp_args->dhcp_sec), dmmap_sect) {
+		dmuci_get_value_by_section_string(dmmap_sect, "option_tag", &v1);
+		dmuci_get_value_by_section_string(dmmap_sect, "option_value", &v2);
+		dhcp_client_opt_args.client_sect= curr_dhcp_args->dhcp_sec;
+		dhcp_client_opt_args.option_tag= strdup(v1);
+		dhcp_client_opt_args.value= strdup(v2);
+		dhcp_client_opt_args.opt_sect= dmmap_sect;
+		instance= handle_update_instance(1, dmctx, &instnbr, update_instance_alias_icwmpd, 3, dmmap_sect, "cwmp_dhcpv4_servpool_option_instance", "cwmp_dhcpv4_servpool_option_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, &dhcp_client_opt_args, instance) == DM_STOP)
+			break;
+	}
+	return 0;
+}
+
+int browseDHCPv4ServerPoolClientOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	//TODO
+	return 0;
+}
+
+char *get_dhcp_network_from_relay_list(char *net_list){
+	struct uci_section *s;
+	char **net_list_arr, *v;
+	int length, i;
+
+	net_list_arr= strsplit(net_list, " ", &length);
+	uci_foreach_sections("network", "interface", s) {
+		dmuci_get_value_by_section_string(s, "proto", &v);
+		for(i=0; i<length; i++) {
+			if(strcmp(net_list_arr[i], section_name(s)) == 0 && strcmp(v, "dhcp") == 0)
+				return net_list_arr[i];
+		}
+	}
+	return "";
+}
+
+struct uci_section* get_dhcp_classifier(char *classifier_name, char *network) {
+	struct uci_section* s= NULL;
+	char *v;
+
+	uci_foreach_sections("dhcp", classifier_name, s) {
+		dmuci_get_value_by_section_string(s, "networkid", &v);
+		if(strcmp(v, network) == 0)
+			return s;
+	}
+	return NULL;
+}
+
+/*#Device.DHCPv4.Relay.Forwarding.{i}.!UCI:network/interface/dmmap_dhcp_relay*/
+int browseDHCPv4RelayForwardingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL, *macclassifier= NULL, *vendorclassidclassifier= NULL, *userclassclassifier= NULL;
+	char *instance, *instnbr = NULL, *v, *dhcp_network= NULL, *mac= NULL, *userclass= NULL, *vendorclass= NULL;
+	struct dmmap_dup *p;
+	char *type, *ipv4addr = "", *ipv6addr = "", *proto, *inst, *mask4= NULL;
+	json_object *res, *jobj;
+	struct dhcp_client_args dhcp_relay_arg = {0};
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap_eq_no_delete("network", "interface", "dmmap_dhcp_relay", "proto", "relay", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+
+		if(p->config_section != NULL){
+
+			dmuci_get_value_by_section_string(p->config_section, "type", &type);
+
+			if (strcmp(type, "alias") == 0 || strcmp(section_name(p->config_section), "loopback")==0)
+				continue;
+
+			dmuci_get_value_by_section_string(p->config_section, "ipaddr", &ipv4addr);
+
+			dmuci_get_value_by_section_string(p->config_section, "netmask", &mask4);
+
+			if (ipv4addr[0] == '\0') {
+
+				dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(p->config_section), String}}, 1, &res);
+
+				if (res)
+				{
+
+					jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
+
+					ipv4addr = dmjson_get_value(jobj, 1, "address");
+
+					mask4= dmjson_get_value(jobj, 1, "mask");
+
+				}
+
+			}
+
+			dmuci_get_value_by_section_string(p->config_section, "ip6addr", &ipv6addr);
+
+			if (ipv6addr[0] == '\0') {
+
+				dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(p->config_section), String}}, 1, &res);
+
+				if (res)
+				{
+
+					jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv6-address");
+
+					ipv6addr = dmjson_get_value(jobj, 1, "address");
+
+				}
+
+			}
+
+			dmuci_get_value_by_section_string(p->config_section, "proto", &proto);
+
+			dmuci_get_value_by_section_string(p->config_section, "ip_int_instance", &inst);
+
+			if (ipv4addr[0] == '\0' && ipv6addr[0] == '\0' && strcmp(inst, "") == 0 && strcmp(type, "bridge") != 0 && strcmp(proto, "relay") != 0) {
+				p->config_section=NULL;
+				DMUCI_SET_VALUE_BY_SECTION(icwmpd, p->dmmap_section, "section_name", "");
+			}
+
+		}
+
+		if (ipv4addr == NULL || strlen(ipv4addr)==0)
+			dhcp_relay_arg.ip = dmstrdup("");
+		else
+			dhcp_relay_arg.ip = dmstrdup(ipv4addr);
+		if (mask4 == NULL || strlen(mask4)==0)
+			dhcp_relay_arg.mask = dmstrdup("");
+		else
+			dhcp_relay_arg.mask = dmstrdup(mask4);
+		if(p->config_section != NULL)
+			dmuci_get_value_by_section_string(p->config_section, "network", &v);
+		else
+			v= dmstrdup("");
+
+		dhcp_network= get_dhcp_network_from_relay_list(v);
+		if(dhcp_network && strlen(dhcp_network)>0){
+			dhcp_relay_arg.macclassifier= get_dhcp_classifier("mac", dhcp_network);
+			dhcp_relay_arg.vendorclassidclassifier= get_dhcp_classifier("vendorclass", dhcp_network);
+			dhcp_relay_arg.userclassclassifier= get_dhcp_classifier("userclass", dhcp_network);
+		} else {
+			dhcp_relay_arg.macclassifier= NULL;
+			dhcp_relay_arg.vendorclassidclassifier= NULL;
+			dhcp_relay_arg.userclassclassifier= NULL;
+		}
+		dhcp_relay_arg.dhcp_client_conf = p->config_section;
+
+		dhcp_relay_arg.dhcp_client_dm= p->dmmap_section;
+		instance= handle_update_instance(1, dmctx, &instnbr, update_instance_alias_icwmpd, 3, (void *)p->dmmap_section, "cwmp_dhcpv4relay_instance", "cwmp_dhcpv4relay_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, &dhcp_relay_arg, instance) == DM_STOP)
+			break;
+
+
+	}
+	return 0;
+}
diff --git a/dmtree/tr181/dhcpv4.h b/dmtree/tr181/dhcpv4.h
new file mode 100644
index 0000000000000000000000000000000000000000..2486233ae46e80aa380f6cdc5ebfc89485683d47
--- /dev/null
+++ b/dmtree/tr181/dhcpv4.h
@@ -0,0 +1,241 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2016 Inteno Broadband Technology AB
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *
+ */
+
+#ifndef __DHCP_H
+#define __DHCP_H
+
+#include <json-c/json.h>
+
+struct dhcp_args
+{
+	struct uci_section *dhcp_sec;
+	char *interface;
+};
+
+struct dhcp_static_args
+{
+	struct uci_section *dhcpsection;
+};
+
+struct client_args
+{
+	json_object *client;
+	char *key;
+};
+
+struct dhcp_client_ipv4address_args {
+	char *mac;
+	char *ip;
+	unsigned int leasetime;
+};
+
+struct dhcp_client_args {
+	struct uci_section *dhcp_client_conf;
+	struct uci_section *dhcp_client_dm;
+	struct uci_section *macclassifier;
+	struct uci_section *vendorclassidclassifier;
+	struct uci_section *userclassclassifier;
+	char *ip;
+	char *mask;
+};
+
+struct dhcp_client_option_args {
+	struct uci_section *opt_sect;
+	struct uci_section *client_sect;
+	char *option_tag;
+	char *value;
+};
+
+extern DMOBJ tDhcpv4Obj[];
+extern DMOBJ tDhcpv4ServerObj[];
+extern DMOBJ tDhcpServerPoolObj[];
+extern DMOBJ tDhcpServerPoolClientObj[];
+extern DMLEAF tDhcpServerPoolParams[];
+extern DMLEAF tDhcpServerPoolAddressParams[];
+extern DMLEAF tDhcpServerPoolClientParams[];
+extern DMLEAF tDhcpServerPoolClientIPv4AddressParams[];
+
+extern DMLEAF tDHCPv4Params[];
+extern DMOBJ tDHCPv4ClientObj[];
+extern DMLEAF tDHCPv4ClientParams[];
+extern DMLEAF tDHCPv4ClientSentOptionParams[];
+extern DMLEAF tDHCPv4ClientReqOptionParams[];
+extern DMOBJ tDHCPv4ServerObj[];
+extern DMLEAF tDHCPv4ServerParams[];
+extern DMLEAF tDHCPv4ServerPoolOptionParams[];
+extern DMLEAF tDHCPv4ServerPoolClientIPv4AddressParams[];
+extern DMLEAF tDHCPv4ServerPoolClientOptionParams[];
+extern DMOBJ tDHCPv4RelayObj[];
+extern DMLEAF tDHCPv4RelayParams[];
+extern DMLEAF tDHCPv4RelayForwardingParams[];
+
+int browseDhcpInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDhcpStaticInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDhcpClientInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDhcpClientIPv4Inst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDHCPv4ClientInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDHCPv4ClientSentOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDHCPv4ClientReqOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDHCPv4ServerPoolOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDHCPv4ServerPoolClientOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDHCPv4RelayForwardingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int add_dhcp_server(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_dhcp_server(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int add_dhcp_staticaddress(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_dhcp_staticaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjDHCPv4Client(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjDHCPv4Client(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjDHCPv4ClientSentOption(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjDHCPv4ClientSentOption(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjDHCPv4ClientReqOption(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjDHCPv4ClientReqOption(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjDHCPv4ServerPoolOption(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjDHCPv4ServerPoolOption(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjDHCPv4RelayForwarding(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjDHCPv4RelayForwarding(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_server_pool_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dns_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_configurable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_interval_address_min(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_interval_address_max(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_reserved_addresses(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_subnetmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_iprouters(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_leasetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_domainname(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_static_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_staticaddress_chaddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_staticaddress_yiaddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_client_chaddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_client_ipv4address_ip_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_client_ipv4address_leasetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_sever_pool_order(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_static_address_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_option_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_clients_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_dhcp_client_active(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int set_server_pool_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_dns_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_dhcp_configurable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_dhcp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_dhcp_address_min(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_dhcp_address_max(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_dhcp_reserved_addresses(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_dhcp_subnetmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_dhcp_iprouters(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_dhcp_leasetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_dhcp_domainname(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_dhcp_interface_linker_parameter(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_dhcp_static_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_dhcp_staticaddress_chaddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_dhcp_staticaddress_yiaddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_dhcp_sever_pool_order(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int get_dhcp_client_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+int set_section_order(char *package, char *dmpackage, char* sect_type, struct uci_section *dmmap_sect, struct uci_section *conf, int set_force, char* order);
+
+int get_DHCPv4_ClientNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4Client_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4Client_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4Client_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4Client_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4Client_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4Client_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4Client_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4Client_DHCPStatus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4Client_Renew(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4Client_Renew(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4Client_IPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4Client_SubnetMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4Client_IPRouters(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4Client_DNSServers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4Client_LeaseTimeRemaining(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4Client_DHCPServer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4Client_PassthroughEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4Client_PassthroughEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4Client_PassthroughDHCPPool(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4Client_PassthroughDHCPPool(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4Client_SentOptionNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4Client_ReqOptionNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4ClientSentOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4ClientSentOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4ClientSentOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4ClientSentOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4ClientSentOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4ClientSentOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4ClientSentOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4ClientSentOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4ClientReqOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4ClientReqOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4ClientReqOption_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4ClientReqOption_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4ClientReqOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4ClientReqOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4ClientReqOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4ClientReqOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4ClientReqOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4Server_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4Server_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4ServerPoolOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4ServerPoolOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4Server_PoolNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4ServerPoolOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4ServerPoolOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4ServerPoolOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4ServerPoolOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4ServerPoolOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4ServerPoolOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4ServerPoolClientOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4RelayForwarding_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4RelayForwarding_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4RelayForwarding_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4RelayForwarding_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4RelayForwarding_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4RelayForwarding_VendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_VendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4RelayForwarding_VendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_VendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4RelayForwarding_VendorClassIDMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_VendorClassIDMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4RelayForwarding_ClientID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_ClientID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4RelayForwarding_ClientIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_ClientIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4RelayForwarding_UserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_UserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4RelayForwarding_UserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_UserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4RelayForwarding_Chaddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_Chaddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4RelayForwarding_ChaddrMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_ChaddrMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4RelayForwarding_ChaddrExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_ChaddrExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4RelayForwarding_LocallyServed(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_LocallyServed(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4RelayForwarding_DHCPServerIPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4RelayForwarding_DHCPServerIPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4ServerPoolClientOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4Relay_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv4Relay_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv4Relay_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv4Relay_ForwardingNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+#endif
diff --git a/dmtree/tr181/dhcpv6.c b/dmtree/tr181/dhcpv6.c
new file mode 100644
index 0000000000000000000000000000000000000000..5907efdda72e93b82fc809c2965139909ae936b8
--- /dev/null
+++ b/dmtree/tr181/dhcpv6.c
@@ -0,0 +1,2076 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*      Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Omar Kallel <omar.kallel@pivasoftware.com>
+*/
+
+#include <uci.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "dmentry.h"
+#include "dhcpv4.h"
+#include "dhcpv6.h"
+#include "dmjson.h"
+
+/* *** Device.DHCPv6. *** */
+DMOBJ tDHCPv6Obj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Client", &DMWRITE, addObjDHCPv6Client, delObjDHCPv6Client, NULL, browseDHCPv6ClientInst, NULL, NULL, tDHCPv6ClientObj, tDHCPv6ClientParams, NULL, BBFDM_BOTH},
+{"Server", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDHCPv6ServerObj, tDHCPv6ServerParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDHCPv6Params[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"ClientNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv6_ClientNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv6.Client.{i}. *** */
+DMOBJ tDHCPv6ClientObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Server", &DMREAD, NULL, NULL, NULL, browseDHCPv6ClientServerInst, NULL, NULL, NULL, tDHCPv6ClientServerParams, NULL, BBFDM_BOTH},
+{"SentOption", &DMWRITE, addObjDHCPv6ClientSentOption, delObjDHCPv6ClientSentOption, NULL, browseDHCPv6ClientSentOptionInst, NULL, NULL, NULL, tDHCPv6ClientSentOptionParams, NULL, BBFDM_BOTH},
+{"ReceivedOption", &DMREAD, NULL, NULL, NULL, browseDHCPv6ClientReceivedOptionInst, NULL, NULL, NULL, tDHCPv6ClientReceivedOptionParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDHCPv6ClientParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_DHCPv6Client_Enable, set_DHCPv6Client_Enable, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_DHCPv6Client_Alias, set_DHCPv6Client_Alias, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_DHCPv6Client_Interface, set_DHCPv6Client_Interface, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_DHCPv6Client_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"DUID", &DMREAD, DMT_HEXBIN, get_DHCPv6Client_DUID, NULL, NULL, NULL, BBFDM_BOTH},
+{"RequestAddresses", &DMWRITE, DMT_BOOL, get_DHCPv6Client_RequestAddresses, set_DHCPv6Client_RequestAddresses, NULL, NULL, BBFDM_BOTH},
+{"RequestPrefixes", &DMWRITE, DMT_BOOL, get_DHCPv6Client_RequestPrefixes, set_DHCPv6Client_RequestPrefixes, NULL, NULL, BBFDM_BOTH},
+{"RapidCommit", &DMWRITE, DMT_BOOL, get_DHCPv6Client_RapidCommit, set_DHCPv6Client_RapidCommit, NULL, NULL, BBFDM_BOTH},
+{"Renew", &DMWRITE, DMT_BOOL, get_DHCPv6Client_Renew, set_DHCPv6Client_Renew, NULL, NULL, BBFDM_BOTH},
+{"SuggestedT1", &DMWRITE, DMT_INT, get_DHCPv6Client_SuggestedT1, set_DHCPv6Client_SuggestedT1, NULL, NULL, BBFDM_BOTH},
+{"SuggestedT2", &DMWRITE, DMT_INT, get_DHCPv6Client_SuggestedT2, set_DHCPv6Client_SuggestedT2, NULL, NULL, BBFDM_BOTH},
+{"SupportedOptions", &DMREAD, DMT_STRING, get_DHCPv6Client_SupportedOptions, NULL, NULL, NULL, BBFDM_BOTH},
+{"RequestedOptions", &DMWRITE, DMT_STRING, get_DHCPv6Client_RequestedOptions, set_DHCPv6Client_RequestedOptions, NULL, NULL, BBFDM_BOTH},
+{"ServerNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv6Client_ServerNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"SentOptionNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv6Client_SentOptionNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"ReceivedOptionNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv6Client_ReceivedOptionNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv6.Client.{i}.Server.{i}. *** */
+DMLEAF tDHCPv6ClientServerParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"SourceAddress", &DMREAD, DMT_STRING, get_DHCPv6ClientServer_SourceAddress, NULL, NULL, NULL, BBFDM_BOTH},
+{"DUID", &DMREAD, DMT_HEXBIN, get_DHCPv6ClientServer_DUID, NULL, NULL, NULL, BBFDM_BOTH},
+{"InformationRefreshTime", &DMREAD, DMT_TIME, get_DHCPv6ClientServer_InformationRefreshTime, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv6.Client.{i}.SentOption.{i}. *** */
+DMLEAF tDHCPv6ClientSentOptionParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_DHCPv6ClientSentOption_Enable, set_DHCPv6ClientSentOption_Enable, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_DHCPv6ClientSentOption_Alias, set_DHCPv6ClientSentOption_Alias, NULL, NULL, BBFDM_BOTH},
+{"Tag", &DMWRITE, DMT_UNINT, get_DHCPv6ClientSentOption_Tag, set_DHCPv6ClientSentOption_Tag, NULL, NULL, BBFDM_BOTH},
+{"Value", &DMWRITE, DMT_HEXBIN, get_DHCPv6ClientSentOption_Value, set_DHCPv6ClientSentOption_Value, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv6.Client.{i}.ReceivedOption.{i}. *** */
+DMLEAF tDHCPv6ClientReceivedOptionParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Tag", &DMREAD, DMT_UNINT, get_DHCPv6ClientReceivedOption_Tag, NULL, NULL, NULL, BBFDM_BOTH},
+{"Value", &DMREAD, DMT_HEXBIN, get_DHCPv6ClientReceivedOption_Value, NULL, NULL, NULL, BBFDM_BOTH},
+{"Server", &DMREAD, DMT_STRING, get_DHCPv6ClientReceivedOption_Server, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv6.Server. *** */
+DMOBJ tDHCPv6ServerObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Pool", &DMWRITE, addObjDHCPv6ServerPool, delObjDHCPv6ServerPool, NULL, browseDHCPv6ServerPoolInst, NULL, NULL, tDHCPv6ServerPoolObj, tDHCPv6ServerPoolParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDHCPv6ServerParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_DHCPv6Server_Enable, set_DHCPv6Server_Enable, NULL, NULL, BBFDM_BOTH},
+{"PoolNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv6Server_PoolNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv6.Server.Pool.{i}. *** */
+DMOBJ tDHCPv6ServerPoolObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Client", &DMREAD, NULL, NULL, NULL, browseDHCPv6ServerPoolClientInst, NULL, NULL, tDHCPv6ServerPoolClientObj, tDHCPv6ServerPoolClientParams, NULL, BBFDM_BOTH},
+{"Option", &DMWRITE, addObjDHCPv6ServerPoolOption, delObjDHCPv6ServerPoolOption, NULL, browseDHCPv6ServerPoolOptionInst, NULL, NULL, NULL, tDHCPv6ServerPoolOptionParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDHCPv6ServerPoolParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_DHCPv6ServerPool_Enable, set_DHCPv6ServerPool_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_DHCPv6ServerPool_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_DHCPv6ServerPool_Alias, set_DHCPv6ServerPool_Alias, NULL, NULL, BBFDM_BOTH},
+{"Order", &DMWRITE, DMT_UNINT, get_DHCPv6ServerPool_Order, set_DHCPv6ServerPool_Order, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_DHCPv6ServerPool_Interface, set_DHCPv6ServerPool_Interface, NULL, NULL, BBFDM_BOTH},
+{"DUID", &DMWRITE, DMT_HEXBIN, get_DHCPv6ServerPool_DUID, set_DHCPv6ServerPool_DUID, NULL, NULL, BBFDM_BOTH},
+{"DUIDExclude", &DMWRITE, DMT_BOOL, get_DHCPv6ServerPool_DUIDExclude, set_DHCPv6ServerPool_DUIDExclude, NULL, NULL, BBFDM_BOTH},
+{"VendorClassID", &DMWRITE, DMT_HEXBIN, get_DHCPv6ServerPool_VendorClassID, set_DHCPv6ServerPool_VendorClassID, NULL, NULL, BBFDM_BOTH},
+{"VendorClassIDExclude", &DMWRITE, DMT_BOOL, get_DHCPv6ServerPool_VendorClassIDExclude, set_DHCPv6ServerPool_VendorClassIDExclude, NULL, NULL, BBFDM_BOTH},
+{"UserClassID", &DMWRITE, DMT_HEXBIN, get_DHCPv6ServerPool_UserClassID, set_DHCPv6ServerPool_UserClassID, NULL, NULL, BBFDM_BOTH},
+{"UserClassIDExclude", &DMWRITE, DMT_BOOL, get_DHCPv6ServerPool_UserClassIDExclude, set_DHCPv6ServerPool_UserClassIDExclude, NULL, NULL, BBFDM_BOTH},
+{"SourceAddress", &DMWRITE, DMT_STRING, get_DHCPv6ServerPool_SourceAddress, set_DHCPv6ServerPool_SourceAddress, NULL, NULL, BBFDM_BOTH},
+{"SourceAddressMask", &DMWRITE, DMT_STRING, get_DHCPv6ServerPool_SourceAddressMask, set_DHCPv6ServerPool_SourceAddressMask, NULL, NULL, BBFDM_BOTH},
+{"SourceAddressExclude", &DMWRITE, DMT_BOOL, get_DHCPv6ServerPool_SourceAddressExclude, set_DHCPv6ServerPool_SourceAddressExclude, NULL, NULL, BBFDM_BOTH},
+{"IANAEnable", &DMWRITE, DMT_BOOL, get_DHCPv6ServerPool_IANAEnable, set_DHCPv6ServerPool_IANAEnable, NULL, NULL, BBFDM_BOTH},
+{"IANAManualPrefixes", &DMWRITE, DMT_STRING, get_DHCPv6ServerPool_IANAManualPrefixes, set_DHCPv6ServerPool_IANAManualPrefixes, NULL, NULL, BBFDM_BOTH},
+{"IANAPrefixes", &DMREAD, DMT_STRING, get_DHCPv6ServerPool_IANAPrefixes, NULL, NULL, NULL, BBFDM_BOTH},
+{"IAPDEnable", &DMWRITE, DMT_BOOL, get_DHCPv6ServerPool_IAPDEnable, set_DHCPv6ServerPool_IAPDEnable, NULL, NULL, BBFDM_BOTH},
+{"IAPDManualPrefixes", &DMWRITE, DMT_STRING, get_DHCPv6ServerPool_IAPDManualPrefixes, set_DHCPv6ServerPool_IAPDManualPrefixes, NULL, NULL, BBFDM_BOTH},
+{"IAPDPrefixes", &DMREAD, DMT_STRING, get_DHCPv6ServerPool_IAPDPrefixes, NULL, NULL, NULL, BBFDM_BOTH},
+{"IAPDAddLength", &DMWRITE, DMT_UNINT, get_DHCPv6ServerPool_IAPDAddLength, set_DHCPv6ServerPool_IAPDAddLength, NULL, NULL, BBFDM_BOTH},
+{"ClientNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv6ServerPool_ClientNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"OptionNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv6ServerPool_OptionNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv6.Server.Pool.{i}.Client.{i}. *** */
+DMOBJ tDHCPv6ServerPoolClientObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"IPv6Address", &DMREAD, NULL, NULL, NULL, browseDHCPv6ServerPoolClientIPv6AddressInst, NULL, NULL, NULL, tDHCPv6ServerPoolClientIPv6AddressParams, NULL, BBFDM_BOTH},
+{"IPv6Prefix", &DMREAD, NULL, NULL, NULL, browseDHCPv6ServerPoolClientIPv6PrefixInst, NULL, NULL, NULL, tDHCPv6ServerPoolClientIPv6PrefixParams, NULL, BBFDM_BOTH},
+{"Option", &DMREAD, NULL, NULL, NULL, browseDHCPv6ServerPoolClientOptionInst, NULL, NULL, NULL, tDHCPv6ServerPoolClientOptionParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDHCPv6ServerPoolClientParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_DHCPv6ServerPoolClient_Alias, set_DHCPv6ServerPoolClient_Alias, NULL, NULL, BBFDM_BOTH},
+{"SourceAddress", &DMREAD, DMT_STRING, get_DHCPv6ServerPoolClient_SourceAddress, NULL, NULL, NULL, BBFDM_BOTH},
+{"Active", &DMREAD, DMT_BOOL, get_DHCPv6ServerPoolClient_Active, NULL, NULL, NULL, BBFDM_BOTH},
+{"IPv6AddressNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv6ServerPoolClient_IPv6AddressNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"IPv6PrefixNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv6ServerPoolClient_IPv6PrefixNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"OptionNumberOfEntries", &DMREAD, DMT_UNINT, get_DHCPv6ServerPoolClient_OptionNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv6.Server.Pool.{i}.Client.{i}.IPv6Address.{i}. *** */
+DMLEAF tDHCPv6ServerPoolClientIPv6AddressParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"IPAddress", &DMREAD, DMT_STRING, get_DHCPv6ServerPoolClientIPv6Address_IPAddress, NULL, NULL, NULL, BBFDM_BOTH},
+{"PreferredLifetime", &DMREAD, DMT_TIME, get_DHCPv6ServerPoolClientIPv6Address_PreferredLifetime, NULL, NULL, NULL, BBFDM_BOTH},
+{"ValidLifetime", &DMREAD, DMT_TIME, get_DHCPv6ServerPoolClientIPv6Address_ValidLifetime, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv6.Server.Pool.{i}.Client.{i}.IPv6Prefix.{i}. *** */
+DMLEAF tDHCPv6ServerPoolClientIPv6PrefixParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Prefix", &DMREAD, DMT_STRING, get_DHCPv6ServerPoolClientIPv6Prefix_Prefix, NULL, NULL, NULL, BBFDM_BOTH},
+{"PreferredLifetime", &DMREAD, DMT_TIME, get_DHCPv6ServerPoolClientIPv6Prefix_PreferredLifetime, NULL, NULL, NULL, BBFDM_BOTH},
+{"ValidLifetime", &DMREAD, DMT_TIME, get_DHCPv6ServerPoolClientIPv6Prefix_ValidLifetime, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv6.Server.Pool.{i}.Client.{i}.Option.{i}. *** */
+DMLEAF tDHCPv6ServerPoolClientOptionParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Tag", &DMREAD, DMT_UNINT, get_DHCPv6ServerPoolClientOption_Tag, NULL, NULL, NULL, BBFDM_BOTH},
+{"Value", &DMREAD, DMT_HEXBIN, get_DHCPv6ServerPoolClientOption_Value, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DHCPv6.Server.Pool.{i}.Option.{i}. *** */
+DMLEAF tDHCPv6ServerPoolOptionParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_DHCPv6ServerPoolOption_Enable, set_DHCPv6ServerPoolOption_Enable, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_DHCPv6ServerPoolOption_Alias, set_DHCPv6ServerPoolOption_Alias, NULL, NULL, BBFDM_BOTH},
+{"Tag", &DMWRITE, DMT_UNINT, get_DHCPv6ServerPoolOption_Tag, set_DHCPv6ServerPoolOption_Tag, NULL, NULL, BBFDM_BOTH},
+{"Value", &DMWRITE, DMT_HEXBIN, get_DHCPv6ServerPoolOption_Value, set_DHCPv6ServerPoolOption_Value, NULL, NULL, BBFDM_BOTH},
+{"PassthroughClient", &DMWRITE, DMT_STRING, get_DHCPv6ServerPoolOption_PassthroughClient, set_DHCPv6ServerPoolOption_PassthroughClient, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+struct uci_section* get_dhcpv6_classifier(char *classifier_name, char *network) {
+	struct uci_section* s= NULL;
+	char *v;
+
+	uci_foreach_sections("dhcp", classifier_name, s) {
+		dmuci_get_value_by_section_string(s, "networkid", &v);
+		if(strcmp(v, network) == 0)
+			return s;
+	}
+	return NULL;
+}
+
+inline int init_dhcpv6_client_args(struct clientv6_args *args, json_object *client, json_object *client_param, int i)
+{
+	args->client = client;
+	args->clientparam= client_param;
+	args->idx = i;
+	return 0;
+}
+
+struct uci_section* exist_other_section_dhcp6_same_order(struct uci_section *dmmap_sect, char * package, char* sect_type, char *order) {
+	struct uci_section *s;
+	uci_path_foreach_option_eq(icwmpd, package, sect_type, "order", order, s) {
+		if(strcmp(section_name(s), section_name(dmmap_sect)) != 0){
+			return s;
+		}
+	}
+	return NULL;
+}
+
+int set_section_dhcp6_order(char *package, char *dmpackage, char* sect_type, struct uci_section *dmmap_sect, struct uci_section *conf, int set_force, char* order) {
+	char *v= NULL, *sect_name, *incrorder;
+	struct uci_section *s, *dm;
+	dmuci_get_value_by_section_string(dmmap_sect, "order", &v);
+	if((v!=NULL || strlen(v)>0) && strcmp(v, order) == 0)
+		return 0;
+	DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "order", order);
+	if(conf==NULL){
+		dmuci_get_value_by_section_string(dmmap_sect, "section_name", &sect_name);
+		get_config_section_of_dmmap_section(package, sect_type, sect_name, &s);
+	} else
+		s= conf;
+
+	if(strcmp(order, "1") != 0 && s!=NULL){
+		dmuci_set_value_by_section(s, "force", "");
+	}
+
+	if(set_force==1 && strcmp(order, "1") == 0 && s!=NULL) {
+		dmuci_set_value_by_section(s, "force", "1");
+	}
+
+	if ((dm = exist_other_section_dhcp6_same_order(dmmap_sect, dmpackage, sect_type, order)) != NULL) {
+		dmuci_get_value_by_section_string(dm, "section_name", &sect_name);
+		get_config_section_of_dmmap_section(package, sect_type, sect_name, &s);
+		dmasprintf(&incrorder, "%d", atoi(order)+1);
+		if(s!=NULL && strcmp(order, "1") == 0){
+			dmuci_set_value_by_section(s, "force", "");
+		}
+		set_section_dhcp6_order(package, dmpackage, sect_type, dm, s, set_force, incrorder);
+	}
+	return 0;
+
+}
+
+inline int init_dhcpv6_args(struct dhcpv6_args *args, struct uci_section *s, char *interface)
+{
+	args->interface = interface;
+	args->dhcp_sec = s;
+	return 0;
+}
+
+/*#Device.DHCPv6.Client.{i}.!UCI:network/interface/dmmap_dhcpv6*/
+int browseDHCPv6ClientInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL;
+	struct dmmap_dup *p;
+	struct dhcpv6_client_args dhcpv6_client_arg = {0};
+	json_object *res, *jobj;
+	char *instance, *instnbr = NULL, *proto= NULL, *ipv6addr;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap_eq_no_delete("network", "interface", "dmmap_dhcpv6", "proto", "dhcpv6", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+
+		dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(p->config_section), String}}, 1, &res);
+
+		if (res)
+		{
+
+			jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv6-address");
+
+			ipv6addr = dmjson_get_value(jobj, 1, "address");
+
+		}
+		dhcpv6_client_arg.dhcp_client_conf = p->config_section;
+
+		dhcpv6_client_arg.dhcp_client_dm= p->dmmap_section;
+		dhcpv6_client_arg.ip= strdup(ipv6addr?ipv6addr:"");
+
+		instance = handle_update_instance(1, dmctx, &instnbr, update_instance_alias, 3, p->dmmap_section, "cwmp_dhcpv6client_instance", "cwmp_dhcpv6client_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, &dhcpv6_client_arg, instance) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+int browseDHCPv6ClientServerInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	//TODO
+	return 0;
+}
+
+int browseDHCPv6ClientSentOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	//TODO
+	return 0;
+}
+
+int browseDHCPv6ClientReceivedOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	//TODO
+	return 0;
+}
+
+/*#Device.DHCPv6.Server.Pool.{i}.!UCI:dhcp/dhcp/dmmap_dhcpv6*/
+int browseDHCPv6ServerPoolInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s;
+	char *interface, *idhcp = NULL, *idhcp_last = NULL, *v;
+	struct dhcpv6_args curr_dhcp6_args = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap_eq("dhcp", "dhcp", "dmmap_dhcpv6", "dhcpv6", "server", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		dmuci_get_value_by_section_string(p->config_section, "interface", &interface);
+		init_dhcpv6_args(&curr_dhcp6_args, p->config_section, interface);
+		idhcp = handle_update_instance(1, dmctx, &idhcp_last, update_instance_alias_icwmpd, 3, p->dmmap_section, "dhcpv6_serv_pool_instance", "dhcpv6_serv_pool_alias");
+		dmuci_get_value_by_section_string(p->dmmap_section, "order", &v);
+		if(v==NULL || strlen(v) == 0)
+			set_section_dhcp6_order("dhcp", "dmmap_dhcpv6", "dhcp", p->dmmap_section, p->config_section, 0, idhcp);
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_dhcp6_args, idhcp) == DM_STOP)
+			break;
+	}
+
+	free_dmmap_config_dup_list(&dup_list);
+
+	return 0;
+}
+
+int browseDHCPv6ServerPoolClientInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct dhcpv6_args *dhcp_arg= (struct dhcpv6_args*)prev_data;
+	json_object *res, *res1, *jobj, *dev_obj= NULL, *net_obj= NULL;
+	struct clientv6_args curr_dhcp_client_args = {0};
+	char *device;
+	int i= 0;
+	char *idx = NULL, *idx_last = NULL;
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(dhcp_arg->dhcp_sec), String}}, 1, &res1);
+	device = dmjson_get_value(res1, 1, "device");
+	dmubus_call("dhcp", "ipv6leases", UBUS_ARGS{}, 0, &res);
+	if(!res)
+		return 0;
+	dev_obj = dmjson_get_obj(res, 1, "device");
+	if (!dev_obj)
+		return 0;
+
+	net_obj = dmjson_get_obj(dev_obj, 1, device);
+	if (!net_obj)
+		return 0;
+
+	while (1) {
+		jobj = dmjson_select_obj_in_array_idx(net_obj, i, 1, "leases");
+		if (jobj == NULL)
+			break;
+		init_dhcpv6_client_args(&curr_dhcp_client_args, jobj, NULL, i);
+		i++;
+		idx = handle_update_instance(2, dmctx, &idx_last, update_instance_without_section, 1, i);
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_dhcp_client_args, idx) == DM_STOP)
+			break;
+	}
+	return 0;
+}
+
+int browseDHCPv6ServerPoolOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_list *dhcp_options_list = NULL;
+	struct uci_element *e;
+	struct dhcpv6_args *curr_dhcp_args = (struct dhcpv6_args*)prev_data;
+	struct uci_section *dmmap_sect;
+	char **tagvalue= NULL;
+	char *instance, *instnbr = NULL, *optionvalue= NULL, *tmp, *v1, *v2, *v;
+	int length, j;
+	struct dhcpv6_client_option_args dhcp_client_opt_args = {0};
+
+	dmuci_get_value_by_section_list(curr_dhcp_args->dhcp_sec, "dhcp_option", &dhcp_options_list);
+	if (dhcp_options_list != NULL) {
+		uci_foreach_element(dhcp_options_list, e) {
+			tagvalue= strsplit(e->name, ",", &length);
+			if ((dmmap_sect = get_dup_section_in_dmmap_eq("dmmap_dhcpv6", "servpool_option", section_name(curr_dhcp_args->dhcp_sec), "option_tag", tagvalue[0])) == NULL) {
+				dmuci_add_section_icwmpd("dmmap_dhcpv6", "servpool_option", &dmmap_sect, &v);
+				DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "option_tag", tagvalue[0]);
+				DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section_name", section_name(curr_dhcp_args->dhcp_sec));
+			}
+			optionvalue=dmstrdup(tagvalue[1]);
+			if(length>2){
+				for(j=2; j<length; j++){
+					tmp=dmstrdup(optionvalue);
+					free(optionvalue);
+					optionvalue= NULL;
+					dmasprintf(&optionvalue, "%s,%s", tmp, tagvalue[j]);
+					free(tmp);
+					tmp= NULL;
+				}
+			}
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "option_value", optionvalue);
+		}
+	}
+	uci_path_foreach_option_eq(icwmpd, "dmmap_dhcpv6", "servpool_option", "section_name", section_name(curr_dhcp_args->dhcp_sec), dmmap_sect) {
+		dmuci_get_value_by_section_string(dmmap_sect, "option_tag", &v1);
+		dmuci_get_value_by_section_string(dmmap_sect, "option_value", &v2);
+		dhcp_client_opt_args.client_sect= curr_dhcp_args->dhcp_sec;
+		dhcp_client_opt_args.option_tag= strdup(v1);
+		dhcp_client_opt_args.value= strdup(v2);
+		dhcp_client_opt_args.opt_sect= dmmap_sect;
+		instance= handle_update_instance(1, dmctx, &instnbr, update_instance_alias_icwmpd, 3, dmmap_sect, "cwmp_dhcpv6_servpool_option_instance", "cwmp_dhcpv6_servpool_option_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, &dhcp_client_opt_args, instance) == DM_STOP)
+			break;
+	}
+	return 0;
+}
+
+int browseDHCPv6ServerPoolClientIPv6AddressInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct clientv6_args *dhcpv6_serv_pool_client= (struct clientv6_args *)prev_data;
+	json_object *address_obj= NULL, *prefix_obj= NULL;
+	struct clientv6_args curr_dhcv6_address_args = {0};
+	char *idx = NULL, *idx_last = NULL;
+	int i= 0;
+
+	while (1) {
+		address_obj = dmjson_select_obj_in_array_idx(dhcpv6_serv_pool_client->client, i, 1, "ipv6-addr");
+		if (address_obj == NULL)
+			break;
+		init_dhcpv6_client_args(&curr_dhcv6_address_args, dhcpv6_serv_pool_client->client, address_obj, i);
+		i++;
+		idx = handle_update_instance(2, dmctx, &idx_last, update_instance_without_section, 1, i);
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_dhcv6_address_args, idx) == DM_STOP)
+			break;
+	}
+
+	return 0;
+}
+
+int browseDHCPv6ServerPoolClientIPv6PrefixInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct clientv6_args *dhcpv6_serv_pool_client= (struct clientv6_args *)prev_data;
+	json_object *address_obj= NULL, *prefix_obj= NULL;
+	struct clientv6_args curr_dhcv6_address_args = {0};
+	char *idx = NULL, *idx_last = NULL;
+	int i= 0;
+
+	while (1) {
+		address_obj = dmjson_select_obj_in_array_idx(dhcpv6_serv_pool_client->client, i, 1, "ipv6-prefix");
+		if (address_obj == NULL)
+			break;
+		init_dhcpv6_client_args(&curr_dhcv6_address_args, dhcpv6_serv_pool_client->client, address_obj, i);
+		i++;
+		idx = handle_update_instance(2, dmctx, &idx_last, update_instance_without_section, 1, i);
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_dhcv6_address_args, idx) == DM_STOP)
+			break;
+	}
+
+	return 0;
+}
+
+int browseDHCPv6ServerPoolClientOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	//TODO
+	return 0;
+}
+
+
+int addObjDHCPv6Client(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	struct uci_section *s, *dmmap_sect;
+	char *wan_eth, *value, *wanname, *instancepara, *v;
+
+	check_create_dmmap_package("dmmap_dhcpv6");
+	instancepara = get_last_instance_icwmpd("dmmap_dhcpv6", "interface", "cwmp_dhcpv6client_instance");
+	dmuci_add_section("network", "interface", &s, &value);
+	dmuci_set_value_by_section(s, "proto", "dhcpv6");
+	dmuci_set_value_by_section(s, "ifname", "@wan");
+	dmuci_set_value_by_section(s, "type", "anywan");
+	dmuci_add_section_icwmpd("dmmap_dhcpv6", "interface", &dmmap_sect, &v);
+	dmuci_set_value_by_section(dmmap_sect, "section_name", section_name(s));
+	*instance = update_instance_icwmpd(dmmap_sect, instancepara, "cwmp_dhcpv6client_instance");
+	return 0;
+}
+
+int delObjDHCPv6Client(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct dhcpv6_client_args *dhcpv6_client_args = (struct dhcpv6_client_args*)data;
+	struct uci_section *s, *dmmap_section, *ss;
+	int found= 0;
+
+	char *proto;
+
+	switch (del_action) {
+		case DEL_INST:
+			if(dhcpv6_client_args->dhcp_client_conf != NULL && is_section_unnamed(section_name(dhcpv6_client_args->dhcp_client_conf))){
+				LIST_HEAD(dup_list);
+				delete_sections_save_next_sections("dmmap_dhcpv6", "interface", "cwmp_dhcpv6client_instance", section_name(dhcpv6_client_args->dhcp_client_conf), atoi(instance), &dup_list);
+				update_dmmap_sections(&dup_list, "cwmp_dhcpv6client_instance", "dmmap_dhcpv6", "interface");
+				dmuci_delete_by_section_unnamed(dhcpv6_client_args->dhcp_client_conf, NULL, NULL);
+			} else {
+				get_dmmap_section_of_config_section("dmmap_dhcpv6", "interface", section_name(dhcpv6_client_args->dhcp_client_conf), &dmmap_section);
+				dmuci_delete_by_section_unnamed_icwmpd(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(dhcpv6_client_args->dhcp_client_conf, NULL, NULL);
+			}
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("network", "interface", s) {
+				if (found != 0){
+					dmuci_get_value_by_section_string(ss, "proto", &proto);
+					if(strcmp(proto, "dhcpv6") == 0) {
+						get_dmmap_section_of_config_section("dmmap_dhcpv6", "interface", section_name(ss), &dmmap_section);
+						if(dmmap_section != NULL)
+							dmuci_delete_by_section(dmmap_section, NULL, NULL);
+						dmuci_delete_by_section(ss, NULL, NULL);
+					}
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL){
+				dmuci_get_value_by_section_string(ss, "proto", &proto);
+				if(strcmp(proto, "dhcpv6") == 0) {
+					get_dmmap_section_of_config_section("dmmap_dhcpv6", "interface", section_name(ss), &dmmap_section);
+					if(dmmap_section != NULL)
+						dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+			}
+			break;
+	}
+	return 0;
+}
+
+int addObjDHCPv6ClientSentOption(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	//TODO
+	return 0;
+}
+
+int delObjDHCPv6ClientSentOption(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	switch (del_action) {
+		case DEL_INST:
+			//TODO
+			break;
+		case DEL_ALL:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int addObjDHCPv6ServerPool(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	char *value, *v;
+	char *instancepara;
+	struct uci_section *s = NULL, *dmmap_dhcp= NULL;
+
+	check_create_dmmap_package("dmmap_dhcpv6");
+	instancepara = get_last_instance_icwmpd("dmmap_dhcpv6", "dhcp", "dhcpv6_serv_pool_instance");
+	dmuci_add_section("dhcp", "dhcp", &s, &value);
+	dmuci_set_value_by_section(s, "dhcpv6", "server");
+	dmuci_set_value_by_section(s, "start", "100");
+	dmuci_set_value_by_section(s, "leasetime", "12h");
+	dmuci_set_value_by_section(s, "limit", "150");
+
+	dmuci_add_section_icwmpd("dmmap_dhcpv6", "dhcp", &dmmap_dhcp, &v);
+	dmuci_set_value_by_section(dmmap_dhcp, "section_name", section_name(s));
+	*instance = update_instance_icwmpd(dmmap_dhcp, instancepara, "dhcpv6_serv_pool_instance");
+	return 0;
+}
+
+int delObjDHCPv6ServerPool(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	int found = 0;
+	char *lan_name;
+	struct uci_section *s = NULL;
+	struct uci_section *ss = NULL, *dmmap_section= NULL;
+	char *dhcpv6= NULL;
+
+	switch (del_action) {
+		case DEL_INST:
+			if(is_section_unnamed(section_name(((struct dhcpv6_args *)data)->dhcp_sec))){
+				LIST_HEAD(dup_list);
+				delete_sections_save_next_sections("dmmap_dhcpv6", "dhcp", "dhcpv6_serv_pool_instance", section_name(((struct dhcpv6_args *)data)->dhcp_sec), atoi(instance), &dup_list);
+				update_dmmap_sections(&dup_list, "dhcpv6_serv_pool_instance", "dmmap_dhcpv6", "dhcp");
+				dmuci_delete_by_section_unnamed(((struct dhcpv6_args *)data)->dhcp_sec, NULL, NULL);
+			} else {
+				get_dmmap_section_of_config_section("dmmap_dhcpv6", "dhcp", section_name(((struct dhcpv6_args *)data)->dhcp_sec), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section_unnamed_icwmpd(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(((struct dhcpv6_args *)data)->dhcp_sec, NULL, NULL);
+			}
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("dhcp", "dhcp", s) {
+				if (found != 0){
+					dmuci_get_value_by_section_string(ss, "dhcpv6", &dhcpv6);
+					if(strcmp(dhcpv6, "server") == 0){
+						get_dmmap_section_of_config_section("dmmap_dhcpv6", "dhcp", section_name(s), &dmmap_section);
+						if(dmmap_section != NULL)
+							dmuci_delete_by_section(dmmap_section, NULL, NULL);
+						dmuci_delete_by_section(ss, NULL, NULL);
+					}
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL){
+				dmuci_get_value_by_section_string(ss, "dhcpv6", &dhcpv6);
+				if(strcmp(dhcpv6, "server") == 0){
+					get_dmmap_section_of_config_section("dmmap_dhcpv6", "dhcp", section_name(ss), &dmmap_section);
+					if(dmmap_section != NULL)
+						dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+			}
+			break;
+	}
+	return 0;
+}
+
+int addObjDHCPv6ServerPoolOption(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	struct dhcpv6_args *dhcp_arg = (struct dhcpv6_args*)data;
+	struct uci_section *s, *dmmap_sect;
+	char *value, *instancepara, *v;
+
+	check_create_dmmap_package("dmmap_dhcpv6");
+	instancepara= get_last_instance_lev2_icwmpd_dmmap_opt("dmmap_dhcpv6", "servpool_option", "cwmp_dhcpv6_servpool_option_instance", "section_name", section_name(dhcp_arg->dhcp_sec));
+	dmuci_add_section_icwmpd("dmmap_dhcpv6", "servpool_option", &dmmap_sect, &value);
+	if(dhcp_arg->dhcp_sec != NULL)
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "section_name", section_name(dhcp_arg->dhcp_sec));
+	DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "option_tag", "0");
+	*instance = update_instance_icwmpd(dmmap_sect, instancepara, "cwmp_dhcpv6_servpool_option_instance");
+	return 0;
+}
+
+int delObjDHCPv6ServerPoolOption(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *s, *stmp;
+	char *list= NULL, *opt_value= NULL;
+	struct uci_list *dhcp_options_list = NULL;
+
+	switch (del_action) {
+		case DEL_INST:
+			if(strcmp(((struct dhcpv6_client_option_args*) data)->option_tag, "0") != 0)
+			{
+				dmasprintf(&opt_value, "%s,%s", ((struct dhcpv6_client_option_args*) data)->option_tag, ((struct dhcpv6_client_option_args*) data)->value);
+				dmuci_get_value_by_section_list(((struct dhcpv6_client_option_args*) data)->client_sect, "dhcp_option", &dhcp_options_list);
+				if(dhcp_options_list != NULL){
+					dmuci_del_list_value_by_section(((struct dhcpv6_client_option_args*) data)->client_sect, "dhcp_option", opt_value);
+				}
+			}
+			dmuci_delete_by_section_unnamed_icwmpd(((struct dhcpv6_client_option_args*) data)->opt_sect, NULL, NULL);
+			break;
+		case DEL_ALL:
+			dmuci_set_value_by_section(((struct dhcpv6_args*) data)->dhcp_sec, "dhcp_option", "");
+			uci_path_foreach_sections_safe(icwmpd, "dmmap_dhcpv6", "servpool_option", stmp, s) {
+				dmuci_delete_by_section_unnamed_icwmpd(s, NULL, NULL);
+			}
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6_ClientNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+	char *proto;
+
+	uci_path_foreach_sections(icwmpd, "dmmap_dhcpv6", "interface", s)
+	{
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+/*#Device.DHCPv6.Client.{i}.Enable!UCI:network/interface,@i-1/disabled*/
+int get_DHCPv6Client_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_client_args *dhcpv6_client_args = (struct dhcpv6_client_args*)data;
+	char *v= NULL;
+
+
+	if(dhcpv6_client_args->dhcp_client_conf == NULL)
+	{
+		*value= "0";
+		return 0;
+	}
+
+	dmuci_get_value_by_section_string(dhcpv6_client_args->dhcp_client_conf, "disabled", &v);
+	if (v==NULL || strlen(v)==0 || strcmp(v, "1")!=0)
+		*value= "1";
+	else
+		*value= "0";
+	return 0;
+}
+
+int set_DHCPv6Client_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct dhcpv6_client_args *dhcpv6_client_args = (struct dhcpv6_client_args*)data;
+
+	switch (action)	{
+	case VALUECHECK:
+		if (string_to_bool(value, &b))
+			return FAULT_9007;
+		return 0;
+	case VALUESET:
+		string_to_bool(value, &b);
+		if (b)
+			dmuci_set_value_by_section(dhcpv6_client_args->dhcp_client_conf, "disabled", "0");
+		else
+			dmuci_set_value_by_section(dhcpv6_client_args->dhcp_client_conf, "disabled", "1");
+		break;
+	}
+	return 0;
+}
+
+int get_DHCPv6Client_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_client_args *dhcpv6_client_args = (struct dhcpv6_client_args*)data;
+
+	dmuci_get_value_by_section_string(dhcpv6_client_args->dhcp_client_dm, "cwmp_dhcpv6client_alias", value);
+	return 0;
+}
+
+int set_DHCPv6Client_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcpv6_client_args *dhcpv6_client_args = (struct dhcpv6_client_args*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(dhcpv6_client_args->dhcp_client_dm, "cwmp_dhcpv6client_alias", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6Client_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+
+	struct dhcpv6_client_args *dhcpv6_client_args = (struct dhcpv6_client_args*)data;
+	if(dhcpv6_client_args->dhcp_client_conf == NULL)
+	{
+		*value= "";
+
+		return 0;
+	}
+
+	char *linker= dmstrdup(section_name(dhcpv6_client_args->dhcp_client_conf));
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim, dm_delim), linker, value);
+	return 0;
+}
+
+int set_DHCPv6Client_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcpv6_client_args *dhcpv6_client_args = (struct dhcpv6_client_args*)data;
+	struct uci_section *s;
+	char *linker= NULL, *newvalue= NULL, *v;
+	struct uci_section *dm;
+
+	switch (action)	{
+		case VALUECHECK:
+			if(strlen(value) == 0 || strcmp(value, "") == 0){
+				return FAULT_9007;
+			}
+
+			if (value[strlen(value)-1]!='.') {
+				dmasprintf(&newvalue, "%s.", value);
+				adm_entry_get_linker_value(ctx, newvalue, &linker);
+			} else
+				adm_entry_get_linker_value(ctx, value, &linker);
+			uci_path_foreach_sections(icwmpd, "dmmap_dhcpv6", "interface", s) {
+				dmuci_get_value_by_section_string(s, "section_name", &v);
+				if(strcmp(v, linker) == 0)
+					return FAULT_9007;
+			}
+			uci_foreach_sections("network", "interface", s) {
+				if(strcmp(section_name(s), linker) == 0){
+					dmuci_get_value_by_section_string(s, "proto", &v);
+					if(strcmp(v, "dhcpv6") != 0)
+						return FAULT_9007;
+				}
+			}
+			break;
+		case VALUESET:
+			if (value[strlen(value)-1]!='.') {
+				dmasprintf(&newvalue, "%s.", value);
+				adm_entry_get_linker_value(ctx, newvalue, &linker);
+			} else
+				adm_entry_get_linker_value(ctx, value, &linker);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dhcpv6_client_args->dhcp_client_dm, "section_name", linker);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv6.Client.{i}.Status!UCI:network/interface,@i-1/disabled*/
+int get_DHCPv6Client_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_client_args *dhcpv6_client_args = (struct dhcpv6_client_args*)data;
+	char *v= "";
+	if(dhcpv6_client_args->dhcp_client_conf == NULL)
+	{
+		*value= "Error_Misconfigured";
+
+		return 0;
+	}
+
+	dmuci_get_value_by_section_string(dhcpv6_client_args->dhcp_client_conf, "disabled", &v);
+
+	if (v==NULL || strlen(v)==0 || strcmp(v, "1")!=0)
+		*value= "Enabled";
+	else
+		*value= "Disabled";
+
+	return 0;
+}
+
+/*#Device.DHCPv6.Client.{i}.DUID!UBUS:network.interface/status/interface,@Name/data.passthru*/
+int get_DHCPv6Client_DUID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_client_args *dhcpv6_client_args = (struct dhcpv6_client_args*)data;
+	json_object *res;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(dhcpv6_client_args->dhcp_client_conf), String}}, 1, &res);
+	if (res)
+	{
+		*value = dmjson_get_value(res, 2, "data", "passthru");
+	}
+	return 0;
+}
+
+/*#Device.DHCPv6.Client.{i}.RequestAddresses!UCI:network/interface,@i-1/reqaddress*/
+int get_DHCPv6Client_RequestAddresses(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_client_args *dhcpv6_client_args = (struct dhcpv6_client_args*)data;
+	char *v= "";
+	if(dhcpv6_client_args->dhcp_client_conf == NULL)
+	{
+		*value= "";
+
+		return 0;
+	}
+
+	dmuci_get_value_by_section_string(dhcpv6_client_args->dhcp_client_conf, "reqaddress", &v);
+	if(strcmp(v, "none") == 0)
+		*value= "0";
+	else
+		*value= "1";
+	return 0;
+}
+
+int set_DHCPv6Client_RequestAddresses(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct dhcpv6_client_args *dhcpv6_client_args = (struct dhcpv6_client_args*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value_by_section(dhcpv6_client_args->dhcp_client_conf, "reqaddress", "force");
+			else
+				dmuci_set_value_by_section(dhcpv6_client_args->dhcp_client_conf, "reqaddress", "none");
+			break;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv6.Client.{i}.RequestPrefixes!UCI:network/interface,@i-1/reqprefix*/
+int get_DHCPv6Client_RequestPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_client_args *dhcpv6_client_args = (struct dhcpv6_client_args*)data;
+	char *v= "";
+	if(dhcpv6_client_args->dhcp_client_conf == NULL)
+	{
+		*value= "";
+
+		return 0;
+	}
+
+	dmuci_get_value_by_section_string(dhcpv6_client_args->dhcp_client_conf, "reqprefix", &v);
+	if(strcmp(v, "no") == 0)
+		*value= "0";
+	else
+		*value= "1";
+	return 0;
+}
+
+int set_DHCPv6Client_RequestPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct dhcpv6_client_args *dhcpv6_client_args = (struct dhcpv6_client_args*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value_by_section(dhcpv6_client_args->dhcp_client_conf, "reqprefix", "auto");
+			else
+				dmuci_set_value_by_section(dhcpv6_client_args->dhcp_client_conf, "reqprefix", "no");
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6Client_RapidCommit(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6Client_RapidCommit(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6Client_Renew(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value= "false";
+	return 0;
+}
+
+int set_DHCPv6Client_Renew(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcpv6_client_args *dhcp_client_args = (struct dhcpv6_client_args*)data;
+	json_object *res;
+	bool b;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (dhcp_client_args->dhcp_client_conf == NULL && !b)
+				return 0;
+
+			dmubus_call("network.interface", "renew", UBUS_ARGS{{"interface", section_name(dhcp_client_args->dhcp_client_conf), String}}, 1, &res);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6Client_SuggestedT1(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6Client_SuggestedT1(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6Client_SuggestedT2(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6Client_SuggestedT2(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6Client_SupportedOptions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+/*#Device.DHCPv6.Client.{i}.RequestedOptions!UCI:network/interface,@i-1/reqopts*/
+int get_DHCPv6Client_RequestedOptions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_client_args *dhcpv6_client_args = (struct dhcpv6_client_args*)data;
+
+	if(dhcpv6_client_args->dhcp_client_conf == NULL)
+	{
+		*value= "";
+
+		return 0;
+	}
+
+	dmuci_get_value_by_section_string(dhcpv6_client_args->dhcp_client_conf, "reqopts", value);
+	return 0;
+}
+
+int set_DHCPv6Client_RequestedOptions(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcpv6_client_args *dhcpv6_client_args = (struct dhcpv6_client_args*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(dhcpv6_client_args->dhcp_client_conf, "reqopts", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6Client_ServerNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6Client_SentOptionNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6Client_ReceivedOptionNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6ClientServer_SourceAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6ClientServer_DUID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6ClientServer_InformationRefreshTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6ClientSentOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6ClientSentOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ClientSentOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6ClientSentOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ClientSentOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6ClientSentOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ClientSentOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6ClientSentOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ClientReceivedOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6ClientReceivedOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6ClientReceivedOption_Server(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6Server_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *path = "/etc/rc.d/*odhcpd";
+	if (check_file(path))
+		*value = "1";
+	else
+		*value = "0";
+	return 0;
+}
+
+int set_DHCPv6Server_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmcmd("/etc/init.d/odhcpd", 1, "enable");
+			else
+				dmcmd("/etc/init.d/odhcpd", 1, "disable");
+			break;
+	}
+    return 0;
+}
+
+int get_DHCPv6Server_PoolNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	int i= 0;
+	char *v= NULL;
+
+	uci_foreach_sections("dhcp", "dhcp", s) {
+		dmuci_get_value_by_section_string(s, "dhcpv6", &v);
+		if (v!=NULL && strcmp(v, "server") == 0)
+			i++;
+	}
+	dmasprintf(value, "%d", i);
+	return 0;
+}
+
+/*#Device.DHCPv6.Server.Pool.{i}.Enable!UCI:dhcp/dhcp,@i-1/ignore*/
+int get_DHCPv6ServerPool_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{	struct uci_section *s = NULL;
+
+	uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcpv6_args *)data)->interface, s) {
+		dmuci_get_value_by_section_string(s, "ignore", value);
+		if ((*value)[0] == '\0')
+			*value = "1";
+		else
+			*value = "0";
+		return 0;
+	}
+	*value = "0";
+	return 0;
+}
+
+int set_DHCPv6ServerPool_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct uci_section *s = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcpv6_args *)data)->interface, s) {
+				if (b)
+					dmuci_set_value_by_section(s, "ignore", "");
+				else
+					dmuci_set_value_by_section(s, "ignore", "1");
+				break;
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv6.Server.Pool.{i}.Status!UCI:dhcp/dhcp,@i-1/ignore*/
+int get_DHCPv6ServerPool_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	char *v= NULL;
+	uci_foreach_option_eq("dhcp", "dhcp", "interface", ((struct dhcpv6_args *)data)->interface, s) {
+		dmuci_get_value_by_section_string(s, "ignore", &v);
+		*value = (v && *v == '1') ? "Disabled" : "Enabled";
+		return 0;
+	}
+	*value="Error_Misconfigured";
+	return 0;
+}
+
+int get_DHCPv6ServerPool_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_args *dhcpv6_arg= (struct dhcpv6_args*)data;
+	struct uci_section *dmmap_sect;
+
+	get_dmmap_section_of_config_section("dmmap_dhcpv6", "dhcp", section_name(dhcpv6_arg->dhcp_sec), &dmmap_sect);
+	if (dmmap_sect)
+		dmuci_get_value_by_section_string(dmmap_sect, "dhcpv6_serv_pool_alias", value);
+	return 0;
+}
+
+int set_DHCPv6ServerPool_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcpv6_args *dhcpv6_arg= (struct dhcpv6_args*)data;
+	struct uci_section *dmmap_sect;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			get_dmmap_section_of_config_section("dmmap_dhcpv6", "dhcp", section_name(dhcpv6_arg->dhcp_sec), &dmmap_sect);
+			if (dmmap_sect)
+				DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "dhcpv6_serv_pool_alias", value);
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPool_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_args *dhcp_arg= (struct dhcpv6_args*)data;
+	struct uci_section *dmmap_sect;
+
+	get_dmmap_section_of_config_section("dmmap_dhcpv6", "dhcp", section_name(dhcp_arg->dhcp_sec), &dmmap_sect);
+	if (dmmap_sect)
+		dmuci_get_value_by_section_string(dmmap_sect, "order", value);
+	return 0;
+}
+
+int set_DHCPv6ServerPool_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcpv6_args *dhcp_arg= (struct dhcpv6_args*)data;
+	struct uci_section *dmmap_sect;
+
+	get_dmmap_section_of_config_section("dmmap_dhcpv6", "dhcp", section_name(dhcp_arg->dhcp_sec), &dmmap_sect);
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			set_section_order("dhcp", "dmmap_dhcpv6", "dhcp", dmmap_sect, dhcp_arg->dhcp_sec, 1, value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPool_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *linker;
+	linker = dmstrdup(((struct dhcpv6_args *)data)->interface);
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value);
+	if (*value == NULL)
+		*value = "";
+	dmfree(linker);
+	return 0;
+}
+
+int set_DHCPv6ServerPool_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *linker;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			adm_entry_get_linker_value(ctx, value, &linker);
+			if (linker) {
+				dmuci_set_value_by_section(((struct dhcpv6_args *)data)->dhcp_sec, "interface", linker);
+				dmfree(linker);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPool_DUID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6ServerPool_DUID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPool_DUIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6ServerPool_DUIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv6.Server.Pool.{i}.VendorClassID!UCI:dhcp/dhcp,@i-1/vendorclass*/
+int get_DHCPv6ServerPool_VendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_args *dhcpv6_client_args = (struct dhcpv6_args*)data;
+
+	struct uci_section *vendorclassidclassifier= get_dhcpv6_classifier("vendorclass", dhcpv6_client_args->interface);
+	if(vendorclassidclassifier == NULL)
+		return 0;
+	dmuci_get_value_by_section_string(vendorclassidclassifier, "vendorclass", value);
+	return 0;
+}
+
+int set_DHCPv6ServerPool_VendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcpv6_args *dhcpv6_client_args = (struct dhcpv6_args*)data;
+	struct uci_section *vendorclassidclassifier= NULL;
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			vendorclassidclassifier= get_dhcpv6_classifier("vendorclass", dhcpv6_client_args->interface);
+			if(vendorclassidclassifier == NULL)
+				return 0;
+			dmuci_set_value_by_section(vendorclassidclassifier, "vendorclass", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPool_VendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value="false";
+	return 0;
+}
+
+int set_DHCPv6ServerPool_VendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.DHCPv6.Server.Pool.{i}.UserClassID!UCI:dhcp/dhcp,@i-1/userclass*/
+int get_DHCPv6ServerPool_UserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_args *dhcpv6_client_args = (struct dhcpv6_args*)data;
+
+	struct uci_section *userclassidclassifier= get_dhcpv6_classifier("userclass", dhcpv6_client_args->interface);
+	if(userclassidclassifier == NULL)
+		return 0;
+	dmuci_get_value_by_section_string(userclassidclassifier, "userclass", value);
+	return 0;
+}
+
+int set_DHCPv6ServerPool_UserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcpv6_args *dhcpv6_client_args = (struct dhcpv6_args*)data;
+
+	struct uci_section *userclassidclassifier;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			userclassidclassifier= get_dhcpv6_classifier("userclass", dhcpv6_client_args->interface);
+			if(userclassidclassifier == NULL)
+				return 0;
+			dmuci_set_value_by_section(userclassidclassifier, "userclass", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPool_UserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value= "false";
+	return 0;
+}
+
+int set_DHCPv6ServerPool_UserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPool_SourceAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_args *dhcpv6_client_args = (struct dhcpv6_args*)data;
+	struct uci_section *macaddrclassifier;
+	char *mac, *mac1, *mac2, *mac3, *mac4, *mac5, *mac6, **macarray, *res= NULL, *tmp= "";
+	int length, i;
+
+	macaddrclassifier= get_dhcpv6_classifier("mac", dhcpv6_client_args->interface);
+	if(macaddrclassifier == NULL) {
+		*value= "";
+		return 0;
+	}
+	dmuci_get_value_by_section_string(macaddrclassifier, "mac", &mac);
+	macarray= strsplit(mac, ":", &length);
+	res= (char*)dmcalloc(18, sizeof(char));
+	tmp=res;
+	for(i= 0; i<6; i++){
+		if(strcmp(macarray[i], "*") == 0) {
+			sprintf(tmp, "%s", "00");
+		} else{
+			sprintf(tmp, "%s", macarray[i]);
+		}
+		tmp+=2;
+
+		if(i<5){
+			sprintf(tmp, "%s", ":");
+			tmp++;
+		}
+	}
+	dmasprintf(value, "%s", res);
+	return 0;
+}
+
+int set_DHCPv6ServerPool_SourceAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPool_SourceAddressMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_args *dhcp_relay_args = (struct dhcpv6_args*)data;
+	struct uci_section *macaddrclassifier;
+	char *mac, *mac1, *mac2, *mac3, *mac4, *mac5, *mac6, **macarray, *res= NULL, *tmp= "";
+	int length, i;
+
+	if(macaddrclassifier == NULL) {
+		*value= "";
+		return 0;
+	}
+	dmuci_get_value_by_section_string(macaddrclassifier, "mac", &mac);
+	macarray= strsplit(mac, ":", &length);
+	res= (char*)dmcalloc(18, sizeof(char));
+	tmp=res;
+	for(i= 0; i<6; i++){
+		if(strcmp(macarray[i], "*") == 0) {
+			sprintf(tmp, "%s", "00");
+		} else{
+			sprintf(tmp, "%s", "FF");
+		}
+		tmp+=2;
+
+		if(i<5){
+			sprintf(tmp, "%s", ":");
+			tmp++;
+		}
+	}
+	dmasprintf(value, "%s", res);
+	return 0;
+}
+
+int set_DHCPv6ServerPool_SourceAddressMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPool_SourceAddressExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6ServerPool_SourceAddressExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPool_IANAEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6ServerPool_IANAEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPool_IANAManualPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6ServerPool_IANAManualPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPool_IANAPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6ServerPool_IAPDEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6ServerPool_IAPDEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPool_IAPDManualPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6ServerPool_IAPDManualPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPool_IAPDPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6ServerPool_IAPDAddLength(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6ServerPool_IAPDAddLength(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPool_ClientNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_args *dhcp_arg= (struct dhcpv6_args*)data;
+	json_object *res, *res1, *jobj, *dev_obj= NULL, *net_obj= NULL;
+	struct clientv6_args curr_dhcp_client_args = {0};
+	char *device;
+	int i= 0;
+	char *idx = NULL, *idx_last = NULL;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(dhcp_arg->dhcp_sec), String}}, 1, &res1);
+	device = dmjson_get_value(res1, 1, "device");
+	dmubus_call("dhcp", "ipv6leases", UBUS_ARGS{}, 0, &res);
+	if(!res)
+		return 0;
+	dev_obj = dmjson_get_obj(res, 1, "device");
+	if (!dev_obj)
+		return 0;
+
+	net_obj = dmjson_get_obj(dev_obj, 1, device);
+	if (!net_obj)
+		return 0;
+
+	while (1) {
+
+		jobj = dmjson_select_obj_in_array_idx(net_obj, i, 1, "leases");
+		if (jobj == NULL)
+			break;
+		i++;
+	}
+	dmasprintf(value, "%d", i);
+	return 0;
+}
+
+int get_DHCPv6ServerPool_OptionNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_args *curr_dhcp_args = (struct dhcpv6_args*)data;
+	struct uci_list *dhcp_options_list = NULL;
+	struct uci_element *e;
+
+	int i= 0;
+
+	dmuci_get_value_by_section_list(curr_dhcp_args->dhcp_sec, "dhcp_option", &dhcp_options_list);
+	if (dhcp_options_list != NULL) {
+		uci_foreach_element(dhcp_options_list, e) {
+			i++;
+		}
+	}
+	dmasprintf(value, "%d", i);
+	return 0;
+}
+
+int get_DHCPv6ServerPoolClient_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6ServerPoolClient_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPoolClient_SourceAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6ServerPoolClient_Active(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6ServerPoolClient_IPv6AddressNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct clientv6_args *dhcpv6_serv_pool_client= (struct clientv6_args *)data;
+	json_object *address_obj= NULL, *prefix_obj= NULL;
+	struct clientv6_args curr_dhcv6_address_args = {0};
+	char *idx = NULL, *idx_last = NULL;
+	int i= 0;
+
+	while (1) {
+		address_obj = dmjson_select_obj_in_array_idx(dhcpv6_serv_pool_client->client, i, 1, "ipv6-addr");
+		if (address_obj == NULL)
+			break;
+		i++;
+	}
+	dmasprintf(value, "%d", i);
+	return 0;
+}
+
+int get_DHCPv6ServerPoolClient_IPv6PrefixNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct clientv6_args *dhcpv6_serv_pool_client= (struct clientv6_args *)data;
+	json_object *address_obj= NULL, *prefix_obj= NULL;
+	struct clientv6_args curr_dhcv6_address_args = {0};
+	char *idx = NULL, *idx_last = NULL;
+	int i= 0;
+
+	while (1) {
+		address_obj = dmjson_select_obj_in_array_idx(dhcpv6_serv_pool_client->client, i, 1, "ipv6-prefix");
+		if (address_obj == NULL)
+			break;
+		i++;
+	}
+	dmasprintf(value, "%d", i);
+	return 0;
+}
+
+int get_DHCPv6ServerPoolClient_OptionNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6ServerPoolClientIPv6Address_IPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct clientv6_args *dhcpv6_serv_pool_client_ip6address= (struct clientv6_args *)data;
+	*value = dmjson_get_value(dhcpv6_serv_pool_client_ip6address->clientparam, 1, "address");
+	return 0;
+}
+
+int get_DHCPv6ServerPoolClientIPv6Address_PreferredLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct clientv6_args *dhcpv6_serv_pool_client_ip6address= (struct clientv6_args *)data;
+	*value = dmjson_get_value(dhcpv6_serv_pool_client_ip6address->clientparam, 1, "preferred-lifetime");
+	return 0;
+}
+
+int get_DHCPv6ServerPoolClientIPv6Address_ValidLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct clientv6_args *dhcpv6_serv_pool_client_ip6address= (struct clientv6_args *)data;
+	*value = dmjson_get_value(dhcpv6_serv_pool_client_ip6address->clientparam, 1, "valid-lifetime");
+	return 0;
+}
+
+int get_DHCPv6ServerPoolClientIPv6Prefix_Prefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct clientv6_args *dhcpv6_serv_pool_client_ip6address= (struct clientv6_args *)data;
+	*value = dmjson_get_value(dhcpv6_serv_pool_client_ip6address->clientparam, 1, "address");
+	return 0;
+}
+
+int get_DHCPv6ServerPoolClientIPv6Prefix_PreferredLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct clientv6_args *dhcpv6_serv_pool_client_ip6address= (struct clientv6_args *)data;
+	*value = dmjson_get_value(dhcpv6_serv_pool_client_ip6address->clientparam, 1, "preferred-lifetime");
+	return 0;
+}
+
+int get_DHCPv6ServerPoolClientIPv6Prefix_ValidLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct clientv6_args *dhcpv6_serv_pool_client_ip6address= (struct clientv6_args *)data;
+	*value = dmjson_get_value(dhcpv6_serv_pool_client_ip6address->clientparam, 1, "valid-lifetime");
+	return 0;
+}
+
+int get_DHCPv6ServerPoolClientOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6ServerPoolClientOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_DHCPv6ServerPoolOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_client_option_args* dhcp_client_opt_args= (struct dhcpv6_client_option_args*)data;
+	char *v;
+	char *opttagvalue= NULL;
+	struct uci_list *dhcp_option_list;
+	struct uci_element *e;
+	char **buf;
+	int length;
+
+	if(strcmp(dhcp_client_opt_args->option_tag, "0") == 0){
+		*value= "0";
+		return 0;
+	}
+
+	dmuci_get_value_by_section_list(dhcp_client_opt_args->client_sect, "dhcp_option", &dhcp_option_list);
+	if (dhcp_option_list != NULL) {
+			uci_foreach_element(dhcp_option_list, e) {
+				buf= strsplit(e->name, ",", &length);
+				if(strcmp(buf[0], dhcp_client_opt_args->option_tag) == 0) {
+					*value= "1";
+					return 0;
+				}
+			}
+	}
+
+	*value= "0";
+	return 0;
+}
+
+int set_DHCPv6ServerPoolOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcpv6_client_option_args* dhcp_client_opt_args= (struct dhcpv6_client_option_args*)data;
+	struct uci_list *dhcp_option_list;
+	struct uci_element *e;
+	char **buf, *opt_value;
+	int length;
+	bool test= false, b;
+
+	switch (action)	{
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+
+			if(strcmp(dhcp_client_opt_args->option_tag, "0") == 0)
+				return 0;
+
+
+			dmuci_get_value_by_section_list(dhcp_client_opt_args->client_sect, "dhcp_option", &dhcp_option_list);
+			dmasprintf(&opt_value, "%s,%s", dhcp_client_opt_args->option_tag, dhcp_client_opt_args->value);
+
+			if (dhcp_option_list != NULL) {
+					uci_foreach_element(dhcp_option_list, e) {
+						buf= strsplit(e->name, ",", &length);
+						if(strcmp(buf[0], dhcp_client_opt_args->option_tag) == 0) {
+							test= true;
+							if(!b){
+								dmuci_del_list_value_by_section(dhcp_client_opt_args->client_sect, "dhcp_option", opt_value);
+							}
+							break;
+						}
+					}
+			}
+			if(!test && b){
+				dmuci_add_list_value_by_section(dhcp_client_opt_args->client_sect, "dhcp_option", opt_value);
+			}
+
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPoolOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_client_option_args* dhcp_client_opt_args= (struct dhcpv6_client_option_args*)data;
+
+	dmuci_get_value_by_section_string(dhcp_client_opt_args->opt_sect, "cwmp_dhcpv6_servpool_option_alias", value);
+	return 0;
+
+}
+
+int set_DHCPv6ServerPoolOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcpv6_client_option_args* dhcp_client_opt_args= (struct dhcpv6_client_option_args*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dhcp_client_opt_args->opt_sect, "cwmp_dhcpv6_servpool_option_alias", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPoolOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_client_option_args* dhcp_client_opt_args= (struct dhcpv6_client_option_args*)data;
+	*value= dmstrdup(dhcp_client_opt_args->option_tag);
+	return 0;
+}
+
+int set_DHCPv6ServerPoolOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcpv6_client_option_args* dhcp_client_opt_args= (struct dhcpv6_client_option_args*)data;
+	char *opttagvalue, **option, *oldopttagvalue;
+	int length;
+	struct uci_list *dhcp_option_list= NULL;
+	struct uci_element *e;
+
+	switch (action)	{
+		case VALUECHECK:
+			dmuci_get_value_by_section_list(dhcp_client_opt_args->client_sect, "dhcp_option", &dhcp_option_list);
+
+			if(dhcp_option_list==NULL)
+				return 0;
+
+			uci_foreach_element(dhcp_option_list, e) {
+				option= strsplit(e->name, ",", &length);
+				if (strcmp(option[0], value)==0)
+					return FAULT_9007;
+			}
+			break;
+		case VALUESET:
+			dmasprintf(&oldopttagvalue, "%s,%s", dhcp_client_opt_args->option_tag, dhcp_client_opt_args->value);
+			dmasprintf(&opttagvalue, "%s,%s", value, dhcp_client_opt_args->value);
+			dmuci_get_value_by_section_list(dhcp_client_opt_args->client_sect, "dhcp_option", &dhcp_option_list);
+			dmuci_del_list_value_by_section(dhcp_client_opt_args->client_sect, "dhcp_option", oldopttagvalue);
+			dmuci_add_list_value_by_section(dhcp_client_opt_args->client_sect, "dhcp_option", opttagvalue);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dhcp_client_opt_args->opt_sect, "option_tag", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPoolOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dhcpv6_client_option_args* dhcp_client_opt_args= (struct dhcpv6_client_option_args*)data;
+	*value= dmstrdup(dhcp_client_opt_args->value);
+	return 0;
+}
+
+int set_DHCPv6ServerPoolOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dhcpv6_client_option_args* dhcp_client_opt_args= (struct dhcpv6_client_option_args*)data;
+	char *opttagvalue, **option, *oldopttagvalue;
+	int length;
+	struct uci_list *dhcp_option_list= NULL;
+	struct uci_element *e;
+
+	switch (action)	{
+		case VALUECHECK:
+			dmuci_get_value_by_section_list(dhcp_client_opt_args->client_sect, "dhcp_option", &dhcp_option_list);
+
+			if(dhcp_option_list==NULL)
+				return 0;
+
+			uci_foreach_element(dhcp_option_list, e) {
+				option= strsplit(e->name, ",", &length);
+				if (strcmp(option[0], value)==0)
+					return FAULT_9007;
+			}
+			break;
+		case VALUESET:
+			dmasprintf(&oldopttagvalue, "%s,%s", dhcp_client_opt_args->option_tag, dhcp_client_opt_args->value);
+			dmasprintf(&opttagvalue, "%s,%s", dhcp_client_opt_args->option_tag, value);
+			dmuci_get_value_by_section_list(dhcp_client_opt_args->client_sect, "dhcp_option", &dhcp_option_list);
+			dmuci_del_list_value_by_section(dhcp_client_opt_args->client_sect, "dhcp_option", oldopttagvalue);
+			dmuci_add_list_value_by_section(dhcp_client_opt_args->client_sect, "dhcp_option", opttagvalue);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dhcp_client_opt_args->opt_sect, "option_value", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DHCPv6ServerPoolOption_PassthroughClient(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_DHCPv6ServerPoolOption_PassthroughClient(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
diff --git a/dmtree/tr181/dhcpv6.h b/dmtree/tr181/dhcpv6.h
new file mode 100644
index 0000000000000000000000000000000000000000..041f8f2d6b9e74ec69948cf97ddeae156e6db803
--- /dev/null
+++ b/dmtree/tr181/dhcpv6.h
@@ -0,0 +1,190 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*      Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Omar Kallel <omar.kallel@pivasoftware.com>
+*/
+
+#ifndef __DHCPV6_H
+#define __DHCPV6_H
+
+extern DMOBJ tDHCPv6Obj[];
+extern DMLEAF tDHCPv6Params[];
+extern DMOBJ tDHCPv6ClientObj[];
+extern DMLEAF tDHCPv6ClientParams[];
+extern DMLEAF tDHCPv6ClientServerParams[];
+extern DMLEAF tDHCPv6ClientSentOptionParams[];
+extern DMLEAF tDHCPv6ClientReceivedOptionParams[];
+extern DMOBJ tDHCPv6ServerObj[];
+extern DMLEAF tDHCPv6ServerParams[];
+extern DMOBJ tDHCPv6ServerPoolObj[];
+extern DMLEAF tDHCPv6ServerPoolParams[];
+extern DMOBJ tDHCPv6ServerPoolClientObj[];
+extern DMLEAF tDHCPv6ServerPoolClientParams[];
+extern DMLEAF tDHCPv6ServerPoolClientIPv6AddressParams[];
+extern DMLEAF tDHCPv6ServerPoolClientIPv6PrefixParams[];
+extern DMLEAF tDHCPv6ServerPoolClientOptionParams[];
+extern DMLEAF tDHCPv6ServerPoolOptionParams[];
+
+struct dhcpv6_client_args {
+	struct uci_section *dhcp_client_conf;
+	struct uci_section *dhcp_client_dm;
+	char *ip;
+};
+
+struct dhcpv6_args
+{
+	struct uci_section *dhcp_sec;
+	char *interface;
+};
+
+struct clientv6_args
+{
+	json_object *client;
+	json_object *clientparam;
+	int idx;
+};
+
+struct dhcpv6_client_option_args {
+	struct uci_section *opt_sect;
+	struct uci_section *client_sect;
+	char *option_tag;
+	char *value;
+};
+
+int browseDHCPv6ClientInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDHCPv6ClientServerInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDHCPv6ClientSentOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDHCPv6ClientReceivedOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDHCPv6ServerPoolInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDHCPv6ServerPoolClientInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDHCPv6ServerPoolOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDHCPv6ServerPoolClientIPv6AddressInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDHCPv6ServerPoolClientIPv6PrefixInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDHCPv6ServerPoolClientOptionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int addObjDHCPv6Client(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjDHCPv6Client(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjDHCPv6ClientSentOption(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjDHCPv6ClientSentOption(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjDHCPv6ServerPool(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjDHCPv6ServerPool(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjDHCPv6ServerPoolOption(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjDHCPv6ServerPoolOption(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_DHCPv6_ClientNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6Client_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6Client_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6Client_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6Client_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6Client_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6Client_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6Client_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6Client_DUID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6Client_RequestAddresses(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6Client_RequestAddresses(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6Client_RequestPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6Client_RequestPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6Client_RapidCommit(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6Client_RapidCommit(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6Client_Renew(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6Client_Renew(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6Client_SuggestedT1(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6Client_SuggestedT1(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6Client_SuggestedT2(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6Client_SuggestedT2(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6Client_SupportedOptions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6Client_RequestedOptions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6Client_RequestedOptions(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6Client_ServerNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6Client_SentOptionNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6Client_ReceivedOptionNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ClientServer_SourceAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ClientServer_DUID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ClientServer_InformationRefreshTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ClientSentOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ClientSentOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ClientSentOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ClientSentOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ClientSentOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ClientSentOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ClientSentOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ClientSentOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ClientReceivedOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ClientReceivedOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ClientReceivedOption_Server(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6Server_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6Server_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6Server_PoolNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPool_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPool_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_DUID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_DUID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_DUIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_DUIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_VendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_VendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_VendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_VendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_UserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_UserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_UserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_UserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_SourceAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_SourceAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_SourceAddressMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_SourceAddressMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_SourceAddressExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_SourceAddressExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_IANAEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_IANAEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_IANAManualPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_IANAManualPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_IANAPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPool_IAPDEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_IAPDEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_IAPDManualPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_IAPDManualPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_IAPDPrefixes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPool_IAPDAddLength(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPool_IAPDAddLength(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPool_ClientNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPool_OptionNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPoolClient_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPoolClient_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPoolClient_SourceAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPoolClient_Active(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPoolClient_IPv6AddressNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPoolClient_IPv6PrefixNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPoolClient_OptionNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPoolClientIPv6Address_IPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPoolClientIPv6Address_PreferredLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPoolClientIPv6Address_ValidLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPoolClientIPv6Prefix_Prefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPoolClientIPv6Prefix_PreferredLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPoolClientIPv6Prefix_ValidLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPoolClientOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPoolClientOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DHCPv6ServerPoolOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPoolOption_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPoolOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPoolOption_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPoolOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPoolOption_Tag(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPoolOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPoolOption_Value(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DHCPv6ServerPoolOption_PassthroughClient(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DHCPv6ServerPoolOption_PassthroughClient(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif //__DHCPV6_H
+
diff --git a/dmtree/tr181/dns.c b/dmtree/tr181/dns.c
new file mode 100644
index 0000000000000000000000000000000000000000..08f98574b5ea389f06cc5283144546677dca3503
--- /dev/null
+++ b/dmtree/tr181/dns.c
@@ -0,0 +1,1046 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*      Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*/
+
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "dmjson.h"
+#include "dmentry.h"
+#include "dns.h"
+
+/* *** Device.DNS. *** */
+DMOBJ tDNSObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Client", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDNSClientObj, tDNSClientParams, NULL, BBFDM_BOTH},
+{"Relay", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDNSRelayObj, tDNSRelayParams, NULL, BBFDM_BOTH},
+{"Diagnostics", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDNSDiagnosticsObj, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDNSParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"SupportedRecordTypes", &DMREAD, DMT_STRING, get_dns_supported_record_types, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DNS.Client. *** */
+DMOBJ tDNSClientObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Server", &DMWRITE, add_client_server, delete_client_server, NULL, browseServerInst, NULL, NULL, NULL, tDNSClientServerParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDNSClientParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_client_enable, set_client_enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_client_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"ServerNumberOfEntries", &DMREAD, DMT_UNINT, get_client_server_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DNS.Client.Server.{i}. *** */
+DMLEAF tDNSClientServerParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_server_enable, set_server_enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_server_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_server_alias, set_server_alias, NULL, NULL, BBFDM_BOTH},
+{"DNSServer", &DMWRITE, DMT_STRING, get_server_dns_server, set_server_dns_server, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_server_interface, set_server_interface, NULL, NULL, BBFDM_BOTH},
+{"Type", &DMREAD, DMT_STRING, get_server_type, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DNS.Relay. *** */
+DMOBJ tDNSRelayObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Forwarding", &DMWRITE, add_relay_forwarding, delete_relay_forwarding, NULL, browseRelayForwardingInst, NULL, NULL, NULL, tDNSRelayForwardingParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDNSRelayParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_relay_enable, set_relay_enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_relay_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"ForwardNumberOfEntries", &DMREAD, DMT_UNINT, get_relay_forward_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DNS.Relay.Forwarding.{i}. *** */
+DMLEAF tDNSRelayForwardingParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_forwarding_enable, set_forwarding_enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_forwarding_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_forwarding_alias, set_forwarding_alias, NULL, NULL, BBFDM_BOTH},
+{"DNSServer", &DMWRITE, DMT_STRING, get_forwarding_dns_server, set_forwarding_dns_server, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_forwarding_interface, set_forwarding_interface, NULL, NULL, BBFDM_BOTH},
+{"Type", &DMREAD, DMT_STRING, get_forwarding_type, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DNS.Diagnostics. *** */
+DMOBJ tDNSDiagnosticsObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"NSLookupDiagnostics", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDNSDiagnosticsNSLookupDiagnosticsObj, tDNSDiagnosticsNSLookupDiagnosticsParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DNS.Diagnostics.NSLookupDiagnostics. *** */
+DMOBJ tDNSDiagnosticsNSLookupDiagnosticsObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Result", &DMREAD, NULL, NULL, NULL, browseResultInst, NULL, NULL, NULL, tDNSDiagnosticsNSLookupDiagnosticsResultParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDNSDiagnosticsNSLookupDiagnosticsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"DiagnosticsState", &DMWRITE, DMT_STRING, get_nslookupdiagnostics_diagnostics_state, set_nslookupdiagnostics_diagnostics_state, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_nslookupdiagnostics_interface, set_nslookupdiagnostics_interface, NULL, NULL, BBFDM_BOTH},
+{"HostName", &DMWRITE, DMT_STRING, get_nslookupdiagnostics_host_name, set_nslookupdiagnostics_host_name, NULL, NULL, BBFDM_BOTH},
+{"DNSServer", &DMWRITE, DMT_STRING, get_nslookupdiagnostics_d_n_s_server, set_nslookupdiagnostics_d_n_s_server, NULL, NULL, BBFDM_BOTH},
+{"Timeout", &DMWRITE, DMT_UNINT, get_nslookupdiagnostics_timeout, set_nslookupdiagnostics_timeout, NULL, NULL, BBFDM_BOTH},
+{"NumberOfRepetitions", &DMWRITE, DMT_UNINT, get_nslookupdiagnostics_number_of_repetitions, set_nslookupdiagnostics_number_of_repetitions, NULL, NULL, BBFDM_BOTH},
+{"SuccessCount", &DMREAD, DMT_UNINT, get_nslookupdiagnostics_success_count, NULL, NULL, NULL, BBFDM_BOTH},
+{"ResultNumberOfEntries", &DMREAD, DMT_UNINT, get_nslookupdiagnostics_result_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DNS.Diagnostics.NSLookupDiagnostics.Result.{i}. *** */
+DMLEAF tDNSDiagnosticsNSLookupDiagnosticsResultParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Status", &DMREAD, DMT_STRING, get_result_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"AnswerType", &DMREAD, DMT_STRING, get_result_answer_type, NULL, NULL, NULL, BBFDM_BOTH},
+{"HostNameReturned", &DMREAD, DMT_STRING, get_result_host_name_returned, NULL, NULL, NULL, BBFDM_BOTH},
+{"IPAddresses", &DMREAD, DMT_STRING, get_result_i_p_addresses, NULL, NULL, NULL, BBFDM_BOTH},
+{"DNSServerIP", &DMREAD, DMT_STRING, get_result_d_n_s_server_i_p, NULL, NULL, NULL, BBFDM_BOTH},
+{"ResponseTime", &DMREAD, DMT_UNINT, get_result_response_time, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/********************************
+ * init function
+ ********************************/
+inline int init_nslookup_results(struct NSLookupResult *args, char *Status, char *AnswerType, char *HostNameReturned, char *IPAddresses, char *DNSServerIP, char *ResponseTime)
+{
+	args->Status = Status;
+	args->AnswerType = AnswerType;
+	args->HostNameReturned = HostNameReturned;
+	args->IPAddresses = IPAddresses;
+	args->DNSServerIP = DNSServerIP;
+	args->ResponseTime = ResponseTime;
+	return 0;
+}
+
+/****************************************************************************************************************************/
+static inline char *nslookup_get(char *option, char *def)
+{
+	char *tmp;
+	dmuci_get_varstate_string("cwmp", "@nslookupdiagnostic[0]", option, &tmp);
+	if(tmp && tmp[0] == '\0')
+		return dmstrdup(def);
+	else
+		return tmp;
+}
+
+static unsigned char is_dns_server_in_dmmap(char *chk_ip, char *chk_interface)
+{
+	struct uci_section *s = NULL;
+	char *ip, *interface;
+
+	uci_path_foreach_sections(icwmpd, "dmmap_dns", "dns_server", s) {
+		dmuci_get_value_by_section_string(s, "ip", &ip);
+		dmuci_get_value_by_section_string(s, "interface", &interface);
+		if (strcmp(interface, chk_interface) == 0 && strcmp(ip, chk_ip) == 0) {
+			return 1;
+		}
+	}
+	return 0;
+}
+
+static int dmmap_synchronizeDNSClientRelayServer(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	json_object *jobj, *arrobj;
+	struct uci_list *v;
+	struct uci_element *e;
+	struct uci_section *s = NULL, *sdns = NULL, *stmp, *ss;
+	char *ipdns, *str, *vip = NULL, *viface, *name;
+	int j, found;
+
+	check_create_dmmap_package("dmmap_dns");
+	uci_path_foreach_sections_safe(icwmpd, "dmmap_dns", "dns_server", stmp, s) {
+		dmuci_get_value_by_section_string(s, "ip", &vip);
+		dmuci_get_value_by_section_string(s, "interface", &viface);
+		found = 0;
+		uci_foreach_sections("network", "interface", ss) {
+			if (strcmp(section_name(ss), viface) != 0)
+				continue;
+			dmuci_get_value_by_section_list(ss, "dns", &v);
+			if (v != NULL) {
+				uci_foreach_element(v, e) {
+					if (strcmp(e->name, vip) == 0) {
+						found = 1;
+						break;
+					}
+				}
+			}
+			if (found)
+				break;
+			dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(ss), String}}, 1, &jobj);
+			dmjson_foreach_value_in_array(jobj, arrobj, ipdns, j, 1, "dns-server") {
+				if (strcmp(ipdns, vip) == 0) {
+					found = 1;
+					break;
+				}
+			}
+			if (found)
+				break;
+		}
+		if (!found)
+			dmuci_delete_by_section(s, NULL, NULL);
+	}
+
+	uci_foreach_sections("network", "interface", s) {
+		dmuci_get_value_by_section_list(s, "dns", &v);
+		if (v != NULL) {
+			uci_foreach_element(v, e) {
+				if (is_dns_server_in_dmmap(e->name, section_name(s)))
+					continue;
+				dmuci_add_section_icwmpd("dmmap_dns", "dns_server", &sdns, &name);
+				dmuci_set_value_by_section(sdns, "ip", e->name);
+				dmuci_set_value_by_section(sdns, "interface", section_name(s));
+				dmuci_set_value_by_section(sdns, "enable", "1");
+			}
+		}
+		dmuci_get_value_by_section_string(s, "peerdns", &str);
+		if (str[0] == '0')
+			continue;
+		dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(s), String}}, 1, &jobj);
+		dmjson_foreach_value_in_array(jobj, arrobj, ipdns, j, 1, "dns-server") {
+			if (ipdns[0] == '\0' || is_dns_server_in_dmmap(ipdns, section_name(s)))
+				continue;
+			dmuci_add_section_icwmpd("dmmap_dns", "dns_server", &sdns, &name);
+			dmuci_set_value_by_section(sdns, "ip", ipdns);
+			dmuci_set_value_by_section(sdns, "interface", section_name(s));
+			dmuci_set_value_by_section(sdns, "enable", "1");
+			dmuci_set_value_by_section(sdns, "peerdns", "1");
+		}
+	}
+	return 0;
+}
+
+/******************************** Browse Functions ****************************************/
+int browseServerInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL;
+	char *instance, *instnbr = NULL;
+
+	dmmap_synchronizeDNSClientRelayServer(dmctx, NULL, NULL, NULL);
+	uci_path_foreach_sections(icwmpd, "dmmap_dns", "dns_server", s)
+	{
+		instance = handle_update_instance(1, dmctx, &instnbr, update_instance_alias_icwmpd, 3, s, "dns_server_instance", "dns_server_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)s, instance) == DM_STOP)
+			break;
+
+	}
+	return 0;
+}
+
+int browseRelayForwardingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL;
+	char *instance, *instnbr = NULL;
+
+	dmmap_synchronizeDNSClientRelayServer(dmctx, NULL, NULL, NULL);
+	uci_path_foreach_sections(icwmpd, "dmmap_dns", "dns_server", s)
+	{
+		instance = handle_update_instance(1, dmctx, &instnbr, update_instance_alias_icwmpd, 3, s, "dns_server_instance", "dns_server_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)s, instance) == DM_STOP)
+			break;
+
+	}
+	return 0;
+}
+
+int browseResultInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL;
+	char *instance, *idx_last = NULL;
+
+	uci_foreach_sections_state("cwmp", "NSLookupResult", s)
+	{
+		instance = handle_update_instance(2, dmctx, &idx_last, update_instance_alias, 3, (void *)s, "nslookup_res_instance", "nslookup_res_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)s, instance) == DM_STOP)
+			break;
+	}
+	return 0;
+}
+
+/*********************************** Add/Delet Object functions *************************/
+int add_client_server(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	struct uci_section *s = NULL;
+	char *v, *inst;
+
+	check_create_dmmap_package("dmmap_dns");
+	inst = get_last_instance_icwmpd("dmmap_dns", "dns_server", "dns_server_instance");
+	dmuci_add_list_value("network", "lan", "dns", "0.0.0.0");
+	dmuci_add_section_icwmpd("dmmap_dns", "dns_server", &s, &v);
+	dmuci_set_value_by_section(s, "ip", "0.0.0.0");
+	dmuci_set_value_by_section(s, "interface", "lan");
+	dmuci_set_value_by_section(s, "enable", "1");
+	*instance = update_instance_icwmpd(s, inst, "dns_server_instance");
+	return 0;
+}
+
+int add_relay_forwarding(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	struct uci_section *s = NULL;
+	char *v, *inst;
+
+	check_create_dmmap_package("dmmap_dns");
+	inst = get_last_instance_icwmpd("dmmap_dns", "dns_server", "dns_server_instance");
+	dmuci_add_list_value("network", "lan", "dns", "0.0.0.0");
+	dmuci_add_section_icwmpd("dmmap_dns", "dns_server", &s, &v);
+	dmuci_set_value_by_section(s, "ip", "0.0.0.0");
+	dmuci_set_value_by_section(s, "interface", "lan");
+	dmuci_set_value_by_section(s, "enable", "1");
+	*instance = update_instance_icwmpd(s, inst, "dns_server_instance");
+	return 0;
+}
+
+int delete_client_server(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *s = NULL, *ss = NULL;
+	char *interface, *ip, *str, *stmp;
+	struct uci_list *v;
+	struct uci_element *e, *tmp;
+
+	switch (del_action) {
+		case DEL_INST:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "peerdns", &str);
+			if (str[0] == '1')
+				return 0;
+			dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &interface);
+			dmuci_get_value_by_section_string((struct uci_section *)data, "ip", &ip);
+			dmuci_del_list_value("network", interface, "dns", ip);
+			dmuci_delete_by_section((struct uci_section *)data, NULL, NULL);
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("network", "interface", s) {
+				dmuci_get_value_by_section_string(s, "peerdns", &str);
+				if (str[0] == '1')
+					continue;
+				dmuci_get_value_by_section_list(s, "dns", &v);
+				if (v != NULL) {
+					uci_foreach_element_safe(v, e, tmp) {
+						uci_path_foreach_option_eq_safe(icwmpd, "dmmap_dns", "dns_server", "ip", tmp->name, stmp, ss) {
+							dmuci_delete_by_section(ss, NULL, NULL);
+						}
+						dmuci_del_list_value_by_section(s, "dns", tmp->name);
+					}
+				}
+			}
+			break;
+	}
+	return 0;
+}
+
+int delete_relay_forwarding(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *s = NULL, *ss = NULL;
+	char *interface, *ip, *str, *stmp;
+	struct uci_list *v;
+	struct uci_element *e, *tmp;
+
+	switch (del_action) {
+		case DEL_INST:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "peerdns", &str);
+			if (str[0] == '1')
+				return 0;
+			dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &interface);
+			dmuci_get_value_by_section_string((struct uci_section *)data, "ip", &ip);
+			dmuci_del_list_value("network", interface, "dns", ip);
+			dmuci_delete_by_section((struct uci_section *)data, NULL, NULL);
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("network", "interface", s) {
+				dmuci_get_value_by_section_string(s, "peerdns", &str);
+				if (str[0] == '1')
+					continue;
+				dmuci_get_value_by_section_list(s, "dns", &v);
+				if (v != NULL) {
+					uci_foreach_element_safe(v, e, tmp) {
+						uci_path_foreach_option_eq_safe(icwmpd, "dmmap_dns", "dns_server", "ip", tmp->name, stmp, ss) {
+							dmuci_delete_by_section(ss, NULL, NULL);
+						}
+						dmuci_del_list_value_by_section(s, "dns", tmp->name);
+					}
+				}
+			}
+			break;
+	}
+	return 0;
+}
+
+/***************************************** Get/Set Parameter functions ***********************/
+int get_dns_supported_record_types(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "A,AAAA,PTR";
+	return 0;
+}
+
+int get_client_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int get_client_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "Enabled";
+	return 0;
+}
+
+int get_client_server_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	dmmap_synchronizeDNSClientRelayServer(ctx, NULL, NULL, NULL);
+	uci_path_foreach_sections(icwmpd, "dmmap_dns", "dns_server", s)
+	{
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+int get_server_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+    dmuci_get_value_by_section_string((struct uci_section *)data, "enable", value);
+    return 0;
+}
+
+int get_server_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *v;
+
+	dmuci_get_value_by_section_string((struct uci_section *)data, "enable", &v);
+	*value = (*v == '1') ? "Enabled" : "Disabled";
+	return 0;
+}
+
+int get_server_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "dns_server_alias", value);
+	return 0;
+}
+
+int get_server_dns_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "ip", value);
+	return 0;
+}
+
+int get_server_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *linker;
+
+	dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &linker);
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value);
+	return 0;
+}
+
+int get_server_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *v;
+	*value = "Static";
+	dmuci_get_value_by_section_string((struct uci_section *)data, "peerdns", &v);
+	if (*v == '1') {
+		dmuci_get_value_by_section_string((struct uci_section *)data, "ip", &v);
+		if (strchr(v, ':') == NULL) {
+			*value = "DHCPv4";
+		}
+		else {
+			*value = "DHCPv6";
+		}
+	}
+	return 0;
+}
+
+int get_relay_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *path = "/etc/rc.d/*dnsmasq";
+	if (check_file(path))
+		*value = "1";
+	else
+		*value = "0";
+	return 0;
+}
+
+int get_relay_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *path = "/etc/rc.d/*dnsmasq";
+	if (check_file(path))
+		*value = "Enabled";
+	else
+		*value = "Disabled";
+	return 0;
+}
+
+int get_relay_forward_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	dmmap_synchronizeDNSClientRelayServer(ctx, NULL, NULL, NULL);
+	uci_path_foreach_sections(icwmpd, "dmmap_dns", "dns_server", s)
+	{
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+int get_forwarding_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+    dmuci_get_value_by_section_string((struct uci_section *)data, "enable", value);
+    return 0;
+}
+
+int get_forwarding_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *v;
+
+	dmuci_get_value_by_section_string((struct uci_section *)data, "enable", &v);
+	*value = (*v == '1') ? "Enabled" : "Disabled";
+	return 0;
+}
+
+int get_forwarding_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "dns_server_alias", value);
+	return 0;
+}
+
+int get_forwarding_dns_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "ip", value);
+	return 0;
+}
+
+int get_forwarding_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *linker;
+
+	dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &linker);
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value);
+	return 0;
+}
+
+int get_forwarding_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *v;
+	*value = "Static";
+	dmuci_get_value_by_section_string((struct uci_section *)data, "peerdns", &v);
+	if (*v == '1') {
+		dmuci_get_value_by_section_string((struct uci_section *)data, "ip", &v);
+		if (strchr(v, ':') == NULL) {
+			*value = "DHCPv4";
+		}
+		else {
+			*value = "DHCPv6";
+		}
+	}
+	return 0;
+}
+
+int get_nslookupdiagnostics_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = nslookup_get("DiagnosticState", "None");
+	return 0;
+}
+
+int get_nslookupdiagnostics_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_varstate_string("cwmp", "@nslookupdiagnostic[0]", "interface", value);
+	return 0;
+}
+
+int get_nslookupdiagnostics_host_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_varstate_string("cwmp", "@nslookupdiagnostic[0]", "HostName", value);
+	return 0;
+}
+
+int get_nslookupdiagnostics_d_n_s_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_varstate_string("cwmp", "@nslookupdiagnostic[0]", "DNSServer", value);
+	return 0;
+}
+
+int get_nslookupdiagnostics_timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = nslookup_get("Timeout", "5000");
+	return 0;
+}
+
+int get_nslookupdiagnostics_number_of_repetitions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = nslookup_get("NumberOfRepetitions", "1");
+	return 0;
+}
+
+int get_nslookupdiagnostics_success_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = nslookup_get("SuccessCount", "0");
+	return 0;
+}
+
+int get_nslookupdiagnostics_result_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	uci_foreach_sections_state("cwmp", "NSLookupResult", s)
+	{
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt); // MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+int get_result_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "Status", value);
+	return 0;
+}
+
+int get_result_answer_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "AnswerType", value);
+	return 0;
+}
+
+int get_result_host_name_returned(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "HostNameReturned", value);
+	return 0;
+}
+
+int get_result_i_p_addresses(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "IPAddresses", value);
+	return 0;
+}
+
+int get_result_d_n_s_server_i_p(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "DNSServerIP", value);
+	return 0;
+}
+
+int get_result_response_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "ResponseTime", value);
+	return 0;
+}
+
+int set_client_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int set_server_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *str, *ip, *interface;
+	bool b, ob;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "enable", &str);
+			string_to_bool(value, &b);
+			string_to_bool(str, &ob);
+			if (ob == b)
+				return 0;
+			dmuci_get_value_by_section_string((struct uci_section *)data, "peerdns", &str);
+			if (str[0] == '1')
+				return 0;
+			dmuci_set_value_by_section((struct uci_section *)data, "enable", b ? "1" : "0");
+			dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &interface);
+			dmuci_get_value_by_section_string((struct uci_section *)data, "ip", &ip);
+			if (b == 1) {
+				dmuci_add_list_value("network", interface, "dns", ip);
+			}
+			else {
+				dmuci_del_list_value("network", interface, "dns", ip);
+			}
+			break;
+	}
+	return 0;
+}
+
+int set_server_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "dns_server_alias", value);
+			break;
+	}
+	return 0;
+}
+
+int set_server_dns_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *str, *oip, *interface;
+	struct uci_list *v;
+	struct uci_element *e;
+	int count = 0, i = 0;
+	char *dns[32] = {0};
+
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "ip", &oip);
+			if (strcmp(oip, value) == 0)
+				return 0;
+			dmuci_get_value_by_section_string((struct uci_section *)data, "peerdns", &str);
+			if (str[0] == '1')
+				return 0;
+			dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &interface);
+			dmuci_get_option_value_list("network", interface, "dns", &v);
+			if (v) {
+				uci_foreach_element(v, e) {
+					if (strcmp(e->name, oip)==0)
+						dns[count] = dmstrdup(value);
+					else
+						dns[count] = dmstrdup(e->name);
+					count++;
+				}
+			}
+			dmuci_delete("network", interface, "dns", NULL);
+			dmuci_get_value_by_section_string((struct uci_section *)data, "enable", &str);
+			if (str[0] == '1') {
+				for (i = 0; i < count; i++) {
+					dmuci_add_list_value("network", interface, "dns", dns[i] ? dns[i] : "");
+					dmfree(dns[i]);
+				}
+			}
+			dmuci_set_value_by_section((struct uci_section *)data, "ip", value);
+			break;
+	}
+	return 0;
+}
+
+int set_server_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *str, *ointerface, *ip, *interface;
+
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &ointerface);
+			adm_entry_get_linker_value(ctx, value, &interface);
+			if (strcmp(ointerface, interface) == 0)
+				return 0;
+			dmuci_get_value_by_section_string((struct uci_section *)data, "peerdns", &str);
+			if (str[0] == '1')
+				return 0;
+			dmuci_get_value_by_section_string((struct uci_section *)data, "ip", &ip);
+			dmuci_del_list_value("network", ointerface, "dns", ip);
+			dmuci_get_value_by_section_string((struct uci_section *)data, "enable", &str);
+			if (str[0] == '1') {
+				dmuci_add_list_value("network", interface, "dns", ip);
+			}
+			dmuci_set_value_by_section((struct uci_section *)data, "interface", interface);
+			break;
+	}
+	return 0;
+}
+
+int set_relay_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmcmd("/etc/init.d/dnsmasq", 1, "enable");
+			else
+				dmcmd("/etc/init.d/dnsmasq", 1, "disable");
+			break;
+	}
+	return 0;
+}
+
+int set_forwarding_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *str, *ip, *interface;
+	bool b, ob;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "enable", &str);
+			string_to_bool(value, &b);
+			string_to_bool(str, &ob);
+			if (ob == b)
+				return 0;
+			dmuci_get_value_by_section_string((struct uci_section *)data, "peerdns", &str);
+			if (str[0] == '1')
+				return 0;
+			dmuci_set_value_by_section((struct uci_section *)data, "enable", b ? "1" : "0");
+			dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &interface);
+			dmuci_get_value_by_section_string((struct uci_section *)data, "ip", &ip);
+			if (b == 1) {
+				dmuci_add_list_value("network", interface, "dns", ip);
+			}
+			else {
+				dmuci_del_list_value("network", interface, "dns", ip);
+			}
+			break;
+	}
+	return 0;
+}
+
+int set_forwarding_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "dns_server_alias", value);
+			break;
+	}
+	return 0;
+}
+
+int set_forwarding_dns_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *str, *oip, *interface;
+	struct uci_list *v;
+	struct uci_element *e;
+	int count = 0, i = 0;
+	char *dns[32] = {0};
+
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "ip", &oip);
+			if (strcmp(oip, value) == 0)
+				return 0;
+			dmuci_get_value_by_section_string((struct uci_section *)data, "peerdns", &str);
+			if (str[0] == '1')
+				return 0;
+			dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &interface);
+			dmuci_get_option_value_list("network", interface, "dns", &v);
+			if (v) {
+				uci_foreach_element(v, e) {
+					if (strcmp(e->name, oip)==0)
+						dns[count] = dmstrdup(value);
+					else
+						dns[count] = dmstrdup(e->name);
+					count++;
+				}
+			}
+			dmuci_delete("network", interface, "dns", NULL);
+			dmuci_get_value_by_section_string((struct uci_section *)data, "enable", &str);
+			if (str[0] == '1') {
+				for (i = 0; i < count; i++) {
+					dmuci_add_list_value("network", interface, "dns", dns[i] ? dns[i] : "");
+					dmfree(dns[i]);
+				}
+			}
+			dmuci_set_value_by_section((struct uci_section *)data, "ip", value);
+			break;
+	}
+	return 0;
+}
+
+int set_forwarding_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *str, *ointerface, *ip, *interface;
+
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &ointerface);
+			adm_entry_get_linker_value(ctx, value, &interface);
+			if (strcmp(ointerface, interface) == 0)
+				return 0;
+			dmuci_get_value_by_section_string((struct uci_section *)data, "peerdns", &str);
+			if (str[0] == '1')
+				return 0;
+			dmuci_get_value_by_section_string((struct uci_section *)data, "ip", &ip);
+			dmuci_del_list_value("network", ointerface, "dns", ip);
+			dmuci_get_value_by_section_string((struct uci_section *)data, "enable", &str);
+			if (str[0] == '1') {
+				dmuci_add_list_value("network", interface, "dns", ip);
+			}
+			dmuci_set_value_by_section((struct uci_section *)data, "interface", interface);
+			break;
+	}
+	return 0;
+}
+
+int set_nslookupdiagnostics_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "Requested") == 0) {
+				NSLOOKUP_STOP
+				curr_section = (struct uci_section *)dmuci_walk_state_section("cwmp", "nslookupdiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+				if(!curr_section)
+				{
+					dmuci_add_state_section("cwmp", "nslookupdiagnostic", &curr_section, &tmp);
+				}
+				dmuci_set_varstate_value("cwmp", "@nslookupdiagnostic[0]", "DiagnosticState", value);
+				cwmp_set_end_session(END_SESSION_NSLOOKUP_DIAGNOSTIC);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int set_nslookupdiagnostics_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			NSLOOKUP_STOP
+			curr_section = dmuci_walk_state_section("cwmp", "nslookupdiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "nslookupdiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@nslookupdiagnostic[0]", "interface", value);
+			return 0;
+	}
+	return 0;
+}
+
+int set_nslookupdiagnostics_host_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			NSLOOKUP_STOP
+			curr_section = dmuci_walk_state_section("cwmp", "nslookupdiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "nslookupdiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@nslookupdiagnostic[0]", "HostName", value);
+			return 0;
+	}
+	return 0;
+}
+
+int set_nslookupdiagnostics_d_n_s_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			NSLOOKUP_STOP
+			curr_section = dmuci_walk_state_section("cwmp", "nslookupdiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "nslookupdiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@nslookupdiagnostic[0]", "DNSServer", value);
+			return 0;
+	}
+	return 0;
+}
+
+int set_nslookupdiagnostics_timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			NSLOOKUP_STOP
+			curr_section = dmuci_walk_state_section("cwmp", "nslookupdiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "nslookupdiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@nslookupdiagnostic[0]", "Timeout", value);
+			return 0;
+	}
+	return 0;
+}
+
+int set_nslookupdiagnostics_number_of_repetitions(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *tmp;
+	struct uci_section *curr_section = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			NSLOOKUP_STOP
+			curr_section = dmuci_walk_state_section("cwmp", "nslookupdiagnostic", NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION);
+			if(!curr_section)
+			{
+				dmuci_add_state_section("cwmp", "nslookupdiagnostic", &curr_section, &tmp);
+			}
+			dmuci_set_varstate_value("cwmp", "@nslookupdiagnostic[0]", "NumberOfRepetitions", value);
+			return 0;
+	}
+	return 0;
+}
+
+
diff --git a/dmtree/tr181/dns.h b/dmtree/tr181/dns.h
new file mode 100644
index 0000000000000000000000000000000000000000..e0decbd8d1c27a8a1dc8db3be28abc1cce4af036
--- /dev/null
+++ b/dmtree/tr181/dns.h
@@ -0,0 +1,98 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*	Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*/
+
+#ifndef _DNS_H
+#define _DNS_H
+
+extern DMOBJ tDNSObj[];
+extern DMLEAF tDNSParams[];
+extern DMLEAF tDNSClientParams[];
+extern DMOBJ tDNSClientObj[];
+extern DMLEAF tDNSClientServerParams[];
+extern DMLEAF tDNSRelayParams[];
+extern DMOBJ tDNSRelayObj[];
+extern DMLEAF tDNSRelayForwardingParams[];
+extern DMOBJ tDNSDiagnosticsObj[];
+extern DMLEAF tDNSDiagnosticsNSLookupDiagnosticsParams[];
+extern DMOBJ tDNSDiagnosticsNSLookupDiagnosticsObj[];
+extern DMLEAF tDNSDiagnosticsNSLookupDiagnosticsResultParams[];
+
+struct NSLookupResult
+{
+	char *Status;
+	char *AnswerType;
+	char *HostNameReturned;
+	char *IPAddresses;
+	char *DNSServerIP;
+	char *ResponseTime;
+};
+
+int browseServerInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseRelayForwardingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseResultInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int add_client_server(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int add_relay_forwarding(char *refparam, struct dmctx *ctx, void *data, char **instance);
+
+int delete_client_server(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int delete_relay_forwarding(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_dns_supported_record_types(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_client_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_client_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_client_server_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_server_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_server_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_server_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_server_dns_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_server_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_server_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_relay_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_relay_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_relay_forward_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_forwarding_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_forwarding_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_forwarding_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_forwarding_dns_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_forwarding_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_forwarding_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_nslookupdiagnostics_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_nslookupdiagnostics_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_nslookupdiagnostics_host_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_nslookupdiagnostics_d_n_s_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_nslookupdiagnostics_timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_nslookupdiagnostics_number_of_repetitions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_nslookupdiagnostics_success_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_nslookupdiagnostics_result_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_result_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_result_answer_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_result_host_name_returned(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_result_i_p_addresses(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_result_d_n_s_server_i_p(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_result_response_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int set_client_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_server_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_server_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_server_dns_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_server_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_relay_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_forwarding_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_forwarding_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_forwarding_dns_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_forwarding_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_nslookupdiagnostics_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_nslookupdiagnostics_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_nslookupdiagnostics_host_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_nslookupdiagnostics_d_n_s_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_nslookupdiagnostics_timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_nslookupdiagnostics_number_of_repetitions(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif
diff --git a/dmtree/tr181/dsl.c b/dmtree/tr181/dsl.c
new file mode 100644
index 0000000000000000000000000000000000000000..e1aba539027671ab3b46a753c4a7479ba8a39263
--- /dev/null
+++ b/dmtree/tr181/dsl.c
@@ -0,0 +1,1546 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*      Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: AMIN Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*/
+
+#include <uci.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "dmjson.h"
+#include "dmentry.h"
+#include "dsl.h"
+
+#define DELIMITOR ","
+
+/* *** Device.DSL. *** */
+DMOBJ tDSLObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Line", &DMREAD, NULL, NULL, NULL, browseDSLLineInst, NULL, NULL, tDSLLineObj, tDSLLineParams, get_dsl_line_linker, BBFDM_BOTH},
+{"Channel", &DMREAD, NULL, NULL, NULL, browseDSLChannelInst, NULL, NULL, tDSLChannelObj, tDSLChannelParams, get_dsl_channel_linker, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDSLParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"LineNumberOfEntries", &DMREAD, DMT_UNINT, get_DSL_LineNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"ChannelNumberOfEntries", &DMREAD, DMT_UNINT, get_DSL_ChannelNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DSL.Line.{i}. *** */
+DMOBJ tDSLLineObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDSLLineStatsObj, tDSLLineStatsParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDSLLineParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_DSLLine_Enable, set_DSLLine_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_DSLLine_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_DSLLine_Alias, set_DSLLine_Alias, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMREAD, DMT_STRING, get_DSLLine_Name, NULL, NULL, NULL, BBFDM_BOTH},
+{"LowerLayers", &DMWRITE, DMT_STRING, get_DSLLine_LowerLayers, set_DSLLine_LowerLayers, NULL, NULL, BBFDM_BOTH},
+{"Upstream", &DMREAD, DMT_BOOL, get_DSLLine_Upstream, NULL, NULL, NULL, BBFDM_BOTH},
+{"FirmwareVersion", &DMREAD, DMT_STRING, get_DSLLine_FirmwareVersion, NULL, NULL, NULL, BBFDM_BOTH},
+{"LinkStatus", &DMREAD, DMT_STRING, get_DSLLine_LinkStatus, NULL, NULL, NULL, BBFDM_BOTH},
+{"StandardsSupported", &DMREAD, DMT_STRING, get_DSLLine_StandardsSupported, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTSE", &DMREAD, DMT_HEXBIN, get_DSLLine_XTSE, NULL, NULL, NULL, BBFDM_BOTH},
+{"StandardUsed", &DMREAD, DMT_STRING, get_DSLLine_StandardUsed, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTSUsed", &DMREAD, DMT_HEXBIN, get_DSLLine_XTSUsed, NULL, NULL, NULL, BBFDM_BOTH},
+{"LineEncoding", &DMREAD, DMT_STRING, get_DSLLine_LineEncoding, NULL, NULL, NULL, BBFDM_BOTH},
+{"AllowedProfiles", &DMREAD, DMT_STRING, get_DSLLine_AllowedProfiles, NULL, NULL, NULL, BBFDM_BOTH},
+{"CurrentProfile", &DMREAD, DMT_STRING, get_DSLLine_CurrentProfile, NULL, NULL, NULL, BBFDM_BOTH},
+{"PowerManagementState", &DMREAD, DMT_STRING, get_DSLLine_PowerManagementState, NULL, NULL, NULL, BBFDM_BOTH},
+{"SuccessFailureCause", &DMREAD, DMT_UNINT, get_DSLLine_SuccessFailureCause, NULL, NULL, NULL, BBFDM_BOTH},
+{"UPBOKLERPb", &DMREAD, DMT_STRING, get_DSLLine_UPBOKLERPb, NULL, NULL, NULL, BBFDM_BOTH},
+{"RXTHRSHds", &DMREAD, DMT_INT, get_DSLLine_RXTHRSHds, NULL, NULL, NULL, BBFDM_BOTH},
+{"ACTRAMODEds", &DMREAD, DMT_UNINT, get_DSLLine_ACTRAMODEds, NULL, NULL, NULL, BBFDM_BOTH},
+{"ACTRAMODEus", &DMREAD, DMT_UNINT, get_DSLLine_ACTRAMODEus, NULL, NULL, NULL, BBFDM_BOTH},
+{"SNRMROCus", &DMREAD, DMT_UNINT, get_DSLLine_SNRMROCus, NULL, NULL, NULL, BBFDM_BOTH},
+{"LastStateTransmittedDownstream", &DMREAD, DMT_UNINT, get_DSLLine_LastStateTransmittedDownstream, NULL, NULL, NULL, BBFDM_BOTH},
+{"LastStateTransmittedUpstream", &DMREAD, DMT_UNINT, get_DSLLine_LastStateTransmittedUpstream, NULL, NULL, NULL, BBFDM_BOTH},
+{"US0MASK", &DMREAD, DMT_UNINT, get_DSLLine_US0MASK, NULL, NULL, NULL, BBFDM_BOTH},
+{"TRELLISds", &DMREAD, DMT_INT, get_DSLLine_TRELLISds, NULL, NULL, NULL, BBFDM_BOTH},
+{"TRELLISus", &DMREAD, DMT_INT, get_DSLLine_TRELLISus, NULL, NULL, NULL, BBFDM_BOTH},
+{"ACTSNRMODEds", &DMREAD, DMT_UNINT, get_DSLLine_ACTSNRMODEds, NULL, NULL, NULL, BBFDM_BOTH},
+{"ACTSNRMODEus", &DMREAD, DMT_UNINT, get_DSLLine_ACTSNRMODEus, NULL, NULL, NULL, BBFDM_BOTH},
+{"LineNumber", &DMREAD, DMT_INT, get_DSLLine_LineNumber, NULL, NULL, NULL, BBFDM_BOTH},
+{"UpstreamMaxBitRate", &DMREAD, DMT_UNINT, get_DSLLine_UpstreamMaxBitRate, NULL, NULL, NULL, BBFDM_BOTH},
+{"DownstreamMaxBitRate", &DMREAD, DMT_UNINT, get_DSLLine_DownstreamMaxBitRate, NULL, NULL, NULL, BBFDM_BOTH},
+{"UpstreamNoiseMargin", &DMREAD, DMT_INT, get_DSLLine_UpstreamNoiseMargin, NULL, NULL, NULL, BBFDM_BOTH},
+{"DownstreamNoiseMargin", &DMREAD, DMT_INT, get_DSLLine_DownstreamNoiseMargin, NULL, NULL, NULL, BBFDM_BOTH},
+{"SNRMpbus", &DMREAD, DMT_STRING, get_DSLLine_SNRMpbus, NULL, NULL, NULL, BBFDM_BOTH},
+{"SNRMpbds", &DMREAD, DMT_STRING, get_DSLLine_SNRMpbds, NULL, NULL, NULL, BBFDM_BOTH},
+{"UpstreamAttenuation", &DMREAD, DMT_INT, get_DSLLine_UpstreamAttenuation, NULL, NULL, NULL, BBFDM_BOTH},
+{"DownstreamAttenuation", &DMREAD, DMT_INT, get_DSLLine_DownstreamAttenuation, NULL, NULL, NULL, BBFDM_BOTH},
+{"UpstreamPower", &DMREAD, DMT_INT, get_DSLLine_UpstreamPower, NULL, NULL, NULL, BBFDM_BOTH},
+{"DownstreamPower", &DMREAD, DMT_INT, get_DSLLine_DownstreamPower, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTURVendor", &DMREAD, DMT_HEXBIN, get_DSLLine_XTURVendor, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTURCountry", &DMREAD, DMT_HEXBIN, get_DSLLine_XTURCountry, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTURANSIStd", &DMREAD, DMT_UNINT, get_DSLLine_XTURANSIStd, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTURANSIRev", &DMREAD, DMT_UNINT, get_DSLLine_XTURANSIRev, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCVendor", &DMREAD, DMT_HEXBIN, get_DSLLine_XTUCVendor, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCCountry", &DMREAD, DMT_HEXBIN, get_DSLLine_XTUCCountry, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCANSIStd", &DMREAD, DMT_UNINT, get_DSLLine_XTUCANSIStd, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCANSIRev", &DMREAD, DMT_UNINT, get_DSLLine_XTUCANSIRev, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DSL.Line.{i}.Stats. *** */
+DMOBJ tDSLLineStatsObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Total", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tDSLLineStatsTotalParams, NULL, BBFDM_BOTH},
+{"Showtime", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tDSLLineStatsShowtimeParams, NULL, BBFDM_BOTH},
+{"LastShowtime", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tDSLLineStatsLastShowtimeParams, NULL, BBFDM_BOTH},
+{"CurrentDay", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tDSLLineStatsCurrentDayParams, NULL, BBFDM_BOTH},
+{"QuarterHour", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tDSLLineStatsQuarterHourParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDSLLineStatsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"TotalStart", &DMREAD, DMT_UNINT, get_DSLLineStats_TotalStart, NULL, NULL, NULL, BBFDM_BOTH},
+{"ShowtimeStart", &DMREAD, DMT_UNINT, get_DSLLineStats_ShowtimeStart, NULL, NULL, NULL, BBFDM_BOTH},
+{"LastShowtimeStart", &DMREAD, DMT_UNINT, get_DSLLineStats_LastShowtimeStart, NULL, NULL, NULL, BBFDM_BOTH},
+{"CurrentDayStart", &DMREAD, DMT_UNINT, get_DSLLineStats_CurrentDayStart, NULL, NULL, NULL, BBFDM_BOTH},
+{"QuarterHourStart", &DMREAD, DMT_UNINT, get_DSLLineStats_QuarterHourStart, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DSL.Line.{i}.Stats.Total. *** */
+DMLEAF tDSLLineStatsTotalParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"ErroredSecs", &DMREAD, DMT_UNINT, get_DSLLineStatsTotal_ErroredSecs, NULL, NULL, NULL, BBFDM_BOTH},
+{"SeverelyErroredSecs", &DMREAD, DMT_UNINT, get_DSLLineStatsTotal_SeverelyErroredSecs, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DSL.Line.{i}.Stats.Showtime. *** */
+DMLEAF tDSLLineStatsShowtimeParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"ErroredSecs", &DMREAD, DMT_UNINT, get_DSLLineStatsShowtime_ErroredSecs, NULL, NULL, NULL, BBFDM_BOTH},
+{"SeverelyErroredSecs", &DMREAD, DMT_UNINT, get_DSLLineStatsShowtime_SeverelyErroredSecs, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DSL.Line.{i}.Stats.LastShowtime. *** */
+DMLEAF tDSLLineStatsLastShowtimeParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"ErroredSecs", &DMREAD, DMT_UNINT, get_DSLLineStatsLastShowtime_ErroredSecs, NULL, NULL, NULL, BBFDM_BOTH},
+{"SeverelyErroredSecs", &DMREAD, DMT_UNINT, get_DSLLineStatsLastShowtime_SeverelyErroredSecs, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DSL.Line.{i}.Stats.CurrentDay. *** */
+DMLEAF tDSLLineStatsCurrentDayParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"ErroredSecs", &DMREAD, DMT_UNINT, get_DSLLineStatsCurrentDay_ErroredSecs, NULL, NULL, NULL, BBFDM_BOTH},
+{"SeverelyErroredSecs", &DMREAD, DMT_UNINT, get_DSLLineStatsCurrentDay_SeverelyErroredSecs, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DSL.Line.{i}.Stats.QuarterHour. *** */
+DMLEAF tDSLLineStatsQuarterHourParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"ErroredSecs", &DMREAD, DMT_UNINT, get_DSLLineStatsQuarterHour_ErroredSecs, NULL, NULL, NULL, BBFDM_BOTH},
+{"SeverelyErroredSecs", &DMREAD, DMT_UNINT, get_DSLLineStatsQuarterHour_SeverelyErroredSecs, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DSL.Channel.{i}. *** */
+DMOBJ tDSLChannelObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDSLChannelStatsObj, tDSLChannelStatsParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDSLChannelParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_DSLChannel_Enable, set_DSLChannel_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_DSLChannel_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_DSLChannel_Alias, set_DSLChannel_Alias, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMREAD, DMT_STRING, get_DSLChannel_Name, NULL, NULL, NULL, BBFDM_BOTH},
+{"LowerLayers", &DMREAD, DMT_STRING, get_DSLChannel_LowerLayers, NULL, NULL, NULL, BBFDM_BOTH},
+{"LinkEncapsulationSupported", &DMREAD, DMT_STRING, get_DSLChannel_LinkEncapsulationSupported, NULL, NULL, NULL, BBFDM_BOTH},
+{"LinkEncapsulationUsed", &DMREAD, DMT_STRING, get_DSLChannel_LinkEncapsulationUsed, NULL, NULL, NULL, BBFDM_BOTH},
+{"LPATH", &DMREAD, DMT_UNINT, get_DSLChannel_LPATH, NULL, NULL, NULL, BBFDM_BOTH},
+{"INTLVDEPTH", &DMREAD, DMT_UNINT, get_DSLChannel_INTLVDEPTH, NULL, NULL, NULL, BBFDM_BOTH},
+{"INTLVBLOCK", &DMREAD, DMT_INT, get_DSLChannel_INTLVBLOCK, NULL, NULL, NULL, BBFDM_BOTH},
+{"ActualInterleavingDelay", &DMREAD, DMT_UNINT, get_DSLChannel_ActualInterleavingDelay, NULL, NULL, NULL, BBFDM_BOTH},
+{"ACTINP", &DMREAD, DMT_INT, get_DSLChannel_ACTINP, NULL, NULL, NULL, BBFDM_BOTH},
+{"INPREPORT", &DMREAD, DMT_BOOL, get_DSLChannel_INPREPORT, NULL, NULL, NULL, BBFDM_BOTH},
+{"NFEC", &DMREAD, DMT_INT, get_DSLChannel_NFEC, NULL, NULL, NULL, BBFDM_BOTH},
+{"RFEC", &DMREAD, DMT_INT, get_DSLChannel_RFEC, NULL, NULL, NULL, BBFDM_BOTH},
+{"LSYMB", &DMREAD, DMT_INT, get_DSLChannel_LSYMB, NULL, NULL, NULL, BBFDM_BOTH},
+{"UpstreamCurrRate", &DMREAD, DMT_UNINT, get_DSLChannel_UpstreamCurrRate, NULL, NULL, NULL, BBFDM_BOTH},
+{"DownstreamCurrRate", &DMREAD, DMT_UNINT, get_DSLChannel_DownstreamCurrRate, NULL, NULL, NULL, BBFDM_BOTH},
+{"ACTNDR", &DMREAD, DMT_UNINT, get_DSLChannel_ACTNDR, NULL, NULL, NULL, BBFDM_BOTH},
+{"ACTINPREIN", &DMREAD, DMT_UNINT, get_DSLChannel_ACTINPREIN, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DSL.Channel.{i}.Stats. *** */
+DMOBJ tDSLChannelStatsObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Total", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tDSLChannelStatsTotalParams, NULL, BBFDM_BOTH},
+{"Showtime", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tDSLChannelStatsShowtimeParams, NULL, BBFDM_BOTH},
+{"LastShowtime", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tDSLChannelStatsLastShowtimeParams, NULL, BBFDM_BOTH},
+{"CurrentDay", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tDSLChannelStatsCurrentDayParams, NULL, BBFDM_BOTH},
+{"QuarterHour", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tDSLChannelStatsQuarterHourParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tDSLChannelStatsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"TotalStart", &DMREAD, DMT_UNINT, get_DSLChannelStats_TotalStart, NULL, NULL, NULL, BBFDM_BOTH},
+{"ShowtimeStart", &DMREAD, DMT_UNINT, get_DSLChannelStats_ShowtimeStart, NULL, NULL, NULL, BBFDM_BOTH},
+{"LastShowtimeStart", &DMREAD, DMT_UNINT, get_DSLChannelStats_LastShowtimeStart, NULL, NULL, NULL, BBFDM_BOTH},
+{"CurrentDayStart", &DMREAD, DMT_UNINT, get_DSLChannelStats_CurrentDayStart, NULL, NULL, NULL, BBFDM_BOTH},
+{"QuarterHourStart", &DMREAD, DMT_UNINT, get_DSLChannelStats_QuarterHourStart, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DSL.Channel.{i}.Stats.Total. *** */
+DMLEAF tDSLChannelStatsTotalParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"XTURFECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsTotal_XTURFECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCFECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsTotal_XTUCFECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTURHECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsTotal_XTURHECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCHECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsTotal_XTUCHECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTURCRCErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsTotal_XTURCRCErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCCRCErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsTotal_XTUCCRCErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DSL.Channel.{i}.Stats.Showtime. *** */
+DMLEAF tDSLChannelStatsShowtimeParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"XTURFECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsShowtime_XTURFECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCFECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsShowtime_XTUCFECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTURHECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsShowtime_XTURHECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCHECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsShowtime_XTUCHECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTURCRCErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsShowtime_XTURCRCErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCCRCErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsShowtime_XTUCCRCErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DSL.Channel.{i}.Stats.LastShowtime. *** */
+DMLEAF tDSLChannelStatsLastShowtimeParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"XTURFECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsLastShowtime_XTURFECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCFECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsLastShowtime_XTUCFECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTURHECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsLastShowtime_XTURHECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCHECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsLastShowtime_XTUCHECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTURCRCErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsLastShowtime_XTURCRCErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCCRCErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsLastShowtime_XTUCCRCErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DSL.Channel.{i}.Stats.CurrentDay. *** */
+DMLEAF tDSLChannelStatsCurrentDayParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"XTURFECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsCurrentDay_XTURFECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCFECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsCurrentDay_XTUCFECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTURHECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsCurrentDay_XTURHECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCHECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsCurrentDay_XTUCHECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTURCRCErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsCurrentDay_XTURCRCErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCCRCErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsCurrentDay_XTUCCRCErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.DSL.Channel.{i}.Stats.QuarterHour. *** */
+DMLEAF tDSLChannelStatsQuarterHourParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"XTURFECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsQuarterHour_XTURFECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCFECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsQuarterHour_XTUCFECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTURHECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsQuarterHour_XTURHECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCHECErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsQuarterHour_XTUCHECErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTURCRCErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsQuarterHour_XTURCRCErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{"XTUCCRCErrors", &DMREAD, DMT_UNINT, get_DSLChannelStatsQuarterHour_XTUCCRCErrors, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/**************************************************************************
+* LINKER
+***************************************************************************/
+int get_dsl_line_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker)
+{
+	if (data && ((struct dsl_line_args *)data)->id) {
+		dmasprintf(linker, "line_%s", ((struct dsl_line_args *)data)->id);
+		return 0;
+	}
+	*linker = "" ;
+	return 0;
+}
+
+int get_dsl_channel_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker)
+{
+	if (data && ((struct dsl_line_args *)data)->id){
+		dmasprintf(linker, "channel_%s", ((struct dsl_line_args *)data)->id);
+		return 0;
+	}
+	*linker = "" ;
+	return 0;
+}
+
+/**************************************************************************
+* INIT
+***************************************************************************/
+inline int init_dsl_line(struct dsl_line_args *args, struct uci_section *s)
+{
+	args->line_sec = s;
+	return 0;
+}
+
+inline int init_dsl_channel(struct dsl_channel_args *args, struct uci_section *s)
+{
+	args->channel_sec = s;
+	return 0;
+}
+
+/*************************************************************/
+static struct uci_section *update_create_dmmap_dsl_line(char *curr_id)
+{
+	struct uci_section *s = NULL;
+	char *name, *instance;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap", "dsl_line", "id", curr_id, s) {
+		return s;
+	}
+	if (!s) {
+		dmasprintf(&instance, "%d", atoi(curr_id)+1);
+		DMUCI_ADD_SECTION(icwmpd, "dmmap", "dsl_line", &s, &name);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "id", curr_id);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "dsl_line_instance", instance);
+		dmfree(instance);
+	}
+	return s;
+}
+
+static struct uci_section *update_create_dmmap_dsl_channel(char *curr_id)
+{
+	struct uci_section *s = NULL;
+	char *name, *instance;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap", "dsl_channel", "id", curr_id, s) {
+		return s;
+	}
+	if (!s) {
+		dmasprintf(&instance, "%d", atoi(curr_id)+1);
+		DMUCI_ADD_SECTION(icwmpd, "dmmap", "dsl_channel", &s, &name);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "id", curr_id);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "dsl_channel_instance", instance);
+		dmfree(instance);
+	}
+	return s;
+}
+/*************************************************************
+ * ENTRY METHOD
+/*************************************************************/
+int browseDSLLineInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	json_object *res = NULL, *line_obj = NULL;
+	struct dsl_line_args cur_dsl_line_args = {0};
+	struct uci_section *s = NULL;
+	char *dsl_int = NULL, *dsl_int_last = NULL;
+	int entries = 0;
+
+	dmubus_call("dsl", "status", UBUS_ARGS{}, 0, &res);
+	while (res) {
+		line_obj = dmjson_select_obj_in_array_idx(res, entries, 1, "line");
+		if(line_obj) {
+			cur_dsl_line_args.id = dmjson_get_value(line_obj, 1, "id");
+			entries++;
+			s = update_create_dmmap_dsl_line(cur_dsl_line_args.id);
+			init_dsl_line(&cur_dsl_line_args, s);
+			dsl_int = handle_update_instance(1, dmctx, &dsl_int_last, update_instance_alias, 3, s, "dsl_line_instance", "dsl_line_alias");
+			if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&cur_dsl_line_args, dsl_int) == DM_STOP)
+				break;
+		}
+		else
+			break;
+	}
+	return 0;
+}
+
+int browseDSLChannelInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	json_object *res = NULL, *line_obj = NULL, *channel_obj = NULL;
+	struct dsl_channel_args cur_dsl_channel_args = {0};
+	struct uci_section *s = NULL;
+	char *dsl_int = NULL, *dsl_int_last = NULL;
+	int entries_line = 0, entries_channel = 0;
+
+	dmubus_call("dsl", "status", UBUS_ARGS{}, 0, &res);
+	while (res) {
+		line_obj = dmjson_select_obj_in_array_idx(res, entries_line, 1, "line");
+		while (line_obj) {
+			channel_obj = dmjson_select_obj_in_array_idx(line_obj, entries_channel, 1, "channel");
+			if(channel_obj) {
+				cur_dsl_channel_args.id = dmjson_get_value(channel_obj, 1, "id");
+				entries_channel++;
+				s = update_create_dmmap_dsl_channel(cur_dsl_channel_args.id);
+				init_dsl_channel(&cur_dsl_channel_args, s);
+				dsl_int = handle_update_instance(1, dmctx, &dsl_int_last, update_instance_alias, 3, s, "dsl_channel_instance", "dsl_channel_alias");
+				if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&cur_dsl_channel_args, dsl_int) == DM_STOP)
+					break;
+			}
+			else
+				break;
+		}
+		entries_line++;
+		if(!line_obj)
+			break;
+	}
+	return 0;
+}
+
+/**************************************************************************
+* COMMON FUNCTIONS
+***************************************************************************/
+static char *get_dsl_value_without_argument(char *command1, char *id, char *command2, char *key)
+{
+	json_object *res;
+	char command[16], *value = "0";
+
+	sprintf(command, "%s.%s", command1, id);
+	dmubus_call(command, command2, UBUS_ARGS{}, 0, &res);
+	value = dmjson_get_value(res, 1, key);
+	return value;
+}
+
+static char *get_dsl_value_without_argument_and_with_two_key(char *command1, char *id, char *command2, char *key1, char *key2)
+{
+	json_object *res;
+	char command[16], *value = "0";
+
+	sprintf(command, "%s.%s", command1, id);
+	dmubus_call(command, command2, UBUS_ARGS{}, 0, &res);
+	value = dmjson_get_value(res, 2, key1, key2);
+	return value;
+}
+
+static char *get_dsl_value_with_argument(char *command1, char *id, char *command2, char *argument, char *key)
+{
+	json_object *res;
+	char command[16], *value = "0";
+
+	sprintf(command, "%s.%s", command1, id);
+	dmubus_call(command, command2, UBUS_ARGS{{"interval", argument, String}}, 1, &res);
+	value = dmjson_get_value(res, 1, key);
+	return value;
+}
+
+static char *get_dsl_value_array_without_argument(char *command1, char *id, char *command2, char *key)
+{
+	json_object *res;
+	char command[16], *value= "0";
+
+	sprintf(command, "%s.%s", command1, id);
+	dmubus_call(command, command2, UBUS_ARGS{}, 0, &res);
+	value = dmjson_get_value_array_all(res, DELIMITOR, 1, key);
+	return value;
+}
+
+/**************************************************************************
+* GET & SET DSL PARAMETERS
+***************************************************************************/
+int get_DSL_LineNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	uci_path_foreach_sections(icwmpd, "dmmap", "dsl_line", s) {
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+int get_DSL_ChannelNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	uci_path_foreach_sections(icwmpd, "dmmap", "dsl_channel", s) {
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;;
+}
+
+/*#Device.DSL.Line.{i}.Enable!UBUS:dsl.line.0/status//status*/
+int get_DSLLine_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *status = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "status");
+		*value = (strcmp(status, "up") == 0) ? "1" : "0";
+		return 0;
+}
+
+int set_DSLLine_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Status!UBUS:dsl.line.0/status//status*/
+int get_DSLLine_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *status = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "status");
+	*value = (strcmp(status, "up") == 0) ? "Up" : "Down";
+	return 0;
+}
+
+int get_DSLLine_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct dsl_line_args *)data)->line_sec, "dsl_line_alias", value);
+	return 0;
+}
+
+int set_DSLLine_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct dsl_line_args *)data)->line_sec, "dsl_line_alias", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DSLLine_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ((struct dsl_line_args*)data)->id;
+	return 0;
+}
+
+int get_DSLLine_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "";
+	return 0;
+}
+
+int set_DSLLine_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Upstream!UBUS:dsl.line.0/status//upstream*/
+int get_DSLLine_Upstream(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "upstream");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.FirmwareVersion!UBUS:dsl.line.0/status//firmware_version*/
+int get_DSLLine_FirmwareVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "firmware_version");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.LinkStatus!UBUS:dsl.line.0/status//link_status*/
+int get_DSLLine_LinkStatus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *link_status = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "link_status");
+	if(strcmp(link_status, "up") == 0)
+		*value = "Up";
+	else if(strcmp(link_status, "initializing") == 0)
+		*value = "Initializing";
+	else if(strcmp(link_status, "no_signal") == 0)
+		*value = "NoSignal";
+	else if(strcmp(link_status, "disabled") == 0)
+		*value = "Disabled";
+	else if(strcmp(link_status, "establishing") == 0)
+		*value = "EstablishingLink";
+	else if(strcmp(link_status, "error") == 0)
+		*value = "Error";
+	else
+		*value = link_status;
+	return 0;
+}
+
+static char *get_dsl_standard(char *str)
+{
+	char *dsl_standard;
+
+	if(strcmp(str, "gdmt_annexa") == 0)
+		dsl_standard = "G.992.1_Annex_A";
+	else if(strcmp(str, "gdmt_annexb") == 0)
+		dsl_standard = "G.992.1_Annex_B";
+	else if(strcmp(str, "gdmt_annexc") == 0)
+		dsl_standard = "G.992.1_Annex_C";
+	else if(strcmp(str, "t1413") == 0)
+		dsl_standard = "T1.413";
+	else if(strcmp(str, "t1413_i2") == 0)
+		dsl_standard = "T1.413i2";
+	else if(strcmp(str, "glite") == 0)
+		dsl_standard = "G.992.2";
+	else if(strcmp(str, "etsi_101_388") == 0)
+		dsl_standard = "ETSI_101_388";
+	else if(strcmp(str, "adsl2_annexa") == 0)
+		dsl_standard = "G.992.3_Annex_A";
+	else if(strcmp(str, "adsl2_annexb") == 0)
+		dsl_standard = "G.992.3_Annex_B";
+	else if(strcmp(str, "adsl2_annexc") == 0)
+		dsl_standard = "G.992.3_Annex_C";
+	else if(strcmp(str, "adsl2_annexi") == 0)
+		dsl_standard = "G.992.3_Annex_I";
+	else if(strcmp(str, "adsl2_annexj") == 0)
+		dsl_standard = "G.992.3_Annex_J";
+	else if(strcmp(str, "adsl2_annexl") == 0)
+		dsl_standard = "G.992.3_Annex_L";
+	else if(strcmp(str, "adsl2_annexm") == 0)
+		dsl_standard = "G.992.3_Annex_M";
+	else if(strcmp(str, "splitterless_adsl2") == 0)
+		dsl_standard = "G.992.4";
+	else if(strcmp(str, "adsl2p_annexa") == 0)
+		dsl_standard = "G.992.5_Annex_A";
+	else if(strcmp(str, "adsl2p_annexb") == 0)
+		dsl_standard = "G.992.5_Annex_B";
+	else if(strcmp(str, "adsl2p_annexc") == 0)
+		dsl_standard = "G.992.5_Annex_C";
+	else if(strcmp(str, "adsl2p_annexi") == 0)
+		dsl_standard = "G.992.5_Annex_I";
+	else if(strcmp(str, "adsl2p_annexj") == 0)
+		dsl_standard = "G.992.5_Annex_J";
+	else if(strcmp(str, "adsl2p_annexm") == 0)
+		dsl_standard = "G.992.5_Annex_M";
+	else if(strcmp(str, "vdsl") == 0)
+		dsl_standard = "G.993.1";
+	else if(strcmp(str, "vdsl2_annexa") == 0)
+		dsl_standard = "G.993.2_Annex_A";
+	else if(strcmp(str, "vdsl2_annexb") == 0)
+		dsl_standard = "G.993.2_Annex_B";
+	else if(strcmp(str, "vdsl2_annexc") == 0)
+		dsl_standard = "G.993.2_Annex_C";
+	else
+		dsl_standard = str;
+
+	return dsl_standard;
+}
+
+/*#Device.DSL.Line.{i}.StandardsSupported!UBUS:dsl.line.0/status//standards_supported*/
+int get_DSLLine_StandardsSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *standards_supported,*pch, *spch, *tmp, *tmpPtr, *str = "";
+
+	*value = "";
+	standards_supported = get_dsl_value_array_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "standards_supported");
+	if(standards_supported[0] == '\0')
+		return 0;
+	for (pch = strtok_r(standards_supported, ",", &spch); pch != NULL; pch = strtok_r(NULL, ",", &spch))
+	{
+		tmp = get_dsl_standard(pch);
+		if(*str == '\0')
+			dmasprintf(&str, "%s", tmp);
+		else {
+			tmpPtr = str;
+			dmasprintf(&str, "%s,%s", tmpPtr, tmp);
+		}
+	}
+	*value = str;
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.XTSE!UBUS:dsl.line.0/status//xtse*/
+int get_DSLLine_XTSE(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *xtse,*pch, *spch, *tmpPtr, *str = "";
+
+	*value = "";
+	xtse = get_dsl_value_array_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "xtse");
+	if(xtse[0] == '\0')
+		return 0;
+	for (pch = strtok_r(xtse, ",", &spch); pch != NULL; pch = strtok_r(NULL, ",", &spch))
+	{
+		if(*str == '\0')
+			dmasprintf(&str, "%s", pch);
+		else {
+			tmpPtr = str;
+			dmasprintf(&str, "%s%s", tmpPtr, pch);
+		}
+	}
+	*value = str;
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.StandardUsed!UBUS:dsl.line.0/status//standard_used*/
+int get_DSLLine_StandardUsed(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *standard_used = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "standard_used");
+	*value = get_dsl_standard(standard_used);
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.XTSUsed!UBUS:dsl.line.0/status//xtse_used*/
+int get_DSLLine_XTSUsed(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *xtse_used,*pch, *spch, *tmpPtr, *str = "";
+
+	*value = "";
+	xtse_used = get_dsl_value_array_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "xtse_used");
+	if(xtse_used[0] == '\0')
+		return 0;
+	for (pch = strtok_r(xtse_used, ",", &spch); pch != NULL; pch = strtok_r(NULL, ",", &spch))
+	{
+		if(*str == '\0')
+			dmasprintf(&str, "%s", pch);
+		else {
+			tmpPtr = str;
+			dmasprintf(&str, "%s%s", tmpPtr, pch);
+		}
+	}
+	*value = str;
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.LineEncoding!UBUS:dsl.line.0/status//line_encoding*/
+int get_DSLLine_LineEncoding(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *line_encoding = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "line_encoding");
+	if(strcmp(line_encoding, "dmt") == 0)
+		*value = "DMT";
+	else if(strcmp(line_encoding, "cap") == 0)
+		*value = "CAP";
+	else if(strcmp(line_encoding, "2b1q") == 0)
+		*value = "2B1Q";
+	else if(strcmp(line_encoding, "43bt") == 0)
+		*value = "43BT";
+	else if(strcmp(line_encoding, "pam") == 0)
+		*value = "PAM";
+	else if(strcmp(line_encoding, "qam") == 0)
+		*value = "QAM";
+	else
+		*value = line_encoding;
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.AllowedProfiles!UBUS:dsl.line.0/status//allowed_profiles*/
+int get_DSLLine_AllowedProfiles(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_array_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "allowed_profiles");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.CurrentProfile!UBUS:dsl.line.0/status//current_profile*/
+int get_DSLLine_CurrentProfile(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "current_profile");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.PowerManagementState!UBUS:dsl.line.0/status//power_management_state*/
+int get_DSLLine_PowerManagementState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *power_management_state = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "power_management_state");
+	if(strcmp(power_management_state, "l0") == 0)
+		*value = "L0";
+	else if(strcmp(power_management_state, "l1") == 0)
+		*value = "L1";
+	else if(strcmp(power_management_state, "l2") == 0)
+		*value = "L2";
+	else if(strcmp(power_management_state, "l3") == 0)
+		*value = "L3";
+	else if(strcmp(power_management_state, "l4") == 0)
+		*value = "L4";
+	else
+		*value = power_management_state;
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.SuccessFailureCause!UBUS:dsl.line.0/status//success_failure_cause*/
+int get_DSLLine_SuccessFailureCause(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "success_failure_cause");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.UPBOKLERPb!UBUS:dsl.line.0/status//upbokler_pb*/
+int get_DSLLine_UPBOKLERPb(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_array_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "upbokler_pb");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.RXTHRSHds!UBUS:dsl.line.0/status//rxthrsh_ds*/
+int get_DSLLine_RXTHRSHds(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_array_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "rxthrsh_ds");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.ACTRAMODEds!UBUS:dsl.line.0/status//act_ra_mode.ds*/
+int get_DSLLine_ACTRAMODEds(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "act_ra_mode", "ds");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.ACTRAMODEus!UBUS:dsl.line.0/status//act_ra_mode.us*/
+int get_DSLLine_ACTRAMODEus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "act_ra_mode", "us");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.SNRMROCus!UBUS:dsl.line.0/status//snr_mroc_us*/
+int get_DSLLine_SNRMROCus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "snr_mroc_us");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.LastStateTransmittedDownstream!UBUS:dsl.line.0/status//last_state_transmitted.ds*/
+int get_DSLLine_LastStateTransmittedDownstream(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "last_state_transmitted", "ds");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.LastStateTransmittedUpstream!UBUS:dsl.line.0/status//last_state_transmitted.us*/
+int get_DSLLine_LastStateTransmittedUpstream(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "last_state_transmitted", "us");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.US0MASK!UBUS:dsl.line.0/status//us0_mask*/
+int get_DSLLine_US0MASK(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "us0_mask");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.TRELLISds!UBUS:dsl.line.0/status//trellis.ds*/
+int get_DSLLine_TRELLISds(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "trellis", "ds");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.TRELLISus!UBUS:dsl.line.0/status//trellis.us*/
+int get_DSLLine_TRELLISus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "trellis", "us");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.ACTSNRMODEds!UBUS:dsl.line.0/status//act_snr_mode.ds*/
+int get_DSLLine_ACTSNRMODEds(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "act_snr_mode", "ds");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.ACTSNRMODEus!UBUS:dsl.line.0/status//act_snr_mode.us*/
+int get_DSLLine_ACTSNRMODEus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "act_snr_mode", "us");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.LineNumber!UBUS:dsl.line.0/status//line_number*/
+int get_DSLLine_LineNumber(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "line_number");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.UpstreamMaxBitRate!UBUS:dsl.line.0/status//max_bit_rate.us*/
+int get_DSLLine_UpstreamMaxBitRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "max_bit_rate", "us");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.DownstreamMaxBitRate!UBUS:dsl.line.0/status//max_bit_rate.ds*/
+int get_DSLLine_DownstreamMaxBitRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "max_bit_rate", "ds");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.UpstreamNoiseMargin!UBUS:dsl.line.0/status//noise_margin.us*/
+int get_DSLLine_UpstreamNoiseMargin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "noise_margin", "us");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.DownstreamNoiseMargin!UBUS:dsl.line.0/status//noise_margin.ds*/
+int get_DSLLine_DownstreamNoiseMargin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "noise_margin", "ds");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.SNRMpbus!UBUS:dsl.line.0/status//snr_mpb_us*/
+int get_DSLLine_SNRMpbus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_array_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "snr_mpb_us");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.SNRMpbds!UBUS:dsl.line.0/status//snr_mpb_ds*/
+int get_DSLLine_SNRMpbds(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_array_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "snr_mpb_ds");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.UpstreamAttenuation!UBUS:dsl.line.0/status//attenuation.us*/
+int get_DSLLine_UpstreamAttenuation(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "attenuation", "us");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.DownstreamAttenuation!UBUS:dsl.line.0/status//attenuation.ds*/
+int get_DSLLine_DownstreamAttenuation(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "attenuation", "ds");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.UpstreamPower!UBUS:dsl.line.0/status//power.us*/
+int get_DSLLine_UpstreamPower(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "power", "us");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.DownstreamPower!UBUS:dsl.line.0/status//power.ds*/
+int get_DSLLine_DownstreamPower(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.line", ((struct dsl_line_args*)data)->id, "status", "power", "ds");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.XTURVendor!UBUS:dsl.line.0/status//xtur_vendor*/
+int get_DSLLine_XTURVendor(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "xtur_vendor");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.XTURCountry!UBUS:dsl.line.0/status//xtur_country*/
+int get_DSLLine_XTURCountry(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "xtur_country");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.XTURANSIStd!UBUS:dsl.line.0/status//xtur_ansi_std*/
+int get_DSLLine_XTURANSIStd(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "xtur_ansi_std");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.XTURANSIRev!UBUS:dsl.line.0/status//xtur_ansi_rev*/
+int get_DSLLine_XTURANSIRev(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "xtur_ansi_rev");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.XTUCVendor!UBUS:dsl.line.0/status//xtuc_vendor*/
+int get_DSLLine_XTUCVendor(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "xtuc_vendor");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.XTUCCountry!UBUS:dsl.line.0/status//xtuc_country*/
+int get_DSLLine_XTUCCountry(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "xtuc_country");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.XTUCANSIStd!UBUS:dsl.line.0/status//xtuc_ansi_std*/
+int get_DSLLine_XTUCANSIStd(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "status", "xtuc_ansi_std");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.XTUCANSIRev!UBUS:dsl.line.0/status//xtuc_ansi_rev*/
+int get_DSLLine_XTUCANSIRev(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line",((struct dsl_line_args*)data)->id, "status", "xtuc_ansi_rev");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Stats.TotalStart!UBUS:dsl.line.0/stats//total_start*/
+int get_DSLLineStats_TotalStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "stats", "total_start");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Stats.ShowtimeStart!UBUS:dsl.line.0/stats//showtime_start*/
+int get_DSLLineStats_ShowtimeStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "stats", "showtime_start");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Stats.LastShowtimeStart!UBUS:dsl.line.0/stats//last_showtime_start*/
+int get_DSLLineStats_LastShowtimeStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "stats", "last_showtime_start");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Stats.CurrentDayStart!UBUS:dsl.line.0/stats//current_day_start*/
+int get_DSLLineStats_CurrentDayStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "stats", "current_day_start");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Stats.QuarterHourStart!UBUS:dsl.line.0/stats//quarter_hour_start*/
+int get_DSLLineStats_QuarterHourStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.line", ((struct dsl_line_args*)data)->id, "stats", "quarter_hour_start");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Stats.Total.ErroredSecs!UBUS:dsl.line.0/stats//total.errored_secs*/
+int get_DSLLineStatsTotal_ErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.line", ((struct dsl_line_args*)data)->id, "stats", "total", "errored_secs");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Stats.Total.SeverelyErroredSecs!UBUS:dsl.line.0/stats//total.severely_errored_secs*/
+int get_DSLLineStatsTotal_SeverelyErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.line", ((struct dsl_line_args*)data)->id, "stats", "total", "severely_errored_secs");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Stats.Showtime.ErroredSecs!UBUS:dsl.line.0/stats//showtime.severely_errored_secs*/
+int get_DSLLineStatsShowtime_ErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.line", ((struct dsl_line_args*)data)->id, "stats", "showtime", "errored_secs");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Stats.Showtime.SeverelyErroredSecs!UBUS:dsl.line.0/stats//showtime.severely_errored_secs*/
+int get_DSLLineStatsShowtime_SeverelyErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.line", ((struct dsl_line_args*)data)->id, "stats", "showtime", "severely_errored_secs");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Stats.LastShowtime.ErroredSecs!UBUS:dsl.line.0/stats//lastshowtime.errored_secs*/
+int get_DSLLineStatsLastShowtime_ErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.line", ((struct dsl_line_args*)data)->id, "stats", "lastshowtime", "errored_secs");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Stats.LastShowtime.SeverelyErroredSecs!UBUS:dsl.line.0/stats//lastshowtime.severely_errored_secs*/
+int get_DSLLineStatsLastShowtime_SeverelyErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.line", ((struct dsl_line_args*)data)->id, "stats", "lastshowtime", "severely_errored_secs");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Stats.CurrentDay.ErroredSecs!UBUS:dsl.line.0/stats//currentday.errored_secs*/
+int get_DSLLineStatsCurrentDay_ErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.line", ((struct dsl_line_args*)data)->id, "stats", "currentday", "errored_secs");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Stats.CurrentDay.SeverelyErroredSecs!UBUS:dsl.line.0/stats//currentday.severely_errored_secs*/
+int get_DSLLineStatsCurrentDay_SeverelyErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.line", ((struct dsl_line_args*)data)->id, "stats", "currentday", "severely_errored_secs");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Stats.QuarterHour.ErroredSecs!UBUS:dsl.line.0/stats//quarterhour.severely_errored_secs*/
+int get_DSLLineStatsQuarterHour_ErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.line", ((struct dsl_line_args*)data)->id, "stats", "quarterhour", "errored_secs");
+	return 0;
+}
+
+/*#Device.DSL.Line.{i}.Stats.QuarterHour.SeverelyErroredSecs!UBUS:dsl.line.0/stats//quarterhour.severely_errored_secs*/
+int get_DSLLineStatsQuarterHour_SeverelyErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.line", ((struct dsl_line_args*)data)->id, "stats", "quarterhour", "severely_errored_secs");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Enable!UBUS:dsl.channel.0/status//status*/
+int get_DSLChannel_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *status = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "status");
+	*value = (strcmp(status, "up") == 0) ? "1" : "0";
+	return 0;
+}
+
+int set_DSLChannel_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Status!UBUS:dsl.channel.0/status//status*/
+int get_DSLChannel_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *status = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "status");
+	*value = (strcmp(status, "up") == 0) ? "Up" : "Down";
+	return 0;
+}
+
+int get_DSLChannel_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct dsl_channel_args *)data)->channel_sec, "dsl_channel_alias", value);
+	return 0;
+}
+
+int set_DSLChannel_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct dsl_channel_args *)data)->channel_sec, "dsl_channel_alias", value);
+			break;
+	}
+	return 0;
+}
+
+int get_DSLChannel_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ((struct dsl_channel_args*)data)->id;
+	return 0;
+}
+
+int get_DSLChannel_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char linker[8];
+	sprintf(linker, "line_%s", ((struct dsl_line_args *)data)->id);
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cDSL%cLine%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+static char *get_dsl_link_encapsulation_standard(char *str)
+{
+	char *dsl_link_encapsulation_standard;
+
+	if(strcmp(str, "adsl2_atm") == 0)
+		dsl_link_encapsulation_standard = "G.992.3_Annex_K_ATM";
+	else if(strcmp(str, "adsl2_ptm") == 0)
+		dsl_link_encapsulation_standard = "G.992.3_Annex_K_PTM";
+	else if(strcmp(str, "vdsl2_atm") == 0)
+		dsl_link_encapsulation_standard = "G.993.2_Annex_K_ATM";
+	else if(strcmp(str, "vdsl2_ptm") == 0)
+		dsl_link_encapsulation_standard = "G.993.2_Annex_K_PTM";
+	else if(strcmp(str, "auto") == 0)
+		dsl_link_encapsulation_standard = "G.994.1";
+
+	return dsl_link_encapsulation_standard;
+}
+
+/*#Device.DSL.Channel.{i}.LinkEncapsulationSupported!UBUS:dsl.channel.0/status//link_encapsulation_supported*/
+int get_DSLChannel_LinkEncapsulationSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *link_encapsulation_supported,*pch, *spch, *tmp, *tmpPtr, *str = "";
+
+	*value = "";
+	link_encapsulation_supported = get_dsl_value_array_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "link_encapsulation_supported");
+	if(link_encapsulation_supported[0] == '\0')
+		return 0;
+	for (pch = strtok_r(link_encapsulation_supported, ",", &spch); pch != NULL; pch = strtok_r(NULL, ",", &spch))
+	{
+		tmp = get_dsl_link_encapsulation_standard(pch);
+		if(*str == '\0')
+			dmasprintf(&str, "%s", tmp);
+		else {
+			tmpPtr = str;
+			dmasprintf(&str, "%s,%s", tmpPtr, tmp);
+		}
+	}
+	*value = str;
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.LinkEncapsulationUsed!UBUS:dsl.channel.0/status//link_encapsulation_used*/
+int get_DSLChannel_LinkEncapsulationUsed(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *link_encapsulation_used = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "link_encapsulation_used");
+	*value = get_dsl_link_encapsulation_standard(link_encapsulation_used);
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.LPATH!UBUS:dsl.channel.0/status//lpath*/
+int get_DSLChannel_LPATH(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "lpath");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.INTLVDEPTH!UBUS:dsl.channel.0/status//intlvdepth*/
+int get_DSLChannel_INTLVDEPTH(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "intlvdepth");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.INTLVBLOCK!UBUS:dsl.channel.0/status//intlvblock*/
+int get_DSLChannel_INTLVBLOCK(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "intlvblock");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.ActualInterleavingDelay!UBUS:dsl.channel.0/status//actual_interleaving_delay*/
+int get_DSLChannel_ActualInterleavingDelay(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "actual_interleaving_delay");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.ACTINP!UBUS:dsl.channel.0/status//actinp*/
+int get_DSLChannel_ACTINP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "actinp");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.INPREPORT!UBUS:dsl.channel.0/status//inpreport*/
+int get_DSLChannel_INPREPORT(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "inpreport");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.NFEC!UBUS:dsl.channel.0/status//nfec*/
+int get_DSLChannel_NFEC(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "nfec");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.RFEC!UBUS:dsl.channel.0/status//rfec*/
+int get_DSLChannel_RFEC(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "rfec");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.LSYMB!UBUS:dsl.channel.0/status//lsymb*/
+int get_DSLChannel_LSYMB(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "lsymb");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.UpstreamCurrRate!UBUS:dsl.channel.0/status//curr_rate.us*/
+int get_DSLChannel_UpstreamCurrRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "curr_rate", "us");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.DownstreamCurrRate!UBUS:dsl.channel.0/status//curr_rate.ds*/
+int get_DSLChannel_DownstreamCurrRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "curr_rate", "ds");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.ACTNDR!UBUS:dsl.channel.0/status//actndr.ds*/
+int get_DSLChannel_ACTNDR(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "actndr", "ds");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.ACTINPREIN!UBUS:dsl.channel.0/status//actinprein.ds*/
+int get_DSLChannel_ACTINPREIN(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument_and_with_two_key("dsl.channel", ((struct dsl_channel_args*)data)->id, "status", "actinprein", "ds");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.TotalStart!UBUS:dsl.channel.0/stats//total_start*/
+int get_DSLChannelStats_TotalStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "total_start");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.ShowtimeStart(!UBUS:dsl.channel.0/stats//showtime_start*/
+int get_DSLChannelStats_ShowtimeStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "showtime_start");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.LastShowtimeStart!UBUS:dsl.channel.0/stats//last_showtime_start*/
+int get_DSLChannelStats_LastShowtimeStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "last_showtime_start");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.CurrentDayStart!UBUS:dsl.channel.0/stats//current_day_start*/
+int get_DSLChannelStats_CurrentDayStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "current_day_start");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.QuarterHourStart!UBUS:dsl.channel.0/stats//quarter_hour_start*/
+int get_DSLChannelStats_QuarterHourStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_without_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "quarter_hour_start");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.Total.XTURFECErrors!UBUS:dsl.channel.0/stats//total.xtur_fec_errors*/
+int get_DSLChannelStatsTotal_XTURFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "total", "xtur_fec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.Total.XTUCFECErrors!UBUS:dsl.channel.0/stats//total.xtur_fec_errors*/
+int get_DSLChannelStatsTotal_XTUCFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "total", "xtuc_fec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.Total.XTURHECErrors!UBUS:dsl.channel.0/stats//total.xtur_fec_errors*/
+int get_DSLChannelStatsTotal_XTURHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "total", "xtur_hec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.Total.XTUCHECErrors!UBUS:dsl.channel.0/stats//total.xtur_fec_errors*/
+int get_DSLChannelStatsTotal_XTUCHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "total", "xtuc_hec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.Total.XTURCRCErrors!UBUS:dsl.channel.0/stats//total.xtur_fec_errors*/
+int get_DSLChannelStatsTotal_XTURCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "total", "xtur_crc_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.Total.XTUCCRCErrors!UBUS:dsl.channel.0/stats//total.xtur_fec_errors*/
+int get_DSLChannelStatsTotal_XTUCCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "total", "xtuc_crc_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.Showtime.XTURFECErrors!UBUS:dsl.channel.0/stats//showtime.xtur_fec_errors*/
+int get_DSLChannelStatsShowtime_XTURFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "showtime", "xtur_fec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.Showtime.XTUCFECErrors!UBUS:dsl.channel.0/stats//showtime.xtuc_fec_errors*/
+int get_DSLChannelStatsShowtime_XTUCFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "showtime", "xtuc_fec_errors");
+	return 0;}
+
+/*#Device.DSL.Channel.{i}.Stats.Showtime.XTURHECErrors!UBUS:dsl.channel.0/stats//showtime.xtur_hec_errors*/
+int get_DSLChannelStatsShowtime_XTURHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "showtime", "xtur_hec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.Showtime.XTUCHECErrors!UBUS:dsl.channel.0/stats//showtime.xtuc_hec_errors*/
+int get_DSLChannelStatsShowtime_XTUCHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "showtime", "xtuc_hec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.Showtime.XTURCRCErrors!UBUS:dsl.channel.0/stats//showtime.xtur_crc_errors*/
+int get_DSLChannelStatsShowtime_XTURCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "showtime", "xtur_crc_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.Showtime.XTUCCRCErrors!UBUS:dsl.channel.0/stats//showtime.xtuc_crc_errors*/
+int get_DSLChannelStatsShowtime_XTUCCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "showtime", "xtuc_crc_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.LastShowtime.XTURFECErrors!UBUS:dsl.channel.0/stats//lastshowtime.xtur_fec_errors*/
+int get_DSLChannelStatsLastShowtime_XTURFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "lastshowtime", "xtur_fec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.LastShowtime.XTUCFECErrors!UBUS:dsl.channel.0/stats//lastshowtime.xtuc_fec_errors*/
+int get_DSLChannelStatsLastShowtime_XTUCFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "lastshowtime", "xtuc_fec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.LastShowtime.XTURHECErrors!UBUS:dsl.channel.0/stats//lastshowtime.xtur_hec_errors*/
+int get_DSLChannelStatsLastShowtime_XTURHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "lastshowtime", "xtur_hec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.LastShowtime.XTUCHECErrors!UBUS:dsl.channel.0/stats//lastshowtime.xtuc_hec_errors*/
+int get_DSLChannelStatsLastShowtime_XTUCHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "lastshowtime", "xtuc_hec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.LastShowtime.XTURCRCErrors!UBUS:dsl.channel.0/stats//lastshowtime.xtur_crc_errors*/
+int get_DSLChannelStatsLastShowtime_XTURCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "lastshowtime", "xtur_crc_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.LastShowtime.XTUCCRCErrors!UBUS:dsl.channel.0/stats//lastshowtime.xtuc_crc_errors*/
+int get_DSLChannelStatsLastShowtime_XTUCCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "lastshowtime", "xtuc_crc_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.CurrentDay.XTURFECErrors!UBUS:dsl.channel.0/stats//currentday.xtur_fec_errors*/
+int get_DSLChannelStatsCurrentDay_XTURFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "currentday", "xtur_fec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.CurrentDay.XTUCFECErrors!UBUS:dsl.channel.0/stats//currentday.xtuc_fec_errors*/
+int get_DSLChannelStatsCurrentDay_XTUCFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "currentday", "xtuc_fec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.CurrentDay.XTURHECErrors!UBUS:dsl.channel.0/stats//currentday.xtur_hec_errors*/
+int get_DSLChannelStatsCurrentDay_XTURHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "currentday", "xtur_hec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.CurrentDay.XTUCHECErrors!UBUS:dsl.channel.0/stats//currentday.xtuc_hec_errors*/
+int get_DSLChannelStatsCurrentDay_XTUCHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "currentday", "xtuc_hec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.CurrentDay.XTURCRCErrors!UBUS:dsl.channel.0/stats//currentday.xtur_crc_errors*/
+int get_DSLChannelStatsCurrentDay_XTURCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "currentday", "xtur_crc_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.CurrentDay.XTUCCRCErrors!UBUS:dsl.channel.0/stats//currentday.xtuc_crc_errors*/
+int get_DSLChannelStatsCurrentDay_XTUCCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "currentday", "xtuc_crc_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.QuarterHour.XTURFECErrors!UBUS:dsl.channel.0/stats//quarterhour.xtur_fec_errors*/
+int get_DSLChannelStatsQuarterHour_XTURFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "quarterhour", "xtur_fec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.QuarterHour.XTUCFECErrors!UBUS:dsl.channel.0/stats//quarterhour.xtuc_fec_errors*/
+int get_DSLChannelStatsQuarterHour_XTUCFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "quarterhour", "xtuc_fec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.QuarterHour.XTURHECErrors!UBUS:dsl.channel.0/stats//quarterhour.xtur_hec_errors*/
+int get_DSLChannelStatsQuarterHour_XTURHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "quarterhour", "xtur_hec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.QuarterHour.XTUCHECErrors!UBUS:dsl.channel.0/stats//quarterhour.xtuc_hec_errors*/
+int get_DSLChannelStatsQuarterHour_XTUCHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "quarterhour", "xtuc_hec_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.QuarterHour.XTURCRCErrors!UBUS:dsl.channel.0/stats//quarterhour.xtur_crc_errors*/
+int get_DSLChannelStatsQuarterHour_XTURCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "quarterhour", "xtur_crc_errors");
+	return 0;
+}
+
+/*#Device.DSL.Channel.{i}.Stats.QuarterHour.XTUCCRCErrors!UBUS:dsl.channel.0/stats//quarterhour.xtuc_crc_errors*/
+int get_DSLChannelStatsQuarterHour_XTUCCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_dsl_value_with_argument("dsl.channel", ((struct dsl_channel_args*)data)->id, "stats", "quarterhour", "xtuc_crc_errors");
+	return 0;
+}
diff --git a/dmtree/tr181/dsl.h b/dmtree/tr181/dsl.h
new file mode 100644
index 0000000000000000000000000000000000000000..a50c6f230a7a851bc428ec09499af6f2c82211ac
--- /dev/null
+++ b/dmtree/tr181/dsl.h
@@ -0,0 +1,179 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*      Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: AMIN Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*/
+
+#ifndef __DSL_H
+#define __DSL_H
+
+struct dsl_line_args
+{
+	struct uci_section *line_sec;
+	char *id;
+};
+
+struct dsl_channel_args
+{
+	struct uci_section *channel_sec;
+	char *id;
+};
+
+extern DMOBJ tDSLObj[];
+extern DMLEAF tDSLParams[];
+extern DMOBJ tDSLLineObj[];
+extern DMLEAF tDSLLineParams[];
+extern DMOBJ tDSLLineStatsObj[];
+extern DMLEAF tDSLLineStatsParams[];
+extern DMLEAF tDSLLineStatsTotalParams[];
+extern DMLEAF tDSLLineStatsShowtimeParams[];
+extern DMLEAF tDSLLineStatsLastShowtimeParams[];
+extern DMLEAF tDSLLineStatsCurrentDayParams[];
+extern DMLEAF tDSLLineStatsQuarterHourParams[];
+extern DMOBJ tDSLChannelObj[];
+extern DMLEAF tDSLChannelParams[];
+extern DMOBJ tDSLChannelStatsObj[];
+extern DMLEAF tDSLChannelStatsParams[];
+extern DMLEAF tDSLChannelStatsTotalParams[];
+extern DMLEAF tDSLChannelStatsShowtimeParams[];
+extern DMLEAF tDSLChannelStatsLastShowtimeParams[];
+extern DMLEAF tDSLChannelStatsCurrentDayParams[];
+extern DMLEAF tDSLChannelStatsQuarterHourParams[];
+
+int browseDSLLineInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseDSLChannelInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int get_dsl_line_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+int get_dsl_channel_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+
+int get_DSL_LineNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSL_ChannelNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DSLLine_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DSLLine_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DSLLine_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DSLLine_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DSLLine_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DSLLine_Upstream(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_FirmwareVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_LinkStatus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_StandardsSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_XTSE(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_StandardUsed(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_XTSUsed(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_LineEncoding(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_AllowedProfiles(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_CurrentProfile(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_PowerManagementState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_SuccessFailureCause(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_UPBOKLERPb(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_RXTHRSHds(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_ACTRAMODEds(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_ACTRAMODEus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_SNRMROCus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_LastStateTransmittedDownstream(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_LastStateTransmittedUpstream(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_US0MASK(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_TRELLISds(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_TRELLISus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_ACTSNRMODEds(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_ACTSNRMODEus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_LineNumber(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_UpstreamMaxBitRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_DownstreamMaxBitRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_UpstreamNoiseMargin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_DownstreamNoiseMargin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_SNRMpbus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_SNRMpbds(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_UpstreamAttenuation(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_DownstreamAttenuation(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_UpstreamPower(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_DownstreamPower(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_XTURVendor(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_XTURCountry(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_XTURANSIStd(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_XTURANSIRev(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_XTUCVendor(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_XTUCCountry(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_XTUCANSIStd(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLine_XTUCANSIRev(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLineStats_TotalStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLineStats_ShowtimeStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLineStats_LastShowtimeStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLineStats_CurrentDayStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLineStats_QuarterHourStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLineStatsTotal_ErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLineStatsTotal_SeverelyErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLineStatsShowtime_ErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLineStatsShowtime_SeverelyErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLineStatsLastShowtime_ErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLineStatsLastShowtime_SeverelyErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLineStatsCurrentDay_ErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLineStatsCurrentDay_SeverelyErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLineStatsQuarterHour_ErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLLineStatsQuarterHour_SeverelyErroredSecs(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DSLChannel_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DSLChannel_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_DSLChannel_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_DSLChannel_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_LinkEncapsulationSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_LinkEncapsulationUsed(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_LPATH(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_INTLVDEPTH(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_INTLVBLOCK(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_ActualInterleavingDelay(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_ACTINP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_INPREPORT(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_NFEC(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_RFEC(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_LSYMB(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_UpstreamCurrRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_DownstreamCurrRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_ACTNDR(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannel_ACTINPREIN(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStats_TotalStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStats_ShowtimeStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStats_LastShowtimeStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStats_CurrentDayStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStats_QuarterHourStart(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsTotal_XTURFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsTotal_XTUCFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsTotal_XTURHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsTotal_XTUCHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsTotal_XTURCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsTotal_XTUCCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsShowtime_XTURFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsShowtime_XTUCFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsShowtime_XTURHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsShowtime_XTUCHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsShowtime_XTURCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsShowtime_XTUCCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsLastShowtime_XTURFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsLastShowtime_XTUCFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsLastShowtime_XTURHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsLastShowtime_XTUCHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsLastShowtime_XTURCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsLastShowtime_XTUCCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsCurrentDay_XTURFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsCurrentDay_XTUCFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsCurrentDay_XTURHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsCurrentDay_XTUCHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsCurrentDay_XTURCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsCurrentDay_XTUCCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsQuarterHour_XTURFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsQuarterHour_XTUCFECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsQuarterHour_XTURHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsQuarterHour_XTUCHECErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsQuarterHour_XTURCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_DSLChannelStatsQuarterHour_XTUCCRCErrors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+#endif //__DSL_H
diff --git a/dmtree/tr181/ethernet.c b/dmtree/tr181/ethernet.c
new file mode 100644
index 0000000000000000000000000000000000000000..51fdbf1fff5bedac7997270f8c5b4aeb6ba66745
--- /dev/null
+++ b/dmtree/tr181/ethernet.c
@@ -0,0 +1,1509 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *      Copyright (C) 2019 iopsys Software Solutions AB
+ *      Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "ethernet.h"
+#include "dmjson.h"
+#include "dmentry.h"
+
+char *wan_ifname = NULL;
+
+/* *** Device.Ethernet. *** */
+DMOBJ tEthernetObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Interface", &DMREAD, NULL, NULL, NULL, browseEthernetInterfaceInst, NULL, NULL, tEthernetInterfaceObj, tEthernetInterfaceParams, get_linker_interface, BBFDM_BOTH},
+{"Link", &DMWRITE, addObjEthernetLink, delObjEthernetLink, NULL, browseEthernetLinkInst, NULL, NULL, tEthernetLinkObj, tEthernetLinkParams, get_linker_link, BBFDM_BOTH},
+{"VLANTermination", &DMWRITE, addObjEthernetVLANTermination, delObjEthernetVLANTermination, NULL, browseEthernetVLANTerminationInst, NULL, NULL, tEthernetVLANTerminationObj, tEthernetVLANTerminationParams, get_linker_vlan_term, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tEthernetParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"InterfaceNumberOfEntries", &DMREAD, DMT_UNINT, get_Ethernet_InterfaceNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"LinkNumberOfEntries", &DMREAD, DMT_UNINT, get_Ethernet_LinkNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"VLANTerminationNumberOfEntries", &DMREAD, DMT_UNINT, get_Ethernet_VLANTerminationNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Ethernet.Interface.{i}. *** */
+DMOBJ tEthernetInterfaceObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tEthernetInterfaceStatsParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tEthernetInterfaceParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_EthernetInterface_Enable, set_EthernetInterface_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_EthernetInterface_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_EthernetInterface_Alias, set_EthernetInterface_Alias, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMREAD, DMT_STRING, get_EthernetInterface_Name, NULL, NULL, NULL, BBFDM_BOTH},
+{"LastChange", &DMREAD, DMT_UNINT, get_EthernetInterface_LastChange, NULL, NULL, NULL, BBFDM_BOTH},
+{"LowerLayers", &DMWRITE, DMT_STRING, get_EthernetInterface_LowerLayers, set_EthernetInterface_LowerLayers, NULL, NULL, BBFDM_BOTH},
+{"Upstream", &DMREAD, DMT_BOOL, get_EthernetInterface_Upstream, NULL, NULL, NULL, BBFDM_BOTH},
+{"MACAddress", &DMREAD, DMT_STRING, get_EthernetInterface_MACAddress, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxBitRate", &DMWRITE, DMT_INT, get_EthernetInterface_MaxBitRate, set_EthernetInterface_MaxBitRate, NULL, NULL, BBFDM_BOTH},
+{"CurrentBitRate", &DMREAD, DMT_UNINT, get_EthernetInterface_CurrentBitRate, NULL, NULL, NULL, BBFDM_BOTH},
+{"DuplexMode", &DMWRITE, DMT_STRING, get_EthernetInterface_DuplexMode, set_EthernetInterface_DuplexMode, NULL, NULL, BBFDM_BOTH},
+{"EEECapability", &DMREAD, DMT_BOOL, get_EthernetInterface_EEECapability, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Ethernet.Interface.{i}.Stats. *** */
+DMLEAF tEthernetInterfaceStatsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"BytesSent", &DMREAD, DMT_UNINT, get_EthernetInterfaceStats_BytesSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"BytesReceived", &DMREAD, DMT_UNINT, get_EthernetInterfaceStats_BytesReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsSent", &DMREAD, DMT_UNINT, get_EthernetInterfaceStats_PacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsReceived", &DMREAD, DMT_UNINT, get_EthernetInterfaceStats_PacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsSent", &DMREAD, DMT_UNINT, get_EthernetInterfaceStats_ErrorsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsReceived", &DMREAD, DMT_UNINT, get_EthernetInterfaceStats_ErrorsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnicastPacketsSent", &DMREAD, DMT_UNINT, get_EthernetInterfaceStats_UnicastPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnicastPacketsReceived", &DMREAD, DMT_UNINT, get_EthernetInterfaceStats_UnicastPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsSent", &DMREAD, DMT_UNINT, get_EthernetInterfaceStats_DiscardPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsReceived", &DMREAD, DMT_UNINT, get_EthernetInterfaceStats_DiscardPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"MulticastPacketsSent", &DMREAD, DMT_UNINT, get_EthernetInterfaceStats_MulticastPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"MulticastPacketsReceived", &DMREAD, DMT_UNINT, get_EthernetInterfaceStats_MulticastPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"BroadcastPacketsSent", &DMREAD, DMT_UNINT, get_EthernetInterfaceStats_BroadcastPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"BroadcastPacketsReceived", &DMREAD, DMT_UNINT, get_EthernetInterfaceStats_BroadcastPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnknownProtoPacketsReceived", &DMREAD, DMT_UNINT, get_EthernetInterfaceStats_UnknownProtoPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Ethernet.Link.{i}. *** */
+DMOBJ tEthernetLinkObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tEthernetLinkStatsParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tEthernetLinkParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_EthernetLink_Enable, set_EthernetLink_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_EthernetLink_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_EthernetLink_Alias, set_EthernetLink_Alias, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMREAD, DMT_STRING, get_EthernetLink_Name, NULL, NULL, NULL, BBFDM_BOTH},
+{"LastChange", &DMREAD, DMT_UNINT, get_EthernetLink_LastChange, NULL, NULL, NULL, BBFDM_BOTH},
+{"LowerLayers", &DMWRITE, DMT_STRING, get_EthernetLink_LowerLayers, set_EthernetLink_LowerLayers, NULL, NULL, BBFDM_BOTH},
+{"MACAddress", &DMREAD, DMT_STRING, get_EthernetLink_MACAddress, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Ethernet.Link.{i}.Stats. *** */
+DMLEAF tEthernetLinkStatsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"BytesSent", &DMREAD, DMT_UNINT, get_EthernetLinkStats_BytesSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"BytesReceived", &DMREAD, DMT_UNINT, get_EthernetLinkStats_BytesReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsSent", &DMREAD, DMT_UNINT, get_EthernetLinkStats_PacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsReceived", &DMREAD, DMT_UNINT, get_EthernetLinkStats_PacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsSent", &DMREAD, DMT_UNINT, get_EthernetLinkStats_ErrorsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsReceived", &DMREAD, DMT_UNINT, get_EthernetLinkStats_ErrorsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnicastPacketsSent", &DMREAD, DMT_UNINT, get_EthernetLinkStats_UnicastPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnicastPacketsReceived", &DMREAD, DMT_UNINT, get_EthernetLinkStats_UnicastPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsSent", &DMREAD, DMT_UNINT, get_EthernetLinkStats_DiscardPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsReceived", &DMREAD, DMT_UNINT, get_EthernetLinkStats_DiscardPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"MulticastPacketsSent", &DMREAD, DMT_UNINT, get_EthernetLinkStats_MulticastPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"MulticastPacketsReceived", &DMREAD, DMT_UNINT, get_EthernetLinkStats_MulticastPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"BroadcastPacketsSent", &DMREAD, DMT_UNINT, get_EthernetLinkStats_BroadcastPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"BroadcastPacketsReceived", &DMREAD, DMT_UNINT, get_EthernetLinkStats_BroadcastPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnknownProtoPacketsReceived", &DMREAD, DMT_UNINT, get_EthernetLinkStats_UnknownProtoPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Ethernet.VLANTermination.{i}. *** */
+DMOBJ tEthernetVLANTerminationObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tEthernetVLANTerminationStatsParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tEthernetVLANTerminationParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_EthernetVLANTermination_Enable, set_EthernetVLANTermination_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_EthernetVLANTermination_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_EthernetVLANTermination_Alias, set_EthernetVLANTermination_Alias, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMREAD, DMT_STRING, get_EthernetVLANTermination_Name, NULL, NULL, NULL, BBFDM_BOTH},
+{"LastChange", &DMREAD, DMT_UNINT, get_EthernetVLANTermination_LastChange, NULL, NULL, NULL, BBFDM_BOTH},
+{"LowerLayers", &DMWRITE, DMT_STRING, get_EthernetVLANTermination_LowerLayers, set_EthernetVLANTermination_LowerLayers, NULL, NULL, BBFDM_BOTH},
+{"VLANID", &DMWRITE, DMT_UNINT, get_EthernetVLANTermination_VLANID, set_EthernetVLANTermination_VLANID, NULL, NULL, BBFDM_BOTH},
+{"TPID", &DMWRITE, DMT_UNINT, get_EthernetVLANTermination_TPID, set_EthernetVLANTermination_TPID, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Ethernet.VLANTermination.{i}.Stats. *** */
+DMLEAF tEthernetVLANTerminationStatsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"BytesSent", &DMREAD, DMT_UNINT, get_EthernetVLANTerminationStats_BytesSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"BytesReceived", &DMREAD, DMT_UNINT, get_EthernetVLANTerminationStats_BytesReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsSent", &DMREAD, DMT_UNINT, get_EthernetVLANTerminationStats_PacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsReceived", &DMREAD, DMT_UNINT, get_EthernetVLANTerminationStats_PacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsSent", &DMREAD, DMT_UNINT, get_EthernetVLANTerminationStats_ErrorsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsReceived", &DMREAD, DMT_UNINT, get_EthernetVLANTerminationStats_ErrorsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnicastPacketsSent", &DMREAD, DMT_UNINT, get_EthernetVLANTerminationStats_UnicastPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnicastPacketsReceived", &DMREAD, DMT_UNINT, get_EthernetVLANTerminationStats_UnicastPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsSent", &DMREAD, DMT_UNINT, get_EthernetVLANTerminationStats_DiscardPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsReceived", &DMREAD, DMT_UNINT, get_EthernetVLANTerminationStats_DiscardPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"MulticastPacketsSent", &DMREAD, DMT_UNINT, get_EthernetVLANTerminationStats_MulticastPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"MulticastPacketsReceived", &DMREAD, DMT_UNINT, get_EthernetVLANTerminationStats_MulticastPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"BroadcastPacketsSent", &DMREAD, DMT_UNINT, get_EthernetVLANTerminationStats_BroadcastPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"BroadcastPacketsReceived", &DMREAD, DMT_UNINT, get_EthernetVLANTerminationStats_BroadcastPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnknownProtoPacketsReceived", &DMREAD, DMT_UNINT, get_EthernetVLANTerminationStats_UnknownProtoPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*************************************************************
+ * INIT
+/*************************************************************/
+inline int init_eth_port(struct eth_port_args *args, struct uci_section *s, char *ifname)
+{
+	args->eth_port_sec = s;
+	args->ifname = ifname;
+	return 0;
+}
+
+/*************************************************************
+ * COMMON Functions
+/*************************************************************/
+static int is_mac_exist(char *macaddr)
+{
+	struct uci_section *s = NULL;
+	char *mac;
+
+	uci_path_foreach_sections(icwmpd, DMMAP, "link", s) {
+		dmuci_get_value_by_section_string(s, "mac", &mac);
+		if (strcmp(mac, macaddr) == 0)
+			return 1;
+	}
+	return 0;
+}
+
+static void create_link(char *ifname)
+{
+	char *macaddr, *v, *device;
+	struct uci_section *dmmap = NULL;
+
+	macaddr = get_macaddr(ifname);
+	if (macaddr[0] == '\0')
+		return;
+
+	device = get_device(ifname);
+	if (device[0] == '\0')
+		return;
+
+	/* Interfaces might share the same mac address */
+	if (is_mac_exist(macaddr))
+		return;
+
+	dmuci_add_section_icwmpd(DMMAP, "link", &dmmap, &v);
+	dmuci_set_value_by_section(dmmap, "mac", macaddr);
+	dmuci_set_value_by_section(dmmap, "device", device);
+	dmuci_set_value_by_section(dmmap, "section_name", ifname);
+}
+
+static int dmmap_synchronizeEthernetLink(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL;
+	char *type, *ifname;
+
+	uci_foreach_sections("network", "interface", s) {
+		dmuci_get_value_by_section_string(s, "type", &type);
+		if (strcmp(type, "alias") == 0 || strcmp(section_name(s), "loopback") == 0)
+			continue;
+
+		dmuci_get_value_by_section_string(s, "ifname", &ifname);
+		if (*ifname == '\0' || *ifname == '@')
+			continue;
+
+		create_link(section_name(s));
+	}
+	return 0;
+}
+
+/*************************************************************
+ * ENTRY METHOD
+/*************************************************************/
+/*#Device.Ethernet.Interface.{i}.!UCI:ports/ethport/dmmap_ports*/
+int browseEthernetInterfaceInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *int_num = NULL, *int_num_last = NULL, *ifname;
+	struct eth_port_args curr_eth_port_args = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("ports", "ethport", "dmmap_ports", &dup_list);
+	dmuci_get_option_value_string("ports", "WAN", "ifname", &wan_ifname);
+	list_for_each_entry(p, &dup_list, list) {
+		dmuci_get_value_by_section_string(p->config_section, "ifname", &ifname);
+		if (strcmp(ifname, wan_ifname) == 0) {
+			if(strchr(ifname, '.')== NULL)
+				dmasprintf(&ifname, "%s.1", ifname);
+		}
+		init_eth_port(&curr_eth_port_args, p->config_section, ifname);
+		int_num =  handle_update_instance(1, dmctx, &int_num_last, update_instance_alias, 3, p->dmmap_section, "eth_port_instance", "eth_port_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_eth_port_args, int_num) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+int browseEthernetLinkInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct dm_args args = {0};
+	struct uci_section *s = NULL;
+	char *id_last = NULL, *id = NULL;
+
+	dmmap_synchronizeEthernetLink(dmctx, NULL, NULL, NULL);
+	uci_path_foreach_sections(icwmpd, DMMAP, "link", s) {
+		args.section = s;
+		id = handle_update_instance(1, dmctx, &id_last, update_instance_alias_icwmpd, 3, s, "link_instance", "link_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&args, id) == DM_STOP) {
+			break;
+		}
+	}
+	return 0;
+}
+
+/*#Device.Ethernet.VLANTermination.{i}.!UCI:network/device/dmmap_network*/
+int browseEthernetVLANTerminationInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *vlan_term = NULL, *vlan_term_last = NULL, *type= NULL, *vlan_method= NULL;
+	struct dm_args curr_vlan_term_args = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("network", "device", "dmmap_network", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		dmuci_get_value_by_section_string(p->config_section, "type", &type);
+		dmuci_get_option_value_string("cwmp", "cpe", "vlan_method", &vlan_method);
+		if ((strcmp(vlan_method, "2") != 0 && strcmp(vlan_method, "1") != 0) || (strcmp(vlan_method, "1") == 0 && strcmp(type, "untagged") == 0) )
+			continue;
+		curr_vlan_term_args.section = p->config_section;
+		if(strcmp(vlan_method, "2") == 0)
+			vlan_term = handle_update_instance(1, dmctx, &vlan_term_last, update_instance_alias, 3, p->dmmap_section, "all_vlan_term_instance", "all_vlan_term_alias");
+		else
+			vlan_term = handle_update_instance(1, dmctx, &vlan_term_last, update_instance_alias, 3, p->dmmap_section, "only_tagged_vlan_term_instance", "vlan_term_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_vlan_term_args, vlan_term) == DM_STOP)
+			break;
+	}
+
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+/*************************************************************
+* LINKER
+**************************************************************/
+int get_linker_interface(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker)
+{
+	if (data && ((struct eth_port_args *)data)->ifname) {
+		*linker = ((struct eth_port_args *)data)->ifname;
+		return 0;
+	} else {
+		*linker = "";
+		return 0;
+	}
+}
+
+int get_linker_link(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker)
+{
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "mac", linker);
+	return 0;
+}
+
+int get_linker_vlan_term(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker)
+{
+	if(((struct dm_args *)data)->section) {
+		dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "name", linker);
+		return 0;
+	} else {
+		*linker = "";
+		return 0;
+	}
+}
+
+/*************************************************************
+ * ADD & DEL OBJ
+/*************************************************************/
+int addObjEthernetLink(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	char *inst, *v;
+	struct uci_section *dmmap_network= NULL;
+
+	inst = get_last_instance_icwmpd(DMMAP, "link", "link_instance");
+
+	dmuci_add_section_icwmpd(DMMAP, "link", &dmmap_network, &v);
+	*instance = update_instance_icwmpd(dmmap_network, inst, "link_instance");
+	return 0;
+}
+
+int delObjEthernetLink(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	switch (del_action) {
+		case DEL_INST:
+			dmuci_delete_by_section(((struct dm_args *)data)->section, NULL, NULL);
+			break;
+		case DEL_ALL:
+			DMUCI_DEL_SECTION(icwmpd, DMMAP, "link", NULL, NULL);
+			break;
+	}
+
+	return 0;
+}
+
+int addObjEthernetVLANTermination(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	char *inst, *v, *eth_wan, *vid, *name, *vlan_name, *vlan_method = NULL;
+	struct uci_section *dmmap_network= NULL;
+
+	check_create_dmmap_package("dmmap_network");
+	dmuci_get_option_value_string("cwmp", "cpe", "vlan_method", &vlan_method);
+	if(strcmp(vlan_method, "2") == 0)
+		inst = get_vlan_last_instance_icwmpd("dmmap_network", "device", "all_vlan_term_instance", vlan_method);
+	else
+		inst = get_vlan_last_instance_icwmpd("dmmap_network", "device", "only_tagged_vlan_term_instance", vlan_method);
+
+	dmuci_get_option_value_string("ports", "WAN", "ifname", &eth_wan);
+	dmasprintf(&vid, "%d", inst?atoi(inst)+4:4);
+	dmasprintf(&vlan_name, "vlan_%s", vid);
+	dmuci_set_value("network", vlan_name, "", "device");
+	dmuci_set_value("network", vlan_name, "ifname", eth_wan);
+	dmuci_set_value("network", vlan_name, "type", "8021q");
+	dmuci_set_value("network", vlan_name, "vid", vid);
+	dmasprintf(&name, "%s.%s", eth_wan, vid);
+	dmuci_set_value("network", vlan_name, "name", name);
+
+	dmuci_add_section_icwmpd("dmmap_network", "device", &dmmap_network, &v);
+	dmuci_set_value_by_section(dmmap_network, "section_name", vlan_name);
+	if(strcmp(vlan_method, "2") == 0)
+		*instance = update_instance_icwmpd(dmmap_network, inst, "all_vlan_term_instance");
+	else
+		*instance = update_instance_icwmpd(dmmap_network, inst, "only_tagged_vlan_term_instance");
+
+	return 0;
+}
+
+int delObjEthernetVLANTermination(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	int found = 0;
+	struct uci_section *s = NULL, *ss = NULL, *dmmap_section = NULL;
+	char *vlan_method = NULL;
+
+	switch (del_action) {
+	case DEL_INST:
+		dmuci_get_option_value_string("cwmp", "cpe", "vlan_method", &vlan_method);
+		if(is_section_unnamed(section_name(((struct dm_args *)data)->section))) {
+			LIST_HEAD(dup_list);
+			if(strcmp(vlan_method, "2") == 0) {
+				delete_sections_save_next_sections("dmmap_network", "device", "all_vlan_term_instance", section_name((struct uci_section *)data), atoi(instance), &dup_list);
+				update_dmmap_sections(&dup_list, "all_vlan_term_instance", "dmmap_network", "device");
+			}
+			else {
+				delete_sections_save_next_sections("dmmap_network", "device", "only_tagged_vlan_term_instance", section_name((struct uci_section *)data), atoi(instance), &dup_list);
+				update_dmmap_sections(&dup_list, "only_tagged_vlan_term_instance", "dmmap_network", "device");
+			}
+			dmuci_delete_by_section_unnamed(((struct dm_args *)data)->section, NULL, NULL);
+		} else {
+			get_dmmap_section_of_config_section("dmmap_dropbear", "dropbear", section_name(((struct dm_args *)data)->section), &dmmap_section);
+			if(dmmap_section != NULL)
+				dmuci_delete_by_section_unnamed_icwmpd(dmmap_section, NULL, NULL);
+			dmuci_delete_by_section(((struct dm_args *)data)->section, NULL, NULL);
+		}
+		break;
+	case DEL_ALL:
+		uci_foreach_sections("network", "device", s) {
+			if (found != 0){
+				get_dmmap_section_of_config_section("dmmap_network", "device", section_name(s), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			ss = s;
+			found++;
+		}
+		if (ss != NULL){
+			get_dmmap_section_of_config_section("dmmap_network", "device", section_name(ss), &dmmap_section);
+			if(dmmap_section != NULL)
+				dmuci_delete_by_section(dmmap_section, NULL, NULL);
+			dmuci_delete_by_section(ss, NULL, NULL);
+		}
+		break;
+	}
+	return 0;
+}
+
+/*************************************************************
+ * GET & SET PARAM
+/*************************************************************/
+/*#Device.Ethernet.InterfaceNumberOfEntries!UCI:ports/ethport/*/
+int get_Ethernet_InterfaceNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	uci_foreach_sections("ports", "ethport", s)
+	{
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+int get_Ethernet_LinkNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	dmmap_synchronizeEthernetLink(ctx, NULL, NULL, NULL);
+	uci_path_foreach_sections(icwmpd, DMMAP, "link", s)
+	{
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+/*#Device.Ethernet.VLANTerminationNumberOfEntries!UCI:network/device/*/
+int get_Ethernet_VLANTerminationNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	char *type, *vlan_method;
+	int cnt = 0;
+
+	uci_foreach_sections("network", "device", s)
+	{
+		dmuci_get_value_by_section_string(s, "type", &type);
+		dmuci_get_option_value_string("cwmp", "cpe", "vlan_method", &vlan_method);
+		if ((strcmp(vlan_method, "2") != 0 && strcmp(vlan_method, "1") != 0) || (strcmp(vlan_method, "1") == 0 && strcmp(type, "untagged") == 0))
+			continue;
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.Enable!UBUS:network.device/status/name,@Name/carrier*/
+int get_EthernetInterface_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	char *ifname;
+
+	if (strstr(((struct eth_port_args *)data)->ifname, wan_ifname)) {
+		ifname = dmstrdup(wan_ifname);
+	} else
+		ifname = dmstrdup(((struct eth_port_args *)data)->ifname);
+
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 1, "carrier");
+	dmfree(ifname);
+	return 0;
+}
+
+int set_EthernetInterface_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	char *ifname;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (strstr(((struct eth_port_args *)data)->ifname, wan_ifname))
+				ifname = dmstrdup(wan_ifname);
+			else
+				ifname = dmstrdup(((struct eth_port_args *)data)->ifname);
+
+			DMCMD("ethctl", 3, ifname, "phy-power", b ? "up" : "down");
+			dmfree(ifname);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.Status!UBUS:network.device/status/name,@Name/carrier*/
+int get_EthernetInterface_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	bool b;
+
+	get_EthernetInterface_Enable(refparam, ctx, data, instance, value);
+	string_to_bool(*value, &b);
+	*value = b ? "Up" : "Down";
+	return 0;
+}
+
+int get_EthernetInterface_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_ports", "ethport", section_name(((struct eth_port_args *)data)->eth_port_sec), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "eth_port_alias", value);
+	if(*value == NULL || strlen(*value)<1)
+		dmuci_get_value_by_section_string(((struct eth_port_args *)data)->eth_port_sec, "name", value);
+	return 0;
+}
+
+int set_EthernetInterface_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			get_dmmap_section_of_config_section("dmmap_ports", "ethport", section_name(((struct eth_port_args *)data)->eth_port_sec), &dmmap_section);
+			dmuci_set_value_by_section(dmmap_section, "eth_port_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.Name!UCI:ports/ethport,@i-1/name*/
+int get_EthernetInterface_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct eth_port_args *)data)->eth_port_sec, "name", value);
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.LastChange!UBUS:network.interface/status/interface,@Name/uptime*/
+int get_EthernetInterface_LastChange(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	struct uci_section *s = NULL;
+	char *ifname;
+
+	*value ="0";
+	uci_foreach_sections("network", "interface", s) {
+		dmuci_get_value_by_section_string(s, "ifname", &ifname);
+		if (strstr(ifname, ((struct eth_port_args *)data)->ifname)) {
+			dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(s), String}}, 1, &res);
+			DM_ASSERT(res, *value = "0");
+			*value = dmjson_get_value(res, 1, "uptime");
+			if((*value)[0] == '\0')
+				*value = "0";
+			break;
+		}
+	}
+	return 0;
+}
+
+int get_EthernetInterface_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "";
+	return 0;
+}
+
+int set_EthernetInterface_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_EthernetInterface_Upstream(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ifname;
+	dmuci_get_option_value_string("network", "lan", "ifname", &ifname);
+	if (strstr(ifname, ((struct eth_port_args *)data)->ifname))
+		*value = "1";
+	else
+		*value = "0";
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.MACAddress!UBUS:network.device/status/name,@Name/macaddr*/
+int get_EthernetInterface_MACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct eth_port_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 1, "macaddr");
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.MaxBitRate!UCI:ports/ethport,@i-1/speed*/
+int get_EthernetInterface_MaxBitRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *pch, *spch, *speed;
+
+	dmuci_get_value_by_section_string(((struct eth_port_args *)data)->eth_port_sec, "speed", &speed);
+	if (speed[0] == '\0' || strcmp(speed, "disabled") == 0 )
+		*value = "0";
+	else {
+		if (strcmp(speed, "auto") == 0)
+			*value = "-1";
+		else {
+			pch = strtok_r(speed, "FHfh", &spch);
+			*value = dmstrdup(pch);
+		}
+	}
+	return 0;
+}
+
+int set_EthernetInterface_MaxBitRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *duplex, *val = "", *p = "";
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcasecmp(value, "0") == 0 ) {
+				dmuci_set_value_by_section(((struct eth_port_args *)data)->eth_port_sec, "speed", "disabled");
+			} else if (strcmp(value, "-1") == 0) {
+				dmuci_set_value_by_section(((struct eth_port_args *)data)->eth_port_sec, "speed", "auto");
+			} else {
+				dmuci_get_value_by_section_string(((struct eth_port_args *)data)->eth_port_sec, "speed", &duplex);
+				if (strcmp(duplex, "auto") == 0 || strcmp(duplex, "disabled") == 0)
+					p = "FDAUTO";
+				else {
+					p = strchr(duplex, 'F') ? strchr(duplex, 'F') : strchr(duplex, 'H');
+				}
+				if (p) dmastrcat(&val, value, p);
+				dmuci_set_value_by_section(((struct eth_port_args *)data)->eth_port_sec, "speed", val);
+				dmfree(val);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.CurrentBitRate!UBUS:network.device/status/name,@Name/speed*/
+int get_EthernetInterface_CurrentBitRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	char *speed, *pch;
+
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct eth_port_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "0");
+	speed = dmjson_get_value(res, 1, "speed");
+	if(speed[0] != '\0') {
+		pch = strtok(speed, "FHfh");
+		*value = dmstrdup(pch);
+	} else
+		*value = "0";
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.DuplexMode!UCI:ports/status/ethport,@i-1/speed*/
+int get_EthernetInterface_DuplexMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct eth_port_args *)data)->eth_port_sec, "speed", value);
+	if (*value[0] == '\0') {
+		*value = "";
+	} else if (strcmp(*value, "auto") == 0) {
+		*value = "Auto";
+	} else {
+		if (strchr(*value, 'F'))
+			*value = "Full";
+		else if (strchr(*value, 'H'))
+			*value = "Half";
+		else
+			*value = "";
+	}
+	return 0;
+}
+
+int set_EthernetInterface_DuplexMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *m, *spch, *rate, *val = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcasecmp(value, "auto") == 0) {
+				dmuci_set_value_by_section(((struct eth_port_args *)data)->eth_port_sec, "speed", "auto");
+				return 0;
+			}
+			dmuci_get_value_by_section_string(((struct eth_port_args *)data)->eth_port_sec, "speed", &m);
+			m = dmstrdup(m);
+			rate = m;
+			if (strcmp(rate, "auto") == 0)
+				rate = "100";
+			else {
+				strtok_r(rate, "FHfh", &spch);
+			}
+			if (strcasecmp(value, "full") == 0)
+				dmastrcat(&val, rate, "FD");
+			else if (strcasecmp(value, "half") == 0)
+				dmastrcat(&val, rate, "HD");
+			else {
+				dmfree(m);
+				return 0;
+			}
+			dmuci_set_value_by_section(((struct eth_port_args *)data)->eth_port_sec, "speed", val);
+			dmfree(m);
+			dmfree(val);
+			return 0;
+	}
+	return 0;
+}
+
+int get_EthernetInterface_EEECapability(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	return 0;
+}
+
+inline int get_ubus_ethernet_interface_stats(json_object *res, char **value, char *stat_mod, void *data)
+{
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct eth_port_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "0");
+	*value = dmjson_get_value(res, 2, "statistics", stat_mod);
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.Stats.BytesSent!UBUS:network.device/status/name,@Name/statistics.tx_bytes*/
+int get_EthernetInterfaceStats_BytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_interface_stats(res, value, "tx_bytes", data);
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.Stats.BytesReceived!UBUS:network.device/status/name,@Name/statistics.rx_bytes*/
+int get_EthernetInterfaceStats_BytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct eth_port_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "rx_bytes");
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.Stats.PacketsSent!UBUS:network.device/status/name,@Name/statistics.tx_packets*/
+int get_EthernetInterfaceStats_PacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct eth_port_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "tx_packets");
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.Stats.PacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_packets*/
+int get_EthernetInterfaceStats_PacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct eth_port_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "rx_packets");
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.Stats.ErrorsSent!UBUS:network.device/status/name,@Name/statistics.tx_errors*/
+int get_EthernetInterfaceStats_ErrorsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct eth_port_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "tx_errors");
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.Stats.ErrorsReceived!UBUS:network.device/status/name,@Name/statistics.rx_errors*/
+int get_EthernetInterfaceStats_ErrorsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct eth_port_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "rx_errors");
+	return 0;
+}
+
+int get_EthernetInterfaceStats_UnicastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmasprintf(value, "%d", get_stats_from_ifconfig_command(((struct eth_port_args *)data)->ifname, "TX", "unicast"));
+	return 0;
+}
+
+int get_EthernetInterfaceStats_UnicastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmasprintf(value, "%d", get_stats_from_ifconfig_command(((struct eth_port_args *)data)->ifname, "RX", "unicast"));
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.Stats.DiscardPacketsSent!UBUS:network.device/status/name,@Name/statistics.tx_dropped*/
+int get_EthernetInterfaceStats_DiscardPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct eth_port_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "tx_dropped");
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.Stats.DiscardPacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_dropped*/
+int get_EthernetInterfaceStats_DiscardPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct eth_port_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "rx_dropped");
+	return 0;
+}
+
+int get_EthernetInterfaceStats_MulticastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmasprintf(value, "%d", get_stats_from_ifconfig_command(((struct eth_port_args *)data)->ifname, "TX", "multicast"));
+	return 0;
+}
+
+int get_EthernetInterfaceStats_MulticastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmasprintf(value, "%d", get_stats_from_ifconfig_command(((struct eth_port_args *)data)->ifname, "RX", "multicast"));
+	return 0;
+}
+
+int get_EthernetInterfaceStats_BroadcastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmasprintf(value, "%d", get_stats_from_ifconfig_command(((struct eth_port_args *)data)->ifname, "TX", "broadcast"));
+	return 0;
+}
+
+int get_EthernetInterfaceStats_BroadcastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmasprintf(value, "%d", get_stats_from_ifconfig_command(((struct eth_port_args *)data)->ifname, "RX", "broadcast"));
+	return 0;
+}
+
+/*#Device.Ethernet.Interface.{i}.Stats.UnknownProtoPacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_over_errors*/
+int get_EthernetInterfaceStats_UnknownProtoPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct eth_port_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "rx_over_errors");
+	return 0;
+}
+
+int get_EthernetLink_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "true";
+	return 0;
+}
+
+int set_EthernetLink_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_EthernetLink_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "Up";
+	return 0;
+}
+
+int get_EthernetLink_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "link_alias", value);
+	return 0;
+}
+
+int set_EthernetLink_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct dm_args *)data)->section, "link_alias", value);
+			break;
+	}
+	return 0;
+}
+
+int get_EthernetLink_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = dmstrdup(section_name(((struct dm_args *)data)->section));
+	return 0;
+}
+
+int get_EthernetLink_LastChange(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	char *interface;
+
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "section_name", &interface);
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", interface, String}}, 1, &res);
+	DM_ASSERT(res, *value = "0");
+	*value = dmjson_get_value(res, 1, "uptime");
+	if((*value)[0] == '\0')
+		*value = "0";
+	return 0;
+}
+
+int get_EthernetLink_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	char *link_mac, *type, *ifname, *mac, *br_inst, *mg, *wanifname, *wanlinker, linker[64] = "";
+	struct uci_section *dmmap_section, *port;
+
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "mac", &link_mac);
+	uci_foreach_sections("network", "interface", s) {
+		dmuci_get_value_by_section_string(s, "type", &type);
+		if (strcmp(type, "alias") == 0 || strcmp(section_name(s), "loopback") == 0)
+			continue;
+
+		dmuci_get_value_by_section_string(s, "ifname", &ifname);
+		if (*ifname == '\0' || *ifname == '@')
+			continue;
+
+		mac = get_macaddr(section_name(s));
+		if (mac[0] == '\0' || strcasecmp(mac, link_mac) != 0)
+			continue;
+
+		if (strcmp(type, "bridge") == 0) {
+			get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(s), &dmmap_section);
+			if (dmmap_section != NULL) {
+				dmuci_get_value_by_section_string(dmmap_section, "bridge_instance", &br_inst);
+				uci_path_foreach_option_eq(icwmpd, "dmmap_bridge_port", "bridge_port", "bridge_key", br_inst, port) {
+					dmuci_get_value_by_section_string(port, "mg_port", &mg);
+					if (strcmp(mg, "true") == 0)
+						sprintf(linker, "%s+", section_name(port));
+					adm_entry_get_linker_param(ctx, dm_print_path("%s%cBridging%cBridge%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value);
+					if (*value == NULL)
+						*value = "";
+				}
+			}
+		}
+		else {
+			dmuci_get_option_value_string("ports", "WAN", "ifname", &wanifname);
+			/* for upstream interface, set the lowerlayer to wan port of Ethernet.Interface */
+			if(strstr(ifname, wanifname)) {
+				dmasprintf(&wanlinker, "%s.1", wanifname);
+				adm_entry_get_linker_param(ctx, dm_print_path("%s%cEthernet%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), wanlinker, value);
+				dmfree(wanlinker);
+				if (*value == NULL)
+					*value = "";
+			}
+		}
+	}
+	return 0;
+}
+
+int set_EthernetLink_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_EthernetLink_MACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "mac", value);
+	return 0;
+}
+
+inline int get_ubus_ethernet_link_stats(json_object *res, char **value, char *stat_mod, void *data)
+{
+	char *device;
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "device", &device);
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", device, String}}, 1, &res);
+	DM_ASSERT(res, *value = "0");
+	*value = dmjson_get_value(res, 2, "statistics", stat_mod);
+	return 0;
+}
+
+int get_EthernetLinkStats_BytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_link_stats(res, value, "tx_bytes", data);
+	return 0;
+}
+
+int get_EthernetLinkStats_BytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_link_stats(res, value, "rx_bytes", data);
+	return 0;
+}
+
+int get_EthernetLinkStats_PacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_link_stats(res, value, "tx_packets", data);
+	return 0;
+}
+
+int get_EthernetLinkStats_PacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_link_stats(res, value, "rx_packets", data);
+	return 0;
+}
+
+int get_EthernetLinkStats_ErrorsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_link_stats(res, value, "tx_errors", data);
+	return 0;
+}
+
+int get_EthernetLinkStats_ErrorsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_link_stats(res, value, "rx_errors", data);
+	return 0;
+}
+
+int get_EthernetLinkStats_UnicastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *device;
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "device", &device);
+	dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "TX", "unicast"));
+	return 0;
+}
+
+int get_EthernetLinkStats_UnicastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *device;
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "device", &device);
+	dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "RX", "unicast"));
+	return 0;
+}
+
+int get_EthernetLinkStats_DiscardPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_link_stats(res, value, "tx_dropped", data);
+	return 0;
+}
+
+int get_EthernetLinkStats_DiscardPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_link_stats(res, value, "rx_dropped", data);
+	return 0;
+}
+
+int get_EthernetLinkStats_MulticastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *device;
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "device", &device);
+	dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "TX", "multicast"));
+	return 0;
+}
+
+int get_EthernetLinkStats_MulticastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *device;
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "device", &device);
+	dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "RX", "multicast"));
+	return 0;
+}
+
+int get_EthernetLinkStats_BroadcastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *device;
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "device", &device);
+	dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "TX", "broadcast"));
+	return 0;
+}
+
+int get_EthernetLinkStats_BroadcastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *device;
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "device", &device);
+	dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "RX", "broadcast"));
+	return 0;
+}
+
+int get_EthernetLinkStats_UnknownProtoPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_link_stats(res, value, "rx_over_errors", data);
+	return 0;
+}
+
+int get_EthernetVLANTermination_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "true";
+	return 0;
+}
+
+int set_EthernetVLANTermination_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_EthernetVLANTermination_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "Up";
+	return 0;
+}
+
+int get_EthernetVLANTermination_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+	char *vlan_method= NULL;
+
+	get_dmmap_section_of_config_section("dmmap_network", "device", section_name(((struct dm_args *)data)->section), &dmmap_section);
+	dmuci_get_option_value_string("cwmp", "cpe", "vlan_method", &vlan_method);
+	if(strcmp(vlan_method, "2") == 0)
+		dmuci_get_value_by_section_string(dmmap_section, "all_vlan_term_alias", value);
+	else
+		dmuci_get_value_by_section_string(dmmap_section, "vlan_term_alias", value);
+
+	return 0;
+}
+
+int set_EthernetVLANTermination_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+	char *vlan_method= NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			get_dmmap_section_of_config_section("dmmap_network", "device", section_name(((struct dm_args *)data)->section), &dmmap_section);
+			dmuci_get_option_value_string("cwmp", "cpe", "vlan_method", &vlan_method);
+			if(strcmp(vlan_method, "2") == 0)
+				dmuci_set_value_by_section(dmmap_section, "all_vlan_term_alias", value);
+			else
+				dmuci_set_value_by_section(dmmap_section, "vlan_term_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_EthernetVLANTermination_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = dmstrdup(section_name(((struct dm_args *)data)->section));
+	return 0;
+}
+
+/*#Device.Ethernet.VLANTermination.{i}.LastChange!UBUS:network.interface/status/interface,@Name/uptime*/
+int get_EthernetVLANTermination_LastChange(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	struct uci_section *s = NULL;
+	char *ifname, *devifname;
+
+	*value ="0";
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "name", &devifname);
+	uci_foreach_sections("network", "interface", s) {
+		dmuci_get_value_by_section_string(s, "ifname", &ifname);
+		if (strstr(ifname, devifname)) {
+			dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(s), String}}, 1, &res);
+			DM_ASSERT(res, *value = "0");
+			*value = dmjson_get_value(res, 1, "uptime");
+			if((*value)[0] == '\0')
+				*value = "0";
+			break;
+		}
+	}
+	return 0;
+}
+
+int get_EthernetVLANTermination_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *pch, *spch, *devifname, *ifname, *mac;
+	struct uci_section *section;
+	
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "name", &devifname);
+	uci_foreach_sections("network", "interface", section) {
+		dmuci_get_value_by_section_string(section, "ifname", &ifname);
+		for (pch = strtok_r(ifname, " ", &spch); pch != NULL; pch = strtok_r(NULL, " ", &spch)) {
+			if(strcmp(pch, devifname) == 0) {
+				mac = get_macaddr(section_name(section));
+				if (mac[0] != '\0') {
+					adm_entry_get_linker_param(ctx, dm_print_path("%s%cEthernet%cLink%c", dmroot, dm_delim, dm_delim, dm_delim), mac, value);
+					if (*value == NULL)
+						*value = "";
+					break;
+				}
+			}
+		}
+	}
+	return 0;
+}
+
+int set_EthernetVLANTermination_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *iface_list, *linker = NULL, *newvalue = NULL, *vlan_name = NULL;
+	struct uci_section *s;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (value[strlen(value)-1]!='.') {
+				dmasprintf(&newvalue, "%s.", value);
+				adm_entry_get_linker_value(ctx, newvalue, &linker);
+			} else
+				adm_entry_get_linker_value(ctx, value, &linker);
+
+			if (linker == NULL || *linker == '\0')
+				return -1;
+
+			dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "name", &vlan_name);
+			uci_foreach_sections("network", "interface", s) {
+				dmuci_get_value_by_section_string(s, "ifname", &iface_list);
+				if(strcmp(section_name(s), linker) != 0 && is_elt_exit_in_str_list(iface_list, vlan_name)) {
+					remove_elt_from_str_list(&iface_list, vlan_name);
+					dmuci_set_value_by_section(s, "ifname", iface_list);
+				} else if (strcmp(section_name(s), linker) == 0 && !is_elt_exit_in_str_list(iface_list, vlan_name)) {
+					add_elt_to_str_list(&iface_list, vlan_name);
+					dmuci_set_value_by_section(s, "ifname", iface_list);
+				}
+			}
+	}
+	return 0;
+}
+
+/*#Device.Ethernet.VLANTermination.{i}.LastChange!UCI:network/device,@i-1/vid*/
+int get_EthernetVLANTermination_VLANID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "vid", value);
+	return 0;
+}
+
+int set_EthernetVLANTermination_VLANID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *ifname, *name, *vid, *curr_ifname;
+	struct uci_section *s;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET: {
+			dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "ifname", &ifname);
+			dmasprintf(&name, "%s.%s", ifname, value);
+			dmuci_set_value_by_section(((struct dm_args *)data)->section, "name", name);
+			dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "vid", &vid);
+			dmuci_set_value_by_section(((struct dm_args *)data)->section, "vid", value);
+			dmasprintf(&curr_ifname, "%s.%s", ifname, vid);
+			uci_foreach_option_eq("network", "interface", "ifname", curr_ifname, s) {
+				dmuci_set_value_by_section(s, "ifname", name);
+			}
+			dmfree(name);
+			dmfree(curr_ifname);
+			return 0;
+		}
+	}
+	return 0;
+}
+
+/*#Device.Ethernet.VLANTermination.{i}.TPID!UCI:network/device,@i-1/type*/
+int get_EthernetVLANTermination_TPID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *type;
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "type", &type);
+	if (strcmp(type, "8021q") == 0 || strcmp(type, "untagged") == 0)
+		*value = "33024";
+	else if (strcmp(type, "8021ad") == 0)
+		*value = "34984";
+	else
+		return -1;
+	return 0;
+}
+
+int set_EthernetVLANTermination_TPID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "33024") == 0)
+				dmuci_set_value_by_section(((struct dm_args *)data)->section, "type", "8021q");
+			else if (strcmp(value, "34984") == 0)
+				dmuci_set_value_by_section(((struct dm_args *)data)->section, "type", "8021ad");
+			else
+				return -1;
+			return 0;
+	}
+	return 0;
+}
+
+inline int get_ubus_ethernet_vlan_termination_stats(json_object *res, char **value, char *stat_mod, void *data)
+{
+	char *ifname;
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "ifname", &ifname);
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "0");
+	*value = dmjson_get_value(res, 2, "statistics", stat_mod);
+	return 0;
+}
+
+/*#Device.Ethernet.VLANTermination.{i}.Stats.BytesSent!UBUS:network.device/status/name,@Name/statistics.tx_bytes*/
+int get_EthernetVLANTerminationStats_BytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_vlan_termination_stats(res, value, "tx_bytes", data);
+	return 0;
+}
+
+/*#Device.Ethernet.VLANTermination.{i}.Stats.BytesReceived!UBUS:network.device/status/name,@Name/statistics.rx_bytes*/
+int get_EthernetVLANTerminationStats_BytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_vlan_termination_stats(res, value, "rx_bytes", data);
+	return 0;
+}
+
+/*#Device.Ethernet.VLANTermination.{i}.Stats.PacketsSent!UBUS:network.device/status/name,@Name/statistics.tx_packets*/
+int get_EthernetVLANTerminationStats_PacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_vlan_termination_stats(res, value, "tx_packets", data);
+	return 0;
+}
+
+/*#Device.Ethernet.VLANTermination.{i}.Stats.PacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_packets*/
+int get_EthernetVLANTerminationStats_PacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_vlan_termination_stats(res, value, "rx_packets", data);
+	return 0;
+}
+
+/*#Device.Ethernet.VLANTermination.{i}.Stats.ErrorsSent!UBUS:network.device/status/name,@Name/statistics.tx_errors*/
+int get_EthernetVLANTerminationStats_ErrorsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_vlan_termination_stats(res, value, "tx_errors", data);
+	return 0;
+}
+
+/*#Device.Ethernet.VLANTermination.{i}.Stats.ErrorsReceived!UBUS:network.device/status/name,@Name/statistics.rx_errors*/
+int get_EthernetVLANTerminationStats_ErrorsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_vlan_termination_stats(res, value, "rx_errors", data);
+	return 0;
+}
+
+int get_EthernetVLANTerminationStats_UnicastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ifname;
+	*value = "0";
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "ifname", &ifname);
+	if(!strstr(ifname, "atm") && !strstr(ifname, "ptm"))
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(ifname, "TX", "unicast"));
+	return 0;
+}
+
+int get_EthernetVLANTerminationStats_UnicastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ifname;
+	*value = "0";
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "ifname", &ifname);
+	if(!strstr(ifname, "atm") && !strstr(ifname, "ptm"))
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(ifname, "RX", "unicast"));
+	return 0;
+}
+
+/*#Device.Ethernet.VLANTermination.{i}.Stats.DiscardPacketsSent!UBUS:network.device/status/name,@Name/statistics.tx_dropped*/
+int get_EthernetVLANTerminationStats_DiscardPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_vlan_termination_stats(res, value, "tx_dropped", data);
+	return 0;
+}
+
+/*#Device.Ethernet.VLANTermination.{i}.Stats.DiscardPacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_dropped*/
+int get_EthernetVLANTerminationStats_DiscardPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_vlan_termination_stats(res, value, "rx_dropped", data);
+	return 0;
+}
+
+int get_EthernetVLANTerminationStats_MulticastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ifname;
+	*value = "0";
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "ifname", &ifname);
+	if(!strstr(ifname, "atm") && !strstr(ifname, "ptm")) {
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(ifname, "TX", "multicast"));
+	}
+	return 0;
+}
+
+int get_EthernetVLANTerminationStats_MulticastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ifname;
+	*value = "0";
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "ifname", &ifname);
+	if(!strstr(ifname, "atm") && !strstr(ifname, "ptm"))
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(ifname, "RX", "multicast"));
+	return 0;
+}
+
+int get_EthernetVLANTerminationStats_BroadcastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ifname;
+	*value = "0";
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "ifname", &ifname);
+	if(!strstr(ifname, "atm") && !strstr(ifname, "ptm"))
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(ifname, "TX", "broadcast"));
+	return 0;
+}
+
+int get_EthernetVLANTerminationStats_BroadcastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ifname;
+	*value = "0";
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "ifname", &ifname);
+	if(!strstr(ifname, "atm") && !strstr(ifname, "ptm"))
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(ifname, "RX", "broadcast"));
+	return 0;
+}
+
+/*#Device.Ethernet.VLANTermination.{i}.Stats.UnknownProtoPacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_over_errors*/
+int get_EthernetVLANTerminationStats_UnknownProtoPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	get_ubus_ethernet_vlan_termination_stats(res, value, "rx_over_errors", data);
+	return 0;
+}
diff --git a/dmtree/tr181/ethernet.h b/dmtree/tr181/ethernet.h
new file mode 100644
index 0000000000000000000000000000000000000000..ed00af1843a18dd60dc2b537d13288f0e30554b0
--- /dev/null
+++ b/dmtree/tr181/ethernet.h
@@ -0,0 +1,139 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *      Copyright (C) 2019 iopsys Software Solutions AB
+ *      Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#ifndef __ETHERNET_H
+#define __ETHERNET_H
+
+struct eth_port_args
+{
+	struct uci_section *eth_port_sec;
+	char *ifname;
+};
+
+extern DMOBJ tEthernetObj[];
+extern DMLEAF tEthernetParams[];
+extern DMOBJ tEthernetInterfaceObj[];
+extern DMLEAF tEthernetInterfaceParams[];
+extern DMLEAF tEthernetInterfaceStatsParams[];
+extern DMOBJ tEthernetLinkObj[];
+extern DMLEAF tEthernetLinkParams[];
+extern DMLEAF tEthernetLinkStatsParams[];
+extern DMOBJ tEthernetVLANTerminationObj[];
+extern DMLEAF tEthernetVLANTerminationParams[];
+extern DMLEAF tEthernetVLANTerminationStatsParams[];
+
+int browseEthernetInterfaceInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseEthernetLinkInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseEthernetVLANTerminationInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int addObjEthernetLink(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjEthernetLink(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjEthernetVLANTermination(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjEthernetVLANTermination(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_linker_interface(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+int get_linker_link(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+int get_linker_vlan_term(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+
+int get_Ethernet_InterfaceNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_Ethernet_LinkNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_Ethernet_VLANTerminationNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_EthernetInterface_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_EthernetInterface_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_EthernetInterface_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterface_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_EthernetInterface_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_EthernetInterface_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterface_LastChange(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterface_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_EthernetInterface_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_EthernetInterface_Upstream(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterface_MACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterface_MaxBitRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_EthernetInterface_MaxBitRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_EthernetInterface_CurrentBitRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterface_DuplexMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_EthernetInterface_DuplexMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_EthernetInterface_EEECapability(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterfaceStats_BytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterfaceStats_BytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterfaceStats_PacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterfaceStats_PacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterfaceStats_ErrorsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterfaceStats_ErrorsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterfaceStats_UnicastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterfaceStats_UnicastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterfaceStats_DiscardPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterfaceStats_DiscardPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterfaceStats_MulticastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterfaceStats_MulticastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterfaceStats_BroadcastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterfaceStats_BroadcastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetInterfaceStats_UnknownProtoPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_EthernetLink_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_EthernetLink_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_EthernetLink_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLink_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_EthernetLink_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_EthernetLink_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLink_LastChange(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLink_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_EthernetLink_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_EthernetLink_MACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLinkStats_BytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLinkStats_BytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLinkStats_PacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLinkStats_PacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLinkStats_ErrorsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLinkStats_ErrorsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLinkStats_UnicastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLinkStats_UnicastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLinkStats_DiscardPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLinkStats_DiscardPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLinkStats_MulticastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLinkStats_MulticastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLinkStats_BroadcastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLinkStats_BroadcastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetLinkStats_UnknownProtoPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_EthernetVLANTermination_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_EthernetVLANTermination_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_EthernetVLANTermination_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTermination_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_EthernetVLANTermination_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_EthernetVLANTermination_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTermination_LastChange(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTermination_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_EthernetVLANTermination_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_EthernetVLANTermination_VLANID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_EthernetVLANTermination_VLANID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_EthernetVLANTermination_TPID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_EthernetVLANTermination_TPID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_EthernetVLANTerminationStats_BytesSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTerminationStats_BytesReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTerminationStats_PacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTerminationStats_PacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTerminationStats_ErrorsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTerminationStats_ErrorsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTerminationStats_UnicastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTerminationStats_UnicastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTerminationStats_DiscardPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTerminationStats_DiscardPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTerminationStats_MulticastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTerminationStats_MulticastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTerminationStats_BroadcastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTerminationStats_BroadcastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_EthernetVLANTerminationStats_UnknownProtoPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+#endif //__ETHERNET_H
diff --git a/dmtree/tr181/firewall.c b/dmtree/tr181/firewall.c
new file mode 100644
index 0000000000000000000000000000000000000000..a7de6a9756fa1ea6578c4dd330bbcc454b34bf06
--- /dev/null
+++ b/dmtree/tr181/firewall.c
@@ -0,0 +1,1329 @@
+/*
+ *      This program is free software: you can redistribute it and/or modify
+ *      it under the terms of the GNU General Public License as published by
+ *      the Free Software Foundation, either version 2 of the License, or
+ *      (at your option) any later version.
+ *
+ *      Copyright (C) 2019 iopsys Software Solutions AB
+ *
+ *      Author: Omar Kallel <omar.kallel@pivasoftware.com>
+ */
+
+#include "dmcwmp.h"
+#include "firewall.h"
+#include "dmcommon.h"
+#include "dmentry.h"
+
+/* *** Device.Firewall. *** */
+DMOBJ tFirewallObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Level", &DMREAD, NULL, NULL, NULL, browseLevelInst, NULL, NULL, NULL, tFirewallLevelParams, NULL, BBFDM_BOTH},
+{"Chain", &DMREAD, NULL, NULL, NULL, browseChainInst, NULL, NULL, tFirewallChainObj, tFirewallChainParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tFirewallParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_firewall_enable, set_firewall_enable, NULL, NULL, BBFDM_BOTH},
+{"Config", &DMWRITE, DMT_STRING, get_firewall_config, set_firewall_config, NULL, NULL, BBFDM_BOTH},
+{"AdvancedLevel", &DMWRITE, DMT_STRING, get_firewall_advanced_level, set_firewall_advanced_level, NULL, NULL, BBFDM_BOTH},
+{"LevelNumberOfEntries", &DMREAD, DMT_UNINT, get_firewall_level_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{"ChainNumberOfEntries", &DMREAD, DMT_UNINT, get_firewall_chain_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Firewall.Level.{i}. *** */
+DMLEAF tFirewallLevelParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Name", &DMWRITE, DMT_STRING, get_level_name, set_level_name, NULL, NULL, BBFDM_BOTH},
+{"Description", &DMWRITE, DMT_STRING, get_level_description, set_level_description, NULL, NULL, BBFDM_BOTH},
+{"Chain", &DMREAD, DMT_STRING, get_level_chain, NULL, NULL, NULL, BBFDM_BOTH},
+{"PortMappingEnabled", &DMWRITE, DMT_BOOL, get_level_port_mapping_enabled, set_level_port_mapping_enabled, NULL, NULL, BBFDM_BOTH},
+{"DefaultLogPolicy", &DMWRITE, DMT_BOOL, get_level_default_log_policy, set_level_default_log_policy, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Firewall.Chain.{i}. *** */
+DMOBJ tFirewallChainObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Rule", &DMWRITE, add_firewall_rule, delete_firewall_rule, NULL, browseRuleInst, NULL, NULL, tFirewallChainRuleObj, tFirewallChainRuleParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tFirewallChainParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_chain_enable, set_chain_enable, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMWRITE, DMT_STRING, get_chain_name, set_chain_name, NULL, NULL, BBFDM_BOTH},
+{"Creator", &DMREAD, DMT_STRING, get_chain_creator, NULL, NULL, NULL, BBFDM_BOTH},
+{"RuleNumberOfEntries", &DMREAD, DMT_UNINT, get_chain_rule_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Firewall.Chain.{i}.Rule.{i}. *** */
+DMOBJ tFirewallChainRuleObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{CUSTOM_PREFIX"TimeSpan", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tTimeSpanParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tFirewallChainRuleParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_rule_enable, set_rule_enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_rule_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Order", &DMWRITE, DMT_UNINT, get_rule_order, set_rule_order, NULL, NULL, BBFDM_BOTH},
+{"Description", &DMWRITE, DMT_STRING, get_rule_description, set_rule_description, NULL, NULL, BBFDM_BOTH},
+{"Target", &DMWRITE, DMT_STRING, get_rule_target, set_rule_target, NULL, NULL, BBFDM_BOTH},
+{"TargetChain", &DMWRITE, DMT_STRING, get_rule_target_chain, set_rule_target_chain, NULL, NULL, BBFDM_BOTH},
+{"SourceInterface", &DMWRITE, DMT_STRING, get_rule_source_interface, set_rule_source_interface, NULL, NULL, BBFDM_BOTH},
+{"DestInterface", &DMWRITE, DMT_STRING, get_rule_dest_interface, set_rule_dest_interface, NULL, NULL, BBFDM_BOTH},
+{"IPVersion", &DMWRITE, DMT_INT, get_rule_i_p_version, set_rule_i_p_version, NULL, NULL, BBFDM_BOTH},
+{"DestIp", &DMWRITE, DMT_STRING, get_rule_dest_ip, set_rule_dest_ip, NULL, NULL, BBFDM_BOTH},
+{"DestMask", &DMWRITE, DMT_STRING, get_rule_dest_mask, set_rule_dest_mask, NULL, NULL, BBFDM_BOTH},
+{"SourceIp", &DMWRITE, DMT_STRING, get_rule_source_ip, set_rule_source_ip, NULL, NULL, BBFDM_BOTH},
+{"SourceMask", &DMWRITE, DMT_STRING, get_rule_source_mask, set_rule_source_mask, NULL, NULL, BBFDM_BOTH},
+{"Protocol", &DMWRITE, DMT_INT, get_rule_protocol, set_rule_protocol, NULL, NULL, BBFDM_BOTH},
+{"DestPort", &DMWRITE, DMT_INT, get_rule_dest_port, set_rule_dest_port, NULL, NULL, BBFDM_BOTH},
+{"DestPortRangeMax", &DMWRITE, DMT_INT, get_rule_dest_port_range_max, set_rule_dest_port_range_max, NULL, NULL, BBFDM_BOTH},
+{"SourcePort", &DMWRITE, DMT_INT, get_rule_source_port, set_rule_source_port, NULL, NULL, BBFDM_BOTH},
+{"SourcePortRangeMax", &DMWRITE, DMT_INT, get_rule_source_port_range_max, set_rule_source_port_range_max, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"IcmpType", &DMWRITE, DMT_STRING, get_rule_icmp_type, set_rule_icmp_type, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"SourceMac", &DMWRITE, DMT_STRING, get_rule_source_mac, set_rule_source_mac, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tTimeSpanParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"SupportedDays", &DMWRITE, DMT_STRING, get_time_span_supported_days, set_time_span_supported_days, NULL, NULL, BBFDM_BOTH},
+{"Days", &DMWRITE, DMT_STRING, get_time_span_days, set_time_span_days, NULL, NULL, BBFDM_BOTH},
+{"StartTime", &DMWRITE, DMT_STRING, get_time_span_start_time, set_time_span_start_time, NULL, NULL, BBFDM_BOTH},
+{"StopTime", &DMWRITE, DMT_STRING, get_time_span_stop_time, set_time_span_stop_time, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/***************************** Browse Functions ***********************************/
+int browseLevelInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s;
+	char *v, *instance, *instnbr = NULL;
+
+	check_create_dmmap_package("dmmap_firewall");
+	s = is_dmmap_section_exist("dmmap_firewall", "level");
+	if(!s)
+		dmuci_add_section_icwmpd("dmmap_firewall", "level", &s, &v);
+	instance =  handle_update_instance(1, dmctx, &instnbr, update_instance_alias, 3, s, "firewall_level_instance", "firewall_level_alias");
+
+	DM_LINK_INST_OBJ(dmctx, parent_node, s, "1");
+	return 0;
+}
+
+int browseChainInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s;
+	char *v, *instance, *instnbr = NULL;
+
+	check_create_dmmap_package("dmmap_firewall");
+	s = is_dmmap_section_exist("dmmap_firewall", "chain");
+	if(!s)
+		dmuci_add_section_icwmpd("dmmap_firewall", "chain", &s, &v);
+	instance =  handle_update_instance(1, dmctx, &instnbr, update_instance_alias, 3, s, "firewall_chain_instance", "firewall_chain_alias");
+
+	DM_LINK_INST_OBJ(dmctx, parent_node, s, "1");
+	return 0;
+}
+
+/*#Device.Firewall.Chain.{i}.Rule.{i}.!UCI:firewall/rule/dmmap_firewall*/
+int browseRuleInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *instance, *instnbr = NULL;
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("firewall", "rule", "dmmap_firewall", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		instance =  handle_update_instance(1, dmctx, &instnbr, update_instance_alias, 3, p->dmmap_section, "firewall_chain_rule_instance", "firewall_chain_rule_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, instance) == DM_STOP)
+			return 0;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+int add_firewall_rule(char *refparam, struct dmctx *ctx, void *data, char **instance){
+	struct uci_section *s, *dmmap_firewall_rule;
+	char *last_inst= NULL, *sect_name= NULL, *rule_name, *v;
+	char ib[8];
+	last_inst= get_last_instance_icwmpd("dmmap_firewall", "rule", "firewall_chain_rule_instance");
+	if (last_inst)
+		sprintf(ib, "%s", last_inst);
+	else
+		sprintf(ib, "%s", "1");
+	dmasprintf(&rule_name, "Firewall rule %d", atoi(ib)+1);
+
+	dmuci_add_section("firewall", "rule", &s, &sect_name);
+	dmuci_set_value_by_section(s, "name", rule_name);
+	dmuci_set_value_by_section(s, "dest", "lan");
+	dmuci_set_value_by_section(s, "src", "wan");
+	dmuci_set_value_by_section(s, "target", "ACCEPT");
+
+	dmuci_add_section_icwmpd("dmmap_firewall", "rule", &dmmap_firewall_rule, &v);
+	dmuci_set_value_by_section(dmmap_firewall_rule, "section_name", sect_name);
+	*instance = update_instance_icwmpd(dmmap_firewall_rule, last_inst, "firewall_chain_rule_instance");
+	return 0;
+}
+
+int delete_firewall_rule(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action){
+	struct uci_section *s = NULL;
+	struct uci_section *ss = NULL;
+	struct uci_section *dmmap_section;
+	int found = 0;
+
+	switch (del_action) {
+		case DEL_INST:
+			if(is_section_unnamed(section_name((struct uci_section *)data))){
+				LIST_HEAD(dup_list);
+				delete_sections_save_next_sections("dmmap_firewall", "rule", "firewall_chain_rule_instance", section_name((struct uci_section *)data), atoi(instance), &dup_list);
+				update_dmmap_sections(&dup_list, "firewall_chain_rule_instance", "dmmap_firewall", "rule");
+				dmuci_delete_by_section_unnamed((struct uci_section *)data, NULL, NULL);
+			} else {
+				get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name((struct uci_section *)data), &dmmap_section);
+				dmuci_delete_by_section_unnamed_icwmpd(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section((struct uci_section *)data, NULL, NULL);
+			}
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("firewall", "rule", s) {
+				if (found != 0){
+					get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name(ss), &dmmap_section);
+					if(dmmap_section != NULL)
+						dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL){
+				get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name(ss), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+	}
+	return 0;
+}
+
+/***************************************** Set/Get Parameter functions ***********************/
+int get_firewall_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *path = "/etc/rc.d/*firewall";
+	if (check_file(path))
+		*value = "1";
+	else
+		*value = "0";
+	return 0;
+}
+
+int get_firewall_config(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "Advanced";
+    return 0;
+}
+
+int get_firewall_advanced_level(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "Device.Firewall.Level.1.";
+    return 0;
+}
+
+int get_firewall_level_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value="1";
+	return 0;
+}
+
+int get_firewall_chain_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value="1";
+    return 0;
+}
+
+int get_level_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section* levels=(struct uci_section *)data;
+	dmuci_get_value_by_section_string(levels, "name", value);
+	return 0;
+}
+
+int get_level_description(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+    struct uci_section* levels=(struct uci_section *)data;
+    dmuci_get_value_by_section_string(levels, "description", value);
+    return 0;
+}
+
+int get_level_chain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "Device.Firewall.Chain.1.";
+    return 0;
+}
+
+int get_level_port_mapping_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	char *v;
+
+	uci_foreach_sections("firewall", "zone", s)
+	{
+		dmuci_get_value_by_section_string(s, "masq", &v);
+		if (*v == '1') {
+			*value = "1";
+			return 0;
+		}
+	}
+	*value = "0";
+    return 0;
+}
+
+int get_level_default_log_policy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	char *v;
+
+	uci_foreach_sections("firewall", "zone", s)
+	{
+		dmuci_get_value_by_section_string(s, "log", &v);
+		if (*v == '1') {
+			*value = "1";
+			return 0;
+		}
+	}
+	*value = "0";
+	return 0;
+}
+
+int get_chain_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int get_chain_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+    struct uci_section* chains=(struct uci_section *)data;
+    dmuci_get_value_by_section_string(chains, "name", value);
+    return 0;
+}
+
+int get_chain_creator(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "Defaults";
+    return 0;
+}
+
+/*#Device.Firewall.Chain.{i}.RuleNumberOfEntries!UCI:firewall/rule/*/
+int get_chain_rule_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	uci_foreach_sections("firewall", "rule", s)
+	{
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+/*#Device.Firewall.Chain.{i}.Rule.{i}.Enable!UCI:firewall/rule,@i-1/enabled*/
+int get_rule_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *v;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "enabled", &v);
+	*value = (*v == 'n' || *v == '0' ) ? "0" : "1";
+	return 0;
+}
+
+/*#Device.Firewall.Chain.{i}.Rule.{i}.Status!UCI:firewall/rule,@i-1/enabled*/
+int get_rule_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *v;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "enabled", &v);
+	*value = (*v == 'n' || *v == '0') ? "Disabled" : "Enabled";
+	return 0;
+}
+
+int get_rule_order(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dms;
+	get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name((struct uci_section *)data), &dms);
+	dmuci_get_value_by_section_string(dms, "firewall_chain_rule_instance", value);
+	return 0;
+}
+
+int get_rule_description(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dms;
+	get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name((struct uci_section *)data), &dms);
+	dmuci_get_value_by_section_string(dms, "description", value);
+	return 0;
+}
+
+/*#Device.Firewall.Chain.{i}.Rule.{i}.Target!UCI:firewall/rule,@i-1/target*/
+int get_rule_target(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *v;
+	*value = "";
+	dmuci_get_value_by_section_string((struct uci_section *)data, "target", &v);
+	if (strcasecmp(v, "Accept") == 0) {
+		*value = "Accept";
+	}
+	else if (strcasecmp(v, "Reject") == 0) {
+		*value = "Reject";
+	}
+	else if (strcasecmp(v, "Drop") == 0){
+		*value = "Drop";
+	}
+	else if (strcasecmp(v, "MARK") == 0){
+		*value = "Return";
+	}
+	else {
+		*value = v;
+	}
+    return 0;
+}
+
+int get_rule_target_chain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_rule_source_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_list *v = NULL, *v1= NULL;
+	struct uci_element *e;
+	char *zone, *ifaceobj, buf[256] = "", *val;
+	struct uci_section *s = NULL;
+	char linker[64] = "", *vallink;
+
+	dmuci_get_value_by_section_string((struct uci_section *)data, "src", &zone);
+	if(zone == NULL || strlen(zone)==0)
+		return 0;
+
+	if (strcmp(zone, "*") == 0) {
+		v = dmcalloc(1, sizeof(struct uci_list));
+		uci_list_init(v);
+		uci_foreach_sections("firewall", "zone", s)
+		{
+			dmuci_get_value_by_section_list(s, "network", &v1);
+			uci_add_list_to_list(v1, v);
+		}
+	} else {
+		uci_foreach_sections("firewall", "zone", s)
+		{
+			dmuci_get_value_by_section_string(s, "name", &val);
+			if (strcmp(val, zone) == 0) {
+				dmuci_get_value_by_section_list(s, "network", &v);
+				break;
+			}
+		}
+	}
+
+	if (v != NULL) {
+		uci_foreach_element(v, e) {
+			adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), e->name, &vallink);
+			if (*vallink == '\0')
+				continue;
+			if (*buf != '\0')
+				strcat(buf, ",");
+			strcat(buf, vallink);
+		}
+	}
+	else {
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), zone, &vallink);
+		strcpy(buf, vallink);
+	}
+
+	*value = dmstrdup(buf);
+	return 0;
+}
+
+int get_rule_dest_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_list *v = NULL;
+	struct uci_element *e;
+	char *zone, *ifaceobj, buf[256] = "", *val;
+	struct uci_section *s = NULL;
+
+	dmuci_get_value_by_section_string((struct uci_section *)data, "dest", &zone);
+	uci_foreach_sections("firewall", "zone", s)
+	{
+		dmuci_get_value_by_section_string(s, "name", &val);
+		if (strcmp(val, zone) == 0) {
+			dmuci_get_value_by_section_list(s, "network", &v);
+			break;
+		}
+	}
+	if (v != NULL) {
+		uci_foreach_element(v, e) {
+			adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), e->name, &ifaceobj);
+			if (*ifaceobj == '\0')
+				continue;
+			if (*buf != '\0')
+				strcat(buf, ",");
+			strcat(buf, ifaceobj);
+		}
+	}
+
+	*value = dmstrdup(buf);
+	return 0;
+}
+
+/*#Device.Firewall.Chain.{i}.Rule.{i}.IPVersion!UCI:firewall/rule,@i-1/family*/
+int get_rule_i_p_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ipversion;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "family", &ipversion);
+	if (strcasecmp(ipversion, "ipv4") == 0) {
+		*value = "4";
+	}
+	else if (strcasecmp(ipversion, "ipv6") == 0) {
+		*value = "6";
+	}
+	else {
+		*value = "-1";
+	}
+	return 0;
+}
+
+/*#Device.Firewall.Chain.{i}.Rule.{i}.DestIp!UCI:firewall/rule,@i-1/dest_ip*/
+int get_rule_dest_ip(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char buf[64];
+	char *pch;
+	char *destip;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "dest_ip", &destip);
+	strcpy(buf, destip);
+	pch = strchr(buf, '/');
+	if (pch)
+		*pch = '\0';
+	*value = dmstrdup(buf);
+	return 0;
+}
+
+/*#Device.Firewall.Chain.{i}.Rule.{i}.DestMask!UCI:firewall/rule,@i-1/dest_ip*/
+int get_rule_dest_mask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *pch;
+	*value = "";
+
+	char *destip;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "dest_ip", &destip);
+	if (*destip == '\0')
+		return 0;
+
+	pch = strchr(destip, '/');
+	if (pch) {
+		*value = pch+1;
+	}
+	else {
+		*value = "";
+	}
+	return 0;
+}
+
+/*#Device.Firewall.Chain.{i}.Rule.{i}.SourceIp!UCI:firewall/rule,@i-1/src_ip*/
+int get_rule_source_ip(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char buf[64];
+	char *pch;
+	char *srcip;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "src_ip", &srcip);
+	strcpy(buf, srcip);
+	pch = strchr(buf, '/');
+	if (pch)
+		*pch = '\0';
+	*value = dmstrdup(buf);
+	return 0;
+}
+
+/*#Device.Firewall.Chain.{i}.Rule.{i}.SourceMask!UCI:firewall/rule,@i-1/src_ip*/
+int get_rule_source_mask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *pch;
+	*value = "";
+
+	char *srcip;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "src_ip", &srcip);
+	if (*srcip == '\0')
+		return 0;
+
+	pch = strchr(srcip, '/');
+	if (pch) {
+		*value = pch+1;
+	}
+	else {
+		*value = "";
+	}
+	return 0;
+}
+
+/*#Device.Firewall.Chain.{i}.Rule.{i}.Protocol!UCI:firewall/rule,@i-1/proto*/
+int get_rule_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	FILE *fp;
+	char buf[256];
+	char protocol[32];
+	char protocol_nbr[16];
+	struct uci_section *ss = (struct uci_section *)data;
+	char *v;
+
+	dmuci_get_value_by_section_string((struct uci_section *)data, "proto", &v);
+	*value = "-1";
+	if (*v == '\0' || *v == '0') {
+		return 0;
+	}
+	if (isdigit_str(v)) {
+		*value = v;
+		return 0;
+	}
+	fp = fopen("/etc/protocols", "r");
+	if (fp == NULL)
+		return 0;
+	while (fgets (buf , 256 , fp) != NULL) {
+		sscanf(buf, "%s %s", protocol, protocol_nbr);
+		if (strcmp(protocol, v) == 0) {
+			*value =dmstrdup(protocol_nbr);
+			fclose(fp);
+			return 0;
+		}
+	}
+	fclose(fp);
+	return 0;
+}
+
+/*#Device.Firewall.Chain.{i}.Rule.{i}.DestPort!UCI:firewall/rule,@i-1/dest_port*/
+int get_rule_dest_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *tmp;
+	char *v;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "dest_port", &v);
+	v = dmstrdup(v);
+	tmp = strchr(v, ':');
+	if (tmp == NULL)
+		tmp = strchr(v, '-');
+	if (tmp)
+		*tmp = '\0';
+	if (*v == '\0') {
+		*value = "-1";
+		return 0;
+	}
+	*value = v;
+	return 0;
+}
+
+/*#Device.Firewall.Chain.{i}.Rule.{i}.DestPortRangeMax!UCI:firewall/rule,@i-1/dest_port*/
+int get_rule_dest_port_range_max(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *rpch, *tmp;
+	char *v;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "dest_port", &v);
+	tmp = strchr(v, ':');
+	if (tmp == NULL)
+		tmp = strchr(v, '-');
+	*value = (tmp) ? tmp+1 : "-1";
+	return 0;
+}
+
+/*#Device.Firewall.Chain.{i}.Rule.{i}.SourcePort!UCI:firewall/rule,@i-1/src_port*/
+int get_rule_source_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *tmp;
+	char *v;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "src_port", &v);
+	v = dmstrdup(v);
+	tmp = strchr(v, ':');
+	if (tmp == NULL)
+		tmp = strchr(v, '-');
+	if (tmp)
+		*tmp = '\0';
+	if (*v == '\0') {
+		*value = "-1";
+		return 0;
+	}
+	*value = v;
+	return 0;
+}
+
+/*#Device.Firewall.Chain.{i}.Rule.{i}.SourcePortRangeMax!UCI:firewall/rule,@i-1/src_port*/
+int get_rule_source_port_range_max(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *rpch, *tmp;
+	char *v;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "src_port", &v);
+	tmp = strchr(v, ':');
+	if (tmp == NULL)
+		tmp = strchr(v, '-');
+	*value = (tmp) ? tmp+1 : "-1";
+	return 0;
+}
+
+int get_rule_icmp_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_list *v= NULL;
+	struct uci_element *e;
+	char *ptr;
+
+	dmasprintf(value, "%s", "");
+	dmuci_get_value_by_section_list((struct uci_section *)data, "icmp_type", &v);
+	if (v != NULL) {
+		uci_foreach_element(v, e) {
+			ptr= dmstrdup(*value);
+			free(*value);
+
+			if(strlen(ptr)==0)
+				dmasprintf(value, "%s", e->name);
+			else{
+				dmasprintf(value, "%s %s", ptr, e->name);
+				free(ptr);
+			}
+		}
+	}
+	return 0;
+}
+
+int get_rule_source_mac(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *v= NULL;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "src_mac", &v);
+	*value = (v) ? v : "";
+	return 0;
+}
+
+int get_time_span_supported_days(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value= "mon tue wed thu fri sat sun";
+	return 0;
+}
+
+int get_time_span_days(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *v;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "weekdays", &v);
+	*value = (v) ? v : "";
+	return 0;
+}
+
+int get_time_span_start_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *v;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "start_time", &v);
+	*value = (v) ? v : "";
+	return 0;
+}
+
+int get_time_span_stop_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *v;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "stop_time", &v);
+	*value = (v) ? v : "";
+	return 0;
+}
+
+int set_firewall_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmcmd("/etc/init.d/firewall", 1, "enable");
+			else
+				dmcmd("/etc/init.d/firewall", 1, "disable");
+			break;
+	}
+        return 0;
+}
+
+int set_firewall_config(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			if (strcasecmp(value, "Advanced") != 0)
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			break;
+	}
+        return 0;
+}
+
+int set_firewall_advanced_level(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			if (strcasecmp(value, "Device.Firewall.Level.1.") != 0)
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			break;
+	}
+        return 0;
+}
+
+int set_level_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section* level=(struct uci_section *)data;
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, level, "name", value);
+			break;
+	}
+        return 0;
+}
+
+int set_level_description(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section* level=(struct uci_section *)data;
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, level, "description", value);
+			break;
+	}
+        return 0;
+}
+
+int set_level_port_mapping_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct uci_section *s = NULL;
+	char *v, *v2;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b) {
+				uci_foreach_sections("firewall", "zone", s)
+				{
+					dmuci_get_value_by_section_string(s, "src", &v);
+					dmuci_get_value_by_section_string(s, "name", &v2);
+					if (strcasestr(v, "wan") || strcasestr(v2, "wan")) {
+						dmuci_set_value_by_section(s, "masq", "1");
+						return 0;
+					}
+				}
+			}
+			else {
+				uci_foreach_sections("firewall", "zone", s)
+				{
+					dmuci_set_value_by_section(s, "masq", "");
+				}
+			}
+			break;
+	}
+        return 0;
+}
+
+int set_level_default_log_policy(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct uci_section *s = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b) {
+				uci_foreach_sections("firewall", "zone", s)
+				{
+					dmuci_set_value_by_section(s, "log", "1");
+				}
+			}
+			else {
+				uci_foreach_sections("firewall", "zone", s)
+				{
+					dmuci_set_value_by_section(s, "log", "");
+				}
+			}
+			break;
+	}
+        return 0;
+}
+
+int set_chain_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b) || !b)
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			break;
+	}
+        return 0;
+}
+
+int set_chain_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+    struct uci_section* chains=(struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, chains, "name", value);
+			break;
+	}
+        return 0;
+}
+
+int set_rule_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmuci_set_value_by_section((struct uci_section *)data, "enabled", (b) ? "" : "no");
+			break;
+	}
+        return 0;
+}
+
+int set_rule_order(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+        return 0;
+}
+
+int set_rule_description(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dms;
+	get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name((struct uci_section *)data), &dms);
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dms, "description", value);
+			break;
+	}
+        return 0;
+}
+
+int set_rule_target(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			if (strcasecmp(value, "Accept") == 0) {
+				dmuci_set_value_by_section((struct uci_section *)data, "target", "ACCEPT");
+			}
+			else if (strcasecmp(value, "Reject") == 0) {
+				dmuci_set_value_by_section((struct uci_section *)data, "target", "REJECT");
+			}
+			else if (strcasecmp(value, "Drop") == 0) {
+				dmuci_set_value_by_section((struct uci_section *)data, "target", "DROP");
+			}
+			else if (strcasecmp(value, "Return") == 0) {
+				dmuci_set_value_by_section((struct uci_section *)data, "target", "MARK");
+			}
+			break;
+	}
+        return 0;
+}
+
+int set_rule_target_chain(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+    return 0;
+}
+
+int set_rule_source_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *iface, *zone, *v = "", *val, *net;
+	struct uci_section *s = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			adm_entry_get_linker_value(ctx, value, &iface);
+			if(iface == NULL ||  iface[0] == '\0')
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			adm_entry_get_linker_value(ctx, value, &iface);
+			if (iface && iface[0] != '\0') {
+				uci_foreach_sections("firewall", "zone", s)
+				{
+					dmuci_get_value_by_section_string(s, "network", &net);
+					if (dm_strword(net, iface)) {
+						dmuci_get_value_by_section_string(s, "name", &zone);
+						dmuci_set_value_by_section((struct uci_section *)data, "src", zone);
+						break;
+					}
+				}
+			}
+			break;
+	}
+        return 0;
+}
+
+int set_rule_dest_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *iface, *zone, *v = "", *net;
+	struct uci_section *s = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			adm_entry_get_linker_value(ctx, value, &iface);
+			if (iface != NULL && iface[0] != '\0') {
+				uci_foreach_sections("firewall", "zone", s)
+				{
+					dmuci_get_value_by_section_string(s, "name", &net);
+					if (dm_strword(net, iface)) {
+						dmuci_get_value_by_section_string(s, "name", &zone);
+						dmuci_set_value_by_section((struct uci_section *)data, "dest", zone);
+						break;
+					}
+				}
+			}
+			break;
+	}
+        return 0;
+}
+
+int set_rule_i_p_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			if (strcmp(value, "4") == 0) {
+				dmuci_set_value_by_section((struct uci_section *)data, "family", "ipv4");
+			}
+			else if (strcmp(value, "6") == 0) {
+				dmuci_set_value_by_section((struct uci_section *)data, "family", "ipv6");
+			}
+			else if (strcmp(value, "-1") == 0) {
+				dmuci_set_value_by_section((struct uci_section *)data, "family", "");
+			}
+			break;
+			break;
+	}
+        return 0;
+}
+
+int set_rule_dest_ip(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char buf[64], new[64];
+	char *pch, *destip;
+
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "dest_ip", &destip);
+			strcpy(buf, destip);
+			pch = strchr(buf, '/');
+			if (pch) {
+				sprintf(new, "%s%s", value, pch);
+			}
+			else {
+				strcpy(new, value);
+			}
+			dmuci_set_value_by_section((struct uci_section *)data, "dest_ip", new);
+			break;
+	}
+    return 0;
+}
+
+int set_rule_dest_mask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char buf[64], new[64];
+	char *pch, *destip;
+
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "dest_ip", &destip);
+			strcpy(buf, destip);
+			pch = strchr(buf, '/');
+			if (pch) {
+				*pch = '\0';
+			}
+			sprintf(new, "%s/%s", buf, value);
+			dmuci_set_value_by_section((struct uci_section *)data, "dest_ip", new);
+			break;
+	}
+        return 0;
+}
+
+int set_rule_source_ip(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char buf[64], new[64];
+	char *pch, *srcip;
+
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "src_ip", &srcip);
+			strcpy(buf, srcip);
+			pch = strchr(buf, '/');
+			if (pch) {
+				sprintf(new, "%s%s", value, pch);
+			}
+			else {
+				strcpy(new, value);
+			}
+			dmuci_set_value_by_section((struct uci_section *)data, "src_ip", new);
+			break;
+	}
+        return 0;
+}
+
+int set_rule_source_mask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char buf[64], new[64];
+	char *pch, *srcip;
+
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "src_ip", &srcip);
+			strcpy(buf, srcip);
+			pch = strchr(buf, '/');
+			if (pch) {
+				*pch = '\0';
+			}
+			sprintf(new, "%s/%s", buf, value);
+			dmuci_set_value_by_section((struct uci_section *)data, "src_ip", new);
+			break;
+	}
+        return 0;
+}
+
+int set_rule_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			if (*value == '-')
+				dmuci_set_value_by_section((struct uci_section *)data, "proto", "");
+			else
+				dmuci_set_value_by_section((struct uci_section *)data, "proto", value);
+			break;
+	}
+        return 0;
+}
+
+int set_rule_dest_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *v, buffer[64], *tmp;
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			if (*value == '-')
+				value = "";
+			dmuci_get_value_by_section_string((struct uci_section *)data, "dest_port", &v);
+			tmp = strchr(v, ':');
+			if (tmp == NULL)
+				tmp = strchr(v, '-');
+
+			if (tmp == NULL) {
+				sprintf(buffer, "%s", value);
+			}
+			else {
+				sprintf(buffer, "%s%s", value, tmp);
+			}
+			dmuci_set_value_by_section((struct uci_section *)data, "dest_port", buffer);
+			break;
+	}
+        return 0;
+}
+
+int set_rule_dest_port_range_max(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *v, *tmp, *buf, buffer[64];
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "dest_port", &v);
+			buf = dmstrdup(v);
+			v = buf;
+			tmp = strchr(buf, ':');
+			if (tmp == NULL)
+				tmp = strchr(v, '-');
+			if (tmp)
+				*tmp = '\0';
+			if (*value == '-') {
+				sprintf(buffer, "%s", v);
+			}
+			else {
+				sprintf(buffer, "%s:%s", v, value);
+			}
+			dmfree(buf);
+			dmuci_set_value_by_section((struct uci_section *)data, "dest_port", buffer);
+			break;
+	}
+        return 0;
+}
+
+int set_rule_source_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *v, buffer[64], *tmp;
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			if (*value == '-')
+				value = "";
+			dmuci_get_value_by_section_string((struct uci_section *)data, "src_port", &v);
+			tmp = strchr(v, ':');
+			if (tmp == NULL)
+				tmp = strchr(v, '-');
+			if (tmp == NULL) {
+				sprintf(buffer, "%s", value);
+			}
+			else {
+				sprintf(buffer, "%s%s", value, tmp);
+			}
+			dmuci_set_value_by_section((struct uci_section *)data, "src_port", buffer);
+			break;
+	}
+    return 0;
+}
+
+int set_rule_source_port_range_max(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *v, *tmp, *buf, buffer[64];
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "src_port", &v);
+			buf = dmstrdup(v);
+			v = buf;
+			tmp = strchr(buf, ':');
+			if (tmp == NULL)
+				tmp = strchr(buf, '-');
+			if (tmp)
+				*tmp = '\0';
+			if (*value == '-') {
+				sprintf(buffer, "%s", v);
+			}
+			else {
+				sprintf(buffer, "%s:%s", v, value);
+			}
+			dmfree(buf);
+			dmuci_set_value_by_section((struct uci_section *)data, "src_port", buffer);
+			break;
+	}
+        return 0;
+}
+
+int set_rule_icmp_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	int length, i;
+	char **devices= NULL;
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "icmp_type", "");
+			devices = strsplit(value, " ", &length);
+			for(i=0; i<length; i++)
+				dmuci_add_list_value_by_section((struct uci_section *)data, "icmp_type", devices[i]);
+			break;
+	}
+	return 0;
+}
+
+int set_rule_source_mac(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "src_mac", value);
+			break;
+	}
+	return 0;
+}
+
+int set_time_span_supported_days(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int set_time_span_days(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "weekdays", value);
+			break;
+	}
+	return 0;
+}
+
+int set_time_span_start_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "start_time", value);
+			break;
+	}
+	return 0;
+}
+
+int set_time_span_stop_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "stop_time", value);
+			break;
+	}
+	return 0;
+}
diff --git a/dmtree/tr181/firewall.h b/dmtree/tr181/firewall.h
new file mode 100644
index 0000000000000000000000000000000000000000..2900934745038ae0d1728d21318198330588216c
--- /dev/null
+++ b/dmtree/tr181/firewall.h
@@ -0,0 +1,99 @@
+/*
+ *      This program is free software: you can redistribute it and/or modify
+ *      it under the terms of the GNU General Public License as published by
+ *      the Free Software Foundation, either version 2 of the License, or
+ *      (at your option) any later version.
+ *
+ *      Copyright (C) 2019 iopsys Software Solutions AB
+ *
+ *      Author: Omar Kallel <omar.kallel@pivasoftware.com>
+ */
+
+#ifndef _FIREWALL_H
+#define _FIREWALL_H
+
+extern DMOBJ tFirewallObj[];
+extern DMLEAF tFirewallParams[];
+extern DMLEAF tFirewallLevelParams[];
+extern DMLEAF tFirewallChainParams[];
+extern DMOBJ tFirewallChainObj[];
+extern DMLEAF tFirewallChainRuleParams[];
+extern DMOBJ tFirewallChainRuleObj[];
+extern DMLEAF tTimeSpanParams[];
+
+int browseLevelInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseChainInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseRuleInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int add_firewall_rule(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delete_firewall_rule(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int get_firewall_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_firewall_config(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_firewall_advanced_level(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_firewall_level_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_firewall_chain_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_level_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_level_description(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_level_chain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_level_port_mapping_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_level_default_log_policy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_chain_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_chain_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_chain_creator(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_chain_rule_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_order(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_description(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_target(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_target_chain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_source_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_dest_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_i_p_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_dest_ip(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_dest_mask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_source_ip(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_source_mask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_dest_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_dest_port_range_max(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_source_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_source_port_range_max(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_icmp_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_rule_source_mac(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_time_span_supported_days(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_time_span_days(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_time_span_start_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_time_span_stop_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_firewall_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_firewall_config(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_firewall_advanced_level(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_level_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_level_description(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_level_port_mapping_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_level_default_log_policy(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_chain_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_chain_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_order(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_description(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_target(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_target_chain(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_source_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_dest_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_i_p_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_dest_ip(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_dest_mask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_source_ip(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_source_mask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_dest_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_dest_port_range_max(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_source_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_source_port_range_max(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_icmp_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_rule_source_mac(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_time_span_supported_days(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_time_span_days(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_time_span_start_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_time_span_stop_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+#endif
diff --git a/dmtree/tr181/hosts.c b/dmtree/tr181/hosts.c
new file mode 100644
index 0000000000000000000000000000000000000000..f6c8176867228838288e86edfa44e90e556b59b3
--- /dev/null
+++ b/dmtree/tr181/hosts.c
@@ -0,0 +1,311 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2016 Inteno Broadband Technology AB
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "hosts.h"
+#include "dmjson.h"
+#include "dmentry.h"
+
+/* *** Device.Hosts. *** */
+DMOBJ tHostsObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Host", &DMREAD, NULL, NULL, NULL, browsehostInst, NULL, NULL, NULL, tHostsHostParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tHostsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"HostNumberOfEntries", &DMREAD, DMT_UNINT, get_host_nbr_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Hosts.Host.{i}. *** */
+DMLEAF tHostsHostParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"AssociatedDevice", &DMREAD, DMT_STRING, get_host_associateddevice, NULL, NULL, NULL, BBFDM_BOTH},
+{"Layer3Interface", &DMREAD, DMT_STRING, get_host_layer3interface, NULL, NULL, NULL, BBFDM_BOTH},
+{"IPAddress", &DMREAD, DMT_STRING, get_host_ipaddress, NULL, NULL, NULL, BBFDM_BOTH},
+{"HostName", &DMREAD, DMT_STRING, get_host_hostname, NULL, NULL, NULL, BBFDM_BOTH},
+{"Active", &DMREAD, DMT_BOOL, get_host_active, NULL, NULL, NULL, BBFDM_BOTH},
+{"PhysAddress", &DMREAD, DMT_STRING, get_host_phy_address, NULL, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"LinkType", &DMREAD, DMT_STRING, get_host_interfacetype, NULL, NULL, NULL, BBFDM_BOTH},
+{"AddressSource", &DMREAD, DMT_STRING, get_host_address_source, NULL, NULL, NULL, BBFDM_BOTH},
+{"LeaseTimeRemaining", &DMREAD, DMT_INT, get_host_leasetime_remaining, NULL, NULL, NULL, BBFDM_BOTH},
+{"DHCPClient", &DMREAD, DMT_STRING, get_host_dhcp_client, NULL, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"InterfaceType", &DMREAD, DMT_STRING, get_host_interface_type, NULL, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"ifname", &DMREAD, DMT_STRING, get_host_interfacename, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+
+/*************************************************************
+ * INIT
+/*************************************************************/
+inline int init_host_args(struct host_args *args, json_object *clients, char *key)
+{
+	args->client = clients;
+	args->key = key;
+	return 0;
+}
+/*************************************************************
+ * GET & SET PARAM
+/*************************************************************/
+int get_host_associateddevice(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *ss;
+	char *macaddr_linker = dmjson_get_value(((struct host_args *)data)->client, 1, "macaddr");
+	char *accesspointInstance = NULL, *wifiAssociativeDeviecPath;
+
+	uci_path_foreach_sections(icwmpd, "dmmap_wireless", "wifi-iface", ss) {
+		dmuci_get_value_by_section_string(ss, "accesspointinstance", &accesspointInstance);
+		if(accesspointInstance[0] != '\0')
+			dmasprintf(&wifiAssociativeDeviecPath, "Device.WiFi.AccessPoint.%s.AssociatedDevice.", accesspointInstance);
+		accesspointInstance = NULL;
+		adm_entry_get_linker_param(ctx, wifiAssociativeDeviecPath, macaddr_linker, value);
+		if(*value != NULL)
+			break;
+	}
+
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+int get_host_layer3interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ip_linker=dmjson_get_value(((struct host_args *)data)->client, 1, "network");
+	adm_entry_get_linker_param(ctx, "Device.IP.Interface.", ip_linker, value);
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+int get_host_interface_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *type= NULL;
+	char *ifname = dmjson_get_value(((struct host_args *)data)->client, 1, "network");
+	struct uci_section *ss = NULL;
+
+	uci_foreach_sections("network", "interface", ss) {
+		if(!strcmp(ifname, section_name(ss))){
+			dmuci_get_value_by_section_string(ss, "type", &type);
+			if(type!=NULL){
+				if(!strcmp(type, "bridge")) *value="Bridge";else *value= "Normal";
+				break;
+			}
+		}
+	}
+	return 0;
+}
+
+int get_host_interfacename(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *frequency, *wireless;
+
+	frequency = dmjson_get_value(((struct host_args *)data)->client, 1, "frequency");
+	wireless = dmjson_get_value(((struct host_args *)data)->client, 1, "wireless");
+	if( (*frequency != '\0') && (strcmp(wireless, "true")==0) )
+	{
+		if(strcmp(frequency,"5GHz")==0)
+			*value = "WiFi@5GHz";
+		else
+			*value = "WiFi@2.4GHz";
+	}
+	else
+	{
+		*value = dmjson_get_value(((struct host_args *)data)->client, 1, "ethport");
+		if (*value == NULL)
+			*value = "";
+	}
+	return 0;
+}
+
+int get_host_ipaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = dmjson_get_value(((struct host_args *)data)->client, 1, "ipaddr");
+	return 0;
+}
+
+int get_host_hostname(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = dmjson_get_value(((struct host_args *)data)->client, 1, "hostname");
+	return 0;
+}
+
+int get_host_active(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = dmjson_get_value(((struct host_args *)data)->client, 1, "connected");
+	return 0;
+}
+
+int get_host_phy_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = dmjson_get_value(((struct host_args *)data)->client, 1, "macaddr");
+	return 0;
+}
+
+int get_host_address_source(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *dhcp;
+
+	dhcp = dmjson_get_value(((struct host_args *)data)->client, 1, "dhcp");
+	if (strcasecmp(dhcp, "true") == 0)
+		*value = "DHCP";
+	else
+		*value = "Static";
+	return 0;
+}
+
+int get_host_leasetime_remaining(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char buf[80], *dhcp;
+	FILE *fp;
+	char line[MAX_DHCP_LEASES];
+	struct tm ts;
+	char *leasetime, *mac_f, *mac, *line1;
+	char delimiter[] = " \t";
+
+	dhcp = dmjson_get_value(((struct host_args *)data)->client, 1, "dhcp");
+	if (strcmp(dhcp, "false") == 0) {
+		*value = "0";
+	}
+	else {
+		mac = dmjson_get_value(((struct host_args *)data)->client, 1, "macaddr");
+		fp = fopen(DHCP_LEASES_FILE, "r");
+		if ( fp != NULL)
+		{
+			while (fgets(line, MAX_DHCP_LEASES, fp) != NULL )
+			{
+				if (line[0] == '\n')
+					continue;
+				line1 = dmstrdup(line);
+				leasetime = cut_fx(line, delimiter, 1);
+				mac_f = cut_fx(line1, delimiter, 2);
+				if (strcasecmp(mac, mac_f) == 0) {
+					int rem_lease = atoi(leasetime) - time(NULL);
+					if (rem_lease < 0)
+						*value = "-1";
+					else
+						dmasprintf(value, "%d", rem_lease); // MEM WILL BE FREED IN DMMEMCLEAN
+					fclose(fp) ;
+					return 0;
+				}
+			}
+			fclose(fp);
+			*value = "0";
+		}
+	}
+	return 0;
+}
+
+int  get_host_dhcp_client(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *linker;
+	dmasprintf(&linker, "%s", ((struct host_args *)data)->key);
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cDHCPv4%c", dmroot, dm_delim, dm_delim), linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
+	if (*value == NULL) {
+		*value = "";
+	}
+	dmfree(linker);
+	return 0;
+}
+
+static char *get_interface_type(char *mac, char *ndev)
+{
+	json_object *res;
+	int wlctl_num;
+	struct uci_section *s, *d;
+	char *network, *device, *value, *wunit;
+	char buf[8], *p;
+
+	uci_foreach_sections("wireless", "wifi-device", d) {
+		wlctl_num = 0;
+		wunit = section_name(d);
+		uci_foreach_option_eq("wireless", "wifi-iface", "device", wunit, s) {
+			dmuci_get_value_by_section_string(s, "network", &network);
+			if (strcmp(network, ndev) == 0) {
+				if (wlctl_num != 0) {
+					sprintf(buf, "%s.%d", wunit, wlctl_num);
+					p = buf;
+				}
+				else {
+					p = wunit;
+				}
+				dmubus_call("router.wireless", "stas", UBUS_ARGS{{"vif", p, String}}, 1, &res);
+				if(res) {
+					json_object_object_foreach(res, key, val) {
+						value = dmjson_get_value(val, 1, "macaddr");
+						if (strcasecmp(value, mac) == 0)
+							return "802.11";
+					}
+				}
+				wlctl_num++;
+			}
+		}
+	}
+	return "Ethernet";
+}
+
+int get_host_interfacetype(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *mac, *network;
+	
+	mac = dmjson_get_value(((struct host_args *)data)->client, 1, "macaddr");
+	network = dmjson_get_value(((struct host_args *)data)->client, 1, "network");
+	*value = get_interface_type(mac, network);
+	return 0;
+}
+
+int get_host_nbr_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	int entries = 0;
+	json_object *res;
+
+	dmubus_call("router.network", "clients", UBUS_ARGS{}, 0, &res);
+	DM_ASSERT(res, *value = "0");
+	json_object_object_foreach(res, key, client_obj) {
+		entries++;
+	}
+	dmasprintf(value, "%d", entries); // MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+/*************************************************************
+ * ENTRY METHOD
+/*************************************************************/
+int browsehostInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	json_object *res, *client_obj;
+	char *idx, *idx_last = NULL, *connected;
+	int id = 0;
+	struct host_args curr_host_args = {0};
+
+	dmubus_call("router.network", "clients", UBUS_ARGS{}, 0, &res);
+	if (res) {
+		json_object_object_foreach(res, key, client_obj) {
+			connected = dmjson_get_value(client_obj, 1, "connected");
+			if(strcmp(connected, "false") == 0)
+				continue;
+			init_host_args(&curr_host_args, client_obj, key);
+			idx = handle_update_instance(2, dmctx, &idx_last, update_instance_without_section, 1, ++id);
+			if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_host_args, idx) == DM_STOP)
+				break;
+		}
+	}
+	return 0;
+}
+
diff --git a/dmtree/tr181/hosts.h b/dmtree/tr181/hosts.h
new file mode 100644
index 0000000000000000000000000000000000000000..aa77a642ffac6b9b494130ce75f665d467c00a97
--- /dev/null
+++ b/dmtree/tr181/hosts.h
@@ -0,0 +1,41 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2016 Inteno Broadband Technology AB
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *
+ */
+
+#ifndef __HOSTS_H
+#define __HOSTS_H
+
+struct host_args
+{
+	json_object *client;
+	char *key;
+};
+
+extern DMOBJ tHostsObj[];
+extern DMLEAF tHostsParams[];
+extern DMLEAF tHostsHostParams[];
+
+int browsehostInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int get_host_nbr_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_host_associateddevice(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_host_layer3interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_host_interface_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_host_interfacename(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_host_ipaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_host_hostname(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_host_active(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_host_phy_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_host_interfacetype(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_host_address_source(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_host_leasetime_remaining(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_host_dhcp_client(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+#endif
diff --git a/dmtree/tr181/interfacestack.c b/dmtree/tr181/interfacestack.c
new file mode 100644
index 0000000000000000000000000000000000000000..b3309b3480db4df3fae825ad800d0e3a175b29ed
--- /dev/null
+++ b/dmtree/tr181/interfacestack.c
@@ -0,0 +1,534 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*      Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*/
+
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "dmubus.h"
+#include "dmjson.h"
+#include "dmentry.h"
+#include "interfacestack.h"
+
+/* *** Device.InterfaceStack.{i}. *** */
+DMLEAF tInterfaceStackParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_InterfaceStack_Alias, set_InterfaceStack_Alias, NULL, NULL, BBFDM_BOTH},
+{"HigherLayer", &DMREAD, DMT_STRING, get_InterfaceStack_HigherLayer, NULL, NULL, NULL, BBFDM_BOTH},
+{"LowerLayer", &DMREAD, DMT_STRING, get_InterfaceStack_LowerLayer, NULL, NULL, NULL, BBFDM_BOTH},
+{"HigherAlias", &DMREAD, DMT_STRING, get_InterfaceStack_HigherAlias, NULL, NULL, NULL, BBFDM_BOTH},
+{"LowerAlias", &DMREAD, DMT_STRING, get_InterfaceStack_LowerAlias, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*************************************************************
+ * ENTRY METHOD
+/*************************************************************/
+static char *get_instance_by_section(struct dmctx *dmctx, int mode, char *dmmap_config, char *section, struct uci_section *s, char *instance_option, char *alias_option)
+{
+	struct uci_section *dmmap_section;
+	char *instance;
+
+	get_dmmap_section_of_config_section(dmmap_config, section, section_name(s), &dmmap_section);
+	if(dmmap_section == NULL) {
+		return "";
+	}
+
+	if (mode == INSTANCE_MODE_NUMBER) {
+		dmuci_get_value_by_section_string(dmmap_section, instance_option, &instance);
+	}
+	else {
+		dmuci_get_value_by_section_string(dmmap_section, alias_option, &instance);
+	}
+	return instance;
+}
+
+static char *get_alias_by_section(char *dmmap_config, char *section, struct uci_section *s, char *alias_option)
+{
+	struct uci_section *dmmap_section;
+	char *alias;
+
+	get_dmmap_section_of_config_section(dmmap_config, section, section_name(s), &dmmap_section);
+	if(dmmap_section == NULL) {
+		return "";
+	}
+	dmuci_get_value_by_section_string(dmmap_section, alias_option, &alias);
+	return alias;
+}
+
+static struct uci_section *create_dmmap_interface_stack_section(char *curr_inst)
+{
+	struct uci_section *s = NULL;
+	char *name;
+
+	check_create_dmmap_package("dmmap_interface_stack");
+	uci_path_foreach_option_eq(icwmpd, "dmmap_interface_stack", "interface_stack", "interface_stack_instance", curr_inst, s) {
+		return s;
+	}
+	if (!s) {
+		DMUCI_ADD_SECTION(icwmpd, "dmmap_interface_stack", "interface_stack", &s, &name);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "interface_stack_instance", curr_inst);
+	}
+	return s;
+}
+
+int browseInterfaceStackInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct interfacestack_data ifdata = {0};
+	struct uci_section *s = NULL, *sd = NULL, *port, *port_s, *ss, *dmmap_s = NULL;
+	char *proto, *type, *pch, *spch, *layer_inst, *v, *vb, *higheralias, *loweralias, *ifname, *br_inst, *mg, *value, *p, *device, *name;
+	char *interface_stack_int = NULL, *interface_stack_int_last = NULL, *wanifname, *wanlinker, *mac, *vlan_method, *sectionname, *package, *section;
+	char buf_lowerlayer[128] = "";
+	char buf_higherlayer[128] = "";
+	char buf_higheralias[64] = "";
+	char buf_loweralias[64] = "";
+	char buf_instance[32] = "";
+	char linker[64] = "";
+	char buf_tmp[64] = "";
+	int instance = 0, found = 0;
+	json_object *jobj;
+
+	/* Higher layers are Device.IP.Interface.{i}. */
+	uci_foreach_sections("network", "interface", s) {
+		dmuci_get_value_by_section_string(s, "type", &type);
+		if (strcmp(type, "alias") == 0 || strcmp(section_name(s), "loopback")==0)
+			continue;
+		layer_inst = get_instance_by_section(dmctx, dmctx->instance_mode, "dmmap_network", "interface", s, "ip_int_instance", "ip_int_alias");
+		if (*layer_inst == '\0')
+			continue;
+		sprintf(buf_higherlayer, "Device.IP.Interface.%s.", layer_inst);
+		higheralias = get_alias_by_section("dmmap_network", "interface", s, "ip_int_alias");
+		sprintf(buf_higheralias, "%s", higheralias);
+		dmuci_get_value_by_section_string(s, "proto", &proto);
+		if (strstr(proto, "ppp")) {
+			layer_inst = get_instance_by_section(dmctx, dmctx->instance_mode, "dmmap_network", "interface", s, "ppp_int_instance", "ppp_int_alias");
+			if (*layer_inst == '\0')
+				continue;
+			sprintf(buf_lowerlayer, "Device.PPP.Interface.%s.", layer_inst);
+			loweralias = get_alias_by_section("dmmap_network", "interface", s, "ppp_int_alias");
+			sprintf(buf_loweralias, "%s", loweralias);
+		}
+		else {
+			device = get_device(section_name(s));
+			if (device[0] != '\0') {
+				adm_entry_get_linker_param(dmctx, dm_print_path("%s%cEthernet%cVLANTermination%c", dmroot, dm_delim, dm_delim, dm_delim), device, &v);
+				dmuci_get_option_value_string("cwmp", "cpe", "vlan_method", &vlan_method);
+				if(strcmp(vlan_method, "2") == 0)
+					loweralias = get_alias_by_section("dmmap_network", "device", s, "all_vlan_term_alias");
+				else
+					loweralias = get_alias_by_section("dmmap_network", "device", s, "vlan_term_alias");
+				if (v != NULL)
+					found = 1;
+			}
+			mac = get_macaddr(section_name(s));
+			if (mac[0] != '\0' && found == 0) {
+				adm_entry_get_linker_param(dmctx, dm_print_path("%s%cEthernet%cLink%c", dmroot, dm_delim, dm_delim, dm_delim), mac, &v);
+				loweralias = get_alias_by_section("dmmap", "link", s, "link_alias");
+				if (v == NULL)
+					v = "";
+			}
+			sprintf(buf_lowerlayer, "%s", v);
+			sprintf(buf_loweralias, "%s", loweralias);
+		}
+		ifdata.higherlayer = buf_higherlayer;
+		ifdata.lowerlayer = buf_lowerlayer;
+		ifdata.higheralias = buf_higheralias;
+		ifdata.loweralias = buf_loweralias;
+		sprintf(buf_instance, "%d", ++instance);
+		dmmap_s = create_dmmap_interface_stack_section(buf_instance);
+		interface_stack_int = handle_update_instance(1, dmctx, &interface_stack_int_last, update_instance_alias, 3, dmmap_s, "interface_stack_instance", "interface_stack_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&ifdata, interface_stack_int) == DM_STOP)
+			goto end;
+	}
+
+	/* Higher layers are Device.PPP.Interface.{i}. */
+	uci_foreach_sections("network", "interface", s) {
+		dmuci_get_value_by_section_string(s, "proto", &proto);
+		if (!strstr(proto, "ppp"))
+			continue;
+		layer_inst = get_instance_by_section(dmctx, dmctx->instance_mode, "dmmap_network", "interface", s, "ppp_int_instance", "ppp_int_alias");
+		if (*layer_inst == '\0')
+			continue;
+		sprintf(buf_higherlayer, "Device.PPP.Interface.%s.", layer_inst);
+		higheralias = get_alias_by_section("dmmap_network", "interface", s, "ppp_int_alias");
+		sprintf(buf_higheralias, "%s", higheralias);
+		found = 0;
+		device = get_device(section_name(s));
+		if (device[0] != '\0') {
+			adm_entry_get_linker_param(dmctx, dm_print_path("%s%cEthernet%cVLANTermination%c", dmroot, dm_delim, dm_delim, dm_delim), device, &v);
+			dmuci_get_option_value_string("cwmp", "cpe", "vlan_method", &vlan_method);
+			if(strcmp(vlan_method, "2") == 0)
+				loweralias = get_alias_by_section("dmmap_network", "device", s, "all_vlan_term_alias");
+			else
+				loweralias = get_alias_by_section("dmmap_network", "device", s, "vlan_term_alias");
+			if (v != NULL)
+				found = 1;
+		}
+		mac = get_macaddr(section_name(s));
+		if (mac[0] != '\0' && found == 0) {
+			adm_entry_get_linker_param(dmctx, dm_print_path("%s%cEthernet%cLink%c", dmroot, dm_delim, dm_delim, dm_delim), mac, &v);
+			loweralias = get_alias_by_section("dmmap", "link", s, "link_alias");
+			if (v == NULL)
+				v = "";
+		}
+		sprintf(buf_lowerlayer, "%s", v);
+		sprintf(buf_loweralias, "%s", loweralias);
+		ifdata.higherlayer = buf_higherlayer;
+		ifdata.lowerlayer = buf_lowerlayer;
+		ifdata.higheralias = buf_higheralias;
+		ifdata.loweralias = buf_loweralias;
+		sprintf(buf_instance, "%d", ++instance);
+		dmmap_s = create_dmmap_interface_stack_section(buf_instance);
+		interface_stack_int = handle_update_instance(1, dmctx, &interface_stack_int_last, update_instance_alias, 3, dmmap_s, "interface_stack_instance", "interface_stack_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&ifdata, interface_stack_int) == DM_STOP)
+			goto end;
+	}
+
+	/* Higher layers are Device.Ethernet.VLANTermination.{i}. */
+	uci_foreach_sections("network", "device", s) {
+		dmuci_get_value_by_section_string(s, "type", &type);
+		dmuci_get_option_value_string("cwmp", "cpe", "vlan_method", &vlan_method);
+		if ((strcmp(vlan_method, "2") != 0 && strcmp(vlan_method, "1") != 0) || (strcmp(vlan_method, "1") == 0 && strcmp(type, "untagged") == 0) )
+			continue;
+		if(strcmp(vlan_method, "2") == 0)
+			layer_inst = get_instance_by_section(dmctx, dmctx->instance_mode, "dmmap_network", "device", s, "all_vlan_term_instance", "all_vlan_term_alias");
+		else
+			layer_inst = get_instance_by_section(dmctx, dmctx->instance_mode, "dmmap_network", "device", s, "only_tagged_vlan_term_instance", "vlan_term_alias");
+		if (*layer_inst == '\0')
+			continue;
+		sprintf(buf_higherlayer, "Device.Ethernet.VLANTermination.%s.", layer_inst);
+		if(strcmp(vlan_method, "2") == 0)
+			higheralias = get_alias_by_section("dmmap_network", "device", s, "all_vlan_term_alias");
+		else
+			higheralias = get_alias_by_section("dmmap_network", "device", s, "vlan_term_alias");
+		sprintf(buf_higheralias, "%s", higheralias);
+
+		dmuci_get_value_by_section_string(s, "name", &value);
+		uci_foreach_sections("network", "interface", ss) {
+			dmuci_get_value_by_section_string(ss, "ifname", &ifname);
+			for (pch = strtok_r(ifname, " ", &spch); pch != NULL; pch = strtok_r(NULL, " ", &spch)) {
+				if(strcmp(pch, value) == 0) {
+					mac = get_macaddr(section_name(ss));
+					if (mac[0] != '\0') {
+						adm_entry_get_linker_param(dmctx, dm_print_path("%s%cEthernet%cLink%c", dmroot, dm_delim, dm_delim, dm_delim), mac, &v);
+						loweralias = get_alias_by_section("dmmap", "link", ss, "link_alias");
+						if (v == NULL)
+							v = "";
+						break;
+					}
+				}
+			}
+		}
+		sprintf(buf_lowerlayer, "%s", v);
+		sprintf(buf_loweralias, "%s", loweralias);
+		ifdata.higherlayer = buf_higherlayer;
+		ifdata.lowerlayer = buf_lowerlayer;
+		ifdata.higheralias = buf_higheralias;
+		ifdata.loweralias = buf_loweralias;
+		sprintf(buf_instance, "%d", ++instance);
+		dmmap_s = create_dmmap_interface_stack_section(buf_instance);
+		interface_stack_int = handle_update_instance(1, dmctx, &interface_stack_int_last, update_instance_alias, 3, dmmap_s, "interface_stack_instance", "interface_stack_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&ifdata, interface_stack_int) == DM_STOP)
+			goto end;
+	}
+
+	/* Higher layers are Device.Ethernet.Link.{i}. */
+	uci_foreach_sections("network", "interface", s) {
+		dmuci_get_value_by_section_string(s, "type", &type);
+		if (strcmp(type, "alias") == 0 || strcmp(section_name(s), "loopback")==0)
+			continue;
+		dmuci_get_value_by_section_string(s, "ifname", &ifname);
+		if (*ifname == '\0' || *ifname == '@')
+			continue;
+		layer_inst = get_instance_by_section(dmctx, dmctx->instance_mode, "dmmap", "link", s, "link_instance", "link_alias");
+		if (*layer_inst == '\0')
+			continue;
+		sprintf(buf_higherlayer, "Device.Ethernet.Link.%s.", layer_inst);
+		higheralias = get_alias_by_section("dmmap", "link", s, "link_alias");
+		sprintf(buf_higheralias, "%s", higheralias);
+		if (strcmp(type, "bridge") == 0) {
+			br_inst = get_alias_by_section("dmmap_network", "interface", s, "bridge_instance");
+			uci_path_foreach_option_eq(icwmpd, "dmmap_bridge_port", "bridge_port", "bridge_key", br_inst, port) {
+				dmuci_get_value_by_section_string(port, "mg_port", &mg);
+				if (strcmp(mg, "true") == 0) {
+					sprintf(linker, "%s+", section_name(port));
+					adm_entry_get_linker_param(dmctx, dm_print_path("%s%cBridging%cBridge%c", dmroot, dm_delim, dm_delim, dm_delim), linker, &v);
+					dmuci_get_value_by_section_string(port, "bridge_port_alias", &loweralias);
+					break;
+				}
+			}
+		} else {
+			uci_foreach_option_eq("ports", "ethport", "name", "WAN", port_s) {
+				dmuci_get_value_by_section_string(port_s, "ifname", &wanifname);
+				if(strstr(ifname, wanifname)) {
+					dmasprintf(&wanlinker, "%s.1", wanifname);
+					adm_entry_get_linker_param(dmctx, dm_print_path("%s%cEthernet%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), wanlinker, &v);
+					dmfree(wanlinker);
+					loweralias = get_alias_by_section("dmmap_ports", "ethport", port_s, "eth_port_alias");
+					break;
+				}
+			}
+		}
+		if (v == NULL)
+			v = "";
+		sprintf(buf_loweralias, "%s", loweralias);
+		ifdata.higherlayer = buf_higherlayer;
+		ifdata.lowerlayer = v;
+		ifdata.higheralias = buf_higheralias;
+		ifdata.loweralias = buf_loweralias;
+		sprintf(buf_instance, "%d", ++instance);
+		dmmap_s = create_dmmap_interface_stack_section(buf_instance);
+		interface_stack_int = handle_update_instance(1, dmctx, &interface_stack_int_last, update_instance_alias, 3, dmmap_s, "interface_stack_instance", "interface_stack_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&ifdata, interface_stack_int) == DM_STOP)
+			goto end;
+	}
+
+	/* Higher layers are Device.Bridging.Bridge.{i}.Port.{i}.*/
+	uci_foreach_sections("network", "interface", s) {
+		dmuci_get_value_by_section_string(s, "type", &type);
+		if (strcmp(type, "bridge") != 0)
+			continue;
+		br_inst = get_instance_by_section(dmctx, dmctx->instance_mode, "dmmap_network", "interface", s, "bridge_instance", "bridge_alias");
+		if (*br_inst == '\0')
+			continue;
+		uci_path_foreach_option_eq(icwmpd, "dmmap_bridge_port", "bridge_port", "bridge_key", br_inst, port) {
+			dmuci_get_value_by_section_string(port, "mg_port", &mg);
+			if (strcmp(mg, "true") == 0) {
+				sprintf(linker, "%s+", section_name(port));
+				adm_entry_get_linker_param(dmctx, dm_print_path("%s%cBridging%cBridge%c", dmroot, dm_delim, dm_delim, dm_delim), linker, &pch);
+				dmuci_get_value_by_section_string(port, "bridge_port_alias", &higheralias);
+				sprintf(buf_tmp, "%s", higheralias);
+				if (pch == NULL)
+					pch = "";
+				break;
+			}
+		}
+
+		uci_path_foreach_option_eq(icwmpd, "dmmap_bridge_port", "bridge_port", "bridge_key", br_inst, sd) {
+			dmuci_get_value_by_section_string(sd, "mg_port", &mg);
+			if (strcmp(mg, "true") == 0)
+				continue;
+
+			dmuci_get_value_by_section_string(sd, "section_name", &sectionname);
+			dmuci_get_value_by_section_string(sd, "package", &package);
+			dmuci_get_value_by_section_string(sd, "section", &section);
+
+			uci_foreach_sections(package, section, port_s) {
+				if(strcmp(section_name(port_s), sectionname) == 0) {
+					dmuci_get_value_by_section_string(port_s, "ifname", &ifname);
+					dmuci_get_value_by_section_string(port_s, "name", &name);
+					break;
+				}
+			}
+			if(strcmp(package, "network") == 0 && strcmp(section, "device") == 0)
+				sprintf(linker, "%s+%s", sectionname, name);
+			else
+				sprintf(linker, "%s+%s", sectionname, ifname);
+			adm_entry_get_linker_param(dmctx, dm_print_path("%s%cBridging%cBridge%c", dmroot, dm_delim, dm_delim, dm_delim), linker, &vb);
+			if (vb == NULL)
+				vb = "";
+			dmuci_get_value_by_section_string(sd, "bridge_port_alias", &loweralias);
+			sprintf(buf_loweralias, "%s", loweralias);
+
+			ifdata.higherlayer = pch;
+			ifdata.lowerlayer = vb;
+			ifdata.higheralias = buf_tmp;
+			ifdata.loweralias = buf_loweralias;
+			sprintf(buf_instance, "%d", ++instance);
+			dmmap_s = create_dmmap_interface_stack_section(buf_instance);
+			interface_stack_int = handle_update_instance(1, dmctx, &interface_stack_int_last, update_instance_alias, 3, dmmap_s, "interface_stack_instance", "interface_stack_alias");
+			if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&ifdata, interface_stack_int) == DM_STOP)
+				goto end;
+
+			sprintf(buf_higheralias, "%s", loweralias);
+			if(strcmp(package, "ports") == 0) {
+				adm_entry_get_linker_param(dmctx, dm_print_path("%s%cEthernet%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), ifname, &v);
+				loweralias = get_alias_by_section("dmmap_ports", "ethport", port_s, "eth_port_alias");
+			} else if(strcmp(package, "wireless") == 0) {
+				adm_entry_get_linker_param(dmctx,dm_print_path("%s%cWiFi%cSSID%c", dmroot, dm_delim, dm_delim, dm_delim), ifname, &v);
+				loweralias = get_alias_by_section("dmmap_wireless", "wifi-iface", port_s, "ssidalias");
+			}	else if(strcmp(package, "network") == 0) {
+				if(strstr(ifname, "atm")) {
+					adm_entry_get_linker_param(dmctx,dm_print_path("%s%cATM%cLink%c", dmroot, dm_delim, dm_delim, dm_delim), ifname, &v);
+					uci_foreach_sections("dsl", "atm-device", ss) {
+						if(strcmp(section_name(ss), ifname) == 0) {
+							loweralias = get_alias_by_section("dmmap_dsl", "atm-device", ss, "atmlinkalias");
+							break;
+						}
+					}
+				} else if(strstr(ifname, "ptm")) {
+					adm_entry_get_linker_param(dmctx,dm_print_path("%s%cPTM%cLink%c", dmroot, dm_delim, dm_delim, dm_delim), ifname, &v);
+					uci_foreach_sections("dsl", "ptm-device", ss) {
+						if(strcmp(section_name(ss), ifname) == 0) {
+							loweralias = get_alias_by_section("dmmap_dsl", "ptm-device", ss, "ptmlinkalias");
+							break;
+						}
+					}
+				} else {
+					sprintf(linker, "%s.1", ifname);
+					adm_entry_get_linker_param(dmctx,dm_print_path("%s%cEthernet%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), linker, &v);
+					loweralias = get_alias_by_section("dmmap_ports", "ethport", port_s, "eth_port_alias");
+				}
+			}
+			sprintf(buf_loweralias, "%s", loweralias);
+			if (v == NULL)
+				v = "";
+			ifdata.higherlayer = vb;
+			ifdata.lowerlayer = v;
+			ifdata.higheralias = buf_higheralias;
+			ifdata.loweralias = buf_loweralias;
+			sprintf(buf_instance, "%d", ++instance);
+			dmmap_s = create_dmmap_interface_stack_section(buf_instance);
+			interface_stack_int = handle_update_instance(1, dmctx, &interface_stack_int_last, update_instance_alias, 3, dmmap_s, "interface_stack_instance", "interface_stack_alias");
+			if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&ifdata, interface_stack_int) == DM_STOP)
+				goto end;
+
+			if(strcmp(package, "wireless") == 0) {
+				sprintf(buf_higheralias, "%s", loweralias);
+				uci_foreach_option_eq("wireless", "wifi-iface", "ifname", ifname, ss) {
+					dmuci_get_value_by_section_string(ss, "device", &device);
+				}
+				if (device[0] != '\0') {
+					adm_entry_get_linker_param(dmctx, dm_print_path("%s%cWiFi%cRadio%c", dmroot, dm_delim, dm_delim, dm_delim), device, &vb);
+					uci_foreach_sections("wireless", "wifi-device", ss) {
+						if(strcmp(section_name(ss), device) == 0) {
+							loweralias = get_alias_by_section("dmmap_wireless", "wifi-device", ss, "radioalias");
+							break;
+						}
+					}
+				}
+				if (vb == NULL)
+					vb = "";
+				sprintf(buf_loweralias, "%s", loweralias);
+				ifdata.higherlayer = v;
+				ifdata.lowerlayer = vb;
+				ifdata.higheralias = buf_higheralias;
+				ifdata.loweralias = buf_loweralias;
+				sprintf(buf_instance, "%d", ++instance);
+				dmmap_s = create_dmmap_interface_stack_section(buf_instance);
+				interface_stack_int = handle_update_instance(1, dmctx, &interface_stack_int_last, update_instance_alias, 3, dmmap_s, "interface_stack_instance", "interface_stack_alias");
+				if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&ifdata, interface_stack_int) == DM_STOP)
+					goto end;
+			}
+
+			if(strcmp(package, "network") == 0) {
+				if(strstr(ifname, "atm") || strstr(ifname, "ptm")) {
+					sprintf(buf_higheralias, "%s", loweralias);
+					char *link_channel = "channel_0";
+					adm_entry_get_linker_param(dmctx, dm_print_path("%s%cDSL%cChannel%c", dmroot, dm_delim, dm_delim, dm_delim), link_channel, &vb);
+					if (vb == NULL)
+						vb = "";
+					uci_path_foreach_sections(icwmpd, "dmmap", "dsl_channel", ss) {
+						dmuci_get_value_by_section_string(ss, "dsl_channel_alias", &loweralias);
+					}
+					sprintf(buf_loweralias, "%s", loweralias);
+					ifdata.higherlayer = v;
+					ifdata.lowerlayer = vb;
+					ifdata.higheralias = buf_higheralias;
+					ifdata.loweralias = buf_loweralias;
+					sprintf(buf_instance, "%d", ++instance);
+					dmmap_s = create_dmmap_interface_stack_section(buf_instance);
+					interface_stack_int = handle_update_instance(1, dmctx, &interface_stack_int_last, update_instance_alias, 3, dmmap_s, "interface_stack_instance", "interface_stack_alias");
+					if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&ifdata, interface_stack_int) == DM_STOP)
+						goto end;
+
+					sprintf(buf_higheralias, "%s", loweralias);
+					char *link_line = "line_0";
+					adm_entry_get_linker_param(dmctx, dm_print_path("%s%cDSL%cLine%c", dmroot, dm_delim, dm_delim, dm_delim), link_line, &value);
+					if (value == NULL)
+						value = "";
+					uci_path_foreach_sections(icwmpd, "dmmap", "dsl_line", ss) {
+						dmuci_get_value_by_section_string(ss, "dsl_line_alias", &loweralias);
+					}
+					sprintf(buf_loweralias, "%s", loweralias);
+					ifdata.higherlayer = vb;
+					ifdata.lowerlayer = value;
+					ifdata.higheralias = buf_higheralias;
+					ifdata.loweralias = buf_loweralias;
+					sprintf(buf_instance, "%d", ++instance);
+					dmmap_s = create_dmmap_interface_stack_section(buf_instance);
+					interface_stack_int = handle_update_instance(1, dmctx, &interface_stack_int_last, update_instance_alias, 3, dmmap_s, "interface_stack_instance", "interface_stack_alias");
+					if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&ifdata, interface_stack_int) == DM_STOP)
+						goto end;
+				}
+			}
+		}
+	}
+
+end:
+	return 0;
+}
+
+/*************************************************************
+ * GET & SET PARAM
+/*************************************************************/
+int get_Device_InterfaceStackNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	uci_path_foreach_sections(icwmpd, "dmmap_interface_stack", "interface_stack", s)
+	{
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+int get_InterfaceStack_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	uci_path_foreach_option_eq(icwmpd, "dmmap_interface_stack", "interface_stack", "interface_stack_instance", instance, s) {
+		dmuci_get_value_by_section_string(s, "interface_stack_alias", value);
+	}
+	return 0;
+}
+
+int set_InterfaceStack_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *s = NULL;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			uci_path_foreach_option_eq(icwmpd, "dmmap_interface_stack", "interface_stack", "interface_stack_instance", instance, s) {
+				dmuci_set_value_by_section(s, "interface_stack_alias", value);
+			}
+			break;
+	}
+	return 0;
+}
+
+int get_InterfaceStack_HigherLayer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct interfacestack_data *ifdata = (struct interfacestack_data *) data;
+	*value = dmstrdup(ifdata->higherlayer);
+	return 0;
+}
+
+int get_InterfaceStack_LowerLayer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct interfacestack_data *ifdata = (struct interfacestack_data *) data;
+	*value = dmstrdup(ifdata->lowerlayer);
+	return 0;
+}
+
+int get_InterfaceStack_HigherAlias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct interfacestack_data *ifdata = (struct interfacestack_data *) data;
+	*value = dmstrdup(ifdata->higheralias);
+	return 0;
+}
+
+int get_InterfaceStack_LowerAlias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct interfacestack_data *ifdata = (struct interfacestack_data *) data;
+	*value = dmstrdup(ifdata->loweralias);
+	return 0;
+}
diff --git a/dmtree/tr181/interfacestack.h b/dmtree/tr181/interfacestack.h
new file mode 100644
index 0000000000000000000000000000000000000000..112a1befef4e00e18516631de1ef7dd663f71e97
--- /dev/null
+++ b/dmtree/tr181/interfacestack.h
@@ -0,0 +1,34 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*      Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*/
+
+#ifndef __INTERFACESTACK_H
+#define __INTERFACESTACK_H
+
+extern DMLEAF tInterfaceStackParams[];
+
+struct interfacestack_data {
+	char *lowerlayer;
+	char *higherlayer;
+	char *loweralias;
+	char *higheralias;
+};
+
+int browseInterfaceStackInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int get_Device_InterfaceStackNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_InterfaceStack_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_InterfaceStack_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_InterfaceStack_HigherLayer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_InterfaceStack_LowerLayer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_InterfaceStack_HigherAlias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_InterfaceStack_LowerAlias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+#endif //__INTERFACESTACK_H
diff --git a/dmtree/tr181/ip.c b/dmtree/tr181/ip.c
new file mode 100644
index 0000000000000000000000000000000000000000..3263a19aa342447dc4394df5c6a2a5a7c96b58c4
--- /dev/null
+++ b/dmtree/tr181/ip.c
@@ -0,0 +1,2017 @@
+/*
+*	This program is free software: you can redistribute it and/or modify
+*	it under the terms of the GNU General Public License as published by
+*	the Free Software Foundation, either version 2 of the License, or
+*	(at your option) any later version.
+*
+*	Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*
+*/
+
+#include <uci.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "ip.h"
+#include "dmjson.h"
+#include "dmentry.h"
+#ifdef BBF_TR143
+#include "diagnostics.h"
+#endif
+
+struct dm_forced_inform_s IPv4INFRM = {0, get_ipv4_finform};
+struct dm_forced_inform_s IPv6INFRM = {0, get_ipv6_finform};
+
+/* *** Device.IP. *** */
+DMOBJ tIPObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Interface", &DMWRITE, add_ip_interface, delete_ip_interface, NULL, browseIPIfaceInst, NULL, NULL, tInterfaceObj, tIPintParams, get_linker_ip_interface, BBFDM_BOTH},
+#ifdef BBF_TR143
+{"Diagnostics", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tIPDiagnosticsObj, tIPDiagnosticsParams, NULL, BBFDM_BOTH},
+#endif
+{0}
+};
+
+DMLEAF tIPParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"IPv4Capable", &DMREAD, DMT_BOOL, get_IP_IPv4Capable, NULL, NULL, NULL, BBFDM_BOTH},
+{"IPv4Enable", &DMWRITE, DMT_BOOL, get_IP_IPv4Enable, set_IP_IPv4Enable, NULL, NULL, BBFDM_BOTH},
+{"IPv4Status", &DMREAD, DMT_STRING, get_IP_IPv4Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"IPv6Capable", &DMREAD, DMT_BOOL, get_IP_IPv6Capable, NULL, NULL, NULL, BBFDM_BOTH},
+{"IPv6Enable", &DMWRITE, DMT_BOOL, get_IP_IPv6Enable, set_IP_IPv6Enable, NULL, NULL, BBFDM_BOTH},
+{"IPv6Status", &DMREAD, DMT_STRING, get_IP_IPv6Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"ULAPrefix", &DMWRITE, DMT_STRING, get_IP_ULAPrefix, set_IP_ULAPrefix, NULL, NULL, BBFDM_BOTH},
+{"InterfaceNumberOfEntries", &DMREAD, DMT_UNINT, get_IP_InterfaceNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.IP.Interface. *** */
+DMOBJ tInterfaceObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"IPv4Address", &DMWRITE, add_ipv4, delete_ipv4, NULL, browseIfaceIPv4Inst, NULL, NULL, NULL, tIPv4Params, NULL, BBFDM_BOTH},
+{"IPv6Address", &DMWRITE, add_ipv6, delete_ipv6, NULL, browseIfaceIPv6Inst, NULL, NULL, NULL, tIPv6Params, NULL, BBFDM_BOTH},
+{"IPv6Prefix", &DMWRITE, add_ipv6_prefix, delete_ipv6_prefix, NULL, browseIfaceIPv6PrefixInst, NULL, NULL, NULL, tIPv6PrefixParams, get_linker_ipv6_prefix, BBFDM_BOTH},
+{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tIPInterfaceStatsParams, NULL, BBFDM_BOTH},
+{"TWAMPReflector", &DMWRITE, addObjIPInterfaceTWAMPReflector, delObjIPInterfaceTWAMPReflector, NULL, browseIPInterfaceTWAMPReflectorInst, NULL, NULL, NULL, tIPInterfaceTWAMPReflectorParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tIPintParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_IPInterface_Enable, set_IPInterface_Enable, NULL, NULL, BBFDM_BOTH},
+{"IPv4Enable", &DMWRITE, DMT_BOOL, get_IPInterface_IPv4Enable, set_IPInterface_IPv4Enable, NULL, NULL, BBFDM_BOTH},
+{"IPv6Enable", &DMWRITE, DMT_BOOL, get_IPInterface_IPv6Enable, set_IPInterface_IPv6Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_IPInterface_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_IPInterface_Alias, set_IPInterface_Alias, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMREAD, DMT_STRING, get_IPInterface_Name, NULL, NULL, NULL, BBFDM_BOTH},
+{"LastChange", &DMREAD, DMT_UNINT, get_IPInterface_LastChange, NULL, NULL, NULL, BBFDM_BOTH},
+{"LowerLayers", &DMWRITE, DMT_STRING, get_IPInterface_LowerLayers, set_IPInterface_LowerLayers, NULL, NULL, BBFDM_BOTH},
+{"Router", &DMWRITE, DMT_STRING, get_IPInterface_Router, set_IPInterface_Router, NULL, NULL, BBFDM_BOTH},
+{"Reset", &DMWRITE, DMT_BOOL, get_IPInterface_Reset, set_IPInterface_Reset, NULL, NULL, BBFDM_BOTH},
+{"MaxMTUSize", &DMWRITE, DMT_UNINT, get_IPInterface_MaxMTUSize, set_IPInterface_MaxMTUSize, NULL, NULL, BBFDM_BOTH},
+{"Type", &DMREAD, DMT_STRING, get_IPInterface_Type, NULL, NULL, NULL, BBFDM_BOTH},
+{"Loopback", &DMWRITE, DMT_BOOL, get_IPInterface_Loopback, set_IPInterface_Loopback, NULL, NULL, BBFDM_BOTH},
+{"IPv4AddressNumberOfEntries", &DMREAD, DMT_UNINT, get_IPInterface_IPv4AddressNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"IPv6AddressNumberOfEntries", &DMREAD, DMT_UNINT, get_IPInterface_IPv6AddressNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"IPv6PrefixNumberOfEntries", &DMREAD, DMT_UNINT, get_IPInterface_IPv6PrefixNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"TWAMPReflectorNumberOfEntries", &DMREAD, DMT_UNINT, get_IPInterface_TWAMPReflectorNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.IP.Interface.{i}.IPv4Address.{i}. *** */
+DMLEAF tIPv4Params[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_IPInterface_Enable, set_IPInterface_Enable, &IPv4INFRM, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_IPInterface_Status, NULL, &IPv4INFRM, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_ipv4_alias, set_ipv4_alias, &IPv4INFRM, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"FirewallEnabled", &DMWRITE, DMT_BOOL, get_firewall_enabled, set_firewall_enabled, &IPv4INFRM, NULL, BBFDM_BOTH},
+{"IPAddress", &DMWRITE, DMT_STRING, get_ipv4_address, set_ipv4_address, &IPv4INFRM, NULL, BBFDM_BOTH},
+{"SubnetMask", &DMWRITE, DMT_STRING, get_ipv4_netmask, set_ipv4_netmask, &IPv4INFRM, NULL, BBFDM_BOTH},
+{"AddressingType", &DMWRITE, DMT_STRING, get_ipv4_addressing_type, set_ipv4_addressing_type, &IPv4INFRM, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.IP.Interface.{i}.IPv6Address.{i}. *** */
+DMLEAF tIPv6Params[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_IPInterfaceIPv6Address_Enable, set_IPInterfaceIPv6Address_Enable, &IPv6INFRM, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_IPInterfaceIPv6Address_Status, NULL, &IPv6INFRM, NULL, BBFDM_BOTH},
+{"IPAddressStatus", &DMREAD, DMT_STRING, get_IPInterfaceIPv6Address_IPAddressStatus, NULL, &IPv6INFRM, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Address_Alias, set_IPInterfaceIPv6Address_Alias, &IPv6INFRM, NULL, BBFDM_BOTH},
+{"IPAddress", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Address_IPAddress, set_IPInterfaceIPv6Address_IPAddress, &IPv6INFRM, NULL, BBFDM_BOTH},
+{"Origin", &DMREAD, DMT_STRING, get_IPInterfaceIPv6Address_Origin, NULL, &IPv6INFRM, NULL, BBFDM_BOTH},
+{"Prefix", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Address_Prefix, set_IPInterfaceIPv6Address_Prefix, &IPv6INFRM, NULL, BBFDM_BOTH},
+{"PreferredLifetime", &DMWRITE, DMT_TIME, get_IPInterfaceIPv6Address_PreferredLifetime, set_IPInterfaceIPv6Address_PreferredLifetime, &IPv6INFRM, NULL, BBFDM_BOTH},
+{"ValidLifetime", &DMWRITE, DMT_TIME, get_IPInterfaceIPv6Address_ValidLifetime, set_IPInterfaceIPv6Address_ValidLifetime, &IPv6INFRM, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.IP.Interface.{i}.IPv6Prefix.{i}. *** */
+DMLEAF tIPv6PrefixParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_IPInterfaceIPv6Prefix_Enable, set_IPInterfaceIPv6Prefix_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_IPInterfaceIPv6Prefix_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"PrefixStatus", &DMREAD, DMT_STRING, get_IPInterfaceIPv6Prefix_PrefixStatus, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Prefix_Alias, set_IPInterfaceIPv6Prefix_Alias, NULL, NULL, BBFDM_BOTH},
+{"Prefix", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Prefix_Prefix, set_IPInterfaceIPv6Prefix_Prefix, NULL, NULL, BBFDM_BOTH},
+{"Origin", &DMREAD, DMT_STRING, get_IPInterfaceIPv6Prefix_Origin, NULL, NULL, NULL, BBFDM_BOTH},
+{"StaticType", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Prefix_StaticType, set_IPInterfaceIPv6Prefix_StaticType, NULL, NULL, BBFDM_BOTH},
+{"ParentPrefix", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Prefix_ParentPrefix, set_IPInterfaceIPv6Prefix_ParentPrefix, NULL, NULL, BBFDM_BOTH},
+{"ChildPrefixBits", &DMWRITE, DMT_STRING, get_IPInterfaceIPv6Prefix_ChildPrefixBits, set_IPInterfaceIPv6Prefix_ChildPrefixBits, NULL, NULL, BBFDM_BOTH},
+{"PreferredLifetime", &DMWRITE, DMT_TIME, get_IPInterfaceIPv6Prefix_PreferredLifetime, set_IPInterfaceIPv6Prefix_PreferredLifetime, NULL, NULL, BBFDM_BOTH},
+{"ValidLifetime", &DMWRITE, DMT_TIME, get_IPInterfaceIPv6Prefix_ValidLifetime, set_IPInterfaceIPv6Prefix_ValidLifetime, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.IP.Interface.{i}.Stats. *** */
+DMLEAF tIPInterfaceStatsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"BytesSent", &DMREAD, DMT_UNINT, get_ip_interface_statistics_tx_bytes, NULL, NULL, NULL, BBFDM_BOTH},
+{"BytesReceived", &DMREAD, DMT_UNINT, get_ip_interface_statistics_rx_bytes, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsSent", &DMREAD, DMT_UNINT, get_ip_interface_statistics_tx_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsReceived", &DMREAD, DMT_UNINT, get_ip_interface_statistics_rx_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsSent", &DMREAD, DMT_UNINT, get_ip_interface_statistics_tx_errors, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsReceived", &DMREAD, DMT_UNINT, get_ip_interface_statistics_rx_errors, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsSent", &DMREAD, DMT_UNINT, get_ip_interface_statistics_tx_discardpackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsReceived", &DMREAD, DMT_UNINT, get_ip_interface_statistics_rx_discardpackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnicastPacketsSent", &DMREAD, DMT_UNINT, get_ip_interface_statistics_tx_unicastpackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnicastPacketsReceived", &DMREAD, DMT_UNINT, get_ip_interface_statistics_rx_unicastpackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"MulticastPacketsSent", &DMREAD, DMT_UNINT, get_ip_interface_statistics_tx_multicastpackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"MulticastPacketsReceived", &DMREAD, DMT_UNINT, get_ip_interface_statistics_rx_multicastpackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"BroadcastPacketsSent", &DMREAD, DMT_UNINT, get_ip_interface_statistics_tx_broadcastpackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"BroadcastPacketsReceived", &DMREAD, DMT_UNINT, get_ip_interface_statistics_rx_broadcastpackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnknownProtoPacketsReceived", &DMREAD, DMT_UNINT, get_ip_interface_statistics_rx_unknownprotopackets, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.IP.Interface.{i}.TWAMPReflector.{i}. *** */
+DMLEAF tIPInterfaceTWAMPReflectorParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_IPInterfaceTWAMPReflector_Enable, set_IPInterfaceTWAMPReflector_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_IPInterfaceTWAMPReflector_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_IPInterfaceTWAMPReflector_Alias, set_IPInterfaceTWAMPReflector_Alias, NULL, NULL, BBFDM_BOTH},
+{"Port", &DMWRITE, DMT_UNINT, get_IPInterfaceTWAMPReflector_Port, set_IPInterfaceTWAMPReflector_Port, NULL, NULL, BBFDM_BOTH},
+{"MaximumTTL", &DMWRITE, DMT_UNINT, get_IPInterfaceTWAMPReflector_MaximumTTL, set_IPInterfaceTWAMPReflector_MaximumTTL, NULL, NULL, BBFDM_BOTH},
+{"IPAllowedList", &DMWRITE, DMT_STRING, get_IPInterfaceTWAMPReflector_IPAllowedList, set_IPInterfaceTWAMPReflector_IPAllowedList, NULL, NULL, BBFDM_BOTH},
+{"PortAllowedList", &DMWRITE, DMT_STRING, get_IPInterfaceTWAMPReflector_PortAllowedList, set_IPInterfaceTWAMPReflector_PortAllowedList, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+unsigned char get_ipv4_finform(char *refparam, struct dmctx *dmctx, void *data, char *instance)
+{
+	return 1;
+}
+
+unsigned char get_ipv6_finform(char *refparam, struct dmctx *dmctx, void *data, char *instance)
+{
+	return 1;
+}
+
+/*************************************************************
+ * INIT
+/*************************************************************/
+inline int init_ip_args(struct ip_args *args, struct uci_section *s, char *ip_4address)
+{
+	args->ip_sec = s;
+	args->ip_4address = ip_4address;
+	return 0;
+}
+
+inline int init_ipv6_args(struct ipv6_args *args, struct uci_section *s, char *ip_6address, char *ip_6mask, char *ip_6preferred, char *ip_6valid)
+{
+	args->ip_sec = s;
+	args->ip_6address = ip_6address;
+	args->ip_6mask = ip_6mask;
+	args->ip_6preferred = ip_6preferred;
+	args->ip_6valid = ip_6valid;
+	return 0;
+}
+
+inline int init_ipv6prefix_args(struct ipv6prefix_args *args, struct uci_section *s, char *ip_6prefixaddress, char *ip_6prefixmask, char *ip_6prefixpreferred, char *ip_6prefixvalid)
+{
+	args->ip_sec = s;
+	args->ip_6prefixaddress = ip_6prefixaddress;
+	args->ip_6prefixmask = ip_6prefixmask;
+	args->ip_6prefixpreferred = ip_6prefixpreferred;
+	args->ip_6prefixvalid = ip_6prefixvalid;
+	return 0;
+}
+
+/*************************************************************
+ * COMMON Functions
+/*************************************************************/
+static char *ubus_call_get_value_with_two_objects(char *interface, char *obj1, char *obj2, char *key)
+{
+	json_object *res, *jobj1, *jobj2;
+	char *value = "";
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", interface, String}}, 1, &res);
+	if (res)
+	{
+		jobj1 = dmjson_select_obj_in_array_idx(res, 0, 1, obj1);
+		if(jobj1)
+			jobj2 = dmjson_get_obj(jobj1, 1, obj2);
+		if(jobj2)
+			value = dmjson_get_value(jobj2, 1, key);
+	}
+	return value;
+}
+
+static char *ubus_call_get_value(char *interface, char *obj, char *key)
+{
+	json_object *res, *jobj;
+	char *value = "";
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", interface, String}}, 1, &res);
+	if (res)
+	{
+		jobj = dmjson_select_obj_in_array_idx(res, 0, 1, obj);
+		value = dmjson_get_value(jobj, 1, key);
+	}
+	return value;
+}
+
+static char *get_child_prefix_linker(char *interface)
+{
+	char *address = NULL, *mask = NULL, *value;
+	json_object *res, *jobj, *jobj1, *jobj2;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", interface, String}}, 1, &res);
+	if(res) {
+		jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv6-prefix");
+		if(jobj) {
+			jobj1 = dmjson_get_obj(jobj, 1, "assigned");
+			if(jobj1) {
+				jobj2 = dmjson_get_obj(jobj1, 1, "lan");
+				if(jobj2) {
+					address = dmjson_get_value(jobj2, 1, "address");
+					mask = dmjson_get_value(jobj2, 1, "mask");
+					dmasprintf(&value, "%s/%s", address,mask);
+					return value;
+				}
+			}
+		}
+	}
+	return "";
+}
+
+/*************************************************************
+ * GET & SET PARAM
+/*************************************************************/
+/*
+ * *** Device.IP. ***
+ */
+int get_IP_IPv4Capable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int get_IP_IPv4Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int set_IP_IPv4Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_IP_IPv4Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "Enabled";
+	return 0;
+}
+
+int get_IP_IPv6Capable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int get_IP_IPv6Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int set_IP_IPv6Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_IP_IPv6Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "Enabled";
+	return 0;
+}
+
+int get_IP_ULAPrefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("network", "globals", "ula_prefix", value);
+	return 0;
+}
+
+int set_IP_ULAPrefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value("network", "globals", "ula_prefix", value);
+			break;
+	}
+	return 0;
+}
+
+int get_IP_InterfaceNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	uci_foreach_sections("network", "interface", s) {
+		if (strcmp(section_name(s), "loopback") == 0)
+			continue;
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+/*
+ * *** Device.IP.Interface. ***
+ */
+/*#Device.IP.Interface.{i}.Enable!UCI:network/interface,@i-1/disabled*/
+int get_IPInterface_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *v;
+	dmuci_get_value_by_section_string(((struct ip_args *)data)->ip_sec, "disabled", &v);
+	*value = (*v != '1') ? "1" : "0";
+	return 0;
+}
+
+int set_IPInterface_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "disabled", (b) ? "0" : "1");
+			break;
+	}
+	return 0;
+}
+
+/*#Device.IP.Interface.{i}.Status!UCI:network/interface,@i-1/disabled*/
+int get_IPInterface_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	char *lan_name = section_name(((struct ip_args *)data)->ip_sec), *val= NULL;
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", lan_name, String}}, 1, &res);
+	val = dmjson_get_value(res, 1, "up");
+	*value = !strcmp(val, "true") ? "Up" : "Down";
+	return 0;
+}
+
+int get_IPInterface_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = dmstrdup(section_name(((struct ip_args *)data)->ip_sec));
+	return 0;
+}
+
+int get_IPInterface_IPv4Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int set_IPInterface_IPv4Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+/*#Device.IP.Interface.{i}.IPv6Enable!UCI:network/interface,@i-1/ipv6*/
+int get_IPInterface_IPv6Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *v;
+	dmuci_get_value_by_section_string(((struct ip_args *)data)->ip_sec, "ipv6", &v);
+	*value = (*v != '0') ? "1" : "0";
+	return 0;
+}
+
+int set_IPInterface_IPv6Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action)	{
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "ipv6", (b) ? "" : "0");
+			break;
+	}
+	return 0;
+}
+
+/*#Device.IP.Interface.{i}.LastChange!UBUS:network.interface/status/interface,@Name/uptime*/
+int get_IPInterface_LastChange(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(((struct ip_args *)data)->ip_sec), String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 1, "uptime");
+	return 0;
+}
+
+int get_IPInterface_Router(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "Device.Routing.Router.1.";
+	return 0;
+}
+
+int set_IPInterface_Router(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_IPInterface_Reset(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	return 0;
+}
+
+int set_IPInterface_Reset(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b) {
+				set_interface_enable_ubus(section_name(((struct ip_args *)data)->ip_sec), refparam, ctx, action, "0");
+				set_interface_enable_ubus(section_name(((struct ip_args *)data)->ip_sec), refparam, ctx, action, "1");
+			}
+			break;
+	}
+	return 0;
+}
+
+/*#Device.IP.Interface.{i}.MaxMTUSize!UBUS:network.interface/status/interface,@Name/mtu*/
+int get_IPInterface_MaxMTUSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res, *diag;
+	char *device= NULL;
+
+	dmuci_get_value_by_section_string(((struct ip_args *)data)->ip_sec, "mtu", value);
+	if(*value[0] == '\0') {
+		dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(((struct ip_args *)data)->ip_sec), String}}, 1, &res);
+		DM_ASSERT(res, *value = "");
+		device = dmjson_get_value(res, 1, "device");
+		if(device) {
+			dmubus_call("network.device", "status", UBUS_ARGS{{"name", device, String}}, 1, &diag);
+			DM_ASSERT(diag, *value = "");
+			*value = dmjson_get_value(diag, 1, "mtu");
+		}
+		return 0;
+	}
+	return 0;
+}
+
+int set_IPInterface_MaxMTUSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "mtu", value);
+			break;
+	}
+	return 0;
+}
+
+int get_IPInterface_Type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	if (strcmp(section_name(((struct ip_args *)data)->ip_sec), "loopback") == 0)
+		*value = "Loopback";
+	else
+		*value = "Normal";
+	return 0;
+}
+
+int get_IPInterface_Loopback(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	if (strcmp(section_name(((struct ip_args *)data)->ip_sec), "loopback") == 0)
+		*value = "1";
+	else
+		*value = "0";
+	return 0;
+}
+
+int set_IPInterface_Loopback(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_IPInterface_IPv4AddressNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	char *inst;
+
+	*value = "0";
+	uci_path_foreach_option_eq(icwmpd, "dmmap_network", "interface", "section_name", section_name(((struct ip_args *)data)->ip_sec), s) {
+		dmuci_get_value_by_section_string(s, "ipv4_instance", &inst);
+		if(inst[0] != '\0')
+			*value = "1";
+	}
+	return 0;
+}
+
+int get_IPInterface_IPv6AddressNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	int cnt = 0;
+
+	*value = "0";
+	uci_path_foreach_option_eq(icwmpd, "dmmap_network", "ipv6", "section_name", section_name(((struct ip_args *)data)->ip_sec), s) {
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+int get_IPInterface_IPv6PrefixNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	int cnt = 0;
+
+	*value = "0";
+	uci_path_foreach_option_eq(icwmpd, "dmmap_network", "ipv6prefix", "section_name", section_name(((struct ip_args *)data)->ip_sec), s) {
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+int get_IPInterface_TWAMPReflectorNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+	uci_foreach_option_eq("cwmp_twamp", "twamp_refector", "interface", section_name(((struct ip_args *)data)->ip_sec), s) {
+			cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+/*
+ * *** Device.IP.Interface.{i}.IPv4Address.{i}. ***
+ */
+int get_firewall_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	get_interface_firewall_enabled(section_name(((struct ip_args *)data)->ip_sec), refparam, ctx, value);
+	return 0;
+}
+
+int set_firewall_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	set_interface_firewall_enabled(section_name(((struct ip_args *)data)->ip_sec), refparam, ctx, action, value);
+	return 0;
+}
+
+/*#Device.IP.Interface.{i}.IPv4Address.{i}.IPAddress!UCI:network/interface,@i-1/ipaddr*/
+int get_ipv4_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ((struct ip_args *)data)->ip_4address;
+	return 0;
+}
+
+int set_ipv4_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *proto;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct ip_args *)data)->ip_sec, "proto", &proto);
+			if(strcmp(proto, "static") == 0)
+				dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "ipaddr", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.IP.Interface.{i}.IPv4Address.{i}.SubnetMask!UCI:network/interface,@i-1/netmask*/
+int get_ipv4_netmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res, *jobj;
+	char *mask;
+
+	dmuci_get_value_by_section_string(((struct ip_args *)data)->ip_sec, "netmask", &mask);
+	if (mask[0] == '\0') {
+		dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(((struct ip_args *)data)->ip_sec), String}}, 1, &res);
+		if (res) {
+			jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
+			mask = dmjson_get_value(jobj, 1, "mask");
+			if (mask[0] == '\0')
+				return 0;
+			mask = cidr2netmask(atoi(mask));
+		}
+	}
+	*value = mask;
+	return 0;
+}
+
+int set_ipv4_netmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *proto;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct ip_args *)data)->ip_sec, "proto", &proto);
+			if(strcmp(proto, "static") == 0)
+				dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "netmask", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.IP.Interface.{i}.IPv4Address.{i}.AddressingType!UCI:network/interface,@i-1/proto*/
+int get_ipv4_addressing_type (char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct ip_args *)data)->ip_sec, "proto", value);
+	if (strcmp(*value, "static") == 0)
+		*value = "Static";
+	else if (strcmp(*value, "dhcp") == 0)
+		*value = "DHCP";
+	else
+		*value = "";
+	return 0;
+}
+
+int set_ipv4_addressing_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *proto;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if(strcasecmp(value, "static") == 0) {
+				dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "proto", "static");
+				dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "ipaddr", "0.0.0.0");
+			}
+			if(strcasecmp(value, "dhcp") == 0) {
+				dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "proto", "dhcp");
+				dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "ipaddr", "");
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPInterface_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+	char linker[64] = "", *proto, *device, *mac;
+
+	dmuci_get_value_by_section_string(((struct ip_args *)data)->ip_sec, "proto", &proto);
+	if (strstr(proto, "ppp")) {
+		sprintf(linker, "%s", section_name(((struct ip_args *)data)->ip_sec));
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cPPP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value);
+		goto end;
+	}
+
+	device = get_device(section_name(((struct ip_args *)data)->ip_sec));
+	if (device[0] != '\0') {
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cEthernet%cVLANTermination%c", dmroot, dm_delim, dm_delim, dm_delim), device, value);
+		if (*value != NULL)
+			return 0;
+	}
+
+	mac = get_macaddr(section_name(((struct ip_args *)data)->ip_sec));
+	if (mac[0] != '\0') {
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cEthernet%cLink%c", dmroot, dm_delim, dm_delim, dm_delim), mac, value);
+		goto end;
+	}
+
+end :
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+int set_IPInterface_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *linker = NULL, *newvalue = NULL;
+	struct uci_section *s;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (value[strlen(value)-1]!='.') {
+				dmasprintf(&newvalue, "%s.", value);
+				adm_entry_get_linker_value(ctx, newvalue, &linker);
+			} else
+				adm_entry_get_linker_value(ctx, value, &linker);
+
+			if (linker)
+				dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "ifname", linker);
+			else
+				return FAULT_9005;
+
+			return 0;
+	}
+	return 0;
+}
+
+/*
+ * *** Device.IP.Interface.{i}.IPv6Address.{i}. ***
+ */
+/*#Device.IP.Interface.{i}.IPv6Address.{i}.IPAddress!UCI:network/interface,@i-1/ip6addr*/
+int get_IPInterfaceIPv6Address_IPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ((struct ipv6_args *)data)->ip_6address;
+	if(((struct ipv6_args *)data)->ip_6mask[0] != '\0')
+		dmasprintf(value, "%s/%s", ((struct ipv6_args *)data)->ip_6address, ((struct ipv6_args *)data)->ip_6mask);
+	return 0;
+}
+
+int set_IPInterfaceIPv6Address_IPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *proto;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct ipv6_args *)data)->ip_sec, "proto", &proto);
+			if(strcmp(proto, "static") == 0)
+				dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "ip6addr", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPInterfaceIPv6Address_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int set_IPInterfaceIPv6Address_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_IPInterfaceIPv6Address_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "Enabled";
+	return 0;
+}
+
+int get_IPInterfaceIPv6Address_IPAddressStatus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	if(((struct ipv6_args *)data)->ip_6valid[0] != '\0')
+		*value = "Preferred";
+	else
+		*value = "Unknown";
+	return 0;
+}
+
+int get_IPInterfaceIPv6Address_Origin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ubus_call_get_value_with_two_objects(section_name(((struct ipv6_args *)data)->ip_sec), "ipv6-prefix-assignment", "local-address", "address");
+	if(*value[0] != '\0')
+		*value = "AutoConfigured";
+	else {
+		dmuci_get_value_by_section_string(((struct ipv6_args *)data)->ip_sec, "proto", value);
+		if (strcmp(*value, "static") == 0)
+			*value = "Static";
+		else if (strcmp(*value, "dhcpv6") == 0)
+			*value = "DHCPv6";
+		else
+			*value = "WellKnown";
+	}
+	return 0;
+}
+
+int get_IPInterfaceIPv6Address_Prefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+	char *inst;
+
+	get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(((struct ipv6_args *)data)->ip_sec), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "ip_int_instance", &inst);
+
+	*value = "";
+	if(((struct ipv6prefix_args *)data)->ip_6prefixaddress[0] != '\0')
+		dmasprintf(value, "Device.IP.Interface.%s.IPv6Prefix.1.", inst);
+	return 0;
+}
+
+int set_IPInterfaceIPv6Address_Prefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+/*#Device.IP.Interface.{i}.IPv6Address.{i}.PreferredLifetime!UCI:network/interface,@i-1/adv_preferred_lifetime*/
+int get_IPInterfaceIPv6Address_PreferredLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char local_time[32] = {0};
+	char *preferred = ((struct ipv6_args *)data)->ip_6preferred;
+	*value = "0001-01-01T00:00:00Z";
+	if (get_shift_time_time(atoi(preferred), local_time, sizeof(local_time)) == -1)
+		return 0;
+	*value = dmstrdup(local_time);
+	return 0;
+}
+
+int set_IPInterfaceIPv6Address_PreferredLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char buf[32] = "", *proto;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct ipv6_args *)data)->ip_sec, "proto", &proto);
+			if(strcasecmp(proto, "static") == 0) {
+				get_shift_time_shift(value, buf);
+				if (!(*buf))
+					return 0;
+				dmuci_set_value_by_section(((struct ipv6_args *)data)->ip_sec, "adv_preferred_lifetime", buf);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.IP.Interface.{i}.IPv6Address.{i}.ValidLifetime!UCI:network/interface,@i-1/adv_valid_lifetime*/
+int get_IPInterfaceIPv6Address_ValidLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char local_time[32] = {0};
+	char *preferred = ((struct ipv6_args *)data)->ip_6valid;
+	*value = "0001-01-01T00:00:00Z";
+	if (get_shift_time_time(atoi(preferred), local_time, sizeof(local_time)) == -1)
+		return 0;
+	*value = dmstrdup(local_time);
+	return 0;
+}
+
+int set_IPInterfaceIPv6Address_ValidLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char buf[32] = "", *proto;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct ipv6_args *)data)->ip_sec, "proto", &proto);
+			if(strcasecmp(proto, "static") == 0) {
+				get_shift_time_shift(value, buf);
+				if (!(*buf))
+					return 0;
+				dmuci_set_value_by_section(((struct ipv6_args *)data)->ip_sec, "adv_valid_lifetime", buf);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*
+ * *** Device.IP.Interface.{i}.IPv6Prefix.{i}. ***
+ */
+int get_IPInterfaceIPv6Prefix_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int set_IPInterfaceIPv6Prefix_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_IPInterfaceIPv6Prefix_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "Enabled";
+	return 0;
+}
+
+int get_IPInterfaceIPv6Prefix_PrefixStatus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	if(((struct ipv6prefix_args *)data)->ip_6prefixvalid[0] != '\0')
+		*value = "Preferred";
+	else
+		*value = "Unknown";
+	return 0;
+}
+
+/*#Device.IP.Interface.{i}.IPv6Prefix.{i}.Prefix!UCI:network/interface,@i-1/ip6prefix*/
+int get_IPInterfaceIPv6Prefix_Prefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ((struct ipv6prefix_args *)data)->ip_6prefixaddress;
+	if(((struct ipv6prefix_args *)data)->ip_6prefixmask[0] != '\0')
+		dmasprintf(value, "%s/%s", ((struct ipv6prefix_args *)data)->ip_6prefixaddress, ((struct ipv6prefix_args *)data)->ip_6prefixmask);
+	return 0;
+}
+
+int set_IPInterfaceIPv6Prefix_Prefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *proto;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct ipv6prefix_args *)data)->ip_sec, "proto", &proto);
+			if(strcmp(proto, "static") == 0)
+				dmuci_set_value_by_section(((struct ipv6prefix_args *)data)->ip_sec, "ip6prefix", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPInterfaceIPv6Prefix_Origin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = ubus_call_get_value(section_name(((struct ipv6prefix_args *)data)->ip_sec), "ipv6-prefix-assignment", "address");
+	if(*value[0] != '\0')
+		*value = "AutoConfigured";
+	else {
+		dmuci_get_value_by_section_string(((struct ipv6prefix_args *)data)->ip_sec, "proto", value);
+		if (strcmp(*value, "static") == 0)
+			*value = "Static";
+		else if (strcmp(*value, "dhcpv6") == 0)
+			*value = "DHCPv6";
+		else
+			*value = "WellKnown";
+	}
+	return 0;
+}
+
+int get_IPInterfaceIPv6Prefix_StaticType(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "Static";
+	return 0;
+}
+
+int set_IPInterfaceIPv6Prefix_StaticType(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_IPInterfaceIPv6Prefix_ParentPrefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *linker;
+	dmasprintf(&linker, "%s/%s", ((struct ipv6prefix_args *)data)->ip_6prefixaddress, ((struct ipv6prefix_args *)data)->ip_6prefixmask);
+	if(linker[0] != '\0')
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%Interface%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value);
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+int set_IPInterfaceIPv6Prefix_ParentPrefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_IPInterfaceIPv6Prefix_ChildPrefixBits(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_child_prefix_linker(section_name(((struct ipv6prefix_args *)data)->ip_sec));
+	return 0;
+}
+
+int set_IPInterfaceIPv6Prefix_ChildPrefixBits(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_IPInterfaceIPv6Prefix_PreferredLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char local_time[32] = {0};
+	char *preferred = ((struct ipv6prefix_args *)data)->ip_6prefixpreferred;
+	*value = "0001-01-01T00:00:00Z";
+	if (get_shift_time_time(atoi(preferred), local_time, sizeof(local_time)) == -1)
+		return 0;
+	*value = dmstrdup(local_time);
+	return 0;
+}
+
+int set_IPInterfaceIPv6Prefix_PreferredLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_IPInterfaceIPv6Prefix_ValidLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char local_time[32] = {0};
+	char *preferred = ((struct ipv6prefix_args *)data)->ip_6prefixvalid;
+	*value = "0001-01-01T00:00:00Z";
+	if (get_shift_time_time(atoi(preferred), local_time, sizeof(local_time)) == -1)
+		return 0;
+	*value = dmstrdup(local_time);
+	return 0;
+}
+
+int set_IPInterfaceIPv6Prefix_ValidLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+/*
+ * *** Device.IP.Interface.{i}.Stats. ***
+ */
+static char *get_ip_interface_statistics(char *interface, char *key)
+{
+	json_object *res, *diag;
+	char *device, *value = "0";
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", interface, String}}, 1, &res);
+	device = dmjson_get_value(res, 1, "device");
+	if(device[0] != '\0') {
+		dmubus_call("network.device", "status", UBUS_ARGS{{"name", device, String}}, 1, &diag);
+		value = dmjson_get_value(diag, 2, "statistics", key);
+	}
+	return value;
+}
+
+int get_ip_interface_statistics_tx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_ip_interface_statistics(section_name(((struct ip_args *)data)->ip_sec), "tx_bytes");
+	return 0;
+}
+
+int get_ip_interface_statistics_rx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_ip_interface_statistics(section_name(((struct ip_args *)data)->ip_sec), "rx_bytes");
+	return 0;
+}
+
+int get_ip_interface_statistics_tx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_ip_interface_statistics(section_name(((struct ip_args *)data)->ip_sec), "tx_packets");
+	return 0;
+}
+
+int get_ip_interface_statistics_rx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_ip_interface_statistics(section_name(((struct ip_args *)data)->ip_sec), "rx_packets");
+	return 0;
+}
+
+int get_ip_interface_statistics_tx_errors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_ip_interface_statistics(section_name(((struct ip_args *)data)->ip_sec), "tx_errors");
+	return 0;
+}
+
+int get_ip_interface_statistics_rx_errors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_ip_interface_statistics(section_name(((struct ip_args *)data)->ip_sec), "rx_errors");
+	return 0;
+}
+
+int get_ip_interface_statistics_tx_discardpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_ip_interface_statistics(section_name(((struct ip_args *)data)->ip_sec), "tx_dropped");
+	return 0;
+}
+
+int get_ip_interface_statistics_rx_discardpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_ip_interface_statistics(section_name(((struct ip_args *)data)->ip_sec), "rx_dropped");
+	return 0;
+}
+
+int get_ip_interface_statistics_tx_unicastpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	char *device = get_device(section_name(((struct ip_args *)data)->ip_sec));
+	if(device[0] != '\0')
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "TX", "unicast"));
+	return 0;
+}
+
+int get_ip_interface_statistics_rx_unicastpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	char *device = get_device(section_name(((struct ip_args *)data)->ip_sec));
+	if(device[0] != '\0')
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "RX", "unicast"));
+	return 0;
+}
+
+int get_ip_interface_statistics_tx_multicastpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	char *device = get_device(section_name(((struct ip_args *)data)->ip_sec));
+	if(device[0] != '\0')
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "TX", "multicast"));
+	return 0;
+}
+
+int get_ip_interface_statistics_rx_multicastpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	char *device = get_device(section_name(((struct ip_args *)data)->ip_sec));
+	if(device[0] != '\0')
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "RX", "multicast"));
+	return 0;
+}
+
+int get_ip_interface_statistics_tx_broadcastpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	char *device = get_device(section_name(((struct ip_args *)data)->ip_sec));
+	if(device[0] != '\0')
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "TX", "broadcast"));
+	return 0;
+}
+
+int get_ip_interface_statistics_rx_broadcastpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	char *device = get_device(section_name(((struct ip_args *)data)->ip_sec));
+	if(device[0] != '\0')
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "RX", "broadcast"));
+	return 0;
+}
+
+int get_ip_interface_statistics_rx_unknownprotopackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = get_ip_interface_statistics(section_name(((struct ip_args *)data)->ip_sec), "rx_over_errors");
+	return 0;
+}
+
+/*
+ * *** Device.IP.Interface.{i}.TWAMPReflector.{i}. ***
+ */
+int get_IPInterfaceTWAMPReflector_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "enable", value);
+	return 0;
+}
+
+int set_IPInterfaceTWAMPReflector_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct uci_section *s;
+	char *type, *interface, *device, *id, *ipv4addr = "";
+	json_object *res, *jobj;
+
+	switch (action)	{
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b) {
+				dmuci_get_value_by_section_string((struct uci_section *)data, "interface", &interface);
+				dmuci_get_value_by_section_string((struct uci_section *)data, "id", &id);
+				dmuci_set_value_by_section((struct uci_section *)data, "enable", "1");
+				dmuci_set_value("cwmp_twamp", "twamp", "id", id);
+				uci_foreach_sections("network", "interface", s) {
+					if(strcmp(section_name(s), interface) != 0)
+						continue;
+					dmuci_get_value_by_section_string(s, "ipaddr", &ipv4addr);
+					break;
+				}
+				if (ipv4addr[0] == '\0') {
+					dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", interface, String}}, 1, &res);
+					if (res)
+					{
+						jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
+						ipv4addr = dmjson_get_value(jobj, 1, "address");
+						if (ipv4addr[0] == '\0')
+							dmuci_set_value_by_section((struct uci_section *)data, "ip_version", "6");
+						else
+							dmuci_set_value_by_section((struct uci_section *)data, "ip_version", "4");
+					}
+				}
+				else
+					dmuci_set_value_by_section((struct uci_section *)data, "ip_version", "4");
+				dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", interface, String}}, 1, &res);
+				if (res)
+				{
+					device = dmjson_get_value(res, 1, "device");
+					dmuci_set_value_by_section((struct uci_section *)data, "device", device);
+				}
+			} else {
+				dmuci_set_value_by_section((struct uci_section *)data, "enable", "0");
+			}
+			break;
+	}
+	return 0;
+}
+
+int get_IPInterfaceTWAMPReflector_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *enable;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "enable", &enable);
+	if(strcmp(enable, "1")==0)
+		*value = "Active";
+	else
+		*value = "Disabled";
+	return 0;
+}
+
+int get_IPInterfaceTWAMPReflector_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "twamp_alias", value);
+	return 0;
+}
+
+int set_IPInterfaceTWAMPReflector_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "twamp_alias", value);
+			break;
+	}
+	return 0;
+}
+
+int get_IPInterfaceTWAMPReflector_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "port", value);
+	return 0;
+}
+
+int set_IPInterfaceTWAMPReflector_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "port", value);
+			break;
+	}
+	return 0;
+}
+
+int get_IPInterfaceTWAMPReflector_MaximumTTL(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "max_ttl", value);
+	return 0;
+}
+
+int set_IPInterfaceTWAMPReflector_MaximumTTL(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "max_ttl", value);
+			break;
+	}
+	return 0;
+}
+
+int get_IPInterfaceTWAMPReflector_IPAllowedList(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "ip_list", value);
+	return 0;
+}
+
+int set_IPInterfaceTWAMPReflector_IPAllowedList(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "ip_list", value);
+			break;
+	}
+	return 0;
+}
+
+int get_IPInterfaceTWAMPReflector_PortAllowedList(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "port_list", value);
+	return 0;
+}
+
+int set_IPInterfaceTWAMPReflector_PortAllowedList(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "port_list", value);
+			break;
+	}
+	return 0;
+}
+
+/*************************************************************
+ * GET & SET ALIAS
+/*************************************************************/
+int get_IPInterface_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(((struct ip_args *)data)->ip_sec), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "ip_int_alias", value);
+	return 0;
+}
+
+int set_IPInterface_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section =NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(((struct ip_args *)data)->ip_sec), &dmmap_section);
+			if(dmmap_section != NULL)
+				dmuci_set_value_by_section(dmmap_section, "ip_int_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_ipv4_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(((struct ip_args *)data)->ip_sec), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "ipv4_alias", value);
+	return 0;
+}
+
+int set_ipv4_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section =NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(((struct ip_args *)data)->ip_sec), &dmmap_section);
+			if(dmmap_section != NULL)
+				dmuci_set_value_by_section(dmmap_section, "ipv4_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPInterfaceIPv6Address_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+	char *name;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap_network", "ipv6", "ipv6_instance", instance, dmmap_section) {
+		dmuci_get_value_by_section_string(dmmap_section, "section_name", &name);
+		if(strcmp(name, section_name(((struct ipv6_args *)data)->ip_sec)) == 0)
+			dmuci_get_value_by_section_string(dmmap_section, "ipv6_alias", value);
+	}
+	return 0;
+}
+
+int set_IPInterfaceIPv6Address_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+	char *name;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			uci_path_foreach_option_eq(icwmpd, "dmmap_network", "ipv6", "ipv6_instance", instance, dmmap_section) {
+				dmuci_get_value_by_section_string(dmmap_section, "section_name", &name);
+				if(strcmp(name, section_name(((struct ipv6_args *)data)->ip_sec)) == 0)
+					break;
+			}
+			dmuci_set_value_by_section(dmmap_section, "ipv6_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_IPInterfaceIPv6Prefix_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+	char *name;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap_network", "ipv6prefix", "ipv6prefix_instance", instance, dmmap_section) {
+		dmuci_get_value_by_section_string(dmmap_section, "section_name", &name);
+		if(strcmp(name, section_name(((struct ipv6prefix_args *)data)->ip_sec)) == 0)
+			dmuci_get_value_by_section_string(dmmap_section, "ipv6prefix_alias", value);
+	}
+	return 0;
+}
+
+int set_IPInterfaceIPv6Prefix_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+	char *name;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			uci_path_foreach_option_eq(icwmpd, "dmmap_network", "ipv6prefix", "ipv6prefix_instance", instance, dmmap_section) {
+				dmuci_get_value_by_section_string(dmmap_section, "section_name", &name);
+				if(strcmp(name, section_name(((struct ipv6prefix_args *)data)->ip_sec)) == 0)
+					break;
+			}
+			dmuci_set_value_by_section(dmmap_section, "ipv6prefix_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*************************************************************
+ * ADD & DEL OBJ
+/*************************************************************/
+char *get_last_instance_cond(char* dmmap_package, char *package, char *section, char *opt_inst, char *opt_cond, char *cond_val, char *opt_filter, char *filter_val, char *refused_interface)
+{
+	struct uci_section *s, *dmmap_section;
+	char *inst = NULL, *val, *val_f;
+	char *type, *ipv4addr = "", *ipv6addr = "", *proto;
+	json_object *res, *jobj;
+
+	uci_foreach_sections(package, section, s) {
+		if (opt_cond) dmuci_get_value_by_section_string(s, opt_cond, &val);
+		if (opt_filter) dmuci_get_value_by_section_string(s, opt_filter, &val_f);
+		if(opt_cond && opt_filter && (strcmp(val, cond_val) == 0 || strcmp(val_f, filter_val) == 0))
+			continue;
+		if (strcmp(section_name(s), refused_interface)==0)
+			continue;
+
+		dmuci_get_value_by_section_string(s, "ipaddr", &ipv4addr);
+		if (ipv4addr[0] == '\0') {
+			dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(s), String}}, 1, &res);
+			if (res)
+			{
+				jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv4-address");
+				ipv4addr = dmjson_get_value(jobj, 1, "address");
+			}
+		}
+		dmuci_get_value_by_section_string(s, "ip6addr", &ipv6addr);
+		if (ipv6addr[0] == '\0') {
+			dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(s), String}}, 1, &res);
+			if (res)
+			{
+				jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv6-address");
+				ipv6addr = dmjson_get_value(jobj, 1, "address");
+			}
+		}
+		dmuci_get_value_by_section_string(s, "proto", &proto);
+		if (ipv4addr[0] == '\0' && ipv6addr[0] == '\0' && strcmp(proto, "dhcp") != 0 && strcmp(proto, "dhcpv6") != 0 && strcmp(val, "bridge") != 0) {
+			continue;
+		}
+		get_dmmap_section_of_config_section(dmmap_package, section, section_name(s), &dmmap_section);
+		inst = update_instance_icwmpd(dmmap_section, inst, opt_inst);
+	}
+	return inst;
+}
+
+int add_ip_interface(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	char *last_inst, *v;
+	char ip_name[32], ib[8];
+	char *p = ip_name;
+	struct uci_section *dmmap_ip_interface, *dmmap_section;
+
+	last_inst = get_last_instance_cond("dmmap_network", "network", "interface", "ip_int_instance", "type", "alias", "proto", "", "loopback");
+	sprintf(ib, "%d", last_inst ? atoi(last_inst)+1 : 1);
+	dmstrappendstr(p, "ip_interface_");
+	dmstrappendstr(p, ib);
+	dmstrappendend(p);
+	dmuci_set_value("network", ip_name, "", "interface");
+	dmuci_set_value("network", ip_name, "proto", "dhcp");
+
+	dmuci_add_section_icwmpd("dmmap_network", "interface", &dmmap_ip_interface, &v);
+	dmuci_set_value_by_section(dmmap_ip_interface, "section_name", ip_name);
+	*instance = update_instance_icwmpd(dmmap_ip_interface, last_inst, "ip_int_instance");
+	return 0;
+}
+
+int delete_ip_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *dmmap_section = NULL;
+
+	switch (del_action) {
+	case DEL_INST:
+		dmuci_delete_by_section(((struct ip_args *)data)->ip_sec, NULL, NULL);
+		get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(((struct ip_args *)data)->ip_sec), &dmmap_section);
+		if(dmmap_section != NULL)
+			dmuci_delete_by_section(dmmap_section, NULL, NULL);
+		break;
+	case DEL_ALL:
+		return FAULT_9005;
+	}
+	return 0;
+}
+
+int add_ipv4(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{
+	char *instance;
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(((struct ip_args *)data)->ip_sec), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "ipv4_instance", &instance);
+	*instancepara = update_instance_icwmpd(dmmap_section, instance, "ipv4_instance");
+	if(instance[0] == '\0') {
+		dmuci_set_value_by_section(dmmap_section, "ipv4_instance", *instancepara);
+		dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "ipaddr", "0.0.0.0");
+		dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "proto", "static");
+	}
+	return 0;
+}
+
+int delete_ipv4(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *dmmap_section;
+
+	switch (del_action) {
+	case DEL_INST:
+		dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "ipaddr", "");
+		dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "proto", "");
+		get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(((struct ip_args *)data)->ip_sec), &dmmap_section);
+		if(dmmap_section != NULL)
+			dmuci_set_value_by_section(dmmap_section, "ipv4_instance", "");
+		break;
+	case DEL_ALL:
+		return FAULT_9005;
+	}
+	return 0;
+}
+
+int add_ipv6(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{
+	struct uci_section *s, *ss;
+	char *ip, *name, *inst, *curr_inst;
+
+	uci_foreach_sections("network", "interface", s) {
+		if(strcmp(section_name(s), section_name(((struct ipv6_args *)data)->ip_sec)) != 0)
+			continue;
+		dmuci_get_value_by_section_string(s, "ip6addr", &ip);
+		break;
+	}
+	if(ip[0] == '\0') {
+		uci_path_foreach_option_eq(icwmpd, "dmmap_network", "ipv6", "section_name", section_name(((struct ipv6_args *)data)->ip_sec), s) {
+			dmuci_get_value_by_section_string(s, "ipv6_instance", &inst);
+		}
+		dmasprintf(&curr_inst, "%d", atoi(inst)+1);
+		dmuci_set_value_by_section(((struct ipv6_args *)data)->ip_sec, "ip6addr", "::");
+		dmuci_set_value_by_section(((struct ipv6_args *)data)->ip_sec, "proto", "static");
+		DMUCI_ADD_SECTION(icwmpd, "dmmap_network", "ipv6", &ss, &name);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, ss, "section_name", section_name(((struct ipv6_args *)data)->ip_sec));
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, ss, "ipv6_instance", curr_inst);
+	}
+	return 0;
+}
+
+int delete_ipv6(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_network", "ipv6", section_name(((struct ipv6_args *)data)->ip_sec), &dmmap_section);
+	switch (del_action) {
+	case DEL_INST:
+		dmuci_set_value_by_section(((struct ipv6_args *)data)->ip_sec, "ip6addr", "");
+		dmuci_set_value_by_section(dmmap_section, "ipv6_instance", "");
+		dmuci_set_value_by_section(((struct ipv6_args *)data)->ip_sec, "proto", "");
+		break;
+	case DEL_ALL:
+		return FAULT_9005;
+	}
+	return 0;
+}
+
+int add_ipv6_prefix(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{
+	struct uci_section *s, *ss;
+	char *ip, *name, *inst, *curr_inst;
+
+	uci_foreach_sections("network", "interface", s) {
+		if(strcmp(section_name(s), section_name(((struct ipv6prefix_args *)data)->ip_sec)) != 0)
+			continue;
+		dmuci_get_value_by_section_string(s, "ip6prefix", &ip);
+		break;
+	}
+	if(ip[0] == '\0') {
+		uci_path_foreach_option_eq(icwmpd, "dmmap_network", "ipv6prefix", "section_name", section_name(((struct ipv6prefix_args *)data)->ip_sec), s) {
+			dmuci_get_value_by_section_string(s, "ipv6prefix_instance", &inst);
+		}
+		dmasprintf(&curr_inst, "%d", atoi(inst)+1);
+		dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "ip6prefix", "::");
+		dmuci_set_value_by_section(((struct ipv6prefix_args *)data)->ip_sec, "proto", "static");
+		DMUCI_ADD_SECTION(icwmpd, "dmmap_network", "ipv6prefix", &ss, &name);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, ss, "section_name", section_name(((struct ipv6prefix_args *)data)->ip_sec));
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, ss, "ipv6prefix_instance", curr_inst);
+	}
+	return 0;
+}
+
+int delete_ipv6_prefix(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_network", "ipv6prefix", section_name(((struct ipv6prefix_args *)data)->ip_sec), &dmmap_section);
+	switch (del_action) {
+	case DEL_INST:
+		dmuci_set_value_by_section(((struct ipv6prefix_args *)data)->ip_sec, "ip6prefix", "");
+		dmuci_set_value_by_section(dmmap_section, "ipv6prefix_instance", "");
+		dmuci_set_value_by_section(((struct ipv6prefix_args *)data)->ip_sec, "proto", "");
+		break;
+	case DEL_ALL:
+		return FAULT_9005;
+	}
+	return 0;
+}
+
+static char *get_last_instance_with_option(char *package, char *section, char *option, char *val, char *opt_inst)
+{
+	struct uci_section *s;
+	char *inst = NULL;
+
+	uci_foreach_option_eq(package, section, option, val, s) {
+		inst = update_instance(s, inst, opt_inst);
+	}
+	return inst;
+}
+
+static char *get_last_id(char *package, char *section)
+{
+	struct uci_section *s;
+	char *id;
+	int cnt = 0;
+
+	uci_foreach_sections(package, section, s) {
+		cnt++;
+	}
+	dmasprintf(&id, "%d", cnt+1);
+	return id;
+}
+
+int addObjIPInterfaceTWAMPReflector(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	struct uci_section *connection;
+	char *value1, *last_inst, *id;
+
+	last_inst = get_last_instance_with_option("cwmp_twamp", "twamp_refector", "interface", section_name(((struct ip_args *)data)->ip_sec), "twamp_inst");
+	id = get_last_id("cwmp_twamp", "twamp_refector");
+	dmuci_add_section("cwmp_twamp", "twamp_refector", &connection, &value1);
+	dmasprintf(instance, "%d", last_inst?atoi(last_inst)+1:1);
+	dmuci_set_value_by_section(connection, "twamp_inst", *instance);
+	dmuci_set_value_by_section(connection, "id", id);
+	dmuci_set_value_by_section(connection, "enable", "0");
+	dmuci_set_value_by_section(connection, "interface", section_name(((struct ip_args *)data)->ip_sec));
+	dmuci_set_value_by_section(connection, "port", "862");
+	dmuci_set_value_by_section(connection, "max_ttl", "1");
+	return 0;
+}
+
+int delObjIPInterfaceTWAMPReflector(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	int found = 0;
+	struct uci_section *s, *ss = NULL;
+	char *interface;
+	struct uci_section *section = (struct uci_section *)data;
+
+	switch (del_action) {
+		case DEL_INST:
+			dmuci_delete_by_section(section, NULL, NULL);
+			return 0;
+		case DEL_ALL:
+			uci_foreach_sections("cwmp_twamp", "twamp_refector", s) {
+				dmuci_get_value_by_section_string(s, "interface", &interface);
+				if(strcmp(interface, section_name(((struct ip_args *)data)->ip_sec)) != 0)
+					continue;
+				if (found != 0) {
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL) {
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/**************************************************************************
+* LINKER
+***************************************************************************/
+int get_linker_ip_interface(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) {
+	if(data && ((struct ip_args *)data)->ip_sec) {
+		dmasprintf(linker,"%s", section_name(((struct ip_args *)data)->ip_sec));
+		return 0;
+	} else {
+		*linker = "";
+		return 0;
+	}
+}
+
+int get_linker_ipv6_prefix(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) {
+	if(((struct ipv6prefix_args *)data)->ip_sec) {
+		dmasprintf(linker,"%s", get_child_prefix_linker(section_name(((struct ipv6prefix_args *)data)->ip_sec)));
+		return 0;
+	} else {
+		*linker = "";
+		return 0;
+	}
+}
+
+/*************************************************************
+ * ENTRY METHOD
+/*************************************************************/
+/*#Device.IP.Interface.{i}.!UCI:network/interface/dmmap_network*/
+int browseIPIfaceInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *ip_int = NULL, *ip_int_last = NULL;
+	char *type, *ipv4addr = "";
+	struct ip_args curr_ip_args = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("network", "interface", "dmmap_network", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		dmuci_get_value_by_section_string(p->config_section, "type", &type);
+		if (strcmp(type, "alias") == 0 || strcmp(section_name(p->config_section), "loopback")==0)
+			continue;
+
+		/* IPv4 address */
+		dmuci_get_value_by_section_string(p->config_section, "ipaddr", &ipv4addr);
+		if (ipv4addr[0] == '\0')
+			ipv4addr = ubus_call_get_value(section_name(p->config_section), "ipv4-address", "address");
+
+		init_ip_args(&curr_ip_args, p->config_section, ipv4addr);
+		ip_int = handle_update_instance(1, dmctx, &ip_int_last, update_instance_alias, 3, p->dmmap_section, "ip_int_instance", "ip_int_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_ip_args, ip_int) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+int browseIfaceIPv4Inst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *ipv4_inst = NULL, *ipv4_inst_last = NULL;
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(((struct ip_args *)prev_data)->ip_sec), &dmmap_section);
+	if(((struct ip_args *)prev_data)->ip_4address[0] != '\0') {
+		ipv4_inst = handle_update_instance(2, dmctx, &ipv4_inst_last, update_instance_alias, 3, dmmap_section, "ipv4_instance", "ipv4_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, prev_data, ipv4_inst) == DM_STOP)
+			goto end;
+	}
+end:
+	return 0;
+}
+
+static struct uci_section *update_dmmap_network_ipv6(char *curr_inst, char *section_name)
+{
+	struct uci_section *s = NULL;
+	char *inst, *name;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap_network", "ipv6", "section_name", section_name, s) {
+		dmuci_get_value_by_section_string(s, "ipv6_instance", &inst);
+		if(strcmp(curr_inst, inst) == 0)
+			return s;
+	}
+	if (!s) {
+		DMUCI_ADD_SECTION(icwmpd, "dmmap_network", "ipv6", &s, &name);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "section_name", section_name);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "ipv6_instance", curr_inst);
+	}
+	return s;
+}
+
+int browseIfaceIPv6Inst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s;
+	char *ipv6_int = NULL, *ipv6_int_last = NULL, *ipv6addr = "", *ipv6mask = "", *ipv6_preferred = "", *ipv6_valid = "", buf[4]="";
+	struct ipv6_args curr_ipv6_args = {0};
+	json_object *res, *jobj, *jobj1;
+	int entries = 0;
+
+	if(prev_data && ((struct ip_args *)prev_data)->ip_sec) {
+		dmuci_get_value_by_section_string(((struct ip_args *)prev_data)->ip_sec, "ip6addr", &ipv6addr);
+		dmuci_get_value_by_section_string(((struct ip_args *)prev_data)->ip_sec, "adv_preferred_lifetime", &ipv6_preferred);
+		dmuci_get_value_by_section_string(((struct ip_args *)prev_data)->ip_sec, "adv_valid_lifetime", &ipv6_valid);
+		if (ipv6addr[0] == '\0') {
+			dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(((struct ip_args *)prev_data)->ip_sec), String}}, 1, &res);
+			while (res) {
+				jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv6-prefix-assignment");
+				if(jobj) {
+					jobj1 = dmjson_get_obj(jobj, 1, "local-address");
+					if(jobj1) {
+						ipv6addr = dmjson_get_value(jobj1, 1, "address");
+						ipv6mask = dmjson_get_value(jobj1, 1, "mask");
+						goto browse;
+					}
+				}
+				jobj = dmjson_select_obj_in_array_idx(res, entries, 1, "ipv6-address");
+				if(jobj) {
+					ipv6addr = dmjson_get_value(jobj, 1, "address");
+					ipv6mask = dmjson_get_value(jobj, 1, "mask");
+					if (ipv6_preferred[0] == '\0')
+						ipv6_preferred = dmjson_get_value(jobj, 1, "preferred");
+					if (ipv6_valid[0] == '\0')
+						ipv6_valid = dmjson_get_value(jobj, 1, "valid");
+					entries++;
+					sprintf(buf, "%d", entries);
+					s = update_dmmap_network_ipv6(buf, section_name(((struct ip_args *)prev_data)->ip_sec));
+					init_ipv6_args(&curr_ipv6_args, ((struct ip_args *)prev_data)->ip_sec, ipv6addr, ipv6mask, ipv6_preferred, ipv6_valid);
+					ipv6_int = handle_update_instance(1, dmctx, &ipv6_int_last, update_instance_alias, 3, s, "ipv6_instance", "ipv6_alias");
+					if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_ipv6_args, ipv6_int) == DM_STOP)
+						goto end;
+				} else
+					goto end;
+			}
+		}
+browse:
+		s = update_dmmap_network_ipv6("1", section_name(((struct ip_args *)prev_data)->ip_sec));
+		init_ipv6_args(&curr_ipv6_args, ((struct ip_args *)prev_data)->ip_sec, ipv6addr, ipv6mask, ipv6_preferred, ipv6_valid);
+		ipv6_int = handle_update_instance(1, dmctx, &ipv6_int_last, update_instance_alias, 3, s, "ipv6_instance", "ipv6_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_ipv6_args, ipv6_int) == DM_STOP)
+			goto end;
+	}
+end:
+	return 0;
+}
+
+
+static struct uci_section *update_dmmap_network_ipv6prefix(char *curr_inst, char *section_name)
+{
+	struct uci_section *s = NULL;
+	char *inst, *name;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap_network", "ipv6prefix", "section_name", section_name, s) {
+		dmuci_get_value_by_section_string(s, "ipv6prefix_instance", &inst);
+		if(strcmp(curr_inst, inst) == 0)
+			return s;
+	}
+	if (!s) {
+		DMUCI_ADD_SECTION(icwmpd, "dmmap_network", "ipv6prefix", &s, &name);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "section_name", section_name);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "ipv6prefix_instance", curr_inst);
+	}
+	return s;
+}
+
+int browseIfaceIPv6PrefixInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s;
+	char *ipv6prefix_int = NULL, *ipv6prefix_int_last = NULL, *ipv6prefixaddr = "", *ipv6prefixmask = "", *ipv6prefix_preferred = "", *ipv6prefix_valid = "", buf[4] = "";
+	struct ipv6prefix_args curr_ipv6prefix_args = {0};
+	json_object *res, *jobj;
+	int entries = 0;
+
+	if(prev_data && ((struct ip_args *)prev_data)->ip_sec) {
+		dmuci_get_value_by_section_string(((struct ip_args *)prev_data)->ip_sec, "ip6prefix", &ipv6prefixaddr);
+		if (ipv6prefixaddr[0] == '\0') {
+			dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(((struct ip_args *)prev_data)->ip_sec), String}}, 1, &res);
+			while (res) {
+				jobj = dmjson_select_obj_in_array_idx(res, 0, 1, "ipv6-prefix-assignment");
+				if(jobj) {
+					ipv6prefixaddr = dmjson_get_value(jobj, 1, "address");
+					ipv6prefixmask = dmjson_get_value(jobj, 1, "mask");
+					ipv6prefix_preferred = dmjson_get_value(jobj, 1, "preferred");
+					ipv6prefix_valid = dmjson_get_value(jobj, 1, "valid");
+					goto browse;
+				}
+				jobj = dmjson_select_obj_in_array_idx(res, entries, 1, "ipv6-prefix");
+				if(jobj) {
+					ipv6prefixaddr = dmjson_get_value(jobj, 1, "address");
+					ipv6prefixmask = dmjson_get_value(jobj, 1, "mask");
+					ipv6prefix_preferred = dmjson_get_value(jobj, 1, "preferred");
+					ipv6prefix_valid = dmjson_get_value(jobj, 1, "valid");
+					entries++;
+					sprintf(buf, "%d", entries);
+					s = update_dmmap_network_ipv6prefix(buf, section_name(((struct ip_args *)prev_data)->ip_sec));
+					init_ipv6prefix_args(&curr_ipv6prefix_args, ((struct ip_args *)prev_data)->ip_sec, ipv6prefixaddr, ipv6prefixmask, ipv6prefix_preferred, ipv6prefix_valid);
+					ipv6prefix_int = handle_update_instance(1, dmctx, &ipv6prefix_int_last, update_instance_alias, 3, s, "ipv6prefix_instance", "ipv6prefix_alias");
+					if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_ipv6prefix_args, ipv6prefix_int) == DM_STOP)
+						goto end;
+				} else
+					goto end;
+			}
+		}
+browse:
+		s = update_dmmap_network_ipv6prefix("1", section_name(((struct ip_args *)prev_data)->ip_sec));
+		init_ipv6prefix_args(&curr_ipv6prefix_args, ((struct ip_args *)prev_data)->ip_sec, ipv6prefixaddr, ipv6prefixmask, ipv6prefix_preferred, ipv6prefix_valid);
+		ipv6prefix_int = handle_update_instance(1, dmctx, &ipv6prefix_int_last, update_instance_alias, 3, s, "ipv6prefix_instance", "ipv6prefix_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_ipv6prefix_args, ipv6prefix_int) == DM_STOP)
+			goto end;
+	}
+end:
+	return 0;
+}
+
+int browseIPInterfaceTWAMPReflectorInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL;
+	char *twamp_inst = NULL, *twamp_inst_last = NULL;
+
+	uci_foreach_option_eq("cwmp_twamp", "twamp_refector", "interface", section_name(((struct ip_args *)prev_data)->ip_sec), s)
+	{
+		twamp_inst = handle_update_instance(2, dmctx, &twamp_inst_last, update_instance_alias, 3, (void *)s, "twamp_inst", "twamp_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)s, twamp_inst) == DM_STOP)
+			break;
+	}
+	return 0;
+}
diff --git a/dmtree/tr181/ip.h b/dmtree/tr181/ip.h
new file mode 100644
index 0000000000000000000000000000000000000000..f755c329e92e59aec7fe517cb492ef6475f8a3e0
--- /dev/null
+++ b/dmtree/tr181/ip.h
@@ -0,0 +1,189 @@
+/*
+*	This program is free software: you can redistribute it and/or modify
+*	it under the terms of the GNU General Public License as published by
+*	the Free Software Foundation, either version 2 of the License, or
+*	(at your option) any later version.
+*
+*	Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*
+*/
+
+#ifndef __IP_H
+#define __IP_H
+
+struct ip_args
+{
+	struct uci_section *ip_sec;
+	char *ip_4address;
+};
+
+struct ipv6_args
+{
+	struct uci_section *ip_sec;
+	char *ip_6address;
+	char *ip_6mask;
+	char *ip_6preferred;
+	char *ip_6valid;
+};
+
+struct ipv6prefix_args
+{
+	struct uci_section *ip_sec;
+	char *ip_6prefixaddress;
+	char *ip_6prefixmask;
+	char *ip_6prefixpreferred;
+	char *ip_6prefixvalid;
+};
+
+extern DMOBJ tIPObj[];
+extern DMLEAF tIPParams[];
+extern DMOBJ tInterfaceObj[];
+extern DMLEAF tIPintParams[];
+extern DMLEAF tIPv4Params[];
+extern DMLEAF tIPv6Params[];
+extern DMLEAF tIPv6PrefixParams[];
+extern DMLEAF tIPInterfaceStatsParams[];
+extern DMLEAF tIPInterfaceTWAMPReflectorParams[];
+
+unsigned char get_ipv4_finform(char *refparam, struct dmctx *dmctx, void *data, char *instance);
+unsigned char get_ipv6_finform(char *refparam, struct dmctx *dmctx, void *data, char *instance);
+
+int get_linker_ip_interface(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+int get_linker_ipv6_prefix(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+
+int browseIPIfaceInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseIfaceIPv4Inst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseIfaceIPv6Inst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseIfaceIPv6PrefixInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseIPInterfaceTWAMPReflectorInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int add_ip_interface(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_ip_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int add_ipv4(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_ipv4(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int add_ipv6(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_ipv6(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int add_ipv6_prefix(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delete_ipv6_prefix(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjIPInterfaceTWAMPReflector(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjIPInterfaceTWAMPReflector(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_IP_IPv4Capable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IP_IPv4Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IP_IPv4Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IP_IPv4Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IP_IPv6Capable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IP_IPv6Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IP_IPv6Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IP_IPv6Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IP_ULAPrefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IP_ULAPrefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IP_InterfaceNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_ipv4_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_ipv4_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_firewall_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_firewall_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_ipv4_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_ipv4_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_ipv4_netmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_ipv4_netmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_ipv4_addressing_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_ipv4_addressing_type(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int get_IPInterface_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterface_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterface_IPv4Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterface_IPv4Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterface_IPv6Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterface_IPv6Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterface_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPInterface_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterface_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterface_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPInterface_LastChange(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPInterface_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterface_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterface_Router(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterface_Router(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterface_Reset(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterface_Reset(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterface_MaxMTUSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterface_MaxMTUSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterface_Type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPInterface_Loopback(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterface_Loopback(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterface_IPv4AddressNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPInterface_IPv6AddressNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPInterface_IPv6PrefixNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPInterface_TWAMPReflectorNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_IPInterfaceIPv6Address_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceIPv6Address_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceIPv6Address_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPInterfaceIPv6Address_IPAddressStatus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPInterfaceIPv6Address_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceIPv6Address_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceIPv6Address_IPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceIPv6Address_IPAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceIPv6Address_Origin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPInterfaceIPv6Address_Prefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceIPv6Address_Prefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceIPv6Address_PreferredLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceIPv6Address_PreferredLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceIPv6Address_ValidLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceIPv6Address_ValidLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int get_IPInterfaceIPv6Prefix_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceIPv6Prefix_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceIPv6Prefix_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPInterfaceIPv6Prefix_PrefixStatus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPInterfaceIPv6Prefix_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceIPv6Prefix_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceIPv6Prefix_Prefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceIPv6Prefix_Prefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceIPv6Prefix_Origin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPInterfaceIPv6Prefix_StaticType(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceIPv6Prefix_StaticType(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceIPv6Prefix_ParentPrefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceIPv6Prefix_ParentPrefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceIPv6Prefix_ChildPrefixBits(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceIPv6Prefix_ChildPrefixBits(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceIPv6Prefix_PreferredLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceIPv6Prefix_PreferredLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceIPv6Prefix_ValidLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceIPv6Prefix_ValidLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int get_IPInterfaceTWAMPReflector_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceTWAMPReflector_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceTWAMPReflector_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_IPInterfaceTWAMPReflector_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceTWAMPReflector_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceTWAMPReflector_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceTWAMPReflector_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceTWAMPReflector_MaximumTTL(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceTWAMPReflector_MaximumTTL(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceTWAMPReflector_IPAllowedList(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceTWAMPReflector_IPAllowedList(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_IPInterfaceTWAMPReflector_PortAllowedList(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_IPInterfaceTWAMPReflector_PortAllowedList(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int get_ip_interface_statistics_tx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_interface_statistics_rx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_interface_statistics_tx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_interface_statistics_rx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_interface_statistics_tx_errors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_interface_statistics_rx_errors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_interface_statistics_tx_discardpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_interface_statistics_rx_discardpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_interface_statistics_tx_unicastpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_interface_statistics_rx_unicastpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_interface_statistics_tx_multicastpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_interface_statistics_rx_multicastpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_interface_statistics_tx_broadcastpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_interface_statistics_rx_broadcastpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ip_interface_statistics_rx_unknownprotopackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+#endif
diff --git a/dmtree/tr181/managementserver.c b/dmtree/tr181/managementserver.c
new file mode 100644
index 0000000000000000000000000000000000000000..8da4fa9ca55045ddfce0c4070cf16655d3511264
--- /dev/null
+++ b/dmtree/tr181/managementserver.c
@@ -0,0 +1,717 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2012-2014 PIVA SOFTWARE (www.pivasoftware.com)
+ *		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *		Author: Feten Besbes <feten.besbes@pivasoftware.com>
+ *		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ */
+
+#include <ctype.h>
+#include <uci.h>
+#include <stdio.h>
+#include <time.h>
+#include "dmmem.h"
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "managementserver.h"
+#include "dmjson.h"
+
+#define DEFAULT_ACSURL "http://192.168.1.1:8080/openacs/acs"
+
+/*** ManagementServer. ***/
+DMLEAF tManagementServerParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"URL", &DMWRITE, DMT_STRING, get_management_server_url, set_management_server_url, NULL, NULL, BBFDM_CWMP},
+{"Username", &DMWRITE, DMT_STRING, get_management_server_username, set_management_server_username, NULL, NULL, BBFDM_CWMP},
+{"Password", &DMWRITE, DMT_STRING, get_empty, set_management_server_passwd, NULL, NULL, BBFDM_CWMP},
+{"ParameterKey", &DMREAD, DMT_STRING, get_management_server_key, NULL, &DMFINFRM, &DMNONE, BBFDM_CWMP},
+{"PeriodicInformEnable", &DMWRITE, DMT_BOOL, get_management_server_periodic_inform_enable, set_management_server_periodic_inform_enable,  NULL, NULL, BBFDM_CWMP},
+{"PeriodicInformInterval", &DMWRITE, DMT_UNINT, get_management_server_periodic_inform_interval, set_management_server_periodic_inform_interval, NULL, NULL, BBFDM_CWMP},
+{"PeriodicInformTime", &DMWRITE, DMT_TIME, get_management_server_periodic_inform_time, set_management_server_periodic_inform_time, NULL, NULL, BBFDM_CWMP},
+{"ConnectionRequestURL", &DMREAD, DMT_STRING, get_management_server_connection_request_url, NULL, &DMFINFRM, &DMACTIVE, BBFDM_CWMP},
+{"ConnectionRequestUsername", &DMWRITE, DMT_STRING, get_management_server_connection_request_username, set_management_server_connection_request_username, NULL, NULL, BBFDM_CWMP},
+{"ConnectionRequestPassword", &DMWRITE, DMT_STRING, get_empty, set_management_server_connection_request_passwd,  NULL, NULL, BBFDM_CWMP},
+{"HTTPCompressionSupported", &DMREAD, DMT_STRING, get_management_server_http_compression_supportted, NULL, NULL, NULL, BBFDM_CWMP},
+{"HTTPCompression", &DMWRITE, DMT_STRING, get_management_server_http_compression, set_management_server_http_compression, NULL, NULL, BBFDM_CWMP},
+{"LightweightNotificationProtocolsSupported", &DMREAD, DMT_STRING, get_lwn_protocol_supported, NULL, NULL, NULL, BBFDM_CWMP},
+{"LightweightNotificationProtocolsUsed", &DMWRITE, DMT_STRING, get_lwn_protocol_used, set_lwn_protocol_used, NULL, NULL, BBFDM_CWMP},
+{"UDPLightweightNotificationHost", &DMWRITE, DMT_STRING, get_lwn_host, set_lwn_host, NULL, NULL, BBFDM_CWMP},
+{"UDPLightweightNotificationPort", &DMWRITE, DMT_UNINT, get_lwn_port, set_lwn_port, NULL, NULL, BBFDM_CWMP},
+{"CWMPRetryMinimumWaitInterval", &DMWRITE, DMT_UNINT, get_management_server_retry_min_wait_interval, set_management_server_retry_min_wait_interval, NULL, NULL, BBFDM_CWMP},
+{"CWMPRetryIntervalMultiplier", &DMWRITE, DMT_UNINT, get_management_server_retry_interval_multiplier, set_management_server_retry_interval_multiplier, NULL, NULL, BBFDM_CWMP},
+{"AliasBasedAddressing", &DMREAD, DMT_BOOL, get_alias_based_addressing, NULL, &DMFINFRM, NULL, BBFDM_CWMP},
+{"InstanceMode", &DMWRITE, DMT_STRING, get_instance_mode, set_instance_mode, NULL, NULL, BBFDM_CWMP},
+{"ConnReqAllowedJabberIDs", &DMWRITE, DMT_STRING, get_management_server_conn_rep_allowed_jabber_id, set_management_server_conn_rep_allowed_jabber_id, NULL, NULL, BBFDM_CWMP},
+{"ConnReqJabberID", &DMREAD, DMT_STRING, get_management_server_conn_req_jabber_id, NULL, &DMFINFRM, &DMACTIVE, BBFDM_CWMP},
+{"ConnReqXMPPConnection", &DMWRITE, DMT_STRING, get_management_server_conn_req_xmpp_connection, set_management_server_conn_req_xmpp_connection, &DMFINFRM, NULL, BBFDM_CWMP},
+{"SupportedConnReqMethods", &DMREAD, DMT_STRING, get_management_server_supported_conn_req_methods, NULL, NULL, NULL, BBFDM_CWMP},
+{"UDPConnectionRequestAddress", &DMREAD, DMT_STRING, get_upd_cr_address, NULL, NULL, &DMACTIVE, BBFDM_CWMP},
+{"STUNEnable", &DMWRITE, DMT_BOOL, get_stun_enable, set_stun_enable, NULL, NULL, BBFDM_CWMP},
+{"STUNServerAddress", &DMWRITE, DMT_STRING, get_stun_server_address, set_stun_server_address, NULL, NULL, BBFDM_CWMP},
+{"STUNServerPort", &DMWRITE, DMT_UNINT, get_stun_server_port, set_stun_server_port, NULL, NULL, BBFDM_CWMP},
+{"STUNUsername", &DMWRITE, DMT_STRING, get_stun_username, set_stun_username, NULL, NULL, BBFDM_CWMP},
+{"STUNPassword", &DMWRITE, DMT_STRING, get_stun_password, set_stun_password, NULL, NULL, BBFDM_CWMP},
+{"STUNMaximumKeepAlivePeriod", &DMWRITE, DMT_INT, get_stun_maximum_keepalive_period, set_stun_maximum_keepalive_period, NULL, NULL, BBFDM_CWMP},
+{"STUNMinimumKeepAlivePeriod", &DMWRITE, DMT_UNINT, get_stun_minimum_keepalive_period, set_stun_minimum_keepalive_period, NULL, NULL, BBFDM_CWMP},
+{"NATDetected", &DMREAD, DMT_BOOL, get_nat_detected, NULL, NULL, NULL, BBFDM_CWMP},
+{0}
+};
+
+/*#Device.ManagementServer.URL!UCI:cwmp/cwmp,acs/url*/
+int get_management_server_url(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	int i = 1;
+	char *dhcp = NULL, *pch = NULL, *spch = NULL;
+	char *url = NULL;
+	char *provisioning_value = NULL;
+	char package[64] = "", section[64] = "", option[64] = "";
+
+	dmuci_get_option_value_string("cwmp", "acs", "dhcp_discovery", &dhcp);
+	dmuci_get_option_value_string("cwmp", "acs", "url", &url);
+	dmuci_get_varstate_string("cwmp", "acs", "dhcp_url", &provisioning_value);
+
+	if ( ((dhcp && strcmp(dhcp, "enable") == 0 ) || ((url == NULL) || (url[0] == '\0'))) && ((provisioning_value != NULL) && (provisioning_value[0] != '\0')) )
+	{
+		*value = provisioning_value;
+	}
+	else if ((url != NULL) && (url[0] != '\0'))
+			*value = url;
+	else
+		*value = dmstrdup(DEFAULT_ACSURL);
+	return 0;
+}
+
+int set_management_server_url(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:			
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp", "acs", "dhcp_discovery", "disable");
+			dmuci_set_value("cwmp", "acs", "url", value);
+			cwmp_set_end_session(END_SESSION_RELOAD);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.Username!UCI:cwmp/cwmp,acs/userid*/
+int get_management_server_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp", "acs", "userid", value);
+	return 0;	
+}
+
+int set_management_server_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:			
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp", "acs", "userid", value);
+			cwmp_set_end_session(END_SESSION_RELOAD);
+			return 0;
+	}
+	return 0;	
+}
+
+/*#Device.ManagementServer.Password!UCI:cwmp/cwmp,acs/passwd*/
+int set_management_server_passwd(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:			
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp", "acs", "passwd", value);
+			cwmp_set_end_session(END_SESSION_RELOAD);
+			return 0;
+	}
+	return 0;	
+}
+
+/*#Device.ManagementServer.ParameterKey!UCI:cwmp/cwmp,acs/ParameterKey*/
+int get_management_server_key(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp", "acs", "ParameterKey", value);
+	return 0;	
+}
+
+/*#Device.ManagementServer.PeriodicInformEnable!UCI:cwmp/cwmp,acs/periodic_inform_enable*/
+int get_management_server_periodic_inform_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp", "acs", "periodic_inform_enable", value);
+	return 0;	
+}
+
+int set_management_server_periodic_inform_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:			
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value("cwmp", "acs", "periodic_inform_enable", "1");
+			else
+				dmuci_set_value("cwmp", "acs", "periodic_inform_enable", "0");
+			cwmp_set_end_session(END_SESSION_RELOAD);
+			return 0;
+	}
+	return 0;	
+}
+
+/*#Device.ManagementServer.PeriodicInformInterval!UCI:cwmp/cwmp,acs/periodic_inform_interval*/
+int get_management_server_periodic_inform_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp", "acs", "periodic_inform_interval", value);
+	return 0;
+}
+
+int set_management_server_periodic_inform_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:			
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp", "acs", "periodic_inform_interval", value);
+			cwmp_set_end_session(END_SESSION_RELOAD);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.PeriodicInformTime!UCI:cwmp/cwmp,acs/periodic_inform_time*/
+int get_management_server_periodic_inform_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	time_t time_value;
+	
+	dmuci_get_option_value_string("cwmp", "acs", "periodic_inform_time", value);
+	if ((*value)[0] != '0' && (*value)[0] != '\0') {
+		time_value = atoi(*value);
+		char s_now[sizeof "AAAA-MM-JJTHH:MM:SS.000Z"];
+		strftime(s_now, sizeof s_now, "%Y-%m-%dT%H:%M:%S.000Z", localtime(&time_value));
+		*value = dmstrdup(s_now); // MEM WILL BE FREED IN DMMEMCLEAN
+	}
+	else {
+		*value = "0001-01-01T00:00:00Z";
+	}		
+	return 0;	
+}
+
+int set_management_server_periodic_inform_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct tm tm;
+	char *p, buf[16];
+	switch (action) {
+		case VALUECHECK:			
+			return 0;
+		case VALUESET:
+			if (!(strptime(value, "%Y-%m-%dT%H:%M:%S", &tm))) {
+				return 0;
+			}
+			sprintf(buf, "%ld", mktime(&tm));
+			dmuci_set_value("cwmp", "acs", "periodic_inform_time", buf);
+			cwmp_set_end_session(END_SESSION_RELOAD);
+			return 0;
+	}
+	return 0;	
+}
+
+/*#Device.ManagementServer.ConnectionRequestURL!UCI:cwmp/cwmp,cpe/port*/
+int get_management_server_connection_request_url(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *ip, *port, *iface;
+
+	*value = "";
+	dmuci_get_option_value_string("cwmp", "cpe", "default_wan_interface", &iface);
+	network_get_ipaddr(&ip, iface);	
+	dmuci_get_option_value_string("cwmp", "cpe", "port", &port);
+	if (ip[0] != '\0' && port[0] != '\0') {
+		char buf[64];
+		sprintf(buf,"http://%s:%s/", ip, port);
+		*value = dmstrdup(buf); //  MEM WILL BE FREED IN DMMEMCLEAN
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.ConnectionRequestUsername!UCI:cwmp/cwmp,cpe/userid*/
+int get_management_server_connection_request_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp", "cpe", "userid", value);
+	return 0;
+}
+
+int set_management_server_connection_request_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:			
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp", "cpe", "userid", value);
+			cwmp_set_end_session(END_SESSION_RELOAD);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.ConnectionRequestPassword!UCI:cwmp/cwmp,cpe/passwd*/
+int set_management_server_connection_request_passwd(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp", "cpe", "passwd", value);
+			cwmp_set_end_session(END_SESSION_RELOAD);
+			return 0;
+	}
+	return 0;
+}
+
+int get_lwn_protocol_supported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "UDP";
+	return 0;
+}
+
+/*#Device.ManagementServer.LightweightNotificationProtocolsUsed!UCI:cwmp/cwmp,lwn/enable*/
+int get_lwn_protocol_used(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	bool b;
+	char *tmp;
+	
+	dmuci_get_option_value_string("cwmp", "lwn", "enable", &tmp);
+	string_to_bool(tmp, &b);
+	if (b)
+		*value = "UDP";
+	else	
+		*value = "";
+	return 0;
+}
+
+int set_lwn_protocol_used(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value,"UDP") ==0) {
+				dmuci_set_value("cwmp", "lwn", "enable", "1");
+				cwmp_set_end_session(END_SESSION_RELOAD);
+			} 
+			else {
+				dmuci_set_value("cwmp", "lwn", "enable", "0");
+				cwmp_set_end_session(END_SESSION_RELOAD);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.UDPLightweightNotificationHost!UCI:cwmp/cwmp,lwn/hostname*/
+int get_lwn_host(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{	
+	dmuci_get_option_value_string("cwmp", "lwn", "hostname", value);
+	return 0;
+}
+
+int set_lwn_host(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp", "lwn", "hostname", value);
+			cwmp_set_end_session(END_SESSION_RELOAD);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.UDPLightweightNotificationPort!UCI:cwmp/cwmp,lwn/port*/
+int get_lwn_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp", "lwn", "port", value);
+	return 0;
+}
+
+int set_lwn_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp", "lwn", "port", value);
+			cwmp_set_end_session(END_SESSION_RELOAD);
+			return 0;
+	}
+	return 0;
+}
+
+int get_management_server_http_compression_supportted(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "GZIP,Deflate";
+	return 0;
+}
+
+/*#Device.ManagementServer.HTTPCompression!UCI:cwmp/cwmp,acs/compression*/
+int get_management_server_http_compression(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp", "acs", "compression", value);
+	return 0;
+}
+
+int set_management_server_http_compression(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			 if (0 == strcasecmp(value, "gzip") || 0 == strcasecmp(value, "deflate") || 0 == strncasecmp(value, "disable", 7)) {
+				 return 0;
+			 }
+			return FAULT_9007;
+		case VALUESET:
+			dmuci_set_value("cwmp", "acs", "compression", value);
+			cwmp_set_end_session(END_SESSION_RELOAD);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.CWMPRetryMinimumWaitInterval!UCI:cwmp/cwmp,acs/retry_min_wait_interval*/
+int get_management_server_retry_min_wait_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp", "acs", "retry_min_wait_interval", value);
+	return 0;
+}
+
+int set_management_server_retry_min_wait_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	int a;
+	switch (action) {
+		case VALUECHECK:
+			a = atoi(value);
+			if (a <= 65535 && a >= 1) {
+				 return 0;
+			}
+			return FAULT_9007;
+		case VALUESET:
+			dmuci_set_value("cwmp", "acs", "retry_min_wait_interval", value);
+			cwmp_set_end_session(END_SESSION_RELOAD);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.CWMPRetryIntervalMultiplier!UCI:cwmp/cwmp,acs/retry_interval_multiplier*/
+int get_management_server_retry_interval_multiplier(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp", "acs", "retry_interval_multiplier", value);
+	return 0;
+}
+
+int set_management_server_retry_interval_multiplier(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	int a;
+	switch (action) {
+		case VALUECHECK:
+			a = atoi(value);
+			if (a <= 65535 && a >= 1000) {
+				 return 0;
+			}
+			return FAULT_9007;
+		case VALUESET:
+			dmuci_set_value("cwmp", "acs", "retry_interval_multiplier", value);
+			cwmp_set_end_session(END_SESSION_RELOAD);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.AliasBasedAddressing!UCI:cwmp/cwmp,cpe/amd_version*/
+int get_alias_based_addressing(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp", "cpe", "amd_version", value);
+	if((*value)[0] == '\0'|| atoi(*value) <= AMD_4) {
+		*value = "false";
+	}
+	else {
+		*value = "true";
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.InstanceMode!UCI:cwmp/cwmp,cpe/instance_mode*/
+int get_instance_mode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp", "cpe", "instance_mode", value);
+	return 0;
+}
+
+int set_instance_mode(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			if (0 == strcmp(value, "InstanceNumber") || 0 == strcmp(value, "InstanceAlias") ) {
+				return 0;
+			}
+			return FAULT_9007;
+		case VALUESET:
+			dmuci_set_value("cwmp", "cpe", "instance_mode", value);
+			cwmp_set_end_session(END_SESSION_RELOAD);
+			return 0;
+	}
+	return 0;
+}
+
+/*
+ * STUN parameters
+ */
+/*#Device.ManagementServer.UDPConnectionRequestAddress!UCI:cwmp_stun/stun,stun/crudp_address*/
+int get_upd_cr_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	dmuci_get_varstate_string("cwmp_stun", "stun", "crudp_address", value);
+	return 0;
+}
+
+int get_stun_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	char *path = "/etc/rc.d/*icwmp_stund";
+	if (check_file(path))
+		*value = "1";
+	else
+		*value = "0";
+	return 0;
+}
+
+int set_stun_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b) {
+				DMCMD("/etc/rc.common", 2, "/etc/init.d/icwmp_stund", "enable");
+				DMCMD("/etc/rc.common", 2, "/etc/init.d/icwmp_stund", "start");
+			}
+			else {
+				DMCMD("/etc/rc.common", 2, "/etc/init.d/icwmp_stund", "disable");
+				DMCMD("/etc/rc.common", 2, "/etc/init.d/icwmp_stund", "stop");
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.STUNServerAddress!UCI:cwmp_stun/stun,stun/server_address*/
+int get_stun_server_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	dmuci_get_option_value_string("cwmp_stun", "stun", "server_address", value);
+	return 0;
+}
+
+int set_stun_server_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp_stun", "stun", "server_address", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.STUNServerPort!UCI:cwmp_stun/stun,stun/server_port*/
+int get_stun_server_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	dmuci_get_option_value_string("cwmp_stun", "stun", "server_port", value);
+	return 0;
+}
+
+int set_stun_server_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp_stun", "stun", "server_port", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.STUNUsername!UCI:cwmp_stun/stun,stun/username*/
+int get_stun_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	dmuci_get_option_value_string("cwmp_stun", "stun", "username", value);
+	return 0;
+}
+
+int set_stun_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp_stun", "stun", "username", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.STUNPassword!UCI:cwmp_stun/stun,stun/password*/
+int get_stun_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	dmuci_get_option_value_string("cwmp_stun", "stun", "password", value);
+	return 0;
+}
+
+int set_stun_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp_stun", "stun", "password", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.STUNMaximumKeepAlivePeriod!UCI:cwmp_stun/stun,stun/max_keepalive*/
+int get_stun_maximum_keepalive_period(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	dmuci_get_option_value_string("cwmp_stun", "stun", "max_keepalive", value);
+	return 0;
+}
+
+int set_stun_maximum_keepalive_period(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp_stun", "stun", "max_keepalive", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.STUNMinimumKeepAlivePeriod!UCI:cwmp_stun/stun,stun/min_keepalive*/
+int get_stun_minimum_keepalive_period(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	dmuci_get_option_value_string("cwmp_stun", "stun", "min_keepalive", value);
+	return 0;
+}
+
+int set_stun_minimum_keepalive_period(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action){
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp_stun", "stun", "min_keepalive", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.ManagementServer.NATDetected!UCI:cwmp_stun/stun,stun/nat_detected*/
+int get_nat_detected(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	char *path = "/etc/rc.d/*icwmp_stund";
+	char *v;
+
+	if (check_file(path)) { //stun is enabled
+		dmuci_get_varstate_string("cwmp_stun", "stun", "nat_detected", &v);
+		*value = (*v == '1') ? "true" : "false";
+	}
+	else {
+		*value = "false";
+	}
+
+	return 0;
+}
+
+
+/*
+ * XMPP parameters
+ */
+/*#Device.ManagementServer.ConnReqAllowedJabberIDs!UCI:cwmp_xmpp/cwmp,xmpp/allowed_jid*/
+int get_management_server_conn_rep_allowed_jabber_id(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("cwmp_xmpp", "xmpp", "allowed_jid", value);
+	return 0;
+}
+
+int set_management_server_conn_rep_allowed_jabber_id(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("cwmp_xmpp", "xmpp", "allowed_jid", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_management_server_conn_req_jabber_id(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	char *username, *domain, *resource, *tmpPtr, *strResponse = "";
+	*value = "";
+
+	uci_foreach_sections("cwmp_xmpp", "xmpp_connection", s) {
+		dmuci_get_value_by_section_string(s, "username", &username);
+		dmuci_get_value_by_section_string(s, "domain", &domain);
+		dmuci_get_value_by_section_string(s, "resource", &resource);
+		if(*username != '\0' || *domain != '\0' || *resource != '\0') {
+			if(*strResponse == '\0')
+				dmasprintf(&strResponse, "%s@%s/%s", username, domain, resource);
+			else {
+				tmpPtr = dmstrdup(strResponse);
+				dmasprintf(&strResponse, "%s, %s@%s/%s", tmpPtr, username, domain, resource);
+			}
+		}
+	}
+	*value = dmstrdup(strResponse);
+	return 0;
+}
+
+int get_management_server_conn_req_xmpp_connection(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *id;
+
+	dmuci_get_option_value_string("cwmp_xmpp", "xmpp", "id", &id);
+	dmasprintf(value, "Device.XMPP.Connection.%s", id);
+	return 0;
+}
+
+int set_management_server_conn_req_xmpp_connection(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *str, *connection_instance;
+	struct uci_section *s = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (str = strstr(value, "Device.XMPP.Connection.")) {
+				value = dmstrdup(str + sizeof("Device.XMPP.Connection.") - 1); //MEM WILL BE FREED IN DMMEMCLEAN
+			}
+			uci_foreach_sections("cwmp_xmpp", "xmpp_connection", s) {
+				dmuci_get_value_by_section_string(s, "connection_instance", &connection_instance);
+				if(strcmp(value, connection_instance) == 0) {
+					dmuci_set_value("cwmp_xmpp", "xmpp", "id", value);
+					break;
+				}
+			}
+			cwmp_set_end_session(END_SESSION_RELOAD);
+			return 0;
+	}
+	return 0;
+}
+
+int get_management_server_supported_conn_req_methods(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "HTTP,XMPP,STUN";
+	return 0;
+}
diff --git a/dmtree/tr181/managementserver.h b/dmtree/tr181/managementserver.h
new file mode 100644
index 0000000000000000000000000000000000000000..ddc427aa159892696de3a609575e06f35251bca7
--- /dev/null
+++ b/dmtree/tr181/managementserver.h
@@ -0,0 +1,79 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2012-2014 PIVA SOFTWARE (www.pivasoftware.com)
+ *		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *		Author: Feten Besbes <feten.besbes@pivasoftware.com>
+ */
+
+#ifndef __MANAGEMENT_SERVER_H
+#define __MANAGEMENT_SERVER_H
+#include "dmcwmp.h"
+extern DMLEAF tManagementServerParams[];
+
+int get_management_server_url(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_management_server_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_empty(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_management_server_key(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_management_server_periodic_inform_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_management_server_periodic_inform_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_management_server_periodic_inform_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_management_server_connection_request_url(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_management_server_connection_request_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_management_server_http_compression_supportted(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_management_server_http_compression(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_lwn_protocol_supported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_lwn_protocol_used(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_lwn_host(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_lwn_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_management_server_retry_min_wait_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_management_server_retry_interval_multiplier(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_alias_based_addressing(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_instance_mode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_management_server_conn_rep_allowed_jabber_id(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_management_server_conn_req_jabber_id(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_management_server_conn_req_xmpp_connection(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_management_server_supported_conn_req_methods(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_upd_cr_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_upd_cr_address_notification_limit(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_stun_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_stun_server_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_stun_server_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_stun_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_stun_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_stun_maximum_keepalive_period(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_stun_minimum_keepalive_period(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_nat_detected(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int set_management_server_url(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_management_server_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_management_server_passwd(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_management_server_periodic_inform_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_management_server_periodic_inform_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_management_server_periodic_inform_time(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_management_server_connection_request_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_management_server_connection_request_passwd(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_management_server_http_compression(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_lwn_protocol_used(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_lwn_protocol_used(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_lwn_host(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_lwn_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_management_server_retry_min_wait_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_management_server_retry_interval_multiplier(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_instance_mode(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_management_server_conn_rep_allowed_jabber_id(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_management_server_conn_req_xmpp_connection(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int set_upd_cr_address_notification_limit(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_stun_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_stun_server_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_stun_server_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_stun_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_stun_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_stun_maximum_keepalive_period(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_stun_minimum_keepalive_period(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+#endif
diff --git a/dmtree/tr181/nat.c b/dmtree/tr181/nat.c
new file mode 100644
index 0000000000000000000000000000000000000000..2207a7ed6796ceeffb8284cab8fa2309d29fe5cb
--- /dev/null
+++ b/dmtree/tr181/nat.c
@@ -0,0 +1,686 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2019 iopsys Software Solutions AB
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "dmentry.h"
+#include "nat.h"
+
+/* *** Device.NAT. *** */
+DMOBJ tNATObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"InterfaceSetting", &DMWRITE, add_NAT_InterfaceSetting, delete_NAT_InterfaceSetting, NULL, browseInterfaceSettingInst, NULL, NULL, NULL, tNATInterfaceSettingParams, NULL, BBFDM_BOTH},
+{"PortMapping", &DMWRITE, add_NAT_PortMapping, delete_NAT_PortMapping, NULL, browsePortMappingInst, NULL, NULL, NULL, tNATPortMappingParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tNATParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"InterfaceSettingNumberOfEntries", &DMREAD, DMT_UNINT, get_nat_interface_setting_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{"PortMappingNumberOfEntries", &DMREAD, DMT_UNINT, get_nat_port_mapping_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.NAT.InterfaceSetting.{i}. *** */
+DMLEAF tNATInterfaceSettingParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_nat_interface_setting_enable, set_nat_interface_setting_enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMWRITE, DMT_STRING, get_nat_interface_setting_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_nat_interface_setting_alias, set_nat_interface_setting_alias, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_nat_interface_setting_interface, set_nat_interface_setting_interface, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.NAT.PortMapping.{i}. *** */
+DMLEAF tNATPortMappingParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_nat_port_mapping_enable, set_nat_port_mapping_enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMWRITE, DMT_STRING, get_nat_port_mapping_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_nat_port_mapping_alias, set_nat_port_mapping_alias, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_nat_port_mapping_interface, set_nat_port_mapping_interface, NULL, NULL, BBFDM_BOTH},
+{"AllInterfaces", &DMWRITE, DMT_BOOL, get_nat_port_mapping_all_interface, set_nat_port_mapping_all_interface, NULL, NULL, BBFDM_BOTH},
+{"LeaseDuration", &DMWRITE, DMT_UNINT, get_nat_port_mapping_lease_duration, set_nat_port_mapping_lease_duration, NULL, NULL, BBFDM_BOTH},
+{"RemoteHost", &DMWRITE, DMT_STRING, get_nat_port_mapping_remote_host, set_nat_port_mapping_remote_host, NULL, NULL, BBFDM_BOTH},
+{"ExternalPort", &DMWRITE, DMT_UNINT, get_nat_port_mapping_external_port, set_nat_port_mapping_external_port, NULL, NULL, BBFDM_BOTH},
+{"ExternalPortEndRange", &DMWRITE, DMT_UNINT, get_nat_port_mapping_external_port_end_range, set_nat_port_mapping_external_port_end_range, NULL, NULL, BBFDM_BOTH},
+{"InternalPort", &DMWRITE, DMT_UNINT, get_nat_port_mapping_internal_port, set_nat_port_mapping_internal_port, NULL, NULL, BBFDM_BOTH},
+{"Protocol", &DMWRITE, DMT_STRING, get_nat_port_mapping_protocol, set_nat_port_mapping_protocol, NULL, NULL, BBFDM_BOTH},
+{"InternalClient", &DMWRITE, DMT_STRING, get_nat_port_mapping_internal_client, set_nat_port_mapping_internal_client, NULL, NULL, BBFDM_BOTH},
+{"Description", &DMWRITE, DMT_STRING, get_nat_port_mapping_description, set_nat_port_mapping_description, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*************************************************************
+ * ADD DEL OBJ
+/*************************************************************/
+int add_NAT_InterfaceSetting(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	char *value, *v, *inst, name[16];
+	struct uci_section *s = NULL, *dmmap_firewall = NULL;
+
+	check_create_dmmap_package("dmmap_firewall");
+	inst = get_last_instance_icwmpd("dmmap_firewall", "zone", "interface_setting_instance");
+	sprintf(name, "iface_set_%d", inst ? (atoi(inst)+1) : 1);
+	dmuci_add_section_and_rename("firewall", "zone", &s, &value);
+	dmuci_set_value_by_section(s, "input", "REJECT");
+	dmuci_set_value_by_section(s, "output", "ACCEPT");
+	dmuci_set_value_by_section(s, "forward", "REJECT");
+	dmuci_set_value_by_section(s, "name", name);
+
+	dmuci_add_section_icwmpd("dmmap_firewall", "zone", &dmmap_firewall, &v);
+	dmuci_set_value_by_section(dmmap_firewall, "section_name", section_name(s));
+	*instance = update_instance_icwmpd(dmmap_firewall, inst, "interface_setting_instance");
+	return 0;
+
+}
+
+int delete_NAT_InterfaceSetting(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	int found = 0;
+	char *lan_name;
+	struct uci_section *s = NULL, *ss = NULL, *dmmap_firewall= NULL;
+
+	switch (del_action) {
+		case DEL_INST:
+			get_dmmap_section_of_config_section("dmmap_firewall", "zone", section_name((struct uci_section *)data), &dmmap_firewall);
+			if(dmmap_firewall != NULL)
+				dmuci_delete_by_section(dmmap_firewall, NULL, NULL);
+			dmuci_delete_by_section((struct uci_section *)data, NULL, NULL);
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("firewall", "zone", s) {
+				if (found != 0){
+					get_dmmap_section_of_config_section("dmmap_firewall", "zone", section_name(ss), &dmmap_firewall);
+					if(dmmap_firewall != NULL)
+						dmuci_delete_by_section(dmmap_firewall, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL){
+				get_dmmap_section_of_config_section("dmmap_firewall", "zone", section_name(ss), &dmmap_firewall);
+				if(dmmap_firewall != NULL)
+					dmuci_delete_by_section(dmmap_firewall, NULL, NULL);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int add_NAT_PortMapping(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	char *value, *v, *inst, name[16];
+	struct uci_section *s = NULL, *dmmap_firewall = NULL;
+
+	check_create_dmmap_package("dmmap_firewall");
+	inst = get_last_instance_icwmpd("dmmap_firewall", "redirect", "port_mapping_instance");
+	sprintf(name, "port_map_%d", inst ? (atoi(inst)+1) : 1);
+	dmuci_add_section_and_rename("firewall", "redirect", &s, &value);
+	dmuci_set_value_by_section(s, "name", name);
+	dmuci_set_value_by_section(s, "src", "wan");
+	dmuci_set_value_by_section(s, "target", "DNAT");
+	dmuci_set_value_by_section(s, "dest", "lan");
+
+	dmuci_add_section_icwmpd("dmmap_firewall", "redirect", &dmmap_firewall, &v);
+	dmuci_set_value_by_section(dmmap_firewall, "section_name", section_name(s));
+	*instance = update_instance_icwmpd(dmmap_firewall, inst, "port_mapping_instance");
+	return 0;
+
+}
+
+int delete_NAT_PortMapping(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	int found = 0;
+	char *lan_name;
+	struct uci_section *s = NULL, *ss = NULL, *dmmap_firewall= NULL;
+
+	switch (del_action) {
+		case DEL_INST:
+			get_dmmap_section_of_config_section("dmmap_firewall", "redirect", section_name((struct uci_section *)data), &dmmap_firewall);
+			if(dmmap_firewall != NULL)
+				dmuci_delete_by_section(dmmap_firewall, NULL, NULL);
+			dmuci_delete_by_section((struct uci_section *)data, NULL, NULL);
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("firewall", "redirect", s) {
+				if (found != 0){
+					get_dmmap_section_of_config_section("dmmap_firewall", "redirect", section_name(ss), &dmmap_firewall);
+					if(dmmap_firewall != NULL)
+						dmuci_delete_by_section(dmmap_firewall, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL){
+				get_dmmap_section_of_config_section("dmmap_firewall", "redirect", section_name(ss), &dmmap_firewall);
+				if(dmmap_firewall != NULL)
+					dmuci_delete_by_section(dmmap_firewall, NULL, NULL);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/**************************************************************************
+* SET & GET VALUE
+***************************************************************************/
+/*#Device.NAT.InterfaceSettingNumberOfEntries!UCI:firewall/zone/*/
+int get_nat_interface_setting_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	uci_foreach_sections("firewall", "zone", s)
+	{
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+/*#Device.NAT.PortMappingNumberOfEntries!UCI:firewall/redirect/*/
+int get_nat_port_mapping_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	uci_foreach_sections("firewall", "redirect", s)
+	{
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+/*#Device.NAT.InterfaceSetting.{i}.Enable!UCI:firewall/zone,@i-1/masq*/
+int get_nat_interface_setting_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *val;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "masq", &val);
+	*value = (*val == '1') ? "1" : "0";
+	return 0;
+}
+
+int set_nat_interface_setting_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmuci_set_value_by_section((struct uci_section *)data, "masq", b ? "1" : "0");
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.NAT.InterfaceSetting.{i}.Status!UCI:firewall/zone,@i-1/masq*/
+int get_nat_interface_setting_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *val;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "masq", &val);
+	*value = (*val == '1') ? "Enabled" : "Disabled";
+	return 0;
+}
+
+int get_nat_interface_setting_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_firewall", "zone", section_name((struct uci_section *)data), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "interface_setting_alias", value);
+	return 0;
+}
+
+int set_nat_interface_setting_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_firewall", "zone", section_name((struct uci_section *)data), &dmmap_section);
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, "interface_setting_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_nat_interface_setting_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_list *v;
+	struct uci_element *e;
+	char *ifaceobj, buf[256] = "";
+
+	*value = "";
+	dmuci_get_value_by_section_list((struct uci_section *)data, "network", &v);
+	if (v == NULL)
+		return 0;
+	uci_foreach_element(v, e) {
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), e->name, &ifaceobj); // MEM WILL BE FREED IN DMMEMCLEAN
+		if (ifaceobj == NULL)
+			continue;
+		if (*buf != '\0')
+			strcat(buf, ",");
+		strcat(buf, ifaceobj);
+	}
+	*value = dmstrdup(buf);
+	return 0;
+}
+
+int set_nat_interface_setting_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *iface, *pch, *pchr, buf[256] = "";
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			strcpy(buf, value);
+			dmuci_set_value_by_section((struct uci_section *)data, "network", "");
+			for(pch = strtok_r(buf, ",", &pchr); pch != NULL; pch = strtok_r(NULL, ",", &pchr)) {
+				adm_entry_get_linker_value(ctx, pch, &iface);
+				if (iface) {
+					dmuci_add_list_value_by_section((struct uci_section *)data, "network", iface);
+					free(iface);
+				}
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.NAT.PortMapping.{i}.Enable!UCI:firewall/redirect,@i-1/enabled*/
+int get_nat_port_mapping_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *val;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "enabled", &val);
+	*value = (*val == '1') ? "1" : "0";
+	return 0;
+}
+
+int set_nat_port_mapping_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmuci_set_value_by_section((struct uci_section *)data, "enabled", b ? "1" : "0");
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.NAT.PortMapping.{i}.Status!UCI:firewall/redirect,@i-1/enabled*/
+int get_nat_port_mapping_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *val;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "enabled", &val);
+	*value = (*val == '1') ? "Enabled" : "Disabled";
+	return 0;
+}
+
+int get_nat_port_mapping_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_firewall", "redirect", section_name((struct uci_section *)data), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "port_mapping_alias", value);
+	return 0;
+}
+
+int set_nat_port_mapping_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_firewall", "redirect", section_name((struct uci_section *)data), &dmmap_section);
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, "port_mapping_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_nat_port_mapping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	struct uci_list *v;
+	struct uci_element *e;
+	char *zone, *name, *ifaceobj, buf[256] = "";
+
+	dmuci_get_value_by_section_string((struct uci_section *)data, "src", &zone);
+	uci_foreach_sections("firewall", "zone", s) {
+		dmuci_get_value_by_section_string(s, "name", &name);
+		if (strcmp(zone, name) == 0) {
+			dmuci_get_value_by_section_list(s, "network", &v);
+			break;
+		}
+	}
+	if (v == NULL)
+		return 0;
+	uci_foreach_element(v, e) {
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), e->name, &ifaceobj); // MEM WILL BE FREED IN DMMEMCLEAN
+		if (ifaceobj == NULL)
+			continue;
+		if (*buf != '\0')
+			strcat(buf, ",");
+		strcat(buf, ifaceobj);
+	}
+	*value = dmstrdup(buf);
+	return 0;
+}
+
+int set_nat_port_mapping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *iface, *network, *zone;
+	struct uci_section *s = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			adm_entry_get_linker_value(ctx, value, &iface);
+			if (iface[0] != '\0') {
+				uci_foreach_sections("firewall", "zone", s)
+				{
+					dmuci_get_value_by_section_string(s, "network", &network);
+					if (is_strword_in_optionvalue(network, iface)){
+						dmuci_get_value_by_section_string(s, "name", &zone);
+						dmuci_set_value_by_section((struct uci_section *)data, "src", zone);
+						break;
+					}
+				}
+			}
+			break;
+	}
+	return 0;
+}
+
+int get_nat_port_mapping_all_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	return 0;
+}
+
+int set_nat_port_mapping_all_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			return 0;
+	}
+	return 0;
+}
+
+int get_nat_port_mapping_lease_duration(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	// CPE only supports static port forwards
+	*value = "0";
+	return 0;
+}
+
+int set_nat_port_mapping_lease_duration(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			// CPE only supports static port forwards
+			if (strcmp(value, "0") != 0)
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			// Nothing to set for static port forwards
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.NAT.PortMapping.{i}.RemoteHost!UCI:firewall/redirect,@i-1/src_dip*/
+int get_nat_port_mapping_remote_host(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "src_dip", value);
+	return 0;
+}
+
+int set_nat_port_mapping_remote_host(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "src_dip", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.NAT.PortMapping.{i}.ExternalPort!UCI:firewall/redirect,@i-1/src_dport*/
+int get_nat_port_mapping_external_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *dport, *tmp;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "src_dport", &dport);
+	if (*dport == '\0') {
+		*value = "0";
+		return 0;
+	}
+	tmp = strchr(dport, ':');
+	if (tmp)
+		*tmp = '\0';
+	*value = dport;
+	return 0;
+}
+
+int set_nat_port_mapping_external_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *dport, buffer[64];
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "src_dport", &dport);
+			dport = strchr(dport, ':');
+			if (dport == NULL)
+				sprintf(buffer, "%s", value);
+			else
+				sprintf(buffer, "%s%s", value, dport);
+			dmuci_set_value_by_section((struct uci_section *)data, "src_dport", buffer);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.NAT.PortMapping.{i}.ExternalPortEndRange!UCI:firewall/redirect,@i-1/src_dport*/
+int get_nat_port_mapping_external_port_end_range(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *dport, *tmp;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "src_dport", &dport);
+	tmp = strchr(dport, ':');
+	*value = (tmp) ? tmp+1 : "0";
+	return 0;
+}
+
+int set_nat_port_mapping_external_port_end_range(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *dport, *tmp, buffer[64];
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section *)data, "src_dport", &dport);
+			tmp = strchr(dport, ':');
+			if (tmp)
+				*tmp = '\0';
+			if (*value == '0')
+				sprintf(buffer, "%s", dport);
+			else
+				sprintf(buffer, "%s:%s", dport, value);
+			dmuci_set_value_by_section((struct uci_section *)data, "src_dport", buffer);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.NAT.PortMapping.{i}.InternalPort!UCI:firewall/redirect,@i-1/dest_port*/
+int get_nat_port_mapping_internal_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "dest_port", value);
+	return 0;
+}
+
+int set_nat_port_mapping_internal_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "dest_port", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.NAT.PortMapping.{i}.Protocol!UCI:firewall/redirect,@i-1/proto*/
+int get_nat_port_mapping_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *proto;
+	dmuci_get_value_by_section_string((struct uci_section *)data, "proto", &proto);
+	if (strcasecmp(proto, "tcp") == 0)
+		*value = "TCP";
+	else if (strcasecmp(proto, "udp") == 0)
+		*value = "UDP";
+	else
+		*value = "TCP/UDP";
+	return 0;
+	return 0;
+}
+
+int set_nat_port_mapping_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *v;
+	switch (action) {
+		case VALUECHECK:
+			if (strcasecmp("TCP", value) != 0 && strcasecmp("UDP", value) != 0 && strcasecmp("TCP/UDP", value) != 0)
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			if (strcasecmp("TCP", value) == 0)
+				v = "tcp";
+			else if (strcasecmp("UDP", value) == 0)
+				v = "udp";
+			else
+				v = "tcpudp";
+			dmuci_set_value_by_section((struct uci_section *)data, "proto", v);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.NAT.PortMapping.{i}.InternalClient!UCI:firewall/redirect,@i-1/dest_ip*/
+int get_nat_port_mapping_internal_client(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "dest_ip", value);
+	return 0;
+}
+
+int set_nat_port_mapping_internal_client(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "dest_ip", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.NAT.PortMapping.{i}.Description!UCI:firewall/redirect,@i-1/name*/
+int get_nat_port_mapping_description(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "name", value);
+	return 0;
+}
+
+int set_nat_port_mapping_description(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "name", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*************************************************************
+ * ENTRY METHOD
+/*************************************************************/
+/*#Device.NAT.InterfaceSetting.{i}.!UCI:firewall/zone/dmmap_firewall*/
+int browseInterfaceSettingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *nati, *nati_last = NULL;
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("firewall", "zone", "dmmap_firewall", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		nati =  handle_update_instance(1, dmctx, &nati_last, update_instance_alias, 3, p->dmmap_section, "interface_setting_instance", "interface_setting_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, nati) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+/*#Device.NAT.PortMapping.{i}.!UCI:firewall/redirect/dmmap_firewall*/
+int browsePortMappingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *natp, *natp_last = NULL, *target;
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("firewall", "redirect", "dmmap_firewall", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		dmuci_get_value_by_section_string(p->config_section, "target", &target);
+		if (*target != '\0' && strcmp(target, "DNAT") != 0)
+			continue;
+		natp =  handle_update_instance(1, dmctx, &natp_last, update_instance_alias, 3, p->dmmap_section, "port_mapping_instance", "port_mapping_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, natp) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
diff --git a/dmtree/tr181/nat.h b/dmtree/tr181/nat.h
new file mode 100644
index 0000000000000000000000000000000000000000..32f0a9168e5583d1d2c9ad1bdc0b948207d69f39
--- /dev/null
+++ b/dmtree/tr181/nat.h
@@ -0,0 +1,66 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2019 iopsys Software Solutions AB
+ *		Author: Imen BHIRI <imen.bhiri@pivasoftware.com>
+ *		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#ifndef __NAT_H
+#define __NAT_H
+
+extern DMOBJ tNATObj[];
+extern DMLEAF tNATParams[];
+extern DMLEAF tNATInterfaceSettingParams[];
+extern DMLEAF tNATPortMappingParams[];
+
+int browseInterfaceSettingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browsePortMappingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int add_NAT_InterfaceSetting(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delete_NAT_InterfaceSetting(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int add_NAT_PortMapping(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delete_NAT_PortMapping(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_nat_interface_setting_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_nat_port_mapping_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_nat_interface_setting_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_nat_interface_setting_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_nat_interface_setting_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_nat_interface_setting_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_nat_interface_setting_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_nat_interface_setting_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_nat_interface_setting_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int get_nat_port_mapping_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_nat_port_mapping_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_nat_port_mapping_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_nat_port_mapping_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_nat_port_mapping_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_nat_port_mapping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_nat_port_mapping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_nat_port_mapping_all_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_nat_port_mapping_all_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_nat_port_mapping_lease_duration(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_nat_port_mapping_lease_duration(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_nat_port_mapping_remote_host(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_nat_port_mapping_remote_host(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_nat_port_mapping_external_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_nat_port_mapping_external_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_nat_port_mapping_external_port_end_range(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_nat_port_mapping_external_port_end_range(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_nat_port_mapping_internal_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_nat_port_mapping_internal_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_nat_port_mapping_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_nat_port_mapping_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_nat_port_mapping_internal_client(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_nat_port_mapping_internal_client(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_nat_port_mapping_description(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_nat_port_mapping_description(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif
diff --git a/dmtree/tr181/ppp.c b/dmtree/tr181/ppp.c
new file mode 100644
index 0000000000000000000000000000000000000000..89db476f4479c64b5819a2dcc8a2a8fb517ac6bc
--- /dev/null
+++ b/dmtree/tr181/ppp.c
@@ -0,0 +1,600 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2016 Inteno Broadband Technology AB
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmjson.h"
+#include "dmcommon.h"
+#include "dmentry.h"
+#include "ppp.h"
+
+/* *** Device.PPP. *** */
+DMOBJ tPPPObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Interface", &DMWRITE, add_ppp_interface, delete_ppp_interface, NULL, browseInterfaceInst, NULL, NULL, tPPPInterfaceObj, tPPPInterfaceParams, get_linker_ppp_interface, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tPPPParams[] = {
+/* PARAM, permission, type, getvlue, setvalue, forced_inform, notification*/
+{"InterfaceNumberOfEntries", &DMREAD, DMT_UNINT, get_PPP_InterfaceNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.PPP.Interface.{i}. *** */
+DMOBJ tPPPInterfaceObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"PPPoE", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tPPPInterfacePPPoEParams, NULL, BBFDM_BOTH},
+{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tPPPInterfaceStatsParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tPPPInterfaceParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_ppp_alias, set_ppp_alias, NULL, NULL, BBFDM_BOTH},
+{"Enable", &DMWRITE, DMT_BOOL, get_ppp_enable, set_ppp_enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_PPPInterface_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"LastChange", &DMREAD, DMT_UNINT, get_PPPInterface_LastChange, NULL, NULL, NULL, BBFDM_BOTH},
+{"Reset", &DMWRITE, DMT_BOOL, get_PPPInterface_Reset, set_PPPInterface_Reset, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMREAD, DMT_STRING, get_ppp_name, NULL, NULL, NULL, BBFDM_BOTH},
+{"LowerLayers", &DMWRITE, DMT_STRING, get_ppp_lower_layer, set_ppp_lower_layer, NULL, NULL, BBFDM_BOTH},
+{"ConnectionStatus", &DMREAD, DMT_STRING, get_ppp_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Username", &DMWRITE, DMT_STRING, get_ppp_username, set_ppp_username, NULL, NULL, BBFDM_BOTH},
+{"Password", &DMWRITE, DMT_STRING, get_empty, set_ppp_password, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.PPP.Interface.{i}.PPPoE. *** */
+DMLEAF tPPPInterfacePPPoEParams[] = {
+		/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"SessionID", &DMREAD, DMT_UNINT, get_PPPInterfacePPPoE_SessionID, NULL, NULL, NULL, BBFDM_BOTH},
+{"ACName", &DMWRITE, DMT_STRING, get_PPPInterfacePPPoE_ACName, set_PPPInterfacePPPoE_ACName, NULL, NULL, BBFDM_BOTH},
+{"ServiceName", &DMWRITE, DMT_STRING, get_PPPInterfacePPPoE_ServiceName, set_PPPInterfacePPPoE_ServiceName, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.PPP.Interface.{i}.Stats. *** */
+DMLEAF tPPPInterfaceStatsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"BytesReceived", &DMREAD, DMT_UNINT, get_ppp_eth_bytes_received, NULL, NULL, NULL, BBFDM_BOTH},
+{"BytesSent", &DMREAD, DMT_UNINT, get_ppp_eth_bytes_sent, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsReceived", &DMREAD, DMT_UNINT, get_ppp_eth_pack_received, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsSent", &DMREAD, DMT_UNINT, get_ppp_eth_pack_sent, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsSent", &DMREAD, DMT_UNINT, get_PPPInterfaceStats_ErrorsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsReceived", &DMREAD, DMT_UNINT, get_PPPInterfaceStats_ErrorsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnicastPacketsSent", &DMREAD, DMT_UNINT, get_PPPInterfaceStats_UnicastPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnicastPacketsReceived", &DMREAD, DMT_UNINT, get_PPPInterfaceStats_UnicastPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsSent", &DMREAD, DMT_UNINT, get_PPPInterfaceStats_DiscardPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsReceived", &DMREAD, DMT_UNINT, get_PPPInterfaceStats_DiscardPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"MulticastPacketsSent", &DMREAD, DMT_UNINT, get_PPPInterfaceStats_MulticastPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"MulticastPacketsReceived", &DMREAD, DMT_UNINT, get_PPPInterfaceStats_MulticastPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"BroadcastPacketsSent", &DMREAD, DMT_UNINT, get_PPPInterfaceStats_BroadcastPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"BroadcastPacketsReceived", &DMREAD, DMT_UNINT, get_PPPInterfaceStats_BroadcastPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnknownProtoPacketsReceived", &DMREAD, DMT_UNINT, get_PPPInterfaceStats_UnknownProtoPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*************************************************************
+ * GET SET ALIAS
+/*************************************************************/
+int get_ppp_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_network", "interface", section_name((struct uci_section *)data), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "ppp_int_alias", value);
+	return 0;
+}
+
+int set_ppp_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_network", "interface", section_name((struct uci_section *)data), &dmmap_section);
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, "ppp_int_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+/**************************************************************************
+* GET & SET PARAMETERS
+***************************************************************************/
+/*#Device.PPP.Interface.{i}.Enable!UBUS:network.interface/status/interface,@Name/up*/
+int get_ppp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	return get_interface_enable_ubus(section_name(((struct uci_section *)data)), refparam, ctx, value);
+}
+
+int set_ppp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	return set_interface_enable_ubus(section_name(((struct uci_section *)data)), refparam, ctx, action, value);
+}
+
+/*#Device.PPP.Interface.{i}.Status!UBUS:network.interface/status/interface,@Name/up*/
+int get_PPPInterface_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *status;
+	get_interface_enable_ubus(section_name(((struct uci_section *)data)), refparam, ctx, &status);
+	if(strcmp(status, "true") == 0)
+		*value= "Up";
+	else
+		*value= "Down";
+	return 0;
+}
+
+/*#Device.PPP.Interface.{i}.LastChange!UBUS:network.interface/status/interface,@Name/uptime*/
+int get_PPPInterface_LastChange(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name((struct uci_section *)data), String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 1, "uptime");
+	return 0;
+}
+
+int get_PPPInterface_Reset(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "false";
+	return 0;
+}
+
+int set_PPPInterface_Reset(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	unsigned char b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b) {
+				set_interface_enable_ubus(section_name((struct uci_section *)data), refparam, ctx, action, "0");
+				set_interface_enable_ubus(section_name((struct uci_section *)data), refparam, ctx, action, "1");
+			}
+			break;
+	}
+	return 0;
+}
+
+int get_ppp_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = dmstrdup(section_name(((struct uci_section *)data)));
+	return 0;
+}
+
+/*#Device.PPP.Interface.{i}.ConnectionStatus!UBUS:network.interface/status/interface,@Name/up*/
+int get_ppp_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *status = NULL;
+	char *uptime = NULL;
+	char *pending = NULL;
+	json_object *res = NULL, *jobj = NULL;
+	bool bstatus = false, bpend = false;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(((struct uci_section *)data)), String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	jobj = dmjson_get_obj(res, 1, "up");
+	if(jobj)
+	{
+		status = dmjson_get_value(res, 1, "up");
+		string_to_bool(status, &bstatus);
+		if (bstatus) {
+			uptime = dmjson_get_value(res, 1, "uptime");
+			pending = dmjson_get_value(res, 1, "pending");			
+			string_to_bool(pending, &bpend);
+		}
+	}
+	if (uptime && atoi(uptime) > 0)
+		*value = "Connected";
+	else if (pending && bpend)
+		*value = "Pending Disconnect";
+	else
+		*value = "Disconnected";
+	return 0;
+}
+
+/*#Device.PPP.Interface.{i}.Username!UCI:network/interface,@i-1/username*/
+int get_ppp_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct uci_section *)data), "username", value);
+	return 0;
+}
+
+int set_ppp_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct uci_section *)data), "username", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.PPP.Interface.{i}.Password!UCI:network/interface,@i-1/password*/
+int set_ppp_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct uci_section *)data), "password", value);
+			return 0;
+	}
+	return 0;
+}
+
+inline int ubus_get_wan_stats(void *data, char *instance, json_object *res, char **value, char *stat_mod)
+{
+	char *ifname, *proto;
+	dmuci_get_value_by_section_string(((struct uci_section *)data), "ifname", &ifname);
+	dmuci_get_value_by_section_string(((struct uci_section *)data), "proto", &proto);
+	if (strcmp(proto, "pppoe") == 0) {
+		dmubus_call("network.device", "status", UBUS_ARGS{{"name", ifname, String}}, 1, &res);
+		DM_ASSERT(res, *value = "");
+		*value = dmjson_get_value(res, 2, "statistics", stat_mod);
+	}
+	return 0;
+}
+
+/*#Device.PPP.Interface.{i}.Stats.BytesReceived!UBUS:network.device/status/name,@Name/statistics.rx_bytes*/
+int get_ppp_eth_bytes_received(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_get_wan_stats(data, instance, res, value, "rx_bytes");
+	return 0;
+}
+
+/*#Device.PPP.Interface.{i}.Stats.BytesSent!UBUS:network.device/status/name,@Name/statistics.tx_bytes*/
+int get_ppp_eth_bytes_sent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_get_wan_stats(data, instance, res, value, "tx_bytes");
+	return 0;
+}
+
+/*#Device.PPP.Interface.{i}.Stats.PacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_packets*/
+int get_ppp_eth_pack_received(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_get_wan_stats(data, instance, res, value, "rx_packets");
+	return 0;
+}
+
+/*#Device.PPP.Interface.{i}.Stats.PacketsSent!UBUS:network.device/status/name,@Name/statistics.tx_packets*/
+int get_ppp_eth_pack_sent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_get_wan_stats(data, instance, res, value, "tx_packets");
+	return 0;
+}
+
+/*#Device.PPP.Interface.{i}.Stats.ErrorsSent!UBUS:network.device/status/name,@Name/statistics.tx_errors*/
+int get_PPPInterfaceStats_ErrorsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_get_wan_stats(data, instance, res, value, "tx_errors");
+	return 0;
+}
+
+/*#Device.PPP.Interface.{i}.Stats.ErrorsReceived!UBUS:network.device/status/name,@Name/statistics.rx_errors*/
+int get_PPPInterfaceStats_ErrorsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_get_wan_stats(data, instance, res, value, "rx_errors");
+	return 0;
+}
+
+int get_PPPInterfaceStats_UnicastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	char *device = get_device(section_name((struct uci_section *)data));
+	if(device[0] != '\0')
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "TX", "unicast"));
+	return 0;
+}
+
+int get_PPPInterfaceStats_UnicastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	char *device = get_device(section_name((struct uci_section *)data));
+	if(device[0] != '\0')
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "RX", "unicast"));
+	return 0;
+}
+
+/*#Device.PPP.Interface.{i}.Stats.DiscardPacketsSent!UBUS:network.device/status/name,@Name/statistics.tx_dropped*/
+int get_PPPInterfaceStats_DiscardPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_get_wan_stats(data, instance, res, value, "tx_dropped");
+	return 0;
+}
+
+/*#Device.PPP.Interface.{i}.Stats.DiscardPacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_dropped*/
+int get_PPPInterfaceStats_DiscardPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_get_wan_stats(data, instance, res, value, "rx_dropped");
+	return 0;
+}
+
+int get_PPPInterfaceStats_MulticastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	char *device = get_device(section_name((struct uci_section *)data));
+	if(device[0] != '\0')
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "TX", "multicast"));
+	return 0;
+}
+
+int get_PPPInterfaceStats_MulticastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	char *device = get_device(section_name((struct uci_section *)data));
+	if(device[0] != '\0')
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "RX", "multicast"));
+	return 0;
+}
+
+int get_PPPInterfaceStats_BroadcastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	char *device = get_device(section_name((struct uci_section *)data));
+	if(device[0] != '\0')
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "TX", "broadcast"));
+	return 0;
+}
+
+int get_PPPInterfaceStats_BroadcastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "0";
+	char *device = get_device(section_name((struct uci_section *)data));
+	if(device[0] != '\0')
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(device, "RX", "broadcast"));
+	return 0;
+}
+
+/*#Device.PPP.Interface.{i}.Stats.UnknownProtoPacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_over_errors*/
+int get_PPPInterfaceStats_UnknownProtoPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_get_wan_stats(data, instance, res, value, "rx_over_errors");
+	return 0;
+}
+
+int get_ppp_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *linker;
+	dmuci_get_value_by_section_string(((struct uci_section *)data), "ifname", &linker);
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cATM%cLink%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value);
+	if (*value == NULL) {
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cPTM%cLink%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value);
+	}
+	if (*value == NULL) {
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cEthernet%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value);
+	}
+	if (*value == NULL) {
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cWiFi%cSSID%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value);
+	}
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+int set_ppp_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *linker;
+	char *newvalue= NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (value[strlen(value)-1]!='.') {
+				dmasprintf(&newvalue, "%s.", value);
+				adm_entry_get_linker_value(ctx, newvalue, &linker);
+			} else
+				adm_entry_get_linker_value(ctx, value, &linker);
+			if(linker) dmuci_set_value_by_section(((struct uci_section *)data), "ifname", linker);
+			else return FAULT_9005;
+			return 0;
+	}
+	return 0;
+}
+
+int get_PPP_InterfaceNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	char *proto;
+	int nbre= 0;
+
+	uci_foreach_sections("network", "interface", s) {
+		dmuci_get_value_by_section_string(s, "proto", &proto);
+		if (!strstr(proto, "ppp"))
+			continue;
+		nbre++;
+	}
+	dmasprintf(value, "%d", nbre);
+	return 0;
+}
+
+int get_PPPInterfacePPPoE_SessionID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+/*#Device.PPP.Interface.{i}.PPPoE.ACName!UCI:network/interface,@i-1/ac*/
+int get_PPPInterfacePPPoE_ACName(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *proto;
+	dmuci_get_value_by_section_string(((struct uci_section *)data), "proto", &proto);
+	if (strcmp(proto, "pppoe") == 0) {
+		dmuci_get_value_by_section_string(((struct uci_section *)data), "ac", value);
+		return 0;
+	}
+	*value= "";
+	return 0;
+}
+
+int set_PPPInterfacePPPoE_ACName(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *proto;
+
+	switch (action)	{
+		case VALUECHECK:
+			dmuci_get_value_by_section_string(((struct uci_section *)data), "proto", &proto);
+			if (strcmp(proto, "pppoe") != 0)
+				return FAULT_9001;
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct uci_section *)data), "ac", value);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.PPP.Interface.{i}.PPPoE.ServiceName!UCI:network/interface,@i-1/service*/
+int get_PPPInterfacePPPoE_ServiceName(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *proto;
+	dmuci_get_value_by_section_string(((struct uci_section *)data), "proto", &proto);
+	if (strcmp(proto, "pppoe") == 0) {
+		dmuci_get_value_by_section_string(((struct uci_section *)data), "service", value);
+		return 0;
+	}
+	*value= "";
+	return 0;
+}
+
+int set_PPPInterfacePPPoE_ServiceName(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *proto;
+
+	switch (action)	{
+		case VALUECHECK:
+			dmuci_get_value_by_section_string(((struct uci_section *)data), "proto", &proto);
+			if (strcmp(proto, "pppoe") != 0)
+				return FAULT_9001;
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct uci_section *)data), "service", value);
+			break;
+	}
+	return 0;
+}
+
+/**************************************************************************
+* LINKER
+***************************************************************************/
+int get_linker_ppp_interface(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) {
+
+	if(((struct uci_section *)data)) {
+		dmasprintf(linker,"%s", section_name(((struct uci_section *)data)));
+		return 0;
+	}
+	*linker = "";
+	return 0;
+}
+
+/*************************************************************
+ * ADD DEL OBJ
+/*************************************************************/
+int add_ppp_interface(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	char name[16] = {0};
+	char *inst, *v;
+	struct uci_section *s = NULL;
+	struct uci_section *dmmap_ppp = NULL;
+
+	check_create_dmmap_package("dmmap_network");
+	inst = get_last_instance_lev2_icwmpd("network", "interface", "dmmap_network", "ppp_int_instance", "proto", "ppp");
+	sprintf(name, "ppp_%d", inst ? (atoi(inst)+1) : 1);
+	dmuci_set_value("network", name, "", "interface");
+	dmuci_set_value("network", name, "proto", "ppp");
+	dmuci_set_value("network", name, "username", name);
+	dmuci_set_value("network", name, "password", name);
+	dmuci_add_section_icwmpd("dmmap_network", "interface", &dmmap_ppp, &v);
+	dmuci_set_value_by_section(dmmap_ppp, "section_name", name);
+	*instance = update_instance_icwmpd(dmmap_ppp, inst, "ppp_int_instance");
+	return 0;
+}
+
+int delete_ppp_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	int found = 0;
+	struct uci_section *ppp_s = NULL;
+	struct uci_section *ss = NULL, *dmmap_section = NULL;
+
+	switch (del_action) {
+		case DEL_INST:
+			get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(((struct uci_section *)data)), &dmmap_section);
+			if(dmmap_section != NULL)
+				dmuci_delete_by_section(dmmap_section, NULL, NULL);
+			dmuci_delete_by_section(((struct uci_section *)data), NULL, NULL);
+			break;
+		case DEL_ALL:
+			uci_foreach_option_eq("network", "interface", "proto", "ppp", ppp_s) {
+				if (found != 0) {
+					get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(ss), &dmmap_section);
+					if(dmmap_section != NULL)
+						dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = ppp_s;
+				found++;
+			}
+			if (ss != NULL) {
+				get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(ss), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*************************************************************
+ * ENTRY METHOD
+/*************************************************************/
+/*#Device.PPP.Interface.{i}.!UCI:network/interface/dmmap_network*/
+int browseInterfaceInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *net_sec = NULL;
+	char *ppp_int = NULL, *ppp_int_last = NULL;
+	char *proto;
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("network", "interface", "dmmap_network", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		dmuci_get_value_by_section_string(p->config_section, "proto", &proto);
+		if (!strstr(proto, "ppp"))
+			continue;
+		ppp_int = handle_update_instance(1, dmctx, &ppp_int_last, update_instance_alias, 3, p->dmmap_section, "ppp_int_instance", "ppp_int_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, ppp_int) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
diff --git a/dmtree/tr181/ppp.h b/dmtree/tr181/ppp.h
new file mode 100644
index 0000000000000000000000000000000000000000..63ff5af25e4efdb9670ea1bfa82863fbe15098d3
--- /dev/null
+++ b/dmtree/tr181/ppp.h
@@ -0,0 +1,68 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2016 Inteno Broadband Technology AB
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *
+ */
+
+#ifndef __PPP_H
+#define __PPP_H
+
+extern DMOBJ tPPPObj[];
+extern DMLEAF tPPPParams[];
+extern DMOBJ tPPPInterfaceObj[];
+extern DMLEAF tPPPInterfaceParams[];
+extern DMLEAF tPPPInterfacePPPoEParams[];
+extern DMLEAF tPPPInterfaceStatsParams[];
+
+int browseInterfaceInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int get_ppp_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ppp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ppp_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ppp_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ppp_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ppp_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ppp_eth_bytes_received(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ppp_eth_bytes_sent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ppp_eth_pack_received(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ppp_eth_pack_sent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_PPPInterfaceStats_ErrorsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_PPPInterfaceStats_ErrorsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_PPPInterfaceStats_UnicastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_PPPInterfaceStats_UnicastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_PPPInterfaceStats_DiscardPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_PPPInterfaceStats_DiscardPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_PPPInterfaceStats_MulticastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_PPPInterfaceStats_MulticastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_PPPInterfaceStats_BroadcastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_PPPInterfaceStats_BroadcastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_PPPInterfaceStats_UnknownProtoPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int set_ppp_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_ppp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_ppp_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_ppp_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_ppp_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int get_linker_ppp_interface(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+int get_PPP_InterfaceNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_PPPInterface_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_PPPInterface_LastChange(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_PPPInterface_Reset(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_PPPInterface_Reset(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int add_ppp_interface(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delete_ppp_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_PPPInterfacePPPoE_SessionID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_PPPInterfacePPPoE_ACName(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_PPPInterfacePPPoE_ACName(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_PPPInterfacePPPoE_ServiceName(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_PPPInterfacePPPoE_ServiceName(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif
diff --git a/dmtree/tr181/ptm.c b/dmtree/tr181/ptm.c
new file mode 100644
index 0000000000000000000000000000000000000000..e9d79dc7126d9ddcc9d6b6715ba043624a0959a2
--- /dev/null
+++ b/dmtree/tr181/ptm.c
@@ -0,0 +1,272 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2016 PIVA SOFTWARE (www.pivasoftware.com)
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *
+ */
+
+#include <ctype.h>
+#include <uci.h>
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "ptm.h"
+#include "dmjson.h"
+#include "dmentry.h"
+
+/* *** Device.PTM. *** */
+DMOBJ tPTMObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Link", &DMWRITE, add_ptm_link, delete_ptm_link, NULL, browsePtmLinkInst, NULL, NULL, tPTMLinkObj, tPTMLinkParams, get_ptm_linker, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.PTM.Link.{i}. *** */
+DMOBJ tPTMLinkObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tPTMLinkStatsParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tPTMLinkParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_ptm_alias, set_ptm_alias, NULL, NULL, BBFDM_BOTH},
+{"Enable", &DMREAD, DMT_BOOL, get_ptm_enable, NULL, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMREAD, DMT_STRING, get_ptm_link_name, NULL, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_ptm_enable, NULL, NULL, NULL, BBFDM_BOTH},
+{"LowerLayers", &DMREAD, DMT_STRING, get_ptm_lower_layer, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.PTM.Link.{i}.Stats. *** */
+DMLEAF tPTMLinkStatsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"BytesSent", &DMREAD, DMT_UNINT, get_ptm_stats_bytes_sent, NULL, NULL, NULL, BBFDM_BOTH},
+{"BytesReceived", &DMREAD, DMT_UNINT, get_ptm_stats_bytes_received, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsSent", &DMREAD, DMT_UNINT, get_ptm_stats_pack_sent, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsReceived", &DMREAD, DMT_UNINT, get_ptm_stats_pack_received, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/**************************************************************************
+* LINKER
+***************************************************************************/
+int get_ptm_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) {
+	if (data && ((struct ptm_args *)data)->ifname){
+		*linker =  ((struct ptm_args *)data)->ifname;
+		return 0;
+	}
+	*linker = "" ;
+	return 0;
+}
+
+/**************************************************************************
+* INIT
+***************************************************************************/
+inline int init_ptm_link(struct ptm_args *args, struct uci_section *s, char *ifname)
+{
+	args->ptm_sec = s;
+	args->ifname = ifname;
+	return 0;
+}
+
+/**************************************************************************
+* SET & GET DSL LINK PARAMETERS
+***************************************************************************/
+/*#Device.PTM.Link.{i}.Name!UCI:dsl/ptm-device,@i-1/name*/
+int get_ptm_link_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct ptm_args *)data)->ptm_sec, "name", value);
+	return 0;
+}
+
+int get_ptm_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char linker[16];
+	sprintf(linker, "channel_%d", atoi(instance)-1);
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cDSL%cChannel%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+inline int ubus_ptm_stats(json_object *res, char **value, char *stat_mod, void *data)
+{
+
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct ptm_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", stat_mod);
+	return 0;
+}
+
+/*#Device.PTM.Link.{i}.Stats.BytesReceived!UBUS:network.device/status/name,@Name/statistics.rx_bytes*/
+int get_ptm_stats_bytes_received(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_ptm_stats(res, value, "rx_bytes", data);
+	return 0;
+}
+
+/*#Device.PTM.Link.{i}.Stats.BytesSent!UBUS:network.device/status/name,@Name/statistics.tx_bytes*/
+int get_ptm_stats_bytes_sent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_ptm_stats(res, value, "tx_bytes", data);
+	return 0;
+}
+
+/*#Device.PTM.Link.{i}.Stats.PacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_packets*/
+int get_ptm_stats_pack_received(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_ptm_stats(res, value, "rx_packets", data);
+	return 0;
+}
+
+/*#Device.PTM.Link.{i}.Stats.PacketsSent!UBUS:network.device/status/name,@Name/statistics.tx_packets*/
+int get_ptm_stats_pack_sent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	ubus_ptm_stats(res, value, "tx_packets", data);
+	return 0;
+}
+
+int get_ptm_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "true";
+	return 0;
+}
+
+/*************************************************************
+ * ADD OBJ
+/*************************************************************/
+int add_ptm_link(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{
+	char *instance = NULL, *ptm_device = NULL, *v = NULL, *instance_update = NULL;
+	struct uci_section *dmmap_ptm = NULL;
+
+	check_create_dmmap_package("dmmap_dsl");
+	instance = get_last_instance_icwmpd("dmmap_dsl", "ptm-device", "ptmlinkinstance");
+	dmasprintf(&ptm_device, "ptm%d", instance ? atoi(instance) : 0);
+	dmasprintf(&instance_update, "%d", instance ? atoi(instance)+ 1 : 1);
+	dmuci_set_value("dsl", ptm_device, "", "ptm-device");
+	dmuci_set_value("dsl", ptm_device, "name", "PTM");
+	dmuci_set_value("dsl", ptm_device, "device", ptm_device);
+	dmuci_set_value("dsl", ptm_device, "priority", "1");
+	dmuci_set_value("dsl", ptm_device, "portid", "1");
+	dmuci_add_section_icwmpd("dmmap_dsl", "ptm-device", &dmmap_ptm, &v);
+	dmuci_set_value_by_section(dmmap_ptm, "section_name", ptm_device);
+	*instancepara = update_instance_icwmpd(dmmap_ptm, instance, "ptmlinkinstance");
+	return 0;
+}
+
+int delete_ptm_link(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	char *ifname;
+	struct uci_section *s = NULL, *ss = NULL, *ns = NULL, *nss = NULL, *dmmap_section= NULL;
+
+	switch (del_action) {
+	case DEL_INST:
+		get_dmmap_section_of_config_section("dmmap_dsl", "ptm-device", section_name(((struct ptm_args *)data)->ptm_sec), &dmmap_section);
+		if(dmmap_section != NULL)
+			dmuci_delete_by_section(dmmap_section, NULL, NULL);
+		dmuci_delete_by_section(((struct ptm_args *)data)->ptm_sec, NULL, NULL);
+		uci_foreach_option_cont("network", "interface", "ifname", ((struct ptm_args *)data)->ifname, s) {
+			if (ss && ifname!=NULL)
+				wan_remove_dev_interface(ss, ((struct ptm_args *)data)->ifname);
+			ss = s;
+		}
+		if (ss != NULL && ifname!=NULL)
+			wan_remove_dev_interface(ss, ((struct ptm_args *)data)->ifname);
+		break;
+	case DEL_ALL:
+		uci_foreach_sections("dsl", "ptm-device", s) {
+			if (ss){
+				get_dmmap_section_of_config_section("dmmap_dsl", "ptm-device", section_name(ss), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_get_value_by_section_string(ss, "device", &ifname);
+				dmuci_delete_by_section(ss, NULL, NULL);
+				uci_foreach_option_cont("network", "interface", "ifname", ifname, ns) {
+					if (nss)
+						wan_remove_dev_interface(nss, ifname);
+					nss = ns;
+				}
+				if (nss != NULL && ifname!=NULL)
+					wan_remove_dev_interface(nss, ifname);
+			}
+			ss = s;
+		}
+		if (ss != NULL) {
+			get_dmmap_section_of_config_section("dmmap_dsl", "ptm-device", section_name(ss), &dmmap_section);
+			if(dmmap_section != NULL)
+				dmuci_delete_by_section(dmmap_section, NULL, NULL);
+			dmuci_get_value_by_section_string(ss, "device", &ifname);
+			dmuci_delete_by_section(ss, NULL, NULL);
+			uci_foreach_option_cont("network", "interface", "ifname", ifname, ns) {
+				if (nss && ifname!=NULL)
+					wan_remove_dev_interface(nss, ifname);
+				nss = ns;
+			}
+			if (nss != NULL && ifname!=NULL)
+				wan_remove_dev_interface(nss, ifname);
+		}
+		break;
+	}
+	return 0;
+}
+
+/*************************************************************
+ * SET AND GET ALIAS
+/*************************************************************/
+int get_ptm_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_dsl", "ptm-device", section_name(((struct ptm_args *)data)->ptm_sec), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "ptmlinkalias", value);
+	return 0;
+}
+
+int set_ptm_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			get_dmmap_section_of_config_section("dmmap_dsl", "ptm-device", section_name(((struct ptm_args *)data)->ptm_sec), &dmmap_section);
+			dmuci_set_value_by_section(dmmap_section, "ptmlinkalias", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*************************************************************
+ * ENTRY METHOD
+/*************************************************************/
+/*#Device.PTM.Link.{i}.!UCI:dsl/ptm-device/dmmap_dsl*/
+int browsePtmLinkInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *wnum = NULL, *channel_last = NULL, *ifname;
+	struct ptm_args curr_ptm_args = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("dsl", "ptm-device", "dmmap_dsl", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		dmuci_get_value_by_section_string(p->config_section, "device", &ifname);
+		init_ptm_link(&curr_ptm_args, p->config_section, ifname);
+		wnum = handle_update_instance(1, dmctx, &channel_last, update_instance_alias, 3, p->dmmap_section, "ptmlinkinstance", "ptmlinkalias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_ptm_args, wnum) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
diff --git a/dmtree/tr181/ptm.h b/dmtree/tr181/ptm.h
new file mode 100644
index 0000000000000000000000000000000000000000..c6c95db8e6996d3c764e166be5827e9aa66a044d
--- /dev/null
+++ b/dmtree/tr181/ptm.h
@@ -0,0 +1,43 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2016 Inteno Broadband Technology AB
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *
+ */
+
+#ifndef __PTM_H
+#define __PTM_H
+
+struct ptm_args
+{
+	struct uci_section *ptm_sec;
+	char *ifname;
+};
+
+extern DMOBJ tPTMObj[];
+extern DMOBJ tPTMLinkObj[];
+extern DMLEAF tPTMLinkStatsParams[];
+extern DMLEAF tPTMLinkParams[];
+
+int browsePtmLinkInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int add_ptm_link(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_ptm_link(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_ptm_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ptm_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ptm_link_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ptm_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ptm_stats_bytes_sent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ptm_stats_bytes_received(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ptm_stats_pack_sent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ptm_stats_pack_received(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_ptm_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int get_ptm_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+
+#endif
diff --git a/dmtree/tr181/qos.c b/dmtree/tr181/qos.c
new file mode 100644
index 0000000000000000000000000000000000000000..4164217ed836a19cc7198655231c7a7d32345ed9
--- /dev/null
+++ b/dmtree/tr181/qos.c
@@ -0,0 +1,3709 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*      Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Omar Kallel <omar.kallel@pivasoftware.com>
+*/
+
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "dmcwmp.h"
+#include "dmentry.h"
+#include "dmuci.h"
+#include "qos.h"
+#include <regex.h>
+
+/* *** Device.QoS. *** */
+DMOBJ tQoSObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Classification", &DMWRITE, addObjQoSClassification, delObjQoSClassification, NULL, browseQoSClassificationInst, NULL, NULL, NULL, tQoSClassificationParams, NULL, BBFDM_BOTH},
+{"App", &DMWRITE, addObjQoSApp, delObjQoSApp, NULL, browseQoSAppInst, NULL, NULL, NULL, tQoSAppParams, NULL, BBFDM_BOTH},
+{"Flow", &DMWRITE, addObjQoSFlow, delObjQoSFlow, NULL, browseQoSFlowInst, NULL, NULL, NULL, tQoSFlowParams, NULL, BBFDM_BOTH},
+{"Policer", &DMWRITE, addObjQoSPolicer, delObjQoSPolicer, NULL, browseQoSPolicerInst, NULL, NULL, NULL, tQoSPolicerParams, NULL, BBFDM_BOTH},
+{"Queue", &DMWRITE, addObjQoSQueue, delObjQoSQueue, NULL, browseQoSQueueInst, NULL, NULL, NULL, tQoSQueueParams, get_linker_qos_queue, BBFDM_BOTH},
+{"QueueStats", &DMWRITE, addObjQoSQueueStats, delObjQoSQueueStats, NULL, browseQoSQueueStatsInst, NULL, NULL, NULL, tQoSQueueStatsParams, NULL, BBFDM_BOTH},
+{"Shaper", &DMWRITE, addObjQoSShaper, delObjQoSShaper, NULL, browseQoSShaperInst, NULL, NULL, NULL, tQoSShaperParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tQoSParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"MaxClassificationEntries", &DMREAD, DMT_UNINT, get_QoS_MaxClassificationEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"ClassificationNumberOfEntries", &DMREAD, DMT_UNINT, get_QoS_ClassificationNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxAppEntries", &DMREAD, DMT_UNINT, get_QoS_MaxAppEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"AppNumberOfEntries", &DMREAD, DMT_UNINT, get_QoS_AppNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxFlowEntries", &DMREAD, DMT_UNINT, get_QoS_MaxFlowEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"FlowNumberOfEntries", &DMREAD, DMT_UNINT, get_QoS_FlowNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxPolicerEntries", &DMREAD, DMT_UNINT, get_QoS_MaxPolicerEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"PolicerNumberOfEntries", &DMREAD, DMT_UNINT, get_QoS_PolicerNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxQueueEntries", &DMREAD, DMT_UNINT, get_QoS_MaxQueueEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"QueueNumberOfEntries", &DMREAD, DMT_UNINT, get_QoS_QueueNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"QueueStatsNumberOfEntries", &DMREAD, DMT_UNINT, get_QoS_QueueStatsNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxShaperEntries", &DMREAD, DMT_UNINT, get_QoS_MaxShaperEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"ShaperNumberOfEntries", &DMREAD, DMT_UNINT, get_QoS_ShaperNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"DefaultForwardingPolicy", &DMWRITE, DMT_UNINT, get_QoS_DefaultForwardingPolicy, set_QoS_DefaultForwardingPolicy, NULL, NULL, BBFDM_BOTH},
+{"DefaultTrafficClass", &DMWRITE, DMT_UNINT, get_QoS_DefaultTrafficClass, set_QoS_DefaultTrafficClass, NULL, NULL, BBFDM_BOTH},
+{"DefaultPolicer", &DMWRITE, DMT_STRING, get_QoS_DefaultPolicer, set_QoS_DefaultPolicer, NULL, NULL, BBFDM_BOTH},
+{"DefaultQueue", &DMWRITE, DMT_STRING, get_QoS_DefaultQueue, set_QoS_DefaultQueue, NULL, NULL, BBFDM_BOTH},
+{"DefaultDSCPMark", &DMWRITE, DMT_INT, get_QoS_DefaultDSCPMark, set_QoS_DefaultDSCPMark, NULL, NULL, BBFDM_BOTH},
+{"DefaultEthernetPriorityMark", &DMWRITE, DMT_INT, get_QoS_DefaultEthernetPriorityMark, set_QoS_DefaultEthernetPriorityMark, NULL, NULL, BBFDM_BOTH},
+{"DefaultInnerEthernetPriorityMark", &DMWRITE, DMT_INT, get_QoS_DefaultInnerEthernetPriorityMark, set_QoS_DefaultInnerEthernetPriorityMark, NULL, NULL, BBFDM_BOTH},
+{"AvailableAppList", &DMREAD, DMT_STRING, get_QoS_AvailableAppList, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.QoS.Classification.{i}. *** */
+DMLEAF tQoSClassificationParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_QoSClassification_Enable, set_QoSClassification_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_QoSClassification_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Order", &DMWRITE, DMT_UNINT, get_QoSClassification_Order, set_QoSClassification_Order, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_QoSClassification_Alias, set_QoSClassification_Alias, NULL, NULL, BBFDM_BOTH},
+{"DHCPType", &DMWRITE, DMT_STRING, get_QoSClassification_DHCPType, set_QoSClassification_DHCPType, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_QoSClassification_Interface, set_QoSClassification_Interface, NULL, NULL, BBFDM_BOTH},
+{"AllInterfaces", &DMWRITE, DMT_BOOL, get_QoSClassification_AllInterfaces, set_QoSClassification_AllInterfaces, NULL, NULL, BBFDM_BOTH},
+{"DestIP", &DMWRITE, DMT_STRING, get_QoSClassification_DestIP, set_QoSClassification_DestIP, NULL, NULL, BBFDM_BOTH},
+{"DestMask", &DMWRITE, DMT_STRING, get_QoSClassification_DestMask, set_QoSClassification_DestMask, NULL, NULL, BBFDM_BOTH},
+{"DestIPExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_DestIPExclude, set_QoSClassification_DestIPExclude, NULL, NULL, BBFDM_BOTH},
+{"SourceIP", &DMWRITE, DMT_STRING, get_QoSClassification_SourceIP, set_QoSClassification_SourceIP, NULL, NULL, BBFDM_BOTH},
+{"SourceMask", &DMWRITE, DMT_STRING, get_QoSClassification_SourceMask, set_QoSClassification_SourceMask, NULL, NULL, BBFDM_BOTH},
+{"SourceIPExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_SourceIPExclude, set_QoSClassification_SourceIPExclude, NULL, NULL, BBFDM_BOTH},
+{"Protocol", &DMWRITE, DMT_INT, get_QoSClassification_Protocol, set_QoSClassification_Protocol, NULL, NULL, BBFDM_BOTH},
+{"ProtocolExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_ProtocolExclude, set_QoSClassification_ProtocolExclude, NULL, NULL, BBFDM_BOTH},
+{"DestPort", &DMWRITE, DMT_INT, get_QoSClassification_DestPort, set_QoSClassification_DestPort, NULL, NULL, BBFDM_BOTH},
+{"DestPortRangeMax", &DMWRITE, DMT_INT, get_QoSClassification_DestPortRangeMax, set_QoSClassification_DestPortRangeMax, NULL, NULL, BBFDM_BOTH},
+{"DestPortExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_DestPortExclude, set_QoSClassification_DestPortExclude, NULL, NULL, BBFDM_BOTH},
+{"SourcePort", &DMWRITE, DMT_INT, get_QoSClassification_SourcePort, set_QoSClassification_SourcePort, NULL, NULL, BBFDM_BOTH},
+{"SourcePortRangeMax", &DMWRITE, DMT_INT, get_QoSClassification_SourcePortRangeMax, set_QoSClassification_SourcePortRangeMax, NULL, NULL, BBFDM_BOTH},
+{"SourcePortExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_SourcePortExclude, set_QoSClassification_SourcePortExclude, NULL, NULL, BBFDM_BOTH},
+{"SourceMACAddress", &DMWRITE, DMT_STRING, get_QoSClassification_SourceMACAddress, set_QoSClassification_SourceMACAddress, NULL, NULL, BBFDM_BOTH},
+{"SourceMACMask", &DMWRITE, DMT_STRING, get_QoSClassification_SourceMACMask, set_QoSClassification_SourceMACMask, NULL, NULL, BBFDM_BOTH},
+{"SourceMACExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_SourceMACExclude, set_QoSClassification_SourceMACExclude, NULL, NULL, BBFDM_BOTH},
+{"DestMACAddress", &DMWRITE, DMT_STRING, get_QoSClassification_DestMACAddress, set_QoSClassification_DestMACAddress, NULL, NULL, BBFDM_BOTH},
+{"DestMACMask", &DMWRITE, DMT_STRING, get_QoSClassification_DestMACMask, set_QoSClassification_DestMACMask, NULL, NULL, BBFDM_BOTH},
+{"DestMACExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_DestMACExclude, set_QoSClassification_DestMACExclude, NULL, NULL, BBFDM_BOTH},
+{"Ethertype", &DMWRITE, DMT_INT, get_QoSClassification_Ethertype, set_QoSClassification_Ethertype, NULL, NULL, BBFDM_BOTH},
+{"EthertypeExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_EthertypeExclude, set_QoSClassification_EthertypeExclude, NULL, NULL, BBFDM_BOTH},
+{"SSAP", &DMWRITE, DMT_INT, get_QoSClassification_SSAP, set_QoSClassification_SSAP, NULL, NULL, BBFDM_BOTH},
+{"SSAPExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_SSAPExclude, set_QoSClassification_SSAPExclude, NULL, NULL, BBFDM_BOTH},
+{"DSAP", &DMWRITE, DMT_INT, get_QoSClassification_DSAP, set_QoSClassification_DSAP, NULL, NULL, BBFDM_BOTH},
+{"DSAPExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_DSAPExclude, set_QoSClassification_DSAPExclude, NULL, NULL, BBFDM_BOTH},
+{"LLCControl", &DMWRITE, DMT_INT, get_QoSClassification_LLCControl, set_QoSClassification_LLCControl, NULL, NULL, BBFDM_BOTH},
+{"LLCControlExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_LLCControlExclude, set_QoSClassification_LLCControlExclude, NULL, NULL, BBFDM_BOTH},
+{"SNAPOUI", &DMWRITE, DMT_INT, get_QoSClassification_SNAPOUI, set_QoSClassification_SNAPOUI, NULL, NULL, BBFDM_BOTH},
+{"SNAPOUIExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_SNAPOUIExclude, set_QoSClassification_SNAPOUIExclude, NULL, NULL, BBFDM_BOTH},
+{"SourceVendorClassID", &DMWRITE, DMT_STRING, get_QoSClassification_SourceVendorClassID, set_QoSClassification_SourceVendorClassID, NULL, NULL, BBFDM_BOTH},
+{"SourceVendorClassIDv6", &DMWRITE, DMT_HEXBIN, get_QoSClassification_SourceVendorClassIDv6, set_QoSClassification_SourceVendorClassIDv6, NULL, NULL, BBFDM_BOTH},
+{"SourceVendorClassIDExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_SourceVendorClassIDExclude, set_QoSClassification_SourceVendorClassIDExclude, NULL, NULL, BBFDM_BOTH},
+{"SourceVendorClassIDMode", &DMWRITE, DMT_STRING, get_QoSClassification_SourceVendorClassIDMode, set_QoSClassification_SourceVendorClassIDMode, NULL, NULL, BBFDM_BOTH},
+{"DestVendorClassID", &DMWRITE, DMT_STRING, get_QoSClassification_DestVendorClassID, set_QoSClassification_DestVendorClassID, NULL, NULL, BBFDM_BOTH},
+{"DestVendorClassIDv6", &DMWRITE, DMT_HEXBIN, get_QoSClassification_DestVendorClassIDv6, set_QoSClassification_DestVendorClassIDv6, NULL, NULL, BBFDM_BOTH},
+{"DestVendorClassIDExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_DestVendorClassIDExclude, set_QoSClassification_DestVendorClassIDExclude, NULL, NULL, BBFDM_BOTH},
+{"DestVendorClassIDMode", &DMWRITE, DMT_STRING, get_QoSClassification_DestVendorClassIDMode, set_QoSClassification_DestVendorClassIDMode, NULL, NULL, BBFDM_BOTH},
+{"SourceClientID", &DMWRITE, DMT_HEXBIN, get_QoSClassification_SourceClientID, set_QoSClassification_SourceClientID, NULL, NULL, BBFDM_BOTH},
+{"SourceClientIDExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_SourceClientIDExclude, set_QoSClassification_SourceClientIDExclude, NULL, NULL, BBFDM_BOTH},
+{"DestClientID", &DMWRITE, DMT_HEXBIN, get_QoSClassification_DestClientID, set_QoSClassification_DestClientID, NULL, NULL, BBFDM_BOTH},
+{"DestClientIDExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_DestClientIDExclude, set_QoSClassification_DestClientIDExclude, NULL, NULL, BBFDM_BOTH},
+{"SourceUserClassID", &DMWRITE, DMT_HEXBIN, get_QoSClassification_SourceUserClassID, set_QoSClassification_SourceUserClassID, NULL, NULL, BBFDM_BOTH},
+{"SourceUserClassIDExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_SourceUserClassIDExclude, set_QoSClassification_SourceUserClassIDExclude, NULL, NULL, BBFDM_BOTH},
+{"DestUserClassID", &DMWRITE, DMT_HEXBIN, get_QoSClassification_DestUserClassID, set_QoSClassification_DestUserClassID, NULL, NULL, BBFDM_BOTH},
+{"DestUserClassIDExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_DestUserClassIDExclude, set_QoSClassification_DestUserClassIDExclude, NULL, NULL, BBFDM_BOTH},
+{"SourceVendorSpecificInfo", &DMWRITE, DMT_HEXBIN, get_QoSClassification_SourceVendorSpecificInfo, set_QoSClassification_SourceVendorSpecificInfo, NULL, NULL, BBFDM_BOTH},
+{"SourceVendorSpecificInfoExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_SourceVendorSpecificInfoExclude, set_QoSClassification_SourceVendorSpecificInfoExclude, NULL, NULL, BBFDM_BOTH},
+{"SourceVendorSpecificInfoEnterprise", &DMWRITE, DMT_UNINT, get_QoSClassification_SourceVendorSpecificInfoEnterprise, set_QoSClassification_SourceVendorSpecificInfoEnterprise, NULL, NULL, BBFDM_BOTH},
+{"SourceVendorSpecificInfoSubOption", &DMWRITE, DMT_INT, get_QoSClassification_SourceVendorSpecificInfoSubOption, set_QoSClassification_SourceVendorSpecificInfoSubOption, NULL, NULL, BBFDM_BOTH},
+{"DestVendorSpecificInfo", &DMWRITE, DMT_HEXBIN, get_QoSClassification_DestVendorSpecificInfo, set_QoSClassification_DestVendorSpecificInfo, NULL, NULL, BBFDM_BOTH},
+{"DestVendorSpecificInfoExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_DestVendorSpecificInfoExclude, set_QoSClassification_DestVendorSpecificInfoExclude, NULL, NULL, BBFDM_BOTH},
+{"DestVendorSpecificInfoEnterprise", &DMWRITE, DMT_UNINT, get_QoSClassification_DestVendorSpecificInfoEnterprise, set_QoSClassification_DestVendorSpecificInfoEnterprise, NULL, NULL, BBFDM_BOTH},
+{"DestVendorSpecificInfoSubOption", &DMWRITE, DMT_INT, get_QoSClassification_DestVendorSpecificInfoSubOption, set_QoSClassification_DestVendorSpecificInfoSubOption, NULL, NULL, BBFDM_BOTH},
+{"TCPACK", &DMWRITE, DMT_BOOL, get_QoSClassification_TCPACK, set_QoSClassification_TCPACK, NULL, NULL, BBFDM_BOTH},
+{"TCPACKExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_TCPACKExclude, set_QoSClassification_TCPACKExclude, NULL, NULL, BBFDM_BOTH},
+{"IPLengthMin", &DMWRITE, DMT_UNINT, get_QoSClassification_IPLengthMin, set_QoSClassification_IPLengthMin, NULL, NULL, BBFDM_BOTH},
+{"IPLengthMax", &DMWRITE, DMT_UNINT, get_QoSClassification_IPLengthMax, set_QoSClassification_IPLengthMax, NULL, NULL, BBFDM_BOTH},
+{"IPLengthExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_IPLengthExclude, set_QoSClassification_IPLengthExclude, NULL, NULL, BBFDM_BOTH},
+{"DSCPCheck", &DMWRITE, DMT_INT, get_QoSClassification_DSCPCheck, set_QoSClassification_DSCPCheck, NULL, NULL, BBFDM_BOTH},
+{"DSCPExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_DSCPExclude, set_QoSClassification_DSCPExclude, NULL, NULL, BBFDM_BOTH},
+{"DSCPMark", &DMWRITE, DMT_INT, get_QoSClassification_DSCPMark, set_QoSClassification_DSCPMark, NULL, NULL, BBFDM_BOTH},
+{"EthernetPriorityCheck", &DMWRITE, DMT_INT, get_QoSClassification_EthernetPriorityCheck, set_QoSClassification_EthernetPriorityCheck, NULL, NULL, BBFDM_BOTH},
+{"EthernetPriorityExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_EthernetPriorityExclude, set_QoSClassification_EthernetPriorityExclude, NULL, NULL, BBFDM_BOTH},
+{"EthernetPriorityMark", &DMWRITE, DMT_INT, get_QoSClassification_EthernetPriorityMark, set_QoSClassification_EthernetPriorityMark, NULL, NULL, BBFDM_BOTH},
+{"InnerEthernetPriorityCheck", &DMWRITE, DMT_INT, get_QoSClassification_InnerEthernetPriorityCheck, set_QoSClassification_InnerEthernetPriorityCheck, NULL, NULL, BBFDM_BOTH},
+{"InnerEthernetPriorityExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_InnerEthernetPriorityExclude, set_QoSClassification_InnerEthernetPriorityExclude, NULL, NULL, BBFDM_BOTH},
+{"InnerEthernetPriorityMark", &DMWRITE, DMT_INT, get_QoSClassification_InnerEthernetPriorityMark, set_QoSClassification_InnerEthernetPriorityMark, NULL, NULL, BBFDM_BOTH},
+{"EthernetDEICheck", &DMWRITE, DMT_INT, get_QoSClassification_EthernetDEICheck, set_QoSClassification_EthernetDEICheck, NULL, NULL, BBFDM_BOTH},
+{"EthernetDEIExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_EthernetDEIExclude, set_QoSClassification_EthernetDEIExclude, NULL, NULL, BBFDM_BOTH},
+{"VLANIDCheck", &DMWRITE, DMT_INT, get_QoSClassification_VLANIDCheck, set_QoSClassification_VLANIDCheck, NULL, NULL, BBFDM_BOTH},
+{"VLANIDExclude", &DMWRITE, DMT_BOOL, get_QoSClassification_VLANIDExclude, set_QoSClassification_VLANIDExclude, NULL, NULL, BBFDM_BOTH},
+{"OutOfBandInfo", &DMWRITE, DMT_INT, get_QoSClassification_OutOfBandInfo, set_QoSClassification_OutOfBandInfo, NULL, NULL, BBFDM_BOTH},
+{"ForwardingPolicy", &DMWRITE, DMT_UNINT, get_QoSClassification_ForwardingPolicy, set_QoSClassification_ForwardingPolicy, NULL, NULL, BBFDM_BOTH},
+{"TrafficClass", &DMWRITE, DMT_INT, get_QoSClassification_TrafficClass, set_QoSClassification_TrafficClass, NULL, NULL, BBFDM_BOTH},
+{"Policer", &DMWRITE, DMT_STRING, get_QoSClassification_Policer, set_QoSClassification_Policer, NULL, NULL, BBFDM_BOTH},
+{"App", &DMWRITE, DMT_STRING, get_QoSClassification_App, set_QoSClassification_App, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.QoS.App.{i}. *** */
+DMLEAF tQoSAppParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_QoSApp_Enable, set_QoSApp_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_QoSApp_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_QoSApp_Alias, set_QoSApp_Alias, NULL, NULL, BBFDM_BOTH},
+{"ProtocolIdentifier", &DMWRITE, DMT_STRING, get_QoSApp_ProtocolIdentifier, set_QoSApp_ProtocolIdentifier, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMWRITE, DMT_STRING, get_QoSApp_Name, set_QoSApp_Name, NULL, NULL, BBFDM_BOTH},
+{"DefaultForwardingPolicy", &DMWRITE, DMT_UNINT, get_QoSApp_DefaultForwardingPolicy, set_QoSApp_DefaultForwardingPolicy, NULL, NULL, BBFDM_BOTH},
+{"DefaultTrafficClass", &DMWRITE, DMT_UNINT, get_QoSApp_DefaultTrafficClass, set_QoSApp_DefaultTrafficClass, NULL, NULL, BBFDM_BOTH},
+{"DefaultPolicer", &DMWRITE, DMT_STRING, get_QoSApp_DefaultPolicer, set_QoSApp_DefaultPolicer, NULL, NULL, BBFDM_BOTH},
+{"DefaultDSCPMark", &DMWRITE, DMT_INT, get_QoSApp_DefaultDSCPMark, set_QoSApp_DefaultDSCPMark, NULL, NULL, BBFDM_BOTH},
+{"DefaultEthernetPriorityMark", &DMWRITE, DMT_INT, get_QoSApp_DefaultEthernetPriorityMark, set_QoSApp_DefaultEthernetPriorityMark, NULL, NULL, BBFDM_BOTH},
+{"DefaultInnerEthernetPriorityMark", &DMWRITE, DMT_INT, get_QoSApp_DefaultInnerEthernetPriorityMark, set_QoSApp_DefaultInnerEthernetPriorityMark, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.QoS.Flow.{i}. *** */
+DMLEAF tQoSFlowParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_QoSFlow_Enable, set_QoSFlow_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_QoSFlow_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_QoSFlow_Alias, set_QoSFlow_Alias, NULL, NULL, BBFDM_BOTH},
+{"Type", &DMWRITE, DMT_STRING, get_QoSFlow_Type, set_QoSFlow_Type, NULL, NULL, BBFDM_BOTH},
+{"TypeParameters", &DMWRITE, DMT_STRING, get_QoSFlow_TypeParameters, set_QoSFlow_TypeParameters, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMWRITE, DMT_STRING, get_QoSFlow_Name, set_QoSFlow_Name, NULL, NULL, BBFDM_BOTH},
+{"App", &DMWRITE, DMT_STRING, get_QoSFlow_App, set_QoSFlow_App, NULL, NULL, BBFDM_BOTH},
+{"ForwardingPolicy", &DMWRITE, DMT_UNINT, get_QoSFlow_ForwardingPolicy, set_QoSFlow_ForwardingPolicy, NULL, NULL, BBFDM_BOTH},
+{"TrafficClass", &DMWRITE, DMT_UNINT, get_QoSFlow_TrafficClass, set_QoSFlow_TrafficClass, NULL, NULL, BBFDM_BOTH},
+{"Policer", &DMWRITE, DMT_STRING, get_QoSFlow_Policer, set_QoSFlow_Policer, NULL, NULL, BBFDM_BOTH},
+{"DSCPMark", &DMWRITE, DMT_INT, get_QoSFlow_DSCPMark, set_QoSFlow_DSCPMark, NULL, NULL, BBFDM_BOTH},
+{"EthernetPriorityMark", &DMWRITE, DMT_INT, get_QoSFlow_EthernetPriorityMark, set_QoSFlow_EthernetPriorityMark, NULL, NULL, BBFDM_BOTH},
+{"InnerEthernetPriorityMark", &DMWRITE, DMT_INT, get_QoSFlow_InnerEthernetPriorityMark, set_QoSFlow_InnerEthernetPriorityMark, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.QoS.Policer.{i}. *** */
+DMLEAF tQoSPolicerParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_QoSPolicer_Enable, set_QoSPolicer_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_QoSPolicer_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_QoSPolicer_Alias, set_QoSPolicer_Alias, NULL, NULL, BBFDM_BOTH},
+{"CommittedRate", &DMWRITE, DMT_UNINT, get_QoSPolicer_CommittedRate, set_QoSPolicer_CommittedRate, NULL, NULL, BBFDM_BOTH},
+{"CommittedBurstSize", &DMWRITE, DMT_UNINT, get_QoSPolicer_CommittedBurstSize, set_QoSPolicer_CommittedBurstSize, NULL, NULL, BBFDM_BOTH},
+{"ExcessBurstSize", &DMWRITE, DMT_UNINT, get_QoSPolicer_ExcessBurstSize, set_QoSPolicer_ExcessBurstSize, NULL, NULL, BBFDM_BOTH},
+{"PeakRate", &DMWRITE, DMT_UNINT, get_QoSPolicer_PeakRate, set_QoSPolicer_PeakRate, NULL, NULL, BBFDM_BOTH},
+{"PeakBurstSize", &DMWRITE, DMT_UNINT, get_QoSPolicer_PeakBurstSize, set_QoSPolicer_PeakBurstSize, NULL, NULL, BBFDM_BOTH},
+{"MeterType", &DMWRITE, DMT_STRING, get_QoSPolicer_MeterType, set_QoSPolicer_MeterType, NULL, NULL, BBFDM_BOTH},
+{"PossibleMeterTypes", &DMREAD, DMT_STRING, get_QoSPolicer_PossibleMeterTypes, NULL, NULL, NULL, BBFDM_BOTH},
+{"ConformingAction", &DMWRITE, DMT_STRING, get_QoSPolicer_ConformingAction, set_QoSPolicer_ConformingAction, NULL, NULL, BBFDM_BOTH},
+{"PartialConformingAction", &DMWRITE, DMT_STRING, get_QoSPolicer_PartialConformingAction, set_QoSPolicer_PartialConformingAction, NULL, NULL, BBFDM_BOTH},
+{"NonConformingAction", &DMWRITE, DMT_STRING, get_QoSPolicer_NonConformingAction, set_QoSPolicer_NonConformingAction, NULL, NULL, BBFDM_BOTH},
+{"TotalCountedPackets", &DMREAD, DMT_UNINT, get_QoSPolicer_TotalCountedPackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"TotalCountedBytes", &DMREAD, DMT_UNINT, get_QoSPolicer_TotalCountedBytes, NULL, NULL, NULL, BBFDM_BOTH},
+{"ConformingCountedPackets", &DMREAD, DMT_UNINT, get_QoSPolicer_ConformingCountedPackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"ConformingCountedBytes", &DMREAD, DMT_UNINT, get_QoSPolicer_ConformingCountedBytes, NULL, NULL, NULL, BBFDM_BOTH},
+{"PartiallyConformingCountedPackets", &DMREAD, DMT_UNINT, get_QoSPolicer_PartiallyConformingCountedPackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"PartiallyConformingCountedBytes", &DMREAD, DMT_UNINT, get_QoSPolicer_PartiallyConformingCountedBytes, NULL, NULL, NULL, BBFDM_BOTH},
+{"NonConformingCountedPackets", &DMREAD, DMT_UNINT, get_QoSPolicer_NonConformingCountedPackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"NonConformingCountedBytes", &DMREAD, DMT_UNINT, get_QoSPolicer_NonConformingCountedBytes, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.QoS.Queue.{i}. *** */
+DMLEAF tQoSQueueParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_QoSQueue_Enable, set_QoSQueue_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_QoSQueue_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_QoSQueue_Alias, set_QoSQueue_Alias, NULL, NULL, BBFDM_BOTH},
+{"TrafficClasses", &DMWRITE, DMT_STRING, get_QoSQueue_TrafficClasses, set_QoSQueue_TrafficClasses, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_QoSQueue_Interface, set_QoSQueue_Interface, NULL, NULL, BBFDM_BOTH},
+{"AllInterfaces", &DMWRITE, DMT_BOOL, get_QoSQueue_AllInterfaces, set_QoSQueue_AllInterfaces, NULL, NULL, BBFDM_BOTH},
+{"HardwareAssisted", &DMREAD, DMT_BOOL, get_QoSQueue_HardwareAssisted, NULL, NULL, NULL, BBFDM_BOTH},
+{"BufferLength", &DMREAD, DMT_UNINT, get_QoSQueue_BufferLength, NULL, NULL, NULL, BBFDM_BOTH},
+{"Weight", &DMWRITE, DMT_UNINT, get_QoSQueue_Weight, set_QoSQueue_Weight, NULL, NULL, BBFDM_BOTH},
+{"Precedence", &DMWRITE, DMT_UNINT, get_QoSQueue_Precedence, set_QoSQueue_Precedence, NULL, NULL, BBFDM_BOTH},
+{"REDThreshold", &DMWRITE, DMT_UNINT, get_QoSQueue_REDThreshold, set_QoSQueue_REDThreshold, NULL, NULL, BBFDM_BOTH},
+{"REDPercentage", &DMWRITE, DMT_UNINT, get_QoSQueue_REDPercentage, set_QoSQueue_REDPercentage, NULL, NULL, BBFDM_BOTH},
+{"DropAlgorithm", &DMWRITE, DMT_STRING, get_QoSQueue_DropAlgorithm, set_QoSQueue_DropAlgorithm, NULL, NULL, BBFDM_BOTH},
+{"SchedulerAlgorithm", &DMWRITE, DMT_STRING, get_QoSQueue_SchedulerAlgorithm, set_QoSQueue_SchedulerAlgorithm, NULL, NULL, BBFDM_BOTH},
+{"ShapingRate", &DMWRITE, DMT_INT, get_QoSQueue_ShapingRate, set_QoSQueue_ShapingRate, NULL, NULL, BBFDM_BOTH},
+{"ShapingBurstSize", &DMWRITE, DMT_UNINT, get_QoSQueue_ShapingBurstSize, set_QoSQueue_ShapingBurstSize, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.QoS.QueueStats.{i}. *** */
+DMLEAF tQoSQueueStatsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_QoSQueueStats_Enable, set_QoSQueueStats_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_QoSQueueStats_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_QoSQueueStats_Alias, set_QoSQueueStats_Alias, NULL, NULL, BBFDM_BOTH},
+{"Queue", &DMWRITE, DMT_STRING, get_QoSQueueStats_Queue, set_QoSQueueStats_Queue, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_QoSQueueStats_Interface, set_QoSQueueStats_Interface, NULL, NULL, BBFDM_BOTH},
+{"OutputPackets", &DMREAD, DMT_UNINT, get_QoSQueueStats_OutputPackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"OutputBytes", &DMREAD, DMT_UNINT, get_QoSQueueStats_OutputBytes, NULL, NULL, NULL, BBFDM_BOTH},
+{"DroppedPackets", &DMREAD, DMT_UNINT, get_QoSQueueStats_DroppedPackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"DroppedBytes", &DMREAD, DMT_UNINT, get_QoSQueueStats_DroppedBytes, NULL, NULL, NULL, BBFDM_BOTH},
+{"QueueOccupancyPackets", &DMREAD, DMT_UNINT, get_QoSQueueStats_QueueOccupancyPackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"QueueOccupancyPercentage", &DMREAD, DMT_UNINT, get_QoSQueueStats_QueueOccupancyPercentage, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.QoS.Shaper.{i}. *** */
+DMLEAF tQoSShaperParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_QoSShaper_Enable, set_QoSShaper_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_QoSShaper_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_QoSShaper_Alias, set_QoSShaper_Alias, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_QoSShaper_Interface, set_QoSShaper_Interface, NULL, NULL, BBFDM_BOTH},
+{"ShapingRate", &DMWRITE, DMT_INT, get_QoSShaper_ShapingRate, set_QoSShaper_ShapingRate, NULL, NULL, BBFDM_BOTH},
+{"ShapingBurstSize", &DMWRITE, DMT_UNINT, get_QoSShaper_ShapingBurstSize, set_QoSShaper_ShapingBurstSize, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/**************************************************************************
+* LINKER
+***************************************************************************/
+int get_linker_qos_queue(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) {
+	if(data && ((struct dmmap_dup *)data)->config_section) {
+		dmasprintf(linker,"%s", section_name(((struct dmmap_dup *)data)->config_section));
+		return 0;
+	} else {
+		*linker = "";
+		return 0;
+	}
+}
+
+/**************************************************************************
+* Browse functions
+***************************************************************************/
+/*#Device.QoS.Classification.{i}.!UCI:qos/classify/dmmap_qos*/
+int browseQoSClassificationInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *wnum = NULL, *wnum_last = NULL;
+	char buf[12];
+	struct uci_section *s = NULL;
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("qos", "classify", "dmmap_qos", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		wnum =  handle_update_instance(1, dmctx, &wnum_last, update_instance_alias, 3, p->dmmap_section, "classifinstance", "classifalias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p, wnum) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+int browseQoSAppInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	//TODO
+	return 0;
+}
+
+int browseQoSFlowInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	//TODO
+	return 0;
+}
+
+int browseQoSPolicerInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	//TODO
+	return 0;
+}
+
+/*#Device.QoS.Queue.{i}.!UCI:qos/class/dmmap_qos*/
+int browseQoSQueueInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *wnum = NULL, *wnum_last = NULL;
+	char buf[12];
+	struct uci_section *s = NULL;
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("qos", "class", "dmmap_qos", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		wnum =  handle_update_instance(1, dmctx, &wnum_last, update_instance_alias, 3, p->dmmap_section, "queueinstance", "queuealias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p, wnum) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+struct uci_section *get_dup_qos_stats_section_in_dmmap(char *dmmap_package, char *section_type, char *dev)
+{
+	struct uci_section *s;
+
+	uci_path_foreach_option_eq(icwmpd, dmmap_package, section_type, "dev_link", dev, s)
+	{
+		return s;
+	}
+
+	return NULL;
+}
+
+int browseQoSQueueStatsInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *dmmap_sect;
+	char *questatsout[256], *wnum= NULL, *instance= NULL, *inst_last= NULL, *v, *lastinstancestore= NULL, *instancestore= NULL, dev[50]= "", user[50]= "";
+	int length, i, ret;
+	struct queuestats queuests= {0}, emptyquestats= {0};
+	regex_t regex1, regex2;
+
+	regcomp(&regex1, queuessts1, 0);
+	regcomp(&regex2, queuessts2, 0);
+	check_create_dmmap_package("dmmap_qos");
+	command_exec_output_to_array("tc -s qdisc", questatsout, &length);
+	for(i=0; i<length; i++){
+		switch(i%3) {
+			case 0: ret= regexec(&regex1, questatsout[i], 0, NULL, 0);
+				 	if (ret == 0)
+				 		sscanf(questatsout[i], "qdisc noqueue %d: dev %s %s refcnt %d\n", &queuests.noqueue, dev, user, &queuests.refcnt);
+				 	else {
+				 		ret= regexec(&regex2, questatsout[i], 0, NULL, 0);
+				 		if (ret == 0)
+				 			sscanf(questatsout[i], "qdisc pfifo_fast %d: dev %s %s refcnt %d\n", &queuests.pfifo_fast, dev, user, &queuests.refcnt);
+				 	}
+					strcpy(queuests.dev, dev);
+					break;
+			case 1: sscanf(questatsout[i], " Sent %d bytes %d pkt (dropped %d, overlimits %d requeues %d)\n", &queuests.bytes_sent, &queuests.pkt_sent, &queuests.pkt_dropped, &queuests.pkt_overlimits, &queuests.pkt_requeues);
+					break;
+			case 2: sscanf(questatsout[i], " backlog %db %dp requeues %d\n", &queuests.backlog_b, &queuests.backlog_p, &queuests.backlog_requeues);
+					if ((dmmap_sect = get_dup_qos_stats_section_in_dmmap("dmmap_qos", "qos_queue_stats", queuests.dev)) == NULL) {
+						dmuci_add_section_icwmpd("dmmap_qos", "qos_queue_stats", &dmmap_sect, &v);
+						DMUCI_SET_VALUE_BY_SECTION(icwmpd, dmmap_sect, "dev_link", queuests.dev);
+					}
+					queuests.dmsect= dmmap_sect;
+
+					if(lastinstancestore != NULL && inst_last !=NULL)
+						inst_last= dmstrdup(lastinstancestore);
+					instance =  handle_update_instance(1, dmctx, &inst_last, update_instance_alias, 3, dmmap_sect, "queuestatsinstance", "queuestatsalias");
+					lastinstancestore= dmstrdup(inst_last);
+					instancestore= dmstrdup(instance);
+					if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&queuests, instance) == DM_STOP)
+						goto end;
+					queuests= emptyquestats;
+					dmfree(instance);
+					break;
+		}
+	}
+	end:
+		return 0;
+}
+
+int browseQoSShaperInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *wnum = NULL, *wnum_last = NULL;
+	char buf[12];
+	struct uci_section *s = NULL;
+	struct dmmap_dup *p;
+	char *limitrate= NULL;
+	LIST_HEAD(dup_list);
+	synchronize_specific_config_sections_with_dmmap("qos", "class", "dmmap_qos", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		dmuci_get_value_by_section_string(p->config_section, "limitrate", &limitrate);
+		if(limitrate == NULL || strlen(limitrate) == 0)
+			continue;
+		wnum =  handle_update_instance(1, dmctx, &wnum_last, update_instance_alias, 3, p->dmmap_section, "shaperinstance", "shaperalias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p, wnum) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+
+int addObjQoSClassification(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	struct uci_section *s, *dmmap_qos_classify;
+	char *last_inst= NULL, *sect_name= NULL, *qos_comment, *v;
+	char ib[8];
+	last_inst= get_last_instance_icwmpd("dmmap_qos", "classify", "classifinstance");
+	if (last_inst)
+		sprintf(ib, "%s", last_inst);
+	else
+		sprintf(ib, "%s", "1");
+	dmasprintf(&qos_comment, "QoS classify %d", atoi(ib)+1);
+
+	dmuci_add_section("qos", "classify", &s, &sect_name);
+	dmuci_set_value_by_section(s, "comment", qos_comment);
+
+	dmuci_add_section_icwmpd("dmmap_qos", "classify", &dmmap_qos_classify, &v);
+	dmuci_set_value_by_section(dmmap_qos_classify, "section_name", sect_name);
+	*instance = update_instance_icwmpd(dmmap_qos_classify, last_inst, "classifinstance");
+	return 0;
+}
+
+int delObjQoSClassification(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	struct uci_section *s = NULL;
+	struct uci_section *ss = NULL;
+	struct uci_section *dmmap_section;
+	int found = 0;
+
+	switch (del_action) {
+		case DEL_INST:
+			if(is_section_unnamed(section_name(p->config_section))){
+				LIST_HEAD(dup_list);
+				delete_sections_save_next_sections("dmmap_qos", "classify", "classifinstance", section_name(p->config_section), atoi(instance), &dup_list);
+				update_dmmap_sections(&dup_list, "classifinstance", "dmmap_qos", "classify");
+				dmuci_delete_by_section_unnamed(p->config_section, NULL, NULL);
+			} else {
+				get_dmmap_section_of_config_section("dmmap_qos", "classify", section_name(p->config_section), &dmmap_section);
+				dmuci_delete_by_section_unnamed_icwmpd(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(p->config_section, NULL, NULL);
+			}
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("qos", "classify", s) {
+				if (found != 0){
+					get_dmmap_section_of_config_section("dmmap_qos", "classify", section_name(ss), &dmmap_section);
+					if(dmmap_section != NULL)
+						dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL){
+				get_dmmap_section_of_config_section("dmmap_qos", "classify", section_name(ss), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			break;
+	}
+	return 0;
+}
+
+int addObjQoSApp(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	//TODO
+	return 0;
+}
+
+int delObjQoSApp(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	switch (del_action) {
+		case DEL_INST:
+			//TODO
+			break;
+		case DEL_ALL:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int addObjQoSFlow(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	//TODO
+	return 0;
+}
+
+int delObjQoSFlow(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	switch (del_action) {
+		case DEL_INST:
+			//TODO
+			break;
+		case DEL_ALL:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int addObjQoSPolicer(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	//TODO
+	return 0;
+}
+
+int delObjQoSPolicer(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	switch (del_action) {
+		case DEL_INST:
+			//TODO
+			break;
+		case DEL_ALL:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int addObjQoSQueue(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	struct uci_section *s, *dmmap_qos_class;
+	char *last_inst= NULL, *sect_name= NULL, *qos_comment, *v;
+	char ib[8];
+	last_inst= get_last_instance_icwmpd("dmmap_qos", "class", "queueinstance");
+	if (last_inst)
+		sprintf(ib, "%s", last_inst);
+	else
+		sprintf(ib, "%s", "1");
+
+	dmuci_add_section("qos", "class", &s, &sect_name);
+	dmuci_set_value_by_section(s, "packetsize", "1000");
+
+	dmuci_add_section_icwmpd("dmmap_qos", "class", &dmmap_qos_class, &v);
+	dmuci_set_value_by_section(dmmap_qos_class, "section_name", sect_name);
+	*instance = update_instance_icwmpd(dmmap_qos_class, last_inst, "queueinstance");
+	return 0;
+}
+
+int delObjQoSQueue(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	struct uci_section *s = NULL;
+	struct uci_section *ss = NULL;
+	struct uci_section *dmmap_section;
+	int found = 0;
+
+	switch (del_action) {
+		case DEL_INST:
+			if(is_section_unnamed(section_name(p->config_section))){
+				LIST_HEAD(dup_list);
+				delete_sections_save_next_sections("dmmap_qos", "class", "queueinstance", section_name(p->config_section), atoi(instance), &dup_list);
+				update_dmmap_sections(&dup_list, "queueinstance", "dmmap_qos", "class");
+				dmuci_delete_by_section_unnamed(p->config_section, NULL, NULL);
+			} else {
+				get_dmmap_section_of_config_section("dmmap_qos", "class", section_name(p->config_section), &dmmap_section);
+				dmuci_delete_by_section_unnamed_icwmpd(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(p->config_section, NULL, NULL);
+			}
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("qos", "class", s) {
+				if (found != 0){
+					get_dmmap_section_of_config_section("dmmap_qos", "class", section_name(ss), &dmmap_section);
+					if(dmmap_section != NULL)
+						dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL){
+				get_dmmap_section_of_config_section("dmmap_qos", "class", section_name(ss), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			break;
+	}
+	return 0;
+}
+
+int addObjQoSQueueStats(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	//TODO
+	return 0;
+}
+
+int delObjQoSQueueStats(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	switch (del_action) {
+		case DEL_INST:
+			//TODO
+			break;
+		case DEL_ALL:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int addObjQoSShaper(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	struct uci_section *s, *dmmap_qos_class;
+	char *last_inst= NULL, *sect_name= NULL, *qos_comment, *v;
+	char ib[8];
+	last_inst= get_last_instance_icwmpd_without_update("dmmap_qos", "class", "shaperinstance");
+	if (last_inst)
+		sprintf(ib, "%s", last_inst);
+	else
+		sprintf(ib, "%s", "1");
+
+	dmuci_add_section("qos", "class", &s, &sect_name);
+	dmuci_set_value_by_section(s, "limitrate", "1000");
+
+	dmuci_add_section_icwmpd("dmmap_qos", "class", &dmmap_qos_class, &v);
+	dmuci_set_value_by_section(dmmap_qos_class, "section_name", sect_name);
+	*instance = update_instance_icwmpd(dmmap_qos_class, last_inst, "shaperinstance");
+	return 0;
+}
+
+int delObjQoSShaper(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	struct uci_section *s, *dmmap_sect;
+	switch (del_action) {
+		case DEL_INST:
+			dmuci_set_value_by_section(p->config_section, "limitrate", "");
+			dmuci_set_value_by_section(p->dmmap_section, "shaperinstance", "");
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("qos", "class", s) {
+				get_dmmap_section_of_config_section("dmmap_qos", "class", section_name(s), &dmmap_sect);
+				dmuci_set_value_by_section(s, "limitrate", "");
+				dmuci_set_value_by_section(dmmap_sect, "shaperinstance", "");
+			}
+			break;
+	}
+	return 0;
+}
+
+
+int get_QoS_MaxClassificationEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+/*#Device.QoS.ClassificationNumberOfEntries!UCI:qos/classify/*/
+int get_QoS_ClassificationNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	int nbre= 0;
+	uci_foreach_sections("qos", "classify", s) {
+		nbre++;
+	}
+	dmasprintf(value, "%d", nbre);
+	return 0;
+}
+
+int get_QoS_MaxAppEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoS_AppNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoS_MaxFlowEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoS_FlowNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoS_MaxPolicerEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoS_PolicerNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoS_MaxQueueEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+/*#Device.QoS.QueueNumberOfEntries!UCI:qos/class/*/
+int get_QoS_QueueNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	int nbre= 0;
+
+	uci_foreach_sections("qos", "class", s) {
+		nbre++;
+	}
+	dmasprintf(value, "%d", nbre);
+	return 0;
+}
+
+int get_QoS_QueueStatsNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *questatsout[256];
+	int length;
+
+	command_exec_output_to_array("tc -s qdisc", questatsout, &length);
+	dmasprintf(value, "%d", length/3);
+	return 0;
+}
+
+int get_QoS_MaxShaperEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoS_ShaperNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	int nbre= 0;
+	char *rate= NULL;
+
+	uci_foreach_sections("qos", "class", s) {
+
+		dmuci_get_value_by_section_string(s, "limitrate", &rate);
+
+		if(rate == NULL || strlen(rate)<=0)
+			continue;
+		nbre++;
+	}
+	dmasprintf(value, "%d", nbre);
+	return 0;
+}
+
+int get_QoS_DefaultForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoS_DefaultForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoS_DefaultTrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoS_DefaultTrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoS_DefaultPolicer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoS_DefaultPolicer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoS_DefaultQueue(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *linker;
+
+	dmuci_get_option_value_string("qos", "Default", "default", &linker);
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cQoS%cQueue%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value);
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+int set_QoS_DefaultQueue(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *linker;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			adm_entry_get_linker_value(ctx, value, &linker);
+			dmuci_set_value("qos", "Default", "default", linker);
+			break;
+	}
+	return 0;
+}
+
+int get_QoS_DefaultDSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	char *linker, *classtarget;
+
+	dmuci_get_option_value_string("qos", "Default", "default", &linker);
+	uci_foreach_sections("qos", "classify", s) {
+		dmuci_get_value_by_section_string(s, "target", &classtarget);
+		if (strcmp(classtarget, linker) == 0) {
+			dmuci_get_value_by_section_string(s, "dscp", value);
+			return 0;
+		}
+	}
+	*value= "";
+	return 0;
+}
+
+int set_QoS_DefaultDSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoS_DefaultEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoS_DefaultEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoS_DefaultInnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoS_DefaultInnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoS_AvailableAppList(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSClassification_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSClassification_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	dmuci_get_value_by_section_string(p->dmmap_section, "classifalias", value);
+	return 0;
+}
+
+int set_QoSClassification_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(p->dmmap_section, "classifalias", value);
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DHCPType(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DHCPType(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup *) data;
+	struct uci_section *s;
+	char *classes= NULL, **classesarr, *classgroup= NULL, *ifaceclassgrp, *targetclass;
+	int nbre= 0;
+	size_t length;
+
+	dmuci_get_value_by_section_string(p->config_section, "target", &targetclass);
+	uci_foreach_sections("qos", "classgroup", s) {
+		dmuci_get_value_by_section_string(s, "classes", &classes);
+		classesarr= strsplit(classes, " ", &length);
+		if(classes!=NULL && is_array_elt_exist(classesarr, targetclass, length)){
+			dmasprintf(&classgroup, "%s", section_name(s));
+			break;
+		}
+	}
+	if(classgroup == NULL)
+		return 0;
+	uci_foreach_sections("qos", "interface", s) {
+		dmuci_get_value_by_section_string(s, "classgroup", &ifaceclassgrp);
+		if(ifaceclassgrp != NULL && strcmp(ifaceclassgrp, classgroup) == 0){
+			adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), section_name(s), value);
+			if (*value == NULL)
+				adm_entry_get_linker_param(ctx, dm_print_path("%s%cPPP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), section_name(s), value);
+			if (*value == NULL)
+				adm_entry_get_linker_param(ctx, dm_print_path("%s%cEthernet%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), section_name(s), value);
+			if (*value == NULL)
+				*value = "";
+		}
+	}
+	return 0;
+}
+
+int set_QoSClassification_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_AllInterfaces(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_AllInterfaces(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.QoS.Classification.{i}.DestIP!UCI:qos/classify,@i-1/dsthost*/
+int get_QoSClassification_DestIP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	dmuci_get_value_by_section_string(p->config_section, "dsthost", value);
+	return 0;
+}
+
+int set_QoSClassification_DestIP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(p->config_section, "dsthost", value);
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestIPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestIPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.QoS.Classification.{i}.SourceIP!UCI:qos/classify,@i-1/srchost*/
+int get_QoSClassification_SourceIP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	dmuci_get_value_by_section_string(p->config_section, "srchost", value);
+	return 0;
+}
+
+int set_QoSClassification_SourceIP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(p->config_section, "srchost", value);
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceIPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceIPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.QoS.Classification.{i}.Protocol!UCI:qos/classify,@i-1/proto*/
+int get_QoSClassification_Protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	dmuci_get_value_by_section_string(p->config_section, "proto", value);
+	return 0;
+}
+
+int set_QoSClassification_Protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(p->config_section, "proto", value);
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_ProtocolExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_ProtocolExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.QoS.Classification.{i}.DestPort!UCI:qos/classify,@i-1/dstports*/
+int get_QoSClassification_DestPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	dmuci_get_value_by_section_string(p->config_section, "dstports", value);
+	return 0;
+}
+
+int set_QoSClassification_DestPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(p->config_section, "dstports", value);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.QoS.Classification.{i}.DestPortRangeMax!UCI:qos/classify,@i-1/portrange*/
+int get_QoSClassification_DestPortRangeMax(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	dmuci_get_value_by_section_string(p->config_section, "portrange", value);
+	return 0;
+}
+
+int set_QoSClassification_DestPortRangeMax(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(p->config_section, "portrange", value);
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestPortExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestPortExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.QoS.Classification.{i}.SourcePort!UCI:qos/classify,@i-1/srcports*/
+int get_QoSClassification_SourcePort(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	dmuci_get_value_by_section_string(p->config_section, "srcports", value);
+	return 0;
+}
+
+int set_QoSClassification_SourcePort(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(p->config_section, "srcports", value);
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourcePortRangeMax(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourcePortRangeMax(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourcePortExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourcePortExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceMACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceMACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceMACMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceMACMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceMACExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceMACExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestMACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestMACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestMACMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestMACMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestMACExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestMACExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_Ethertype(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_Ethertype(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_EthertypeExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_EthertypeExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SSAP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SSAP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SSAPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SSAPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DSAP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DSAP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DSAPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DSAPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_LLCControl(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_LLCControl(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_LLCControlExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_LLCControlExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SNAPOUI(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SNAPOUI(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SNAPOUIExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SNAPOUIExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceVendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceVendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceVendorClassIDv6(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceVendorClassIDv6(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceVendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceVendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceVendorClassIDMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceVendorClassIDMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestVendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestVendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestVendorClassIDv6(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestVendorClassIDv6(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestVendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestVendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestVendorClassIDMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestVendorClassIDMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceClientID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceClientID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceClientIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceClientIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestClientID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestClientID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestClientIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestClientIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceUserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceUserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceUserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceUserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestUserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestUserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestUserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestUserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceVendorSpecificInfo(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceVendorSpecificInfo(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceVendorSpecificInfoExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceVendorSpecificInfoExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceVendorSpecificInfoEnterprise(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceVendorSpecificInfoEnterprise(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_SourceVendorSpecificInfoSubOption(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_SourceVendorSpecificInfoSubOption(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestVendorSpecificInfo(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestVendorSpecificInfo(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestVendorSpecificInfoExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestVendorSpecificInfoExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestVendorSpecificInfoEnterprise(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestVendorSpecificInfoEnterprise(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DestVendorSpecificInfoSubOption(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DestVendorSpecificInfoSubOption(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_TCPACK(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_TCPACK(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_TCPACKExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_TCPACKExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_IPLengthMin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_IPLengthMin(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_IPLengthMax(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_IPLengthMax(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_IPLengthExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_IPLengthExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DSCPCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DSCPCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_DSCPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_DSCPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.QoS.Classification.{i}.DSCPMark!UCI:qos/classify,@i-1/dscp*/
+int get_QoSClassification_DSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup *)data;
+	dmuci_get_value_by_section_string(p->config_section, "dscp", value);
+	return 0;
+}
+
+int set_QoSClassification_DSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dmmap_dup *p= (struct dmmap_dup *)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(p->config_section, "dscp", value);
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_EthernetPriorityCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_EthernetPriorityCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_EthernetPriorityExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_EthernetPriorityExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_EthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_EthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_InnerEthernetPriorityCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_InnerEthernetPriorityCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_InnerEthernetPriorityExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_InnerEthernetPriorityExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_InnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_InnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_EthernetDEICheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_EthernetDEICheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_EthernetDEIExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_EthernetDEIExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_VLANIDCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_VLANIDCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_VLANIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_VLANIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_OutOfBandInfo(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_OutOfBandInfo(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_ForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_ForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_TrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_TrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_Policer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_Policer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSClassification_App(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSClassification_App(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSApp_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSApp_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSApp_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSApp_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSApp_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSApp_ProtocolIdentifier(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSApp_ProtocolIdentifier(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSApp_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSApp_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSApp_DefaultForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSApp_DefaultForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSApp_DefaultTrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSApp_DefaultTrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSApp_DefaultPolicer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSApp_DefaultPolicer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSApp_DefaultDSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSApp_DefaultDSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSApp_DefaultEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSApp_DefaultEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSApp_DefaultInnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSApp_DefaultInnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSFlow_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSFlow_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSFlow_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSFlow_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSFlow_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSFlow_Type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSFlow_Type(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSFlow_TypeParameters(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSFlow_TypeParameters(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSFlow_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSFlow_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSFlow_App(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSFlow_App(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSFlow_ForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSFlow_ForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSFlow_TrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSFlow_TrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSFlow_Policer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSFlow_Policer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSFlow_DSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSFlow_DSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSFlow_EthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSFlow_EthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSFlow_InnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSFlow_InnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSPolicer_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSPolicer_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSPolicer_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSPolicer_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSPolicer_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSPolicer_CommittedRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSPolicer_CommittedRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSPolicer_CommittedBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSPolicer_CommittedBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSPolicer_ExcessBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSPolicer_ExcessBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSPolicer_PeakRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSPolicer_PeakRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSPolicer_PeakBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSPolicer_PeakBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSPolicer_MeterType(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSPolicer_MeterType(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSPolicer_PossibleMeterTypes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSPolicer_ConformingAction(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSPolicer_ConformingAction(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSPolicer_PartialConformingAction(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSPolicer_PartialConformingAction(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSPolicer_NonConformingAction(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSPolicer_NonConformingAction(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSPolicer_TotalCountedPackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSPolicer_TotalCountedBytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSPolicer_ConformingCountedPackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSPolicer_ConformingCountedBytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSPolicer_PartiallyConformingCountedPackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSPolicer_PartiallyConformingCountedBytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSPolicer_NonConformingCountedPackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSPolicer_NonConformingCountedBytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSQueue_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSQueue_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueue_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSQueue_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	dmuci_get_value_by_section_string(p->dmmap_section, "queuealias", value);
+	return 0;
+}
+
+int set_QoSQueue_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(p->dmmap_section, "queuealias", value);
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueue_TrafficClasses(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSQueue_TrafficClasses(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueue_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup *) data;
+	struct uci_section *s;
+	char *classes= NULL, **classesarr, *classgroup= NULL, *ifaceclassgrp, *targetclass;
+	int nbre= 0;
+	size_t length;
+
+	uci_foreach_sections("qos", "classgroup", s) {
+		dmuci_get_value_by_section_string(s, "classes", &classes);
+		classesarr= strsplit(classes, " ", &length);
+		if(classes!=NULL && is_array_elt_exist(classesarr, section_name(p->config_section), length)){
+			dmasprintf(&classgroup, "%s", section_name(s));
+			break;
+		}
+	}
+	if(classgroup == NULL)
+		return 0;
+	uci_foreach_sections("qos", "interface", s) {
+		dmuci_get_value_by_section_string(s, "classgroup", &ifaceclassgrp);
+		if(ifaceclassgrp != NULL && strcmp(ifaceclassgrp, classgroup) == 0){
+			adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), section_name(s), value);
+			if (*value == NULL)
+				adm_entry_get_linker_param(ctx, dm_print_path("%s%cPPP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), section_name(s), value);
+			if (*value == NULL)
+				adm_entry_get_linker_param(ctx, dm_print_path("%s%cEthernet%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), section_name(s), value);
+			if (*value == NULL)
+				*value = "";
+		}
+	}
+	return 0;
+}
+
+int set_QoSQueue_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueue_AllInterfaces(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSQueue_AllInterfaces(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueue_HardwareAssisted(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+/*#Device.QoS.Queue.{i}.BufferLength!UCI:qos/class,@i-1/maxsize*/
+int get_QoSQueue_BufferLength(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	dmuci_get_value_by_section_string(p->config_section, "maxsize", value);
+	return 0;
+}
+
+int get_QoSQueue_Weight(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSQueue_Weight(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueue_Precedence(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSQueue_Precedence(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueue_REDThreshold(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSQueue_REDThreshold(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueue_REDPercentage(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSQueue_REDPercentage(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueue_DropAlgorithm(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSQueue_DropAlgorithm(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueue_SchedulerAlgorithm(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSQueue_SchedulerAlgorithm(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.QoS.Queue.{i}.ShapingRate!UCI:qos/class,@i-1/limitrate*/
+int get_QoSQueue_ShapingRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	char *rate= NULL;
+
+	dmuci_get_value_by_section_string(p->config_section, "limitrate", &rate);
+	if (rate != NULL && atoi(rate)>=0)
+		dmasprintf(value, "%s", rate);
+	else
+		dmasprintf(value, "%s", "-1");
+	return 0;
+}
+
+int set_QoSQueue_ShapingRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			if(atoi(value)>=0)
+				dmuci_set_value_by_section(p->config_section, "limitrate", value);
+			else
+				dmuci_set_value_by_section(p->config_section, "limitrate", "");
+
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueue_ShapingBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSQueue_ShapingBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueueStats_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSQueueStats_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueueStats_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSQueueStats_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct queuestats *qts= (struct queuestats*)data;
+	dmuci_get_value_by_section_string(qts->dmsect, "queuestatsalias", value);
+	return 0;
+}
+
+int set_QoSQueueStats_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct queuestats *qts= (struct queuestats*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(qts->dmsect, "queuestatsalias", value);
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueueStats_Queue(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSQueueStats_Queue(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueueStats_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct queuestats *qts= (struct queuestats*)data;
+
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), qts->dev, value);
+	if (*value == NULL)
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cPPP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), qts->dev, value);
+	if (*value == NULL)
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cEthernet%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), qts->dev, value);
+	if (*value == NULL)
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cWiFi%cRadio%c", dmroot, dm_delim, dm_delim, dm_delim), qts->dev, value);
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+int set_QoSQueueStats_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSQueueStats_OutputPackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct queuestats *queuests= (struct queuestats*)data;
+	dmasprintf(value, "%d", queuests->pkt_sent);
+	return 0;
+}
+
+int get_QoSQueueStats_OutputBytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct queuestats *queuests= (struct queuestats*)data;
+	dmasprintf(value, "%d", queuests->bytes_sent);
+	return 0;
+}
+
+int get_QoSQueueStats_DroppedPackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct queuestats *queuests= (struct queuestats*)data;
+	dmasprintf(value, "%d", queuests->pkt_dropped);
+	return 0;
+}
+
+int get_QoSQueueStats_DroppedBytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	return 0;
+}
+
+int get_QoSQueueStats_QueueOccupancyPackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct queuestats *queuests= (struct queuestats*)data;
+	dmasprintf(value, "%d", queuests->pkt_requeues);
+	return 0;
+}
+
+int get_QoSQueueStats_QueueOccupancyPercentage(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSShaper_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSShaper_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSShaper_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_QoSShaper_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	dmuci_get_value_by_section_string(p->dmmap_section, "shaperalias", value);
+	return 0;
+}
+
+int set_QoSShaper_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(p->dmmap_section, "shaperalias", value);
+			break;
+	}
+	return 0;
+}
+
+int get_QoSShaper_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup *) data;
+	struct uci_section *s;
+	char *classes= NULL, **classesarr, *classgroup= NULL, *ifaceclassgrp, *targetclass;
+	int nbre= 0;
+	size_t length;
+
+	uci_foreach_sections("qos", "classgroup", s) {
+		dmuci_get_value_by_section_string(s, "classes", &classes);
+		classesarr= strsplit(classes, " ", &length);
+		if(classes!=NULL && is_array_elt_exist(classesarr, section_name(p->config_section), length)){
+			dmasprintf(&classgroup, "%s", section_name(s));
+			break;
+		}
+	}
+	if(classgroup == NULL)
+		return 0;
+	uci_foreach_sections("qos", "interface", s) {
+		dmuci_get_value_by_section_string(s, "classgroup", &ifaceclassgrp);
+		if(ifaceclassgrp != NULL && strcmp(ifaceclassgrp, classgroup) == 0){
+			adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), section_name(s), value);
+			if (*value == NULL)
+				adm_entry_get_linker_param(ctx, dm_print_path("%s%cPPP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), section_name(s), value);
+			if (*value == NULL)
+				adm_entry_get_linker_param(ctx, dm_print_path("%s%cEthernet%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), section_name(s), value);
+			if (*value == NULL)
+				*value = "";
+		}
+	}
+	return 0;
+}
+
+int set_QoSShaper_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_QoSShaper_ShapingRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+	char *rate= NULL;
+
+	dmuci_get_value_by_section_string(p->config_section, "limitrate", &rate);
+	if (rate != NULL && atoi(rate)>=0)
+		dmasprintf(value, "%s", rate);
+	else
+		dmasprintf(value, "%s", "-1");
+	return 0;
+}
+
+int set_QoSShaper_ShapingRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct dmmap_dup *p= (struct dmmap_dup*)data;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			if(atoi(value)>=0)
+				dmuci_set_value_by_section(p->config_section, "limitrate", value);
+			else
+				dmuci_set_value_by_section(p->config_section, "limitrate", "");
+
+			break;
+	}
+	return 0;
+}
+
+int get_QoSShaper_ShapingBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_QoSShaper_ShapingBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
diff --git a/dmtree/tr181/qos.h b/dmtree/tr181/qos.h
new file mode 100644
index 0000000000000000000000000000000000000000..60036ffc096ee9cf85b58b6ab6a89442d10f018e
--- /dev/null
+++ b/dmtree/tr181/qos.h
@@ -0,0 +1,403 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*      Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Omar Kallel <omar.kallel@pivasoftware.com>
+*/
+
+#ifndef __QOS_H
+#define __QOS_H
+
+extern DMOBJ tQoSObj[];
+extern DMLEAF tQoSParams[];
+extern DMLEAF tQoSClassificationParams[];
+extern DMLEAF tQoSAppParams[];
+extern DMLEAF tQoSFlowParams[];
+extern DMLEAF tQoSPolicerParams[];
+extern DMLEAF tQoSQueueParams[];
+extern DMLEAF tQoSQueueStatsParams[];
+extern DMLEAF tQoSShaperParams[];
+
+#define queuessts1 "^qdisc noqueue [0-9]*: dev [[:alnum:]]* [[:alnum:]]* refcnt [0-9]*"
+#define queuessts2 "^qdisc pfifo_fast [0-9]*: dev [[:alnum:]]* [[:alnum:]]* refcnt [0-9]*"
+//#define queuessts3 "^[ ]*Sent [0-9]* bytes [0-9]* pkt (dropped [0-9]*, overlimits [0-9]* requeues [0-9]*)"
+//#define queuessts4 "^[ ]*backlog [0-9]*b [0-9]*p requeues [0-9]*"
+
+struct queuestats {
+	struct uci_section *dmsect;
+	char dev[50];
+	char user[50];
+	char priomap[50];
+	int noqueue;
+	int pfifo_fast;
+	int refcnt;
+	int bands;
+	int bytes_sent;
+	int pkt_sent;
+	int pkt_dropped;
+	int pkt_overlimits;
+	int pkt_requeues;
+	int backlog_b;
+	int backlog_p;
+	int backlog_requeues;
+};
+
+int get_linker_qos_queue(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+
+int browseQoSClassificationInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseQoSAppInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseQoSFlowInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseQoSPolicerInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseQoSQueueInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseQoSQueueStatsInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseQoSShaperInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int addObjQoSClassification(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjQoSClassification(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjQoSApp(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjQoSApp(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjQoSFlow(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjQoSFlow(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjQoSPolicer(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjQoSPolicer(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjQoSQueue(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjQoSQueue(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjQoSQueueStats(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjQoSQueueStats(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjQoSShaper(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjQoSShaper(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_QoS_MaxClassificationEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoS_ClassificationNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoS_MaxAppEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoS_AppNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoS_MaxFlowEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoS_FlowNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoS_MaxPolicerEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoS_PolicerNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoS_MaxQueueEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoS_QueueNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoS_QueueStatsNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoS_MaxShaperEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoS_ShaperNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoS_DefaultForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoS_DefaultForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoS_DefaultTrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoS_DefaultTrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoS_DefaultPolicer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoS_DefaultPolicer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoS_DefaultQueue(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoS_DefaultQueue(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoS_DefaultDSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoS_DefaultDSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoS_DefaultEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoS_DefaultEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoS_DefaultInnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoS_DefaultInnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoS_AvailableAppList(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSClassification_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSClassification_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_Order(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DHCPType(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DHCPType(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_AllInterfaces(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_AllInterfaces(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestIP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestIP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestIPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestIPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceIP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceIP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceIPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceIPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_Protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_Protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_ProtocolExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_ProtocolExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestPortRangeMax(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestPortRangeMax(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestPortExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestPortExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourcePort(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourcePort(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourcePortRangeMax(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourcePortRangeMax(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourcePortExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourcePortExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceMACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceMACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceMACMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceMACMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceMACExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceMACExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestMACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestMACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestMACMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestMACMask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestMACExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestMACExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_Ethertype(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_Ethertype(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_EthertypeExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_EthertypeExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SSAP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SSAP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SSAPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SSAPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DSAP(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DSAP(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DSAPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DSAPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_LLCControl(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_LLCControl(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_LLCControlExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_LLCControlExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SNAPOUI(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SNAPOUI(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SNAPOUIExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SNAPOUIExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceVendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceVendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceVendorClassIDv6(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceVendorClassIDv6(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceVendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceVendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceVendorClassIDMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceVendorClassIDMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestVendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestVendorClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestVendorClassIDv6(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestVendorClassIDv6(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestVendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestVendorClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestVendorClassIDMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestVendorClassIDMode(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceClientID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceClientID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceClientIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceClientIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestClientID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestClientID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestClientIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestClientIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceUserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceUserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceUserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceUserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestUserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestUserClassID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestUserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestUserClassIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceVendorSpecificInfo(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceVendorSpecificInfo(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceVendorSpecificInfoExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceVendorSpecificInfoExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceVendorSpecificInfoEnterprise(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceVendorSpecificInfoEnterprise(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_SourceVendorSpecificInfoSubOption(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_SourceVendorSpecificInfoSubOption(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestVendorSpecificInfo(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestVendorSpecificInfo(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestVendorSpecificInfoExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestVendorSpecificInfoExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestVendorSpecificInfoEnterprise(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestVendorSpecificInfoEnterprise(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DestVendorSpecificInfoSubOption(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DestVendorSpecificInfoSubOption(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_TCPACK(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_TCPACK(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_TCPACKExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_TCPACKExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_IPLengthMin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_IPLengthMin(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_IPLengthMax(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_IPLengthMax(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_IPLengthExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_IPLengthExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DSCPCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DSCPCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DSCPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DSCPExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_DSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_DSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_EthernetPriorityCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_EthernetPriorityCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_EthernetPriorityExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_EthernetPriorityExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_EthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_EthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_InnerEthernetPriorityCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_InnerEthernetPriorityCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_InnerEthernetPriorityExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_InnerEthernetPriorityExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_InnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_InnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_EthernetDEICheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_EthernetDEICheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_EthernetDEIExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_EthernetDEIExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_VLANIDCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_VLANIDCheck(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_VLANIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_VLANIDExclude(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_OutOfBandInfo(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_OutOfBandInfo(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_ForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_ForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_TrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_TrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_Policer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_Policer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSClassification_App(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSClassification_App(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSApp_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSApp_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSApp_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSApp_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSApp_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSApp_ProtocolIdentifier(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSApp_ProtocolIdentifier(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSApp_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSApp_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSApp_DefaultForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSApp_DefaultForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSApp_DefaultTrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSApp_DefaultTrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSApp_DefaultPolicer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSApp_DefaultPolicer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSApp_DefaultDSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSApp_DefaultDSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSApp_DefaultEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSApp_DefaultEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSApp_DefaultInnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSApp_DefaultInnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSFlow_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSFlow_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSFlow_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSFlow_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSFlow_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSFlow_Type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSFlow_Type(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSFlow_TypeParameters(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSFlow_TypeParameters(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSFlow_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSFlow_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSFlow_App(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSFlow_App(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSFlow_ForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSFlow_ForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSFlow_TrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSFlow_TrafficClass(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSFlow_Policer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSFlow_Policer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSFlow_DSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSFlow_DSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSFlow_EthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSFlow_EthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSFlow_InnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSFlow_InnerEthernetPriorityMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSPolicer_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSPolicer_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSPolicer_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSPolicer_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSPolicer_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSPolicer_CommittedRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSPolicer_CommittedRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSPolicer_CommittedBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSPolicer_CommittedBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSPolicer_ExcessBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSPolicer_ExcessBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSPolicer_PeakRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSPolicer_PeakRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSPolicer_PeakBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSPolicer_PeakBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSPolicer_MeterType(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSPolicer_MeterType(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSPolicer_PossibleMeterTypes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSPolicer_ConformingAction(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSPolicer_ConformingAction(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSPolicer_PartialConformingAction(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSPolicer_PartialConformingAction(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSPolicer_NonConformingAction(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSPolicer_NonConformingAction(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSPolicer_TotalCountedPackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSPolicer_TotalCountedBytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSPolicer_ConformingCountedPackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSPolicer_ConformingCountedBytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSPolicer_PartiallyConformingCountedPackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSPolicer_PartiallyConformingCountedBytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSPolicer_NonConformingCountedPackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSPolicer_NonConformingCountedBytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSQueue_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueue_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueue_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSQueue_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueue_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueue_TrafficClasses(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueue_TrafficClasses(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueue_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueue_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueue_AllInterfaces(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueue_AllInterfaces(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueue_HardwareAssisted(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSQueue_BufferLength(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSQueue_Weight(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueue_Weight(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueue_Precedence(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueue_Precedence(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueue_REDThreshold(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueue_REDThreshold(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueue_REDPercentage(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueue_REDPercentage(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueue_DropAlgorithm(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueue_DropAlgorithm(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueue_SchedulerAlgorithm(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueue_SchedulerAlgorithm(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueue_ShapingRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueue_ShapingRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueue_ShapingBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueue_ShapingBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueueStats_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueueStats_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueueStats_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSQueueStats_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueueStats_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueueStats_Queue(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueueStats_Queue(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueueStats_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSQueueStats_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSQueueStats_OutputPackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSQueueStats_OutputBytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSQueueStats_DroppedPackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSQueueStats_DroppedBytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSQueueStats_QueueOccupancyPackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSQueueStats_QueueOccupancyPercentage(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSShaper_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSShaper_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSShaper_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_QoSShaper_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSShaper_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSShaper_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSShaper_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSShaper_ShapingRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSShaper_ShapingRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_QoSShaper_ShapingBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_QoSShaper_ShapingBurstSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif //__QOS_H
+
diff --git a/dmtree/tr181/routing.c b/dmtree/tr181/routing.c
new file mode 100644
index 0000000000000000000000000000000000000000..069151496455183972d06cfa741fd045c276667f
--- /dev/null
+++ b/dmtree/tr181/routing.c
@@ -0,0 +1,1403 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2019 iopsys Software Solutions AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *	  Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <ctype.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "routing.h"
+#include "dmjson.h"
+#include "dmentry.h"
+
+enum enum_route_type {
+	ROUTE_STATIC,
+	ROUTE_DYNAMIC,
+	ROUTE_DISABLED
+};
+
+/* *** Device.Routing. *** */
+DMOBJ tRoutingObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Router", &DMREAD, NULL, NULL, NULL, browseRouterInst, NULL, NULL, tRoutingRouterObj, tRoutingRouterParams, NULL, BBFDM_BOTH},
+{"RouteInformation", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tRoutingRouteInformationObj, tRoutingRouteInformationParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tRoutingParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"RouterNumberOfEntries", &DMREAD, DMT_UNINT, get_router_nbr_entry, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Routing.Router.{i}. *** */
+DMOBJ tRoutingRouterObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"IPv4Forwarding", &DMWRITE, add_ipv4forwarding, delete_ipv4forwarding, NULL, browseIPv4ForwardingInst, NULL, NULL, NULL, tRoutingRouterIPv4ForwardingParams, NULL, BBFDM_BOTH},
+{"IPv6Forwarding", &DMWRITE, add_ipv6Forwarding, delete_ipv6Forwarding, NULL, browseIPv6ForwardingInst, NULL, NULL, NULL, tRoutingRouterIPv6ForwardingParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tRoutingRouterParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_RoutingRouter_Enable, set_RoutingRouter_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_RoutingRouter_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_RoutingRouter_Alias, set_RoutingRouter_Alias, NULL, NULL, BBFDM_BOTH},
+{"IPv4ForwardingNumberOfEntries", &DMREAD, DMT_UNINT, get_RoutingRouter_IPv4ForwardingNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"IPv6ForwardingNumberOfEntries", &DMREAD, DMT_UNINT, get_RoutingRouter_IPv6ForwardingNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Routing.Router.{i}.IPv4Forwarding.{i}. *** */
+DMLEAF tRoutingRouterIPv4ForwardingParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMRouting, DMT_BOOL, get_router_ipv4forwarding_enable, set_router_ipv4forwarding_enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_router_ipv4forwarding_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_router_ipv4forwarding_alias, set_router_ipv4forwarding_alias, NULL, NULL, BBFDM_BOTH},
+{"StaticRoute", &DMREAD, DMT_BOOL, get_router_ipv4forwarding_static_route, NULL, NULL, NULL, BBFDM_BOTH},
+{"DestIPAddress", &DMRouting, DMT_STRING, get_router_ipv4forwarding_destip, set_router_ipv4forwarding_destip, NULL, NULL, BBFDM_BOTH},
+{"DestSubnetMask", &DMRouting, DMT_STRING, get_router_ipv4forwarding_destmask, set_router_ipv4forwarding_destmask, NULL, NULL, BBFDM_BOTH},
+{"ForwardingPolicy", &DMREAD, DMT_INT, get_router_ipv4forwarding_forwarding_policy, NULL, NULL, NULL, BBFDM_BOTH},
+{"GatewayIPAddress", &DMRouting, DMT_STRING, get_router_ipv4forwarding_gatewayip, set_router_ipv4forwarding_gatewayip, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMRouting, DMT_STRING, get_router_ipv4forwarding_interface_linker_parameter, set_router_ipv4forwarding_interface_linker_parameter, NULL, NULL, BBFDM_BOTH},
+{"Origin", &DMREAD, DMT_STRING, get_router_ipv4forwarding_origin, NULL, NULL, NULL, BBFDM_BOTH},
+{"ForwardingMetric", &DMRouting, DMT_INT, get_router_ipv4forwarding_metric, set_router_ipv4forwarding_metric, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Routing.Router.{i}.IPv4Forwarding.{i}. *** */
+DMLEAF tRoutingRouterIPv6ForwardingParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMRouting, DMT_BOOL, get_RoutingRouterIPv6Forwarding_Enable, set_RoutingRouterIPv6Forwarding_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_RoutingRouterIPv6Forwarding_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_RoutingRouterIPv6Forwarding_Alias, set_RoutingRouterIPv6Forwarding_Alias, NULL, NULL, BBFDM_BOTH},
+{"DestIPPrefix", &DMRouting, DMT_STRING, get_RoutingRouterIPv6Forwarding_DestIPPrefix, set_RoutingRouterIPv6Forwarding_DestIPPrefix, NULL, NULL, BBFDM_BOTH},
+{"ForwardingPolicy", &DMRouting, DMT_INT, get_RoutingRouterIPv6Forwarding_ForwardingPolicy, set_RoutingRouterIPv6Forwarding_ForwardingPolicy, NULL, NULL, BBFDM_BOTH},
+{"NextHop", &DMRouting, DMT_STRING, get_RoutingRouterIPv6Forwarding_NextHop, set_RoutingRouterIPv6Forwarding_NextHop, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMRouting, DMT_STRING, get_RoutingRouterIPv6Forwarding_Interface, set_RoutingRouterIPv6Forwarding_Interface, NULL, NULL, BBFDM_BOTH},
+{"Origin", &DMREAD, DMT_STRING, get_RoutingRouterIPv6Forwarding_Origin, NULL, NULL, NULL, BBFDM_BOTH},
+{"ForwardingMetric", &DMRouting, DMT_INT, get_RoutingRouterIPv6Forwarding_ForwardingMetric, set_RoutingRouterIPv6Forwarding_ForwardingMetric, NULL, NULL, BBFDM_BOTH},
+{"ExpirationTime", &DMREAD, DMT_TIME, get_RoutingRouterIPv6Forwarding_ExpirationTime, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Routing.RouteInformation. *** */
+DMOBJ tRoutingRouteInformationObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"InterfaceSetting", &DMREAD, NULL, NULL, NULL, browseRoutingRouteInformationInterfaceSettingInst, NULL, NULL, NULL, tRoutingRouteInformationInterfaceSettingParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tRoutingRouteInformationParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_RoutingRouteInformation_Enable, set_RoutingRouteInformation_Enable, NULL, NULL, BBFDM_BOTH},
+{"InterfaceSettingNumberOfEntries", &DMREAD, DMT_UNINT, get_RoutingRouteInformation_InterfaceSettingNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Routing.RouteInformation.InterfaceSetting.{i}. *** */
+DMLEAF tRoutingRouteInformationInterfaceSettingParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Status", &DMREAD, DMT_STRING, get_RoutingRouteInformationInterfaceSetting_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMREAD, DMT_STRING, get_RoutingRouteInformationInterfaceSetting_Interface, NULL, NULL, NULL, BBFDM_BOTH},
+{"SourceRouter", &DMREAD, DMT_STRING, get_RoutingRouteInformationInterfaceSetting_SourceRouter, NULL, NULL, NULL, BBFDM_BOTH},
+{"RouteLifetime", &DMREAD, DMT_TIME, get_RoutingRouteInformationInterfaceSetting_RouteLifetime, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/********************************
+ * init function
+ ********************************/
+inline int init_args_ipv4forward(struct routingfwdargs *args, struct uci_section *s, char *permission, int type)
+{
+	args->permission = permission;
+	args->routefwdsection = s;
+	args->type = type;
+	return 0;
+}
+
+inline int init_args_ipv6forward(struct routingfwdargs *args, struct uci_section *s, char *permission, int type)
+{
+	args->permission = permission;
+	args->routefwdsection = s;
+	args->type = type;
+	return 0;
+}
+
+/************************************************************************************* 
+**** function related to get_object_router_ipv4forwarding ****
+**************************************************************************************/
+static bool is_proc_route_in_config(struct proc_routing *proute)
+{
+	struct uci_section *s;
+	char *mask, *target, *gateway, *device;
+
+	uci_foreach_option_eq("network", "route", "target", proute->destination, s) {
+		dmuci_get_value_by_section_string(s, "netmask", &mask);
+		if (mask[0] == '\0' || strcmp(proute->mask, mask) == 0)
+			return true;
+	}
+	uci_foreach_option_eq("network", "route_disabled", "target", proute->destination, s) {
+		dmuci_get_value_by_section_string(s, "netmask", &mask);
+		if (mask[0] == '\0' || strcmp(proute->mask, mask) == 0)
+			return true;
+	}
+	uci_path_foreach_sections(icwmpd, "dmmap_route_forwarding", "route_dynamic", s) {
+		dmuci_get_value_by_section_string(s, "target", &target);
+		dmuci_get_value_by_section_string(s, "gateway", &gateway);
+		dmuci_get_value_by_section_string(s, "device", &device);
+		if (strcmp(target, proute->destination) == 0 && strcmp(gateway, proute->gateway) == 0 && strcmp(device, proute->iface) == 0) {
+			return true;
+		}
+	}
+	return false;
+}
+
+static unsigned char is_proc_route6_in_config(char *ciface, char *cip, char *cgw)
+{
+	struct uci_section *s = NULL;
+	char *ip, *gw, *v;
+	json_object *jobj;
+
+	uci_foreach_sections("network", "route6", s) {
+		dmuci_get_value_by_section_string(s, "target", &ip);
+		ip = (*ip) ? ip : "::/0";
+		dmuci_get_value_by_section_string(s, "gateway", &gw);
+		gw = (*gw) ? gw : "::";
+		dmuci_get_value_by_section_string(s, "interface", &v);
+		dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", v, String}}, 1, &jobj);
+		v = dmjson_get_value(jobj, 1, "device");
+		if (((*v != '\0' && strcmp(ciface, v) == 0) || ((*gw != ':' || *(gw+1) != ':') && strcmp(cgw, gw) == 0)) && strcmp(cip, ip) == 0) {
+			return 1;
+		}
+	}
+	uci_path_foreach_sections(icwmpd, "dmmap_route_forwarding", "route6_dynamic", s) {
+		dmuci_get_value_by_section_string(s, "target", &ip);
+		dmuci_get_value_by_section_string(s, "gateway", &gw);
+		dmuci_get_value_by_section_string(s, "device", &v);
+		if (((*v != '\0' && strcmp(ciface, v) == 0) || ((*gw != ':' || *(gw+1) != ':') && strcmp(cgw, gw) == 0)) && strcmp(cip, ip) == 0) {
+			return 1;
+		}
+	}
+	return 0;
+}
+
+static bool is_cfg_route_active(struct uci_section *s)
+{
+	FILE *fp;
+	char line[MAX_PROC_ROUTING];
+	struct proc_routing proute;
+	char *dest, *mask;
+
+	dmuci_get_value_by_section_string(s, "target", &dest);
+	dmuci_get_value_by_section_string(s, "netmask", &mask);
+
+	fp = fopen(ROUTING_FILE, "r");
+	if ( fp != NULL)
+	{
+		fgets(line, MAX_PROC_ROUTING, fp);
+		while (fgets(line, MAX_PROC_ROUTING, fp) != NULL )
+		{
+			if (line[0] == '\n')
+				continue;
+			parse_proc_route_line(line, &proute);
+			if (strcmp(dest, proute.destination) == 0 &&
+				(mask[0] == '\0' || strcmp(mask, proute.mask) == 0)) {
+				fclose(fp) ;
+				return true;
+			}
+		}
+		fclose(fp) ;
+	}
+	return false;
+}
+
+static int get_forwarding_last_inst()
+{
+	char *rinst = NULL, *drinst = NULL, *dsinst = NULL, *tmp;
+	int r = 0, dr = 0, ds = 0, max;
+	struct uci_section *s;
+
+	uci_path_foreach_sections(icwmpd, "dmmap_route_forwarding", "route", s) {
+		dmuci_get_value_by_section_string(s, "routeinstance", &tmp);
+		if (tmp[0] == '\0')
+			break;
+		rinst = tmp;
+	}
+	uci_path_foreach_sections(icwmpd, "dmmap_route_forwarding", "route_disabled", s) {
+		dmuci_get_value_by_section_string(s, "routeinstance", &tmp);
+		if (tmp[0] == '\0')
+			break;
+		dsinst = tmp;
+	}
+	uci_path_foreach_sections(icwmpd, "dmmap_route_forwarding", "route_dynamic", s) {
+		dmuci_get_value_by_section_string(s, "routeinstance", &tmp);
+		if (tmp[0] == '\0')
+			break;
+		drinst = tmp;
+	}
+	if (rinst) r = atoi(rinst);
+	if (dsinst) ds = atoi(dsinst);
+	if (drinst) dr = atoi(drinst);
+	max = (r>ds&&r>dr?r:ds>dr?ds:dr);
+	return max;
+}
+
+static char *forwarding_update_instance_alias_icwmpd(int action, char **last_inst, void *argv[])
+{
+	char *instance, *alias;
+	char buf[8] = {0};
+
+	struct uci_section *s = (struct uci_section *) argv[0];
+	char *inst_opt = (char *) argv[1];
+	char *alias_opt = (char *) argv[2];
+	bool *find_max = (bool *) argv[3];
+
+	dmuci_get_value_by_section_string(s, inst_opt, &instance);
+	if (instance[0] == '\0') {
+		if (*find_max) {
+			int m = get_forwarding_last_inst();
+			sprintf(buf, "%d", m+1);
+			*find_max = false;
+		}
+		else if (last_inst == NULL) {
+			sprintf(buf, "%d", 1);
+		}
+		else {
+			sprintf(buf, "%d", atoi(*last_inst)+1);
+		}
+		instance = DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, inst_opt, buf);
+	}
+	*last_inst = instance;
+	if (action == INSTANCE_MODE_ALIAS) {
+		dmuci_get_value_by_section_string(s, alias_opt, &alias);
+		if (alias[0] == '\0') {
+			sprintf(buf, "cpe-%s", instance);
+			alias = DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, alias_opt, buf);
+		}
+		sprintf(buf, "[%s]", alias);
+		instance = dmstrdup(buf);
+	}
+	return instance;
+}
+
+static int get_forwarding6_last_inst()
+{
+	char *rinst = NULL, *drinst = NULL, *tmp;
+	int r = 0, dr = 0, max;
+	struct uci_section *s;
+
+	uci_path_foreach_sections(icwmpd, "dmmap_route_forwarding", "route6", s) {
+		dmuci_get_value_by_section_string(s, "route6instance", &tmp);
+		if (tmp[0] == '\0')
+			break;
+		rinst = tmp;
+	}
+	uci_path_foreach_sections(icwmpd, "dmmap_route_forwarding", "route6_dynamic", s) {
+		dmuci_get_value_by_section_string(s, "route6instance", &tmp);
+		if (tmp[0] == '\0')
+			break;
+		drinst = tmp;
+	}
+	if (rinst) r = atoi(rinst);
+	if (drinst) dr = atoi(drinst);
+	max = r>dr?r:dr;
+	return max;
+}
+
+static char *forwarding6_update_instance_alias_icwmpd(int action, char **last_inst, void *argv[])
+{
+	char *instance, *alias;
+	char buf[8] = {0};
+
+	struct uci_section *s = (struct uci_section *) argv[0];
+	char *inst_opt = (char *) argv[1];
+	char *alias_opt = (char *) argv[2];
+	bool *find_max = (bool *) argv[3];
+
+	dmuci_get_value_by_section_string(s, inst_opt, &instance);
+	if (instance[0] == '\0') {
+		if (*find_max) {
+			int m = get_forwarding6_last_inst();
+			sprintf(buf, "%d", m+1);
+			*find_max = false;
+		}
+		else if (last_inst == NULL) {
+			sprintf(buf, "%d", 1);
+		}
+		else {
+			sprintf(buf, "%d", atoi(*last_inst)+1);
+		}
+		instance = DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, inst_opt, buf);
+	}
+	*last_inst = instance;
+	if (action == INSTANCE_MODE_ALIAS) {
+		dmuci_get_value_by_section_string(s, alias_opt, &alias);
+		if (alias[0] == '\0') {
+			sprintf(buf, "cpe-%s", instance);
+			alias = DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, alias_opt, buf);
+		}
+		sprintf(buf, "[%s]", alias);
+		instance = dmstrdup(buf);
+	}
+	return instance;
+}
+
+static int dmmap_synchronizeRoutingRouterIPv4Forwarding(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL, *stmp;
+	struct proc_routing proute = {0};
+	json_object *jobj;
+	FILE* fp = NULL;
+	char *target, *iface, *name, *instance, *str, line[MAX_PROC_ROUTING];
+	int found, last_inst;
+
+	check_create_dmmap_package("dmmap_route_forwarding");
+	uci_path_foreach_sections_safe(icwmpd, "dmmap_route_forwarding", "route_dynamic", stmp, s) {
+		dmuci_get_value_by_section_string(s, "target", &target);
+		dmuci_get_value_by_section_string(s, "device", &iface);
+		found = 0;
+		fp = fopen(ROUTING_FILE, "r");
+		if ( fp != NULL)
+		{
+			fgets(line, MAX_PROC_ROUTING, fp);
+			while (fgets(line, MAX_PROC_ROUTING, fp) != NULL )
+			{
+				if (line[0] == '\n')
+					continue;
+				parse_proc_route_line(line, &proute);
+				if ((strcmp(iface, proute.iface) == 0) && strcmp(target, proute.destination) == 0) {
+					found = 1;
+					break;
+				}
+			}
+			if (!found)
+				dmuci_delete_by_section(s, NULL, NULL);
+			fclose(fp);
+		}
+	}
+
+	fp = fopen(ROUTING_FILE, "r");
+	if ( fp != NULL) {
+		fgets(line, MAX_PROC_ROUTING, fp);
+		while (fgets(line, MAX_PROC_ROUTING, fp) != NULL )
+		{
+			if (line[0] == '\n')
+				continue;
+			parse_proc_route_line(line, &proute);
+			if (is_proc_route_in_config(&proute))
+				continue;
+			iface = "";
+			uci_foreach_sections("network", "interface", s) {
+				dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(s), String}}, 1, &jobj);
+				str = dmjson_get_value(jobj, 1, "device");
+				if (strcmp(str, proute.iface) == 0) {
+					iface = section_name(s);
+					break;
+				}
+			}
+			last_inst = get_forwarding_last_inst();
+			dmasprintf(&instance, "%d", last_inst+1);
+			DMUCI_ADD_SECTION(icwmpd, "dmmap_route_forwarding", "route_dynamic", &s, &name);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "target", proute.destination);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "netmask", proute.mask);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "metric", proute.metric);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "gateway", proute.gateway);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "device", proute.iface);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "interface", iface);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "routeinstance", instance);
+			dmfree(instance);
+		}
+		fclose(fp);
+	}
+	return 0;
+}
+
+static int dmmap_synchronizeRoutingRouterIPv6Forwarding(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL, *stmp;
+	char buf[512], dev[32], ipstr[INET6_ADDRSTRLEN + 8], gwstr[INET6_ADDRSTRLEN + 8];
+	unsigned int ip[4], gw[4];
+	unsigned int flags, refcnt, use, metric, prefix;
+	char *iface, *str, *target, *name, *instance;
+	json_object *jobj;
+	FILE* fp = NULL;
+	int found, last_inst;
+
+	check_create_dmmap_package("dmmap_route_forwarding");
+	uci_path_foreach_sections_safe(icwmpd, "dmmap_route_forwarding", "route6_dynamic", stmp, s) {
+		dmuci_get_value_by_section_string(s, "target", &target);
+		dmuci_get_value_by_section_string(s, "device", &iface);
+		fp = fopen(PROC_ROUTE6, "r");
+		if (fp == NULL)
+			return 0;
+
+		found = 0;
+		while (fgets(buf, 512, fp) != NULL) {
+			if (*buf == '\n' || *buf == '\0')
+				continue;
+			sscanf(buf, "%8x%8x%8x%8x %x %*s %*s %8x%8x%8x%8x %x %x %x %x %s", &ip[0], &ip[1], &ip[2], &ip[3],
+					&prefix, &gw[0], &gw[1], &gw[2], &gw[3], &metric, &refcnt, &use, &flags, dev);
+			if (strcmp(dev, "lo") == 0)
+				continue;
+			ip[0] = htonl(ip[0]);
+			ip[1] = htonl(ip[1]);
+			ip[2] = htonl(ip[2]);
+			ip[3] = htonl(ip[3]);
+			inet_ntop(AF_INET6, ip, buf, INET6_ADDRSTRLEN);
+			sprintf(ipstr, "%s/%u", buf, prefix);
+			if (strcmp(iface, dev) == 0 && strcmp(ipstr, target) == 0) {
+				found = 1;
+				break;
+			}
+
+		}
+		if (!found)
+			dmuci_delete_by_section(s, NULL, NULL);
+		fclose(fp);
+	}
+
+	fp = fopen(PROC_ROUTE6, "r");
+	if (fp == NULL)
+		return 0;
+
+	while (fgets(buf , 512 , fp) != NULL) {
+		if (*buf == '\n' || *buf == '\0')
+			continue;
+		sscanf(buf, "%8x%8x%8x%8x %x %*s %*s %8x%8x%8x%8x %x %x %x %x %s", &ip[0], &ip[1], &ip[2], &ip[3],
+				&prefix, &gw[0], &gw[1], &gw[2], &gw[3], &metric, &refcnt, &use, &flags, dev);
+		if (strcmp(dev, "lo") == 0)
+			continue;
+		ip[0] = htonl(ip[0]);
+		ip[1] = htonl(ip[1]);
+		ip[2] = htonl(ip[2]);
+		ip[3] = htonl(ip[3]);
+		gw[0] = htonl(gw[0]);
+		gw[1] = htonl(gw[1]);
+		gw[2] = htonl(gw[2]);
+		gw[3] = htonl(gw[3]);
+		inet_ntop(AF_INET6, ip, buf, INET6_ADDRSTRLEN);
+		sprintf(ipstr, "%s/%u", buf, prefix);
+		inet_ntop(AF_INET6, gw, gwstr, INET6_ADDRSTRLEN);
+		if (is_proc_route6_in_config(dev, ipstr, gwstr))
+			continue;
+		iface = "";
+		uci_foreach_sections("network", "interface", s) {
+			dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(s), String}}, 1, &jobj);
+			str = dmjson_get_value(jobj, 1, "device");
+			if (strcmp(str, dev) == 0) {
+				iface = section_name(s);
+				break;
+			}
+		}
+		last_inst = get_forwarding6_last_inst();
+		dmasprintf(&instance, "%d", last_inst+1);
+		DMUCI_ADD_SECTION(icwmpd, "dmmap_route_forwarding", "route6_dynamic", &s, &name);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "target", ipstr);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "gateway", gwstr);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "interface", iface);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "device", dev);
+		sprintf(buf, "%u", metric);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "metric", buf);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "route6instance", instance);
+		dmfree(instance);
+	}
+	fclose(fp);
+	return 0;
+}
+
+/*************************************************************
+ * GET & SET PARAM
+/*************************************************************/
+int get_router_nbr_entry(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int get_RoutingRouter_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int set_RoutingRouter_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_RoutingRouter_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "Enabled";
+	return 0;
+}
+
+/*#Device.Routing.Router.{i}.IPv4ForwardingNumberOfEntries!UCI:network/route/*/
+int get_RoutingRouter_IPv4ForwardingNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	int cnt = 0;
+
+	uci_foreach_sections("network", "route", s) {
+		cnt++;
+	}
+	uci_foreach_sections("network", "route_disabled", s) {
+		cnt++;
+	}
+	dmmap_synchronizeRoutingRouterIPv4Forwarding(ctx, NULL, NULL, NULL);
+	uci_path_foreach_sections(icwmpd, "dmmap_route_forwarding", "route_dynamic", s) {
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt); // MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+/*#Device.Routing.Router.{i}.IPv6ForwardingNumberOfEntries!UCI:network/route6/*/
+int get_RoutingRouter_IPv6ForwardingNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	int cnt = 0;
+
+	uci_foreach_sections("network", "route6", s) {
+		cnt++;
+	}
+	dmmap_synchronizeRoutingRouterIPv6Forwarding(ctx, NULL, NULL, NULL);
+	uci_path_foreach_sections(icwmpd, "dmmap_route_forwarding", "route6_dynamic", s) {
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt); // MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+int get_router_ipv4forwarding_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	if(routeargs->type == ROUTE_DISABLED)
+		*value = "0";
+	else
+		*value = "1";
+	return 0;
+}
+
+int set_router_ipv4forwarding_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b) {
+				if (routeargs->type == ROUTE_STATIC)
+					return 0;
+				dmuci_set_value_by_section(routeargs->routefwdsection, NULL, "route");
+			}
+			else {
+				if (routeargs->type == ROUTE_DISABLED)
+					return 0;
+				dmuci_set_value_by_section(routeargs->routefwdsection, NULL, "route_disabled");
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_router_ipv4forwarding_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	if(routeargs->type == ROUTE_DISABLED) {
+		*value = "Disabled";
+	} else {
+		if (is_cfg_route_active(routeargs->routefwdsection))
+			*value = "Enabled";
+		else
+			*value = "Error";
+	}
+	return 0;
+}
+
+/*#Device.Routing.Router.{i}.IPv4Forwarding.{i}.DestIPAddress!UCI:network/route,@i-1/target*/
+int get_router_ipv4forwarding_destip(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	if (routeargs->routefwdsection != NULL)
+		dmuci_get_value_by_section_string(routeargs->routefwdsection, "target", value);
+	if ((*value)[0] == '\0')
+		*value = "0.0.0.0";
+	return 0;
+}
+
+int set_router_ipv4forwarding_destip(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(routeargs->routefwdsection, "target", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Routing.Router.{i}.IPv4Forwarding.{i}.DestSubnetMask!UCI:network/route,@i-1/netmask*/
+int get_router_ipv4forwarding_destmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	if (routeargs->routefwdsection != NULL)
+		dmuci_get_value_by_section_string(routeargs->routefwdsection, "netmask", value);
+	if ((*value)[0] == '\0')
+		*value = "255.255.255.255";
+	return 0;
+}
+
+int set_router_ipv4forwarding_destmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(routeargs->routefwdsection, "netmask", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_router_ipv4forwarding_static_route(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	if (routeargs->type != ROUTE_DYNAMIC)
+		*value = "1";
+	else
+		*value = "0";
+
+	return 0;
+}
+
+int get_router_ipv4forwarding_forwarding_policy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "-1";
+	return 0;
+}
+
+int get_router_ipv4forwarding_origin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	if (routeargs->type != ROUTE_DYNAMIC)
+		*value = "Static";
+	return 0;
+}
+
+/*#Device.Routing.Router.{i}.IPv4Forwarding.{i}.GatewayIPAddress!UCI:network/route,@i-1/gateway*/
+int get_router_ipv4forwarding_gatewayip(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	if (routeargs->routefwdsection != NULL)
+		dmuci_get_value_by_section_string(routeargs->routefwdsection, "gateway", value);
+	if ((*value)[0] == '\0')
+		*value = "0.0.0.0";
+	return 0;
+}
+
+int set_router_ipv4forwarding_gatewayip(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(routeargs->routefwdsection, "gateway", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_router_ipv4forwarding_interface_linker_parameter(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+	char *linker;
+
+	if (routeargs->routefwdsection != NULL)
+		dmuci_get_value_by_section_string(routeargs->routefwdsection, "interface", &linker);
+	if (linker[0] != '\0') {
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
+		if (*value == NULL)
+			*value = "";
+	}
+	return 0;
+}
+
+int set_router_ipv4forwarding_interface_linker_parameter(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *linker;
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			adm_entry_get_linker_value(ctx, value, &linker);
+			if (linker) {
+				dmuci_set_value_by_section(routeargs->routefwdsection, "interface", linker);
+				dmfree(linker);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.Routing.Router.{i}.IPv4Forwarding.{i}.ForwardingMetric!UCI:network/route,@i-1/metric*/
+int get_router_ipv4forwarding_metric(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	if (routeargs->routefwdsection != NULL)
+		dmuci_get_value_by_section_string(routeargs->routefwdsection, "metric", value);
+	if ((*value)[0] == '\0')
+		*value = "0";
+	return 0;
+}
+
+int set_router_ipv4forwarding_metric(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(routeargs->routefwdsection, "metric", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_RoutingRouterIPv6Forwarding_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int set_RoutingRouterIPv6Forwarding_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_RoutingRouterIPv6Forwarding_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "Enabled";
+	return 0;
+}
+
+/*#Device.Routing.Router.{i}.IPv6Forwarding.{i}.DestIPPrefix!UCI:network/route,@i-1/target*/
+int get_RoutingRouterIPv6Forwarding_DestIPPrefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	if (routeargs->routefwdsection != NULL)
+		dmuci_get_value_by_section_string(routeargs->routefwdsection, "target", value);
+	if ((*value)[0] == '\0')
+		*value = "::";
+	return 0;
+}
+
+int set_RoutingRouterIPv6Forwarding_DestIPPrefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(routeargs->routefwdsection, "target", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_RoutingRouterIPv6Forwarding_ForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "-1";
+	return 0;
+}
+
+int set_RoutingRouterIPv6Forwarding_ForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+/*#Device.Routing.Router.{i}.IPv6Forwarding.{i}.NextHop!UCI:network/route,@i-1/gateway*/
+int get_RoutingRouterIPv6Forwarding_NextHop(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	if (routeargs->routefwdsection != NULL)
+		dmuci_get_value_by_section_string(routeargs->routefwdsection, "gateway", value);
+	if ((*value)[0] == '\0')
+		*value = "::";
+	return 0;
+}
+
+int set_RoutingRouterIPv6Forwarding_NextHop(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(routeargs->routefwdsection, "gateway", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_RoutingRouterIPv6Forwarding_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+	char *linker;
+
+	if (routeargs->routefwdsection != NULL)
+		dmuci_get_value_by_section_string(routeargs->routefwdsection, "interface", &linker);
+	if (linker[0] != '\0') {
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
+		if (*value == NULL)
+			*value = "";
+	}
+	return 0;
+}
+
+int set_RoutingRouterIPv6Forwarding_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *linker;
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			adm_entry_get_linker_value(ctx, value, &linker);
+			if (linker) {
+				dmuci_set_value_by_section(routeargs->routefwdsection, "interface", linker);
+				dmfree(linker);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_RoutingRouterIPv6Forwarding_Origin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	if (routeargs->type != ROUTE_DYNAMIC)
+		*value = "Static";
+	return 0;
+}
+
+/*#Device.Routing.Router.{i}.IPv6Forwarding.{i}.ForwardingMetric!UCI:network/route,@i-1/metric*/
+int get_RoutingRouterIPv6Forwarding_ForwardingMetric(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	if (routeargs->routefwdsection != NULL)
+		dmuci_get_value_by_section_string(routeargs->routefwdsection, "metric", value);
+	if ((*value)[0] == '\0')
+		*value = "0";
+	return 0;
+}
+
+int set_RoutingRouterIPv6Forwarding_ForwardingMetric(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(routeargs->routefwdsection, "metric", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_RoutingRouterIPv6Forwarding_ExpirationTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "9999-12-31T23:59:59Z";
+	return 0;
+}
+
+int get_RoutingRouteInformation_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+int set_RoutingRouteInformation_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_RoutingRouteInformation_InterfaceSettingNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	json_object *res, *jobj, *route_obj;
+	char *proto, *ip6addr;
+	int entries = 0;
+
+	uci_foreach_sections("network", "interface", s) {
+		dmuci_get_value_by_section_string(s, "proto", &proto);
+		dmuci_get_value_by_section_string(s, "ip6addr", &ip6addr);
+		if(strcmp(proto, "dhcpv6")==0 || ip6addr[0] != '\0') {
+			dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(s), String}}, 1, &res);
+			while (res) {
+				route_obj = dmjson_select_obj_in_array_idx(res, entries, 1, "route");
+				if(route_obj) {
+					entries++;
+				}
+				else
+					break;
+			}
+		}
+	}
+	dmasprintf(value, "%d", entries);
+	return 0;
+}
+
+int get_RoutingRouteInformationInterfaceSetting_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	char *target, *mask, *nexthop, *gateway, *ip_target, buf[64];
+
+	*value = "NoForwardingEntry";
+	target = dmjson_get_value((struct json_object *)data, 1, "target");
+	mask = dmjson_get_value((struct json_object *)data, 1, "mask");
+	sprintf(buf, "%s/%s", target, mask);
+	nexthop = dmjson_get_value((struct json_object *)data, 1, "nexthop");
+	uci_foreach_sections("network", "route6", s) {
+		dmuci_get_value_by_section_string(s, "target", &ip_target);
+		dmuci_get_value_by_section_string(s, "gateway", &gateway);
+		if(strcmp(ip_target, buf) == 0 && strcmp(nexthop, gateway) == 0) {
+			*value = "ForwardingEntryCreated";
+			return 0;
+		}
+	}
+	return 0;
+}
+
+int get_RoutingRouteInformationInterfaceSetting_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	char buf[512], dev[32], ipstr[INET6_ADDRSTRLEN + 8], gwstr[INET6_ADDRSTRLEN + 8];
+	unsigned int ip[4], gw[4], flags, refcnt, use, metric, prefix;
+	char *linker, *source, *nexthop, *str, *iface = "";
+	json_object *jobj;
+	FILE* fp = NULL;
+
+	source = dmjson_get_value((struct json_object *)data, 1, "source");
+	nexthop = dmjson_get_value((struct json_object *)data, 1, "nexthop");
+	fp = fopen(PROC_ROUTE6, "r");
+	if (fp == NULL)
+		return 0;
+
+	while (fgets(buf , 512 , fp) != NULL) {
+		if (*buf == '\n' || *buf == '\0')
+			continue;
+		sscanf(buf, "%8x%8x%8x%8x %x %*s %*s %8x%8x%8x%8x %x %x %x %x %s", &ip[0], &ip[1], &ip[2], &ip[3],
+				&prefix, &gw[0], &gw[1], &gw[2], &gw[3], &metric, &refcnt, &use, &flags, dev);
+		if (strcmp(dev, "lo") == 0)
+			continue;
+		ip[0] = htonl(ip[0]);
+		ip[1] = htonl(ip[1]);
+		ip[2] = htonl(ip[2]);
+		ip[3] = htonl(ip[3]);
+		gw[0] = htonl(gw[0]);
+		gw[1] = htonl(gw[1]);
+		gw[2] = htonl(gw[2]);
+		gw[3] = htonl(gw[3]);
+		inet_ntop(AF_INET6, ip, buf, INET6_ADDRSTRLEN);
+		sprintf(ipstr, "%s/%u", buf, prefix);
+		inet_ntop(AF_INET6, gw, gwstr, INET6_ADDRSTRLEN);
+		if((strcmp(source, ipstr) == 0) && (strcmp(nexthop, gwstr) == 0))
+			break;
+	}
+	fclose(fp);
+	uci_foreach_sections("network", "interface", s) {
+		dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(s), String}}, 1, &jobj);
+		str = dmjson_get_value(jobj, 1, "device");
+		if (strcmp(str, dev) == 0) {
+			iface = section_name(s);
+			break;
+		}
+	}
+	if (iface[0] != '\0') {
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), iface, value);
+		if (*value == NULL)
+			*value = "";
+	}
+	return 0;
+}
+
+int get_RoutingRouteInformationInterfaceSetting_SourceRouter(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = dmjson_get_value((struct json_object *)data, 1, "source");
+	return 0;
+}
+
+int get_RoutingRouteInformationInterfaceSetting_RouteLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char local_time[32] = {0};
+	char *valid = dmjson_get_value((struct json_object *)data, 1, "valid");
+	*value = "0001-01-01T00:00:00Z";
+	if (get_shift_time_time(atoi(valid), local_time, sizeof(local_time)) == -1)
+		return 0;
+	*value = dmstrdup(local_time);
+	return 0;
+}
+
+/*************************************************************
+ * SET AND GET ALIAS FOR ROUTER OBJ
+/*************************************************************/
+int get_RoutingRouter_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "router_alias", value);
+	return 0;
+}
+
+int set_RoutingRouter_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "router_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_router_ipv4forwarding_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+	*value = "";
+
+	if(((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC)
+		dmmap_section= ((struct routingfwdargs *)data)->routefwdsection;
+	else if (((struct routingfwdargs *)data)->type == ROUTE_STATIC)
+		get_dmmap_section_of_config_section("dmmap_route_forwarding", "route", section_name(((struct routingfwdargs *)data)->routefwdsection), &dmmap_section);
+	else
+		get_dmmap_section_of_config_section("dmmap_route_forwarding", "route_disabled", section_name(((struct routingfwdargs *)data)->routefwdsection), &dmmap_section);
+
+	dmuci_get_value_by_section_string(dmmap_section, "routealias", value);
+	return 0;
+}
+
+int set_router_ipv4forwarding_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	if(((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC)
+		dmmap_section= ((struct routingfwdargs *)data)->routefwdsection;
+	else if (((struct routingfwdargs *)data)->type == ROUTE_STATIC)
+		get_dmmap_section_of_config_section("dmmap_route_forwarding", "route", section_name(((struct routingfwdargs *)data)->routefwdsection), &dmmap_section);
+	else
+		get_dmmap_section_of_config_section("dmmap_route_forwarding", "route_disabled", section_name(((struct routingfwdargs *)data)->routefwdsection), &dmmap_section);
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, "routealias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_RoutingRouterIPv6Forwarding_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+	*value = "";
+	if(((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC)
+		dmmap_section= ((struct routingfwdargs *)data)->routefwdsection;
+	else
+		get_dmmap_section_of_config_section("dmmap_route_forwarding", "route6", section_name(((struct routingfwdargs *)data)->routefwdsection), &dmmap_section);
+
+	dmuci_get_value_by_section_string(dmmap_section, "route6alias", value);
+	return 0;
+}
+
+int set_RoutingRouterIPv6Forwarding_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	if(((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC)
+		dmmap_section= ((struct routingfwdargs *)data)->routefwdsection;
+	else
+		get_dmmap_section_of_config_section("dmmap_route_forwarding", "route6", section_name(((struct routingfwdargs *)data)->routefwdsection), &dmmap_section);
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, "route6alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+char *get_routing_perm(char *refparam, struct dmctx *dmctx, void *data, char *instance)
+{
+	return ((struct routingfwdargs *)data)->permission;
+}
+
+struct dm_permession_s DMRouting = {"0", &get_routing_perm};
+
+/*************************************************************
+ * ADD DEL OBJ
+/*************************************************************/
+int add_ipv4forwarding(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{
+	char *value, *v, instance[8];
+	struct uci_section *s = NULL;
+	struct uci_section *dmmap_route = NULL;
+	int last_inst;
+
+	check_create_dmmap_package("dmmap_route_forwarding");
+	last_inst = get_forwarding_last_inst();
+	sprintf(instance, "%d", last_inst);
+	dmuci_add_section_and_rename("network", "route", &s, &value);
+	dmuci_set_value_by_section(s, "metric", "0");
+	dmuci_set_value_by_section(s, "interface", "lan");
+
+	dmuci_add_section_icwmpd("dmmap_route_forwarding", "route", &dmmap_route, &v);
+	dmuci_set_value_by_section(dmmap_route, "section_name", section_name(s));
+	*instancepara = update_instance_icwmpd(dmmap_route, instance, "routeinstance");
+	return 0;
+}
+
+int delete_ipv4forwarding(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+	struct uci_section *dmmap_section= NULL;
+
+	switch (del_action) {
+		case DEL_INST:
+			get_dmmap_section_of_config_section("dmmap_route_forwarding", "route", section_name(routeargs->routefwdsection), &dmmap_section);
+			if(dmmap_section != NULL) {
+				dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(routeargs->routefwdsection, NULL, NULL);
+				break;
+			}
+			get_dmmap_section_of_config_section("dmmap_route_forwarding", "route_disabled", section_name(routeargs->routefwdsection), &dmmap_section);
+			if(dmmap_section != NULL) {
+				dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(routeargs->routefwdsection, NULL, NULL);
+			}
+			break;
+		case DEL_ALL:
+			return FAULT_9005;
+		}
+	return 0;
+}
+
+int add_ipv6Forwarding(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{
+	char *value, *v, instance[8];
+	struct uci_section *s = NULL;
+	struct uci_section *dmmap_route = NULL;
+	int last_inst;
+
+	check_create_dmmap_package("dmmap_route_forwarding");
+	last_inst = get_forwarding6_last_inst();
+	sprintf(instance, "%d", last_inst);
+	dmuci_add_section_and_rename("network", "route6", &s, &value);
+	dmuci_set_value_by_section(s, "metric", "0");
+	dmuci_set_value_by_section(s, "interface", "lan");
+
+	dmuci_add_section_icwmpd("dmmap_route_forwarding", "route6", &dmmap_route, &v);
+	dmuci_set_value_by_section(dmmap_route, "section_name", section_name(s));
+	*instancepara = update_instance_icwmpd(dmmap_route, instance, "route6instance");
+	return 0;
+}
+
+int delete_ipv6Forwarding(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct routingfwdargs *routeargs = (struct routingfwdargs *)data;
+	struct uci_section *dmmap_section= NULL;
+
+	switch (del_action) {
+		case DEL_INST:
+			get_dmmap_section_of_config_section("dmmap_route_forwarding", "route6", section_name(routeargs->routefwdsection), &dmmap_section);
+			if(dmmap_section != NULL) {
+				dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(routeargs->routefwdsection, NULL, NULL);
+			}
+			break;
+		case DEL_ALL:
+			return FAULT_9005;
+		}
+	return 0;
+}
+
+/*************************************************************
+ * SUB ENTRIES
+/*************************************************************/
+int browseRouterInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL;
+	char *r = NULL, *r_last = NULL;
+
+	update_section_list(DMMAP,"router", NULL, 1, NULL, NULL, NULL, NULL, NULL);
+	uci_path_foreach_sections(icwmpd, "dmmap", "router", s) {
+		r = handle_update_instance(1, dmctx, &r_last, update_instance_alias_icwmpd, 3, s, "router_instance", "router_alias");
+		DM_LINK_INST_OBJ(dmctx, parent_node, (void *)s, r);
+		break;
+	}
+	return 0;
+}
+
+/*#Device.Routing.Router.{i}.IPv4Forwarding.{i}.!UCI:network/route/dmmap_route_forwarding*/
+int browseIPv4ForwardingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *iroute = NULL, *iroute_last = NULL;
+	struct uci_section *s = NULL, *ss = NULL;
+	bool find_max = true;
+	struct routingfwdargs curr_routefwdargs = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("network", "route", "dmmap_route_forwarding", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		init_args_ipv4forward(&curr_routefwdargs, p->config_section, "1", ROUTE_STATIC);
+		iroute =  handle_update_instance(1, dmctx, &iroute_last, forwarding_update_instance_alias_icwmpd, 4, p->dmmap_section, "routeinstance", "routealias", &find_max);
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_routefwdargs, iroute) == DM_STOP)
+			goto end;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	synchronize_specific_config_sections_with_dmmap("network", "route_disabled", "dmmap_route_forwarding", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		init_args_ipv4forward(&curr_routefwdargs, p->config_section, "1", ROUTE_DISABLED);
+		iroute =  handle_update_instance(1, dmctx, &iroute_last, forwarding_update_instance_alias_icwmpd, 4, p->dmmap_section, "routeinstance", "routealias", &find_max);
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_routefwdargs, iroute) == DM_STOP)
+			goto end;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	dmmap_synchronizeRoutingRouterIPv4Forwarding(dmctx, NULL, NULL, NULL);
+	uci_path_foreach_sections(icwmpd, "dmmap_route_forwarding", "route_dynamic", ss) {
+		init_args_ipv4forward(&curr_routefwdargs, ss, "0", ROUTE_DYNAMIC);
+		iroute =  handle_update_instance(1, dmctx, &iroute_last, forwarding_update_instance_alias_icwmpd, 4, ss, "routeinstance", "routealias", &find_max);
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_routefwdargs, iroute) == DM_STOP)
+			goto end;
+	}
+end:
+	return 0;
+}
+
+/*#Device.Routing.Router.{i}.IPv6Forwarding.{i}.!UCI:network/route6/dmmap_route_forwarding*/
+int browseIPv6ForwardingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *iroute = NULL, *iroute_last = NULL;
+	struct uci_section *s = NULL, *ss = NULL;
+	bool find_max = true;
+	struct routingfwdargs curr_route6fwdargs = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("network", "route6", "dmmap_route_forwarding", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		init_args_ipv6forward(&curr_route6fwdargs, p->config_section, "1", ROUTE_STATIC);
+		iroute =  handle_update_instance(1, dmctx, &iroute_last, forwarding6_update_instance_alias_icwmpd, 4, p->dmmap_section, "route6instance", "route6alias", &find_max);
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_route6fwdargs, iroute) == DM_STOP)
+			goto end;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	dmmap_synchronizeRoutingRouterIPv6Forwarding(dmctx, NULL, NULL, NULL);
+	uci_path_foreach_sections(icwmpd, "dmmap_route_forwarding", "route6_dynamic", ss) {
+		init_args_ipv6forward(&curr_route6fwdargs, ss, "0", ROUTE_DYNAMIC);
+		iroute =  handle_update_instance(1, dmctx, &iroute_last, forwarding6_update_instance_alias_icwmpd, 4, ss, "route6instance", "route6alias", &find_max);
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_route6fwdargs, iroute) == DM_STOP)
+			goto end;
+	}
+end:
+	return 0;
+}
+
+int browseRoutingRouteInformationInterfaceSettingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s = NULL;
+	json_object *res, *jobj, *route_obj;
+	char *proto, *ip6addr, *idx, *idx_last = NULL;
+	int id = 0, entries = 0;
+
+	uci_foreach_sections("network", "interface", s) {
+		dmuci_get_value_by_section_string(s, "proto", &proto);
+		dmuci_get_value_by_section_string(s, "ip6addr", &ip6addr);
+		if(strcmp(proto, "dhcpv6")==0 || ip6addr[0] != '\0') {
+			dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", section_name(s), String}}, 1, &res);
+			while (res) {
+				route_obj = dmjson_select_obj_in_array_idx(res, entries, 1, "route");
+				if(route_obj) {
+					entries++;
+					idx = handle_update_instance(3, dmctx, &idx_last, update_instance_without_section, 1, ++id);
+					if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)route_obj, idx) == DM_STOP)
+						break;
+				}
+				else
+					break;
+			}
+		}
+	}
+	return 0;
+}
+
diff --git a/dmtree/tr181/routing.h b/dmtree/tr181/routing.h
new file mode 100644
index 0000000000000000000000000000000000000000..98e869c7d80fe7956f4fc1fa6746b76bee73d629
--- /dev/null
+++ b/dmtree/tr181/routing.h
@@ -0,0 +1,93 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2019 iopsys Software Solutions AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *	  Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#ifndef __ROUTING_H
+#define __ROUTING_H
+
+#define PROC_ROUTE6 "/proc/net/ipv6_route"
+extern struct dm_permession_s DMRouting;
+
+extern DMOBJ tRoutingObj[];
+extern DMLEAF tRoutingParams[];
+extern DMOBJ tRoutingRouterObj[];
+extern DMLEAF tRoutingRouterParams[];
+extern DMLEAF tRoutingRouterIPv4ForwardingParams[];
+extern DMLEAF tRoutingRouterIPv6ForwardingParams[];
+extern DMOBJ tRoutingRouteInformationObj[];
+extern DMLEAF tRoutingRouteInformationParams[];
+extern DMLEAF tRoutingRouteInformationInterfaceSettingParams[];
+
+int browseRouterInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseIPv4ForwardingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseIPv6ForwardingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseRoutingRouteInformationInterfaceSettingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int add_ipv4forwarding(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_ipv4forwarding(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int add_ipv6Forwarding(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delete_ipv6Forwarding(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_router_nbr_entry(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_RoutingRouter_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_RoutingRouter_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_RoutingRouter_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_RoutingRouter_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_RoutingRouter_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_RoutingRouter_IPv4ForwardingNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_RoutingRouter_IPv6ForwardingNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_router_ipv4forwarding_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_router_ipv4forwarding_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_router_ipv4forwarding_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_router_ipv4forwarding_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_router_ipv4forwarding_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_router_ipv4forwarding_destip(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_router_ipv4forwarding_destip(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_router_ipv4forwarding_destmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_router_ipv4forwarding_destmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_router_ipv4forwarding_static_route(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_router_ipv4forwarding_forwarding_policy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_router_ipv4forwarding_origin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_router_ipv4forwarding_gatewayip(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_router_ipv4forwarding_gatewayip(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_router_ipv4forwarding_interface_linker_parameter(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_router_ipv4forwarding_interface_linker_parameter(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_router_ipv4forwarding_metric(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_router_ipv4forwarding_metric(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+int get_RoutingRouterIPv6Forwarding_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_RoutingRouterIPv6Forwarding_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_RoutingRouterIPv6Forwarding_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_RoutingRouterIPv6Forwarding_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_RoutingRouterIPv6Forwarding_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_RoutingRouterIPv6Forwarding_DestIPPrefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_RoutingRouterIPv6Forwarding_DestIPPrefix(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_RoutingRouterIPv6Forwarding_ForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_RoutingRouterIPv6Forwarding_ForwardingPolicy(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_RoutingRouterIPv6Forwarding_NextHop(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_RoutingRouterIPv6Forwarding_NextHop(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_RoutingRouterIPv6Forwarding_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_RoutingRouterIPv6Forwarding_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_RoutingRouterIPv6Forwarding_Origin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_RoutingRouterIPv6Forwarding_ForwardingMetric(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_RoutingRouterIPv6Forwarding_ForwardingMetric(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_RoutingRouterIPv6Forwarding_ExpirationTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int get_RoutingRouteInformation_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_RoutingRouteInformation_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_RoutingRouteInformation_InterfaceSettingNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_RoutingRouteInformationInterfaceSetting_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_RoutingRouteInformationInterfaceSetting_Interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_RoutingRouteInformationInterfaceSetting_SourceRouter(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_RoutingRouteInformationInterfaceSetting_RouteLifetime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+#endif
diff --git a/dmtree/tr181/softwaremodules.c b/dmtree/tr181/softwaremodules.c
new file mode 100644
index 0000000000000000000000000000000000000000..8e8ac30bfa8ce1fea5bf6074adc4e576b7c28358
--- /dev/null
+++ b/dmtree/tr181/softwaremodules.c
@@ -0,0 +1,244 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2012-2014 PIVA SOFTWARE (www.pivasoftware.com)
+ *		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *		Author: Feten Besbes <feten.besbes@pivasoftware.com>
+ */
+
+#include <ctype.h>
+#include <uci.h>
+#include <stdio.h>
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "softwaremodules.h"
+
+/* *** Device.SoftwareModules. *** */
+DMOBJ tSoftwareModulesObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"DeploymentUnit", &DMREAD, NULL, NULL, NULL, browsesoftwaremodules_deploymentunitInst, NULL, NULL, NULL, tSoftwareModulesDeploymentUnitParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.SoftwareModules.DeploymentUnit.{i}. *** */
+DMLEAF tSoftwareModulesDeploymentUnitParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"UUID", &DMREAD, DMT_STRING, get_deploymentunit_uuid, NULL, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMREAD, DMT_STRING, get_deploymentunit_name, NULL, NULL, NULL, BBFDM_BOTH},
+{"Resolved", &DMREAD, DMT_BOOL, get_deploymentunit_resolved, NULL, NULL, NULL, BBFDM_BOTH},
+{"URL", &DMREAD, DMT_STRING, get_deploymentunit_url, NULL, NULL, NULL, BBFDM_BOTH},
+{"Vendor", &DMREAD, DMT_STRING, get_deploymentunit_vendor, NULL, NULL, NULL, BBFDM_BOTH},
+{"Version", &DMREAD, DMT_STRING, get_deploymentunit_version, NULL, NULL, NULL, BBFDM_BOTH},
+{"ExecutionEnvRef", &DMREAD, DMT_STRING, get_deploymentunit_execution_env_ref, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+int get_deploymentunit_uuid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *softsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(softsection, "uuid", value);
+	
+	return 0;
+}
+
+int get_deploymentunit_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *softsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(softsection, "name", value);
+	return 0;
+}
+
+int get_deploymentunit_resolved(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *softsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(softsection, "resolved", value);
+	return 0;
+}
+
+int get_deploymentunit_url(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *softsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(softsection, "url", value);
+	return 0;
+}
+
+int get_deploymentunit_vendor(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *softsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(softsection, "vendor", value);
+	return 0;
+}
+
+int get_deploymentunit_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *softsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(softsection, "version", value);
+	return 0;
+}
+
+int get_deploymentunit_execution_env_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *softsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(softsection, "execution_env_ref", value);
+	return 0;
+}
+
+char *add_softwaremodules_deploymentunit(char *uuid, char*url, char *username, char *password, char *name, char *version)
+{
+	char *value;
+	char *instance;
+	struct uci_section *deploymentsection = NULL;
+	char duname[16];
+	
+	uci_path_foreach_option_eq(icwmpd, "dmmap", "deploymentunit", "UUID", uuid, deploymentsection) {
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, deploymentsection, "URL", url);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd,deploymentsection, "URL", url);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd,deploymentsection, "Name", name);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd,deploymentsection, "Version", version);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd,deploymentsection, "username", username);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd,deploymentsection, "password", password);
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd,deploymentsection, "Resolved", "1");
+		dmuci_get_value_by_section_string(deploymentsection, "duinstance", &instance);
+		goto end;
+	}
+	instance = get_last_instance(DMMAP, "deploymentunit", "duinstance");
+	if (!instance)
+		sprintf(duname, "du%d", 0);
+	else
+		sprintf(duname, "du%s", instance);
+	DMUCI_SET_VALUE(icwmpd, "dmmap", duname, NULL, "deploymentunit");
+	DMUCI_SET_VALUE(icwmpd, "dmmap", duname, "UUID", uuid);
+	DMUCI_SET_VALUE(icwmpd, "dmmap", duname, "URL", url);
+	DMUCI_SET_VALUE(icwmpd, "dmmap", duname, "Name", name);
+	DMUCI_SET_VALUE(icwmpd, "dmmap", duname, "Version", version);
+	DMUCI_SET_VALUE(icwmpd, "dmmap", duname, "username", username);
+	DMUCI_SET_VALUE(icwmpd, "dmmap", duname, "password", password);
+	DMUCI_SET_VALUE(icwmpd, "dmmap", duname, "Resolved", "1");
+	instance = get_last_instance(DMMAP, "deploymentunit", "duinstance");
+	return instance;
+end:
+	return instance;
+}
+
+int update_softwaremodules_url(char *uuid, char *url)
+{
+	struct uci_section *s = NULL;
+	uci_path_foreach_option_eq(icwmpd, "dmmap", "deploymentunit", "UUID", uuid, s) {
+		DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "URL", url);
+		return 1;
+	}
+	return 0;
+}
+
+char *get_softwaremodules_uuid(char *url)
+{
+	char *uuid;
+	struct uci_section *s = NULL;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap", "deploymentunit", "url", url, s) {
+		dmuci_get_value_by_section_string(s, "UUID", &uuid);
+	
+		return uuid;
+	}
+	return "";
+}
+
+char *get_softwaremodules_url(char *uuid)
+{	
+	char *url;
+	struct uci_section *s = NULL;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap", "deploymentunit", "uuid", uuid, s) {
+		dmuci_get_value_by_section_string(s, "URL", &url);
+		return url;
+	}
+	return "";
+}
+
+char *get_softwaremodules_username(char *uuid)
+{	
+	char *url;
+	struct uci_section *s = NULL;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap", "deploymentunit", "uuid", uuid, s) {
+		dmuci_get_value_by_section_string(s, "username", &url);
+		return url;
+	}
+	return "";
+}
+
+char *get_softwaremodules_pass(char *uuid)
+{	
+	char *url;
+	struct uci_section *s = NULL;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap", "deploymentunit", "uuid", uuid, s) {
+		dmuci_get_value_by_section_string(s, "password", &url);
+		return url;
+	}
+	return "";
+}
+
+char *get_softwaremodules_instance(char *uuid)
+{	
+	char *url;
+	struct uci_section *s = NULL;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap", "deploymentunit", "uuid", uuid, s) {
+		dmuci_get_value_by_section_string(s, "duinstance", &url);
+		return url;
+	}
+	return "";
+}
+
+char *get_softwaremodules_name(char *uuid)
+{	
+	char *name;
+	struct uci_section *s = NULL;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap", "deploymentunit", "uuid", uuid, s) {
+		dmuci_get_value_by_section_string(s, "Name", &name);
+		return name;
+	}
+	return "";
+}
+
+char *get_softwaremodules_version(char *uuid)
+{	
+	char *version;
+	struct uci_section *s = NULL;
+
+	uci_path_foreach_option_eq(icwmpd, "dmmap", "deploymentunit", "uuid", uuid, s) {
+		dmuci_get_value_by_section_string(s, "Version", &version);
+		return version;
+	}
+	return "";
+}
+
+int browsesoftwaremodules_deploymentunitInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *idu = NULL, *idu_last = NULL;
+	char *permission = "1";
+	struct uci_section *s = NULL;
+
+	uci_path_foreach_sections(icwmpd, "dmmap", "deploymentunit", s) {
+		idu = handle_update_instance(1, dmctx, &idu_last, update_instance_alias_icwmpd, 3, s, "duinstance", "duinstance_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)s, idu) == DM_STOP)
+			break;
+	}
+	return 0;
+}
+
+
diff --git a/dmtree/tr181/softwaremodules.h b/dmtree/tr181/softwaremodules.h
new file mode 100644
index 0000000000000000000000000000000000000000..78a724e050857a291f91b4a78ca7757425bb4460
--- /dev/null
+++ b/dmtree/tr181/softwaremodules.h
@@ -0,0 +1,37 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2012-2014 PIVA SOFTWARE (www.pivasoftware.com)
+ *		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+ */
+
+#ifndef __SOFTWARE_MODULE_H
+#define __SOFTWARE_MODULE_H
+
+extern DMOBJ tSoftwareModulesObj[];
+extern DMLEAF tSoftwareModulesDeploymentUnitParams[];
+
+int browsesoftwaremodules_deploymentunitInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int update_softwaremodules_url(char *uuid, char *url);
+char *get_softwaremodules_uuid(char *url);
+char *get_softwaremodules_username(char *uuid);
+char *get_softwaremodules_pass(char *uuid);
+char *get_softwaremodules_instance(char *uuid);
+char *get_softwaremodules_version(char *uuid);
+char *add_softwaremodules_deploymentunit(char *uuid, char*url, char *username, char *password, char *name, char *version);
+char *get_softwaremodules_name(char *uuid);
+char *get_softwaremodules_url(char *uuid);
+
+int get_deploymentunit_uuid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_deploymentunit_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_deploymentunit_resolved(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_deploymentunit_url(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_deploymentunit_vendor(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_deploymentunit_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_deploymentunit_execution_env_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+#endif
diff --git a/dmtree/tr181/times.c b/dmtree/tr181/times.c
new file mode 100644
index 0000000000000000000000000000000000000000..16d48d763dc16b80f9df43a540f51e9bf3c49a01
--- /dev/null
+++ b/dmtree/tr181/times.c
@@ -0,0 +1,291 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmcwmp.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "dmentry.h"
+#include "times.h"
+
+/* *** Device.Time. *** */
+DMLEAF tTimeParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_time_enable, set_time_enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_time_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"NTPServer1", &DMWRITE, DMT_STRING, get_time_ntpserver1, set_time_ntpserver1, NULL, NULL, BBFDM_BOTH},
+{"NTPServer2", &DMWRITE, DMT_STRING, get_time_ntpserver2, set_time_ntpserver2, NULL, NULL, BBFDM_BOTH},
+{"NTPServer3", &DMWRITE, DMT_STRING, get_time_ntpserver3, set_time_ntpserver3, NULL, NULL, BBFDM_BOTH},
+{"NTPServer4", &DMWRITE, DMT_STRING, get_time_ntpserver4, set_time_ntpserver4, NULL, NULL, BBFDM_BOTH},
+{"NTPServer5", &DMWRITE, DMT_STRING, get_time_ntpserver5, set_time_ntpserver5, NULL, NULL, BBFDM_BOTH},
+{"CurrentLocalTime", &DMREAD, DMT_TIME, get_time_CurrentLocalTime, NULL, NULL, NULL, BBFDM_BOTH},
+{"LocalTimeZone", &DMWRITE, DMT_STRING, get_time_LocalTimeZone, set_time_LocalTimeZone, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"LocalTimeZoneOlson", &DMREAD, DMT_STRING, get_local_time_zone_olson, NULL, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"SourceInterface", &DMWRITE, DMT_STRING, get_time_source_interface, set_time_source_interface, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+int get_time_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *path = "/etc/rc.d/*ntpd";
+
+	if (check_file(path))
+		*value = "1";
+	else
+		*value = "0";
+	return 0;
+}
+
+int set_time_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	int check; 
+	pid_t pid;
+	
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b) {
+				DMCMD("/etc/rc.common", 2, "/etc/init.d/ntpd", "enable"); //TODO wait ubus command
+				pid = get_pid("ntpd");
+				if (pid < 0) {
+					DMCMD("/etc/rc.common", 2, "/etc/init.d/ntpd", "start"); //TODO wait ubus command
+				}
+			}
+			else {
+				DMCMD("/etc/rc.common", 2, "/etc/init.d/ntpd", "disable"); //TODO wait ubus command
+				pid = get_pid("ntpd");
+				if (pid > 0) {
+					DMCMD("/etc/rc.common", 2, "/etc/init.d/ntpd", "stop"); //TODO may be should be updated with ubus call uci
+				}
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_time_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	char *path = "/etc/rc.d/*ntpd";
+
+	if (check_file(path))
+		*value = "Synchronized";
+	else
+		*value = "Disabled";
+	return 0;
+}
+
+int get_time_CurrentLocalTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char time_buf[26] = {0};
+	struct tm *t_tm;
+
+	*value = "0001-01-01T00:00:00Z";
+
+	time_t t_time = time(NULL);
+	t_tm = localtime(&t_time);
+	if (t_tm == NULL)
+		return 0;
+
+	if(strftime(time_buf, sizeof(time_buf), "%FT%T%z", t_tm) == 0)
+		return 0;
+
+	time_buf[25] = time_buf[24];
+	time_buf[24] = time_buf[23];
+	time_buf[22] = ':';
+	time_buf[26] = '\0';
+
+	*value = dmstrdup(time_buf);
+	return 0;
+}
+
+/*#Device.Time.LocalTimeZone!UCI:system/system,@system[0]/timezone*/
+int get_time_LocalTimeZone(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("system", "@system[0]", "timezone", value);
+	return 0;
+}
+
+int set_time_LocalTimeZone(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value("system", "@system[0]", "timezone", value);
+			break;
+	}
+	return 0;
+}
+
+int get_local_time_zone_olson(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	dmuci_get_option_value_string("system", "@system[0]", "zonename", value);
+}
+
+int get_time_ntpserver(char *refparam, struct dmctx *ctx, char **value, int index)
+{
+	char *pch;
+	bool found = 0;
+	int element = 0;
+	struct uci_list *v;
+	struct uci_element *e;
+	
+	dmuci_get_option_value_list("system","ntp","server", &v);
+	if (v) {
+		uci_foreach_element(v, e) {
+			element++;
+			if (element == index) {
+				*value = dmstrdup(e->name); // MEM WILL BE FREED IN DMMEMCLEAN
+				found = 1; 
+				break;
+			}
+		}
+	}
+	if (!found) {
+		*value = "";
+		return 0;
+	}
+	if (strcmp(*value, "none") == 0) {
+		*value = "";
+	}
+	return 0;
+}
+
+int get_time_source_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value){
+	char *iface= NULL, *interface= NULL;
+	*value= "";
+	dmuci_get_option_value_string("system", "ntp", "interface", &iface);
+	if (*iface == '\0' || strlen(iface)== 0)
+		return 0;
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), iface, &interface);
+	if (*interface == '\0')
+		return 0;
+	*value= dmstrdup(interface);
+	return 0;
+}
+
+int get_time_ntpserver1(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	return get_time_ntpserver(refparam, ctx, value, 1);
+}
+
+int get_time_ntpserver2(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	return get_time_ntpserver(refparam, ctx, value, 2);
+}
+
+int get_time_ntpserver3(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	return get_time_ntpserver(refparam, ctx, value, 3);
+}
+
+int get_time_ntpserver4(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	return get_time_ntpserver(refparam, ctx, value, 4);
+}
+
+int get_time_ntpserver5(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	return get_time_ntpserver(refparam, ctx, value, 5);
+}
+
+int set_time_source_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *iface= NULL;
+	switch (action) {
+		case VALUECHECK:
+			adm_entry_get_linker_value(ctx, value, &iface);
+			if(iface == NULL ||  iface[0] == '\0')
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			adm_entry_get_linker_value(ctx, value, &iface);
+			dmuci_set_value("system", "ntp", "interface", iface);
+			return 0;
+	}
+	return 0;
+}
+
+int set_time_ntpserver(char *refparam, struct dmctx *ctx, int action, char *value, int index)
+{
+	char *pch, *path;
+	int check;
+	struct uci_list *v;
+	struct uci_element *e;
+	int count = 0;
+	int i = 0;
+	char *ntp[5] = {0};
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_option_value_list("system", "ntp", "server", &v);
+			if (v) {
+				uci_foreach_element(v, e) {
+					if ((count+1) == index) {
+						ntp[count] = dmstrdup(value);
+					}
+					else {
+					ntp[count] = dmstrdup(e->name);
+				}
+					count++;
+					if (count > 4)
+						break;
+				}
+			}
+			if (index > count) {
+				ntp[index-1] = dmstrdup(value);
+				count = index;
+				}
+			for (i = 0; i < 5; i++) {
+				if (ntp[i] && (*ntp[i]) != '\0')
+					count = i+1;
+			}
+			dmuci_delete("system", "ntp", "server", NULL);
+			for (i = 0; i < count; i++) {
+				dmuci_add_list_value("system", "ntp", "server", ntp[i] ? ntp[i] : "");
+				dmfree(ntp[i]);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int set_time_ntpserver1(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	return set_time_ntpserver(refparam, ctx, action, value, 1);
+}
+
+int set_time_ntpserver2(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	return set_time_ntpserver(refparam, ctx, action, value, 2);
+}
+
+int set_time_ntpserver3(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	return set_time_ntpserver(refparam, ctx, action, value, 3);
+}
+
+int set_time_ntpserver4(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	return set_time_ntpserver(refparam, ctx, action, value, 4);
+}
+
+int set_time_ntpserver5(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	return set_time_ntpserver(refparam, ctx, action, value, 5);
+}
diff --git a/dmtree/tr181/times.h b/dmtree/tr181/times.h
new file mode 100644
index 0000000000000000000000000000000000000000..d5e14e7814e46baa757531bc749c4075729f0b8b
--- /dev/null
+++ b/dmtree/tr181/times.h
@@ -0,0 +1,39 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *
+ */
+
+#ifndef __TIMES_H
+#define __TIMES_H
+#include "dmcwmp.h"
+
+extern DMLEAF tTimeParams[];
+
+int get_time_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_time_ntpserver1(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_time_ntpserver2(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_time_ntpserver3(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_time_ntpserver4(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_time_ntpserver5(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_time_CurrentLocalTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_time_LocalTimeZone(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_time_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_time_source_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_local_time_zone_olson(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int set_time_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_time_ntpserver1(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_time_ntpserver2(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_time_ntpserver3(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_time_ntpserver4(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_time_ntpserver5(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_time_LocalTimeZone(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_time_source_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif
diff --git a/dmtree/tr181/upnp.c b/dmtree/tr181/upnp.c
new file mode 100644
index 0000000000000000000000000000000000000000..5355a1898091eeb8137703c0fd85fa185b17f079
--- /dev/null
+++ b/dmtree/tr181/upnp.c
@@ -0,0 +1,77 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "upnp.h"
+
+/* *** Device.UPnP. *** */
+DMOBJ tUPnPObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Device", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tUPnPDeviceParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.UPnP.Device. *** */
+DMLEAF tUPnPDeviceParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_upnp_enable, set_upnp_enable, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"Status", &DMREAD, DMT_STRING, get_upnp_status, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*#Device.UPnP.Device.Enable!UCI:upnpd/upnpd,config/enabled*/
+int get_upnp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("upnpd","config","enabled", value);
+	if ((*value)[0] == '\0') {
+		*value = "1";
+	}
+	return 0;
+}
+
+int set_upnp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	int check;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value("upnpd", "config", "enabled", "");
+			else 
+				dmuci_set_value("upnpd", "config", "enabled", "0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_upnp_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	pid_t pid = get_pid("miniupnpd");
+	
+	if (pid < 0) {
+		*value = "Down";
+	}
+	else {
+		*value = "Up";
+	}
+	return 0;
+}
diff --git a/dmtree/tr181/upnp.h b/dmtree/tr181/upnp.h
new file mode 100644
index 0000000000000000000000000000000000000000..c901b9bb0febd740f78e182b2dba25ee71fd973e
--- /dev/null
+++ b/dmtree/tr181/upnp.h
@@ -0,0 +1,23 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *
+ */
+
+#ifndef __UPNP_H
+#define __UPNP_H
+
+extern DMLEAF tUPnPDeviceParams[];
+extern DMOBJ tUPnPObj[];
+
+int get_upnp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_upnp_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int set_upnp_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif
diff --git a/dmtree/tr181/userinterface.c b/dmtree/tr181/userinterface.c
new file mode 100644
index 0000000000000000000000000000000000000000..be5ddf1d83144b7b6d63c87bfae1ee7550681fda
--- /dev/null
+++ b/dmtree/tr181/userinterface.c
@@ -0,0 +1,250 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2018 Inteno Broadband Technology AB
+ *		Author: Omar Kallel <omar.kallel@pivasoftware.com>
+ *		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmjson.h"
+#include "dmcommon.h"
+#include "userinterface.h"
+
+/* *** Device.UserInterface. *** */
+DMOBJ tUserInterfaceObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"RemoteAccess", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tUserInterfaceRemoteAccessParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.UserInterface.RemoteAccess. *** */
+DMLEAF tUserInterfaceRemoteAccessParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_userint_remoteaccesss_enable, set_userint_remoteaccesss_enable, NULL, NULL, BBFDM_BOTH},
+{"Port", &DMWRITE, DMT_UNINT, get_userint_remoteaccesss_port, set_userint_remoteaccesss_port, NULL, NULL, BBFDM_BOTH},
+{"SupportedProtocols", &DMREAD, DMT_STRING, get_userint_remoteaccesss_supportedprotocols, NULL, NULL, NULL, BBFDM_BOTH},
+{"Protocol", &DMWRITE, DMT_STRING, get_userint_remoteaccesss_protocol, set_userint_remoteaccesss_protocol, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/**************************************************************************
+* GET & SET PARAMETERS
+***************************************************************************/
+static void add_default_rule(char *port, char *enable, char *owsd)
+{
+	struct uci_section *ss;
+	char *ret;
+
+	dmuci_add_section_and_rename("firewall", "rule", &ss, &ret);
+	dmuci_set_value_by_section(ss, "name", "juci-remote-access");
+	dmuci_set_value_by_section(ss, "src", "wan");
+	dmuci_set_value_by_section(ss, "proto", "tcp");
+	dmuci_set_value_by_section(ss, "target", "ACCEPT");
+	dmuci_set_value_by_section(ss, "dest_port", port);
+	dmuci_set_value_by_section(ss, "owsd", owsd);
+	dmuci_set_value_by_section(ss, "enabled", enable);
+}
+
+int get_userint_remoteaccesss_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *ss;
+	char *rule_name, *rule_enabled;
+
+	uci_foreach_sections("firewall", "rule", ss)
+	{
+		dmuci_get_value_by_section_string(ss, "name", &rule_name);
+		if(strcmp(rule_name, "juci-remote-access") == 0)
+		{
+			dmuci_get_value_by_section_string(ss, "enabled", &rule_enabled);
+			*value= (strcmp(rule_enabled, "0") == 0) ? "0": "1";
+			return 0;
+		}
+	}
+
+	*value = "0";
+	return 0;
+}
+
+int set_userint_remoteaccesss_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *ss;
+	char *rule_name;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			uci_foreach_sections("firewall", "rule", ss)
+			{
+				dmuci_get_value_by_section_string(ss, "name", &rule_name);
+				if(strcmp(rule_name, "juci-remote-access") == 0)
+				{
+					dmuci_set_value_by_section(ss, "enabled", b ? "" : "0");
+					return 0;
+				}
+			}
+
+			add_default_rule("80", value, "wan");
+			return 0;
+	}
+	return 0;
+}
+
+int get_userint_remoteaccesss_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *ss;
+	char *rule_name, *dest_port;
+
+	uci_foreach_sections("firewall", "rule", ss) {
+		dmuci_get_value_by_section_string(ss, "name", &rule_name);
+		if(strcmp(rule_name, "juci-remote-access") == 0){
+			dmuci_get_value_by_section_string(ss, "dest_port", &dest_port);
+			*value= dest_port;
+			return 0;
+		}
+	}
+
+	*value = "80";
+	return 0;
+}
+
+int set_userint_remoteaccesss_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+
+	struct uci_section *ss;
+	char *rule_name, *owsd;
+	char *ret;
+
+	switch (action)
+	{
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			uci_foreach_sections("firewall", "rule", ss)
+			{
+				dmuci_get_value_by_section_string(ss, "name", &rule_name);
+				if(strcmp(rule_name, "juci-remote-access") == 0)
+				{
+					dmuci_set_value_by_section(ss, "dest_port", value);
+					dmuci_get_value_by_section_string(ss, "owsd", &owsd);
+					dmuci_set_value("owsd", owsd, "port", value);
+					return 0;
+				}
+			}
+
+			add_default_rule(value, "0", "wan");
+			dmuci_set_value("owsd", "wan", "port", value);
+			return 0;
+	}
+	return 0;
+}
+
+static int get_supportedprotocols(void)
+{
+	char *cert, *key, *ca;
+	int found_https = 0;
+
+	if ((dmuci_get_option_value_string("owsd", "wan_https", "cert", &cert) == 0 && *cert != '\0' && access(cert, F_OK) != -1) ||
+		(dmuci_get_option_value_string("owsd", "wan_https", "key", &key) == 0 && *key != '\0' && access(key, F_OK) != -1) ||
+		(dmuci_get_option_value_string("owsd", "wan_https", "ca", &ca) == 0 && *ca != '\0' && access(ca, F_OK) != -1))
+		found_https = 1;
+
+	return found_https;
+}
+
+int get_userint_remoteaccesss_supportedprotocols(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	int found;
+
+	found = get_supportedprotocols();
+	if (found)
+	{
+		*value = "HTTP, HTTPS";
+		return 0;
+	}
+
+	*value = "HTTP";
+	return 0;
+}
+
+int get_userint_remoteaccesss_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *ss;
+	char *rule_name, *rule_owsd;
+
+	uci_foreach_sections("firewall", "rule", ss)
+	{
+		dmuci_get_value_by_section_string(ss, "name", &rule_name);
+		if(strcmp(rule_name, "juci-remote-access") == 0)
+		{
+			dmuci_get_value_by_section_string(ss, "owsd", &rule_owsd);
+			if (strcmp(rule_owsd, "wan") == 0)
+				*value = "HTTP";
+			else
+				*value = "HTTPS";
+			return 0;
+		}
+	}
+
+	*value = "HTTP";
+	return 0;
+}
+
+int set_userint_remoteaccesss_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *ss;
+	char *rule_name, *name_http;
+	int found;
+
+	switch (action)
+	{
+		case VALUECHECK:
+			found = get_supportedprotocols();
+			if (found)
+			{
+				if ((strcmp(value, "HTTP") != 0) && (strcmp(value, "HTTPS") != 0))
+					return FAULT_9007;
+			}
+			else
+			{
+				if (strcmp(value, "HTTP") != 0)
+					return FAULT_9007;
+			}
+			return 0;
+		case VALUESET:
+			uci_foreach_sections("firewall", "rule", ss)
+			{
+				dmuci_get_value_by_section_string(ss, "name", &rule_name);
+				if(strcmp(rule_name, "juci-remote-access") == 0)
+				{
+					if(strcmp(value, "HTTPS") == 0)
+						dmuci_set_value_by_section(ss, "owsd", "wan_https");
+					else
+						dmuci_set_value_by_section(ss, "owsd", "wan");
+					return 0;
+				}
+			}
+
+			if(strcmp(value, "HTTPS") == 0)
+				name_http = "wan_https";
+			else
+				name_http = "wan";
+			add_default_rule("80", "0", name_http);
+			return 0;
+	}
+	return 0;
+}
diff --git a/dmtree/tr181/userinterface.h b/dmtree/tr181/userinterface.h
new file mode 100644
index 0000000000000000000000000000000000000000..a467980d8b01fb6a12a64433cbca2a669c129480
--- /dev/null
+++ b/dmtree/tr181/userinterface.h
@@ -0,0 +1,26 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2016 Inteno Broadband Technology AB
+ *		Author: Omar Kallel <omar.kallel@pivasoftware.com>
+ *		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#ifndef __USER_INTERFACE_H
+#define __USER_INTERFACE_H
+
+extern DMLEAF tUserInterfaceRemoteAccessParams[];
+extern DMOBJ tUserInterfaceObj[];
+
+int get_userint_remoteaccesss_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_userint_remoteaccesss_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_userint_remoteaccesss_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_userint_remoteaccesss_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_userint_remoteaccesss_supportedprotocols(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_userint_remoteaccesss_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_userint_remoteaccesss_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+#endif
diff --git a/dmtree/tr181/users.c b/dmtree/tr181/users.c
new file mode 100644
index 0000000000000000000000000000000000000000..d2864328418fb6dc65ea292ad3559ca088038032
--- /dev/null
+++ b/dmtree/tr181/users.c
@@ -0,0 +1,254 @@
+/*
+ *      This program is free software: you can redistribute it and/or modify
+ *      it under the terms of the GNU General Public License as published by
+ *      the Free Software Foundation, either version 2 of the License, or
+ *      (at your option) any later version.
+ *
+ *      Copyright (C) 2019 iopsys Software Solutions AB
+ *
+ *      Author: Omar Kallel <omar.kallel@pivasoftware.com>
+ */
+
+#include "dmcwmp.h"
+#include "users.h"
+#include "dmcommon.h"
+
+/* *** Device.Users. *** */
+DMOBJ tUsersObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"User", &DMWRITE, add_users_user, delete_users_user, NULL, browseUserInst, NULL, NULL, NULL, tUsersUserParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tUsersParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"UserNumberOfEntries", &DMREAD, DMT_UNINT, get_users_user_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.Users.User.{i}. *** */
+DMLEAF tUsersUserParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_user_alias, set_user_alias, NULL, NULL, BBFDM_BOTH},
+{"Enable", &DMWRITE, DMT_BOOL, get_user_enable, set_user_enable, NULL, NULL, BBFDM_BOTH},
+{"Username", &DMWRITE, DMT_STRING, get_user_username, set_user_username, NULL, NULL, BBFDM_BOTH},
+{"Password", &DMWRITE, DMT_STRING, get_user_password, set_user_password, NULL, NULL, BBFDM_BOTH},
+{"RemoteAccessCapable", &DMWRITE, DMT_BOOL, get_user_remote_accessable, set_user_remote_accessable, NULL, NULL, BBFDM_BOTH},
+{"Language", &DMWRITE, DMT_STRING, get_user_language, set_user_language, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/***************************** Browse Functions ***********************************/
+/*#Device.Users.User.{i}.!UCI:users/user/dmmap_users*/
+int browseUserInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *instance, *instnbr = NULL;
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("users", "user", "dmmap_users", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		instance =  handle_update_instance(1, dmctx, &instnbr, update_instance_alias, 3, p->dmmap_section, "user_instance", "user_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, instance) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+int add_users_user(char *refparam, struct dmctx *ctx, void *data, char **instance){
+	struct uci_section *s, *dmmap_user;
+	char *last_inst= NULL, *sect_name= NULL, *username, *v;
+	char ib[8];
+	last_inst= get_last_instance_icwmpd("dmmap_users", "user", "user_instance");
+	if (last_inst)
+		sprintf(ib, "%s", last_inst);
+	else
+		sprintf(ib, "%s", "1");
+
+	dmasprintf(&username, "user_%d", atoi(ib)+1);
+
+	dmuci_add_section("users", "user", &s, &sect_name);
+	dmuci_rename_section_by_section(s, username);
+	dmuci_set_value_by_section(s, "enabled", "1");
+	dmuci_set_value_by_section(s, "password", username);
+
+	dmuci_add_section_icwmpd("dmmap_users", "user", &dmmap_user, &v);
+	dmuci_set_value_by_section(dmmap_user, "section_name", sect_name);
+	*instance = update_instance_icwmpd(dmmap_user, last_inst, "user_instance");
+	return 0;
+}
+
+int delete_users_user(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *s = NULL;
+	struct uci_section *ss = NULL;
+	struct uci_section *dmmap_section;
+	int found = 0;
+
+	switch (del_action) {
+		case DEL_INST:
+			if(is_section_unnamed(section_name((struct uci_section *)data))){
+				LIST_HEAD(dup_list);
+				delete_sections_save_next_sections("dmmap_users", "user", "user_instance", section_name((struct uci_section *)data), atoi(instance), &dup_list);
+				update_dmmap_sections(&dup_list, "user_instance", "dmmap_users", "user");
+				dmuci_delete_by_section_unnamed((struct uci_section *)data, NULL, NULL);
+			} else {
+				get_dmmap_section_of_config_section("dmmap_users", "user", section_name((struct uci_section *)data), &dmmap_section);
+				dmuci_delete_by_section_unnamed_icwmpd(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section((struct uci_section *)data, NULL, NULL);
+			}
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("users", "user", s) {
+				if (found != 0){
+					get_dmmap_section_of_config_section("dmmap_users", "user", section_name(ss), &dmmap_section);
+					if(dmmap_section != NULL)
+						dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL){
+				get_dmmap_section_of_config_section("dmmap_users", "user", section_name(ss), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			break;
+	}
+	return 0;
+}
+
+/***************************************** Set/Get Parameter functions ***********************/
+/*#Device.Users.UserNumberOfEntries!UCI:users/user/*/
+int get_users_user_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s = NULL;
+	int cnt = 0;
+
+	uci_foreach_sections("users", "user", s) {
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt);
+	return 0;
+}
+
+int get_user_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_users", "user", section_name((struct uci_section *)data), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "user_alias", value);
+    return 0;
+}
+
+/*#Device.Users.User.{i}.Enable!UCI:users/user,@i-1/enabled*/
+int get_user_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "enabled", value);
+    return 0;
+}
+
+int get_user_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value= dmstrdup(section_name((struct uci_section *)data));
+    return 0;
+}
+
+/*#Device.Users.User.{i}.Password!UCI:users/user,@i-1/password*/
+int get_user_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "password", value);
+    return 0;
+}
+
+/*#Device.Users.User.{i}.RemoteAccessCapable!UCI:users/user,@i-1/remote_access*/
+int get_user_remote_accessable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "remote_access", value);
+    return 0;
+}
+
+/*#Device.Users.User.{i}.Language!UCI:users/user,@i-1/language*/
+int get_user_language(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "language", value);
+    return 0;
+}
+
+int set_user_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			get_dmmap_section_of_config_section("dmmap_users", "user", section_name((struct uci_section *)data), &dmmap_section);
+			dmuci_set_value_by_section(dmmap_section, "user_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int set_user_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "enabled", value);
+			break;
+	}
+	return 0;
+}
+
+int set_user_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_rename_section_by_section((struct uci_section *)data, value);
+			break;
+	}
+	return 0;
+}
+
+int set_user_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "password", value);
+			break;
+	}
+	return 0;
+}
+
+int set_user_remote_accessable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "remote_access", value);
+			break;
+	}
+	return 0;
+}
+
+int set_user_language(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "language", value);
+			break;
+	}
+	return 0;
+}
diff --git a/dmtree/tr181/users.h b/dmtree/tr181/users.h
new file mode 100644
index 0000000000000000000000000000000000000000..2ea935e01147cff11b2c5e325b40484120baa0bd
--- /dev/null
+++ b/dmtree/tr181/users.h
@@ -0,0 +1,39 @@
+/*
+ *      This program is free software: you can redistribute it and/or modify
+ *      it under the terms of the GNU General Public License as published by
+ *      the Free Software Foundation, either version 2 of the License, or
+ *      (at your option) any later version.
+ *
+ *      Copyright (C) 2019 iopsys Software Solutions AB
+ *
+ *      Author: Omar Kallel <omar.kallel@pivasoftware.com>
+ */
+
+#ifndef _USERS_H
+#define _USERS_H
+
+#include "dmcwmp.h"
+
+
+extern DMOBJ tUsersObj[];
+extern DMLEAF tUsersParams[];
+extern DMLEAF tUsersUserParams[];
+
+
+int browseUserInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int add_users_user(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delete_users_user(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int get_users_user_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_user_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_user_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_user_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_user_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_user_remote_accessable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_user_language(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_user_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_user_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_user_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_user_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_user_remote_accessable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_user_language(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+#endif
diff --git a/dmtree/tr181/wifi.c b/dmtree/tr181/wifi.c
new file mode 100644
index 0000000000000000000000000000000000000000..7ec389dcff00665b3b00e46a981d8226b91a43e7
--- /dev/null
+++ b/dmtree/tr181/wifi.c
@@ -0,0 +1,3538 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2016 Inteno Broadband Technology AB
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "wifi.h"
+#include "dmjson.h"
+#include "dmentry.h"
+#include "wepkey.h"
+#define DELIMITOR ","
+
+/* *** Device.WiFi. *** */
+DMOBJ tWiFiObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Radio", &DMREAD, NULL, NULL, NULL, browseWifiRadioInst, NULL, NULL, tWiFiRadioObj, tWiFiRadioParams, get_linker_Wifi_Radio, BBFDM_BOTH},
+{"SSID", &DMWRITE, add_wifi_ssid, delete_wifi_ssid, NULL, browseWifiSsidInst, NULL, NULL, tWiFiSSIDObj, tWiFiSSIDParams, get_linker_Wifi_Ssid, BBFDM_BOTH},
+{"AccessPoint", &DMREAD, NULL, NULL, NULL, browseWifiAccessPointInst, NULL, NULL, tWiFiAccessPointObj, tWiFiAccessPointParams, NULL, BBFDM_BOTH},
+{"NeighboringWiFiDiagnostic", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiNeighboringWiFiDiagnosticObj, tWiFiNeighboringWiFiDiagnosticParams, NULL, BBFDM_BOTH},
+{"EndPoint", &DMWRITE, addObjWiFiEndPoint, delObjWiFiEndPoint, NULL, browseWiFiEndPointInst, NULL, NULL, tWiFiEndPointObj, tWiFiEndPointParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tWiFiParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"RadioNumberOfEntries", &DMREAD, DMT_UNINT, get_WiFi_RadioNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"SSIDNumberOfEntries", &DMREAD, DMT_UNINT, get_WiFi_SSIDNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"AccessPointNumberOfEntries", &DMREAD, DMT_UNINT, get_WiFi_AccessPointNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{"EndPointNumberOfEntries", &DMREAD, DMT_UNINT, get_WiFi_EndPointNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"Bandsteering_Enable", &DMWRITE, DMT_BOOL, get_wifi_bandsteering_enable, set_wifi_bandsteering_enable, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.Radio.{i}. *** */
+DMOBJ tWiFiRadioObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiRadioStatsParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tWiFiRadioParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_radio_alias, set_radio_alias, NULL, NULL, BBFDM_BOTH},
+{"Enable", &DMWRITE, DMT_BOOL, get_radio_enable, set_radio_enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_radio_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"LowerLayers", &DMWRITE, DMT_STRING, get_WiFiRadio_LowerLayers, set_WiFiRadio_LowerLayers, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMREAD, DMT_STRING, get_WiFiRadio_Name, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxBitRate", &DMREAD, DMT_UNINT,get_radio_max_bit_rate, NULL, NULL, NULL, BBFDM_BOTH},
+{"OperatingFrequencyBand", &DMREAD, DMT_STRING, get_radio_frequency, NULL, NULL, NULL, BBFDM_BOTH},
+{"SupportedFrequencyBands", &DMREAD, DMT_STRING, get_radio_supported_frequency_bands, NULL, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"MaxAssociations", &DMWRITE, DMT_STRING, get_radio_maxassoc, set_radio_maxassoc, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"DFSEnable", &DMWRITE, DMT_BOOL, get_radio_dfsenable, set_radio_dfsenable, NULL, NULL, BBFDM_BOTH},
+{"SupportedStandards", &DMREAD, DMT_STRING, get_radio_supported_standard, NULL, NULL, NULL, BBFDM_BOTH},
+{"OperatingStandards", &DMWRITE, DMT_STRING, get_radio_operating_standard, set_radio_operating_standard, NULL, NULL, BBFDM_BOTH},
+{"ChannelsInUse", &DMREAD, DMT_STRING, get_radio_channel, NULL, NULL, NULL, BBFDM_BOTH},
+{"Channel", &DMWRITE, DMT_UNINT, get_radio_channel, set_radio_channel, NULL, NULL, BBFDM_BOTH},
+{"AutoChannelEnable", &DMWRITE, DMT_BOOL, get_radio_auto_channel_enable, set_radio_auto_channel_enable, NULL, NULL, BBFDM_BOTH},
+{"PossibleChannels", &DMREAD, DMT_STRING, get_radio_possible_channels, NULL, NULL, NULL, BBFDM_BOTH},
+{"AutoChannelSupported", &DMREAD, DMT_BOOL, get_WiFiRadio_AutoChannelSupported, NULL, NULL, NULL, BBFDM_BOTH},
+{"AutoChannelRefreshPeriod", &DMWRITE, DMT_UNINT, get_WiFiRadio_AutoChannelRefreshPeriod, set_WiFiRadio_AutoChannelRefreshPeriod, NULL, NULL, BBFDM_BOTH},
+{"MaxSupportedAssociations", &DMREAD, DMT_UNINT, get_WiFiRadio_MaxSupportedAssociations, NULL, NULL, NULL, BBFDM_BOTH},
+{"FragmentationThreshold", &DMWRITE, DMT_UNINT, get_WiFiRadio_FragmentationThreshold, set_WiFiRadio_FragmentationThreshold, NULL, NULL, BBFDM_BOTH},
+{"RTSThreshold", &DMWRITE, DMT_UNINT, get_WiFiRadio_RTSThreshold, set_WiFiRadio_RTSThreshold, NULL, NULL, BBFDM_BOTH},
+{"BeaconPeriod", &DMWRITE, DMT_UNINT, get_WiFiRadio_BeaconPeriod, set_WiFiRadio_BeaconPeriod, NULL, NULL, BBFDM_BOTH},
+{"DTIMPeriod", &DMWRITE, DMT_UNINT, get_WiFiRadio_DTIMPeriod, set_WiFiRadio_DTIMPeriod, NULL, NULL, BBFDM_BOTH},
+{"SupportedOperatingChannelBandwidths", &DMREAD, DMT_STRING, get_WiFiRadio_SupportedOperatingChannelBandwidths, NULL, NULL, NULL, BBFDM_BOTH},
+{"OperatingChannelBandwidth", &DMWRITE, DMT_STRING, get_WiFiRadio_OperatingChannelBandwidth, set_WiFiRadio_OperatingChannelBandwidth, NULL, NULL, BBFDM_BOTH},
+{"CurrentOperatingChannelBandwidth", &DMREAD, DMT_STRING, get_WiFiRadio_CurrentOperatingChannelBandwidth, NULL, NULL, NULL, BBFDM_BOTH},
+{"PreambleType", &DMWRITE, DMT_STRING, get_WiFiRadio_PreambleType, set_WiFiRadio_PreambleType, NULL, NULL, BBFDM_BOTH},
+{"IEEE80211hSupported", &DMREAD, DMT_BOOL, get_WiFiRadio_IEEE80211hSupported, NULL, NULL, NULL, BBFDM_BOTH},
+{"IEEE80211hEnabled", &DMWRITE, DMT_BOOL, get_WiFiRadio_IEEE80211hEnabled, set_WiFiRadio_IEEE80211hEnabled, NULL, NULL, BBFDM_BOTH},
+{"TransmitPower", &DMWRITE, DMT_INT, get_WiFiRadio_TransmitPower, set_WiFiRadio_TransmitPower, NULL, NULL, BBFDM_BOTH},
+{"RegulatoryDomain", &DMWRITE, DMT_STRING, get_WiFiRadio_RegulatoryDomain, set_WiFiRadio_RegulatoryDomain, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.Radio.{i}.Stats. *** */
+DMLEAF tWiFiRadioStatsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"BytesSent", &DMREAD, DMT_UNINT, get_radio_statistics_tx_bytes, NULL, NULL, NULL, BBFDM_BOTH},
+{"BytesReceived", &DMREAD, DMT_UNINT, get_radio_statistics_rx_bytes, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsSent", &DMREAD, DMT_UNINT, get_radio_statistics_tx_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsReceived", &DMREAD, DMT_UNINT, get_radio_statistics_rx_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsSent", &DMREAD, DMT_UNINT, get_radio_statistics_tx_errors, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsReceived", &DMREAD, DMT_UNINT, get_radio_statistics_rx_errors, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsSent", &DMREAD, DMT_UNINT, get_radio_statistics_tx_discardpackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsReceived", &DMREAD, DMT_UNINT, get_radio_statistics_rx_discardpackets, NULL, NULL, NULL, BBFDM_BOTH},
+{"Noise", &DMREAD, DMT_INT, get_WiFiRadioStats_Noise, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.NeighboringWiFiDiagnostic. *** */
+DMOBJ tWiFiNeighboringWiFiDiagnosticObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Result", &DMREAD, NULL, NULL, NULL, browseWifiNeighboringWiFiDiagnosticResultInst, NULL, NULL, NULL, tWiFiNeighboringWiFiDiagnosticResultParams, NULL, BBFDM_CWMP},
+{0}
+};
+
+DMLEAF tWiFiNeighboringWiFiDiagnosticParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"DiagnosticsState", &DMWRITE, DMT_STRING, get_neighboring_wifi_diagnostics_diagnostics_state, set_neighboring_wifi_diagnostics_diagnostics_state, NULL, NULL, BBFDM_CWMP},
+{"ResultNumberOfEntries", &DMREAD, DMT_UNINT, get_neighboring_wifi_diagnostics_result_number_entries, NULL, NULL, NULL, BBFDM_CWMP},
+{0}
+};
+
+/* *** Device.WiFi.NeighboringWiFiDiagnostic.Result.{i}. *** */
+DMLEAF tWiFiNeighboringWiFiDiagnosticResultParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"SSID", &DMREAD, DMT_STRING, get_neighboring_wifi_diagnostics_result_ssid, NULL, NULL, NULL, BBFDM_CWMP},
+{"BSSID", &DMREAD, DMT_STRING, get_neighboring_wifi_diagnostics_result_bssid, NULL, NULL, NULL, BBFDM_CWMP},
+{"Channel", &DMREAD, DMT_UNINT, get_neighboring_wifi_diagnostics_result_channel, NULL, NULL, NULL, BBFDM_CWMP},
+{"SignalStrength", &DMREAD, DMT_INT, get_neighboring_wifi_diagnostics_result_signal_strength, NULL, NULL, NULL, BBFDM_CWMP},
+{"OperatingFrequencyBand", &DMREAD, DMT_STRING, get_neighboring_wifi_diagnostics_result_operating_frequency_band, NULL, NULL, NULL, BBFDM_CWMP},
+{"Noise", &DMREAD, DMT_INT, get_neighboring_wifi_diagnostics_result_noise, NULL, NULL, NULL, BBFDM_CWMP},
+{0}
+};
+
+/* *** Device.WiFi.SSID.{i}. *** */
+DMOBJ tWiFiSSIDObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiSSIDStatsParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tWiFiSSIDParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_ssid_alias, set_ssid_alias, NULL, NULL, BBFDM_BOTH},
+{"Enable", &DMWRITE, DMT_BOOL, get_wifi_enable, set_wifi_enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_wifi_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"SSID", &DMWRITE, DMT_STRING, get_wlan_ssid, set_wlan_ssid, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMWRITE, DMT_STRING,  get_wlan_ssid, set_wlan_ssid, NULL, NULL, BBFDM_BOTH},
+{"LowerLayers", &DMWRITE, DMT_STRING, get_ssid_lower_layer, set_ssid_lower_layer, NULL, NULL, BBFDM_BOTH},
+{"BSSID", &DMREAD, DMT_STRING, get_wlan_bssid, NULL, NULL, NULL, BBFDM_BOTH},
+{"MACAddress", &DMREAD, DMT_STRING, get_WiFiSSID_MACAddress, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.SSID.{i}.Stats. *** */
+DMLEAF tWiFiSSIDStatsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"BytesSent", &DMREAD, DMT_UNINT, get_ssid_statistics_tx_bytes, NULL, NULL, NULL, BBFDM_BOTH},
+{"BytesReceived", &DMREAD, DMT_UNINT, get_ssid_statistics_rx_bytes, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsSent", &DMREAD, DMT_UNINT, get_ssid_statistics_tx_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsReceived", &DMREAD, DMT_UNINT, get_ssid_statistics_rx_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsSent", &DMREAD, DMT_UNINT, get_WiFiSSIDStats_ErrorsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsReceived", &DMREAD, DMT_UNINT, get_WiFiSSIDStats_ErrorsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsSent", &DMREAD, DMT_UNINT, get_WiFiSSIDStats_DiscardPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"DiscardPacketsReceived", &DMREAD, DMT_UNINT, get_WiFiSSIDStats_DiscardPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnicastPacketsSent", &DMREAD, DMT_UNINT, get_WiFiSSIDStats_UnicastPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"UnicastPacketsReceived", &DMREAD, DMT_UNINT, get_WiFiSSIDStats_UnicastPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"MulticastPacketsSent", &DMREAD, DMT_UNINT, get_WiFiSSIDStats_MulticastPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"MulticastPacketsReceived", &DMREAD, DMT_UNINT, get_WiFiSSIDStats_MulticastPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{"BroadcastPacketsSent", &DMREAD, DMT_UNINT, get_WiFiSSIDStats_BroadcastPacketsSent, NULL, NULL, NULL, BBFDM_BOTH},
+{"BroadcastPacketsReceived", &DMREAD, DMT_UNINT, get_WiFiSSIDStats_BroadcastPacketsReceived, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.AccessPoint.{i}. *** */
+DMOBJ tWiFiAccessPointObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Security", &DMWRITE, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiAccessPointSecurityParams, NULL, BBFDM_BOTH},
+{"AssociatedDevice", &DMREAD, NULL, NULL, NULL, browse_wifi_associated_device, NULL, NULL, tWiFiAccessPointAssociatedDeviceObj, tWiFiAccessPointAssociatedDeviceParams, get_linker_associated_device, BBFDM_BOTH},
+{"WPS", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiAccessPointWPSParams, NULL, BBFDM_BOTH},
+{"Accounting", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiAccessPointAccountingParams, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"IEEE80211r", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiAcessPointIEEE80211rParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tWiFiAccessPointParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_access_point_alias, set_access_point_alias, NULL, NULL, BBFDM_BOTH},
+{"Enable", &DMWRITE, DMT_BOOL,  get_wifi_enable, set_wifi_enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_wifi_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"SSIDReference", &DMREAD, DMT_STRING, get_ap_ssid_ref, NULL, NULL, NULL, BBFDM_BOTH},
+{"SSIDAdvertisementEnabled", &DMWRITE, DMT_BOOL, get_wlan_ssid_advertisement_enable, set_wlan_ssid_advertisement_enable, NULL, NULL, BBFDM_BOTH},
+{"WMMEnable", &DMWRITE, DMT_BOOL, get_wmm_enabled, set_wmm_enabled, NULL, NULL, BBFDM_BOTH},
+{"UAPSDEnable", &DMWRITE, DMT_BOOL, get_WiFiAccessPoint_UAPSDEnable, set_WiFiAccessPoint_UAPSDEnable, NULL, NULL, BBFDM_BOTH},
+{"AssociatedDeviceNumberOfEntries", &DMREAD, DMT_UNINT, get_access_point_total_associations, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxAssociatedDevices", &DMWRITE, DMT_UNINT, get_access_point_maxassoc, set_access_point_maxassoc, NULL, NULL, BBFDM_BOTH},
+{"MACAddressControlEnabled", &DMWRITE, DMT_BOOL, get_access_point_control_enable, set_access_point_control_enable, NULL, NULL, BBFDM_BOTH},
+{"UAPSDCapability", &DMREAD, DMT_BOOL, get_WiFiAccessPoint_UAPSDCapability, NULL, NULL, NULL, BBFDM_BOTH},
+{"WMMCapability", &DMREAD, DMT_BOOL, get_WiFiAccessPoint_WMMCapability, NULL, NULL, NULL, BBFDM_BOTH},
+{"MaxAllowedAssociations", &DMWRITE, DMT_UNINT, get_WiFiAccessPoint_MaxAllowedAssociations, set_WiFiAccessPoint_MaxAllowedAssociations, NULL, NULL, BBFDM_BOTH},
+{"IsolationEnable", &DMWRITE, DMT_BOOL, get_WiFiAccessPoint_IsolationEnable, set_WiFiAccessPoint_IsolationEnable, NULL, NULL, BBFDM_BOTH},
+{"AllowedMACAddress", &DMWRITE, DMT_STRING, get_WiFiAccessPoint_AllowedMACAddress, set_WiFiAccessPoint_AllowedMACAddress, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.AccessPoint.{i}.Security. *** */
+DMLEAF tWiFiAccessPointSecurityParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"ModesSupported", &DMREAD, DMT_STRING, get_access_point_security_supported_modes, NULL, NULL, NULL, BBFDM_BOTH},
+{"ModeEnabled", &DMWRITE, DMT_STRING ,get_access_point_security_modes, set_access_point_security_modes, NULL, NULL, BBFDM_BOTH},
+{"WEPKey", &DMWRITE, DMT_STRING, get_empty, set_access_point_security_wepkey, NULL, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"WEPKeyIndex", &DMWRITE, DMT_UNINT, get_access_point_security_wepkey_index, set_access_point_security_wepkey_index, NULL, NULL, BBFDM_BOTH},
+{"PreSharedKey", &DMWRITE, DMT_STRING, get_empty, set_access_point_security_shared_key, NULL, NULL, BBFDM_BOTH},
+{"KeyPassphrase", &DMWRITE, DMT_STRING, get_empty, set_access_point_security_passphrase, NULL, NULL, BBFDM_BOTH},
+{"RekeyingInterval", &DMWRITE, DMT_UNINT, get_access_point_security_rekey_interval, set_access_point_security_rekey_interval, NULL, NULL, BBFDM_BOTH},
+{"RadiusServerIPAddr", &DMWRITE, DMT_STRING, get_access_point_security_radius_ip_address, set_access_point_security_radius_ip_address, NULL, NULL, BBFDM_BOTH},
+{"RadiusServerPort", &DMWRITE, DMT_UNINT, get_access_point_security_radius_server_port, set_access_point_security_radius_server_port, NULL, NULL, BBFDM_BOTH},
+{"RadiusSecret", &DMWRITE, DMT_STRING,get_empty, set_access_point_security_radius_secret, NULL, NULL, BBFDM_BOTH},
+{"MFPConfig", &DMWRITE, DMT_STRING, get_WiFiAccessPointSecurity_MFPConfig, set_WiFiAccessPointSecurity_MFPConfig, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.AccessPoint.{i}.WPS. *** */
+DMLEAF tWiFiAccessPointWPSParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_WiFiAccessPointWPS_Enable, set_WiFiAccessPointWPS_Enable, NULL, NULL, BBFDM_BOTH},
+{"ConfigMethodsSupported", &DMREAD, DMT_STRING, get_WiFiAccessPointWPS_ConfigMethodsSupported, NULL, NULL, NULL, BBFDM_BOTH},
+{"ConfigMethodsEnabled", &DMWRITE, DMT_STRING, get_WiFiAccessPointWPS_ConfigMethodsEnabled, set_WiFiAccessPointWPS_ConfigMethodsEnabled, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_WiFiAccessPointWPS_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Version", &DMREAD, DMT_STRING, get_WiFiAccessPointWPS_Version, NULL, NULL, NULL, BBFDM_BOTH},
+{"PIN", &DMWRITE, DMT_STRING, get_WiFiAccessPointWPS_PIN, set_WiFiAccessPointWPS_PIN, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.AccessPoint.{i}.AssociatedDevice.{i}. *** */
+DMOBJ tWiFiAccessPointAssociatedDeviceObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiAccessPointAssociatedDeviceStatsParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tWiFiAccessPointAssociatedDeviceParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Active", &DMREAD, DMT_BOOL, get_access_point_associative_device_active, NULL, NULL, NULL, BBFDM_BOTH},
+{"Noise", &DMREAD, DMT_INT, get_WiFiAccessPointAssociatedDevice_Noise, NULL, NULL, NULL, BBFDM_BOTH},
+{"MACAddress", &DMREAD, DMT_STRING ,get_access_point_associative_device_mac, NULL, NULL, NULL, BBFDM_BOTH},
+{"LastDataDownlinkRate", &DMREAD, DMT_UNINT, get_access_point_associative_device_lastdatadownlinkrate, NULL, NULL, NULL, BBFDM_BOTH},
+{"LastDataUplinkRate", &DMREAD, DMT_UNINT, get_access_point_associative_device_lastdatauplinkrate, NULL, NULL, NULL, BBFDM_BOTH},
+{"SignalStrength", &DMREAD, DMT_INT, get_access_point_associative_device_signalstrength, NULL, NULL, NULL, BBFDM_BOTH},
+{"Retransmissions", &DMREAD, DMT_UNINT, get_WiFiAccessPointAssociatedDevice_Retransmissions, NULL, NULL, NULL, BBFDM_BOTH},
+{"AssociationTime", &DMREAD, DMT_TIME, get_WiFiAccessPointAssociatedDevice_AssociationTime, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.AccessPoint.{i}.AssociatedDevice.{i}.Stats. *** */
+DMLEAF tWiFiAccessPointAssociatedDeviceStatsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"BytesSent", &DMREAD, DMT_UNINT, get_access_point_associative_device_statistics_tx_bytes, NULL, NULL, NULL, BBFDM_BOTH},
+{"BytesReceived", &DMREAD, DMT_UNINT, get_access_point_associative_device_statistics_rx_bytes, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsSent", &DMREAD, DMT_UNINT, get_access_point_associative_device_statistics_tx_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"PacketsReceived", &DMREAD, DMT_UNINT, get_access_point_associative_device_statistics_rx_packets, NULL, NULL, NULL, BBFDM_BOTH},
+{"ErrorsSent", &DMREAD, DMT_UNINT, get_access_point_associative_device_statistics_tx_errors, NULL, NULL, NULL, BBFDM_BOTH},
+{"RetransCount", &DMREAD, DMT_UNINT, get_access_point_associative_device_statistics_retrans_count, NULL, NULL, NULL, BBFDM_BOTH},
+{"FailedRetransCount", &DMREAD, DMT_UNINT, get_access_point_associative_device_statistics_failed_retrans_count, NULL, NULL, NULL, BBFDM_BOTH},
+{"RetryCount", &DMREAD, DMT_UNINT, get_access_point_associative_device_statistics_retry_count, NULL, NULL, NULL, BBFDM_BOTH},
+{"MultipleRetryCount", &DMREAD, DMT_UNINT, get_access_point_associative_device_statistics_multiple_retry_count, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.AccessPoint.{i}.Accounting. *** */
+DMLEAF tWiFiAccessPointAccountingParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+//{"Enable", &DMWRITE, DMT_BOOL, get_WiFiAccessPointAccounting_Enable, set_WiFiAccessPointAccounting_Enable, NULL, NULL, BBFDM_BOTH},
+{"ServerIPAddr", &DMWRITE, DMT_STRING, get_WiFiAccessPointAccounting_ServerIPAddr, set_WiFiAccessPointAccounting_ServerIPAddr, NULL, NULL, BBFDM_BOTH},
+//{"SecondaryServerIPAddr", &DMWRITE, DMT_STRING, get_WiFiAccessPointAccounting_SecondaryServerIPAddr, set_WiFiAccessPointAccounting_SecondaryServerIPAddr, NULL, NULL, BBFDM_BOTH},
+{"ServerPort", &DMWRITE, DMT_UNINT, get_WiFiAccessPointAccounting_ServerPort, set_WiFiAccessPointAccounting_ServerPort, NULL, NULL, BBFDM_BOTH},
+//{"SecondaryServerPort", &DMWRITE, DMT_UNINT, get_WiFiAccessPointAccounting_SecondaryServerPort, set_WiFiAccessPointAccounting_SecondaryServerPort, NULL, NULL, BBFDM_BOTH},
+{"Secret", &DMWRITE, DMT_STRING, get_WiFiAccessPointAccounting_Secret, set_WiFiAccessPointAccounting_Secret, NULL, NULL, BBFDM_BOTH},
+//{"SecondarySecret", &DMWRITE, DMT_STRING, get_WiFiAccessPointAccounting_SecondarySecret, set_WiFiAccessPointAccounting_SecondarySecret, NULL, NULL, BBFDM_BOTH},
+//{"InterimInterval", &DMWRITE, DMT_UNINT, get_WiFiAccessPointAccounting_InterimInterval, set_WiFiAccessPointAccounting_InterimInterval, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/*** WiFi.AccessPoint.X_IOPSYS_EU_IEEE80211r. ***/
+DMLEAF tWiFiAcessPointIEEE80211rParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_access_point_ieee80211r_enable, set_access_point_ieee80211r_enable, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.EndPoint.{i}. *** */
+DMOBJ tWiFiEndPointObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Stats", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiEndPointStatsParams, NULL, BBFDM_BOTH},
+{"Security", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiEndPointSecurityParams, NULL, BBFDM_BOTH},
+{"Profile", &DMREAD, NULL, NULL, NULL, browseWiFiEndPointProfileInst, NULL, NULL, tWiFiEndPointProfileObj, tWiFiEndPointProfileParams, NULL, BBFDM_BOTH},
+{"WPS", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiEndPointWPSParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tWiFiEndPointParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_WiFiEndPoint_Enable, set_WiFiEndPoint_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_WiFiEndPoint_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_WiFiEndPoint_Alias, set_WiFiEndPoint_Alias, NULL, NULL, BBFDM_BOTH},
+//{"ProfileReference", &DMWRITE, DMT_STRING, get_WiFiEndPoint_ProfileReference, set_WiFiEndPoint_ProfileReference, NULL, NULL, BBFDM_BOTH},
+{"SSIDReference", &DMREAD, DMT_STRING, get_WiFiEndPoint_SSIDReference, NULL, NULL, NULL, BBFDM_BOTH},
+//{"ProfileNumberOfEntries", &DMREAD, DMT_UNINT, get_WiFiEndPoint_ProfileNumberOfEntries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.EndPoint.{i}.Stats. *** */
+DMLEAF tWiFiEndPointStatsParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"LastDataDownlinkRate", &DMREAD, DMT_UNINT, get_WiFiEndPointStats_LastDataDownlinkRate, NULL, NULL, NULL, BBFDM_BOTH},
+{"LastDataUplinkRate", &DMREAD, DMT_UNINT, get_WiFiEndPointStats_LastDataUplinkRate, NULL, NULL, NULL, BBFDM_BOTH},
+{"SignalStrength", &DMREAD, DMT_INT, get_WiFiEndPointStats_SignalStrength, NULL, NULL, NULL, BBFDM_BOTH},
+{"Retransmissions", &DMREAD, DMT_UNINT, get_WiFiEndPointStats_Retransmissions, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.EndPoint.{i}.Security. *** */
+DMLEAF tWiFiEndPointSecurityParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"ModesSupported", &DMREAD, DMT_STRING, get_WiFiEndPointSecurity_ModesSupported, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.EndPoint.{i}.Profile.{i}. *** */
+DMOBJ tWiFiEndPointProfileObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Security", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tWiFiEndPointProfileSecurityParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tWiFiEndPointProfileParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_WiFiEndPointProfile_Enable, set_WiFiEndPointProfile_Enable, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_WiFiEndPointProfile_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_WiFiEndPointProfile_Alias, set_WiFiEndPointProfile_Alias, NULL, NULL, BBFDM_BOTH},
+{"SSID", &DMWRITE, DMT_STRING, get_WiFiEndPointProfile_SSID, set_WiFiEndPointProfile_SSID, NULL, NULL, BBFDM_BOTH},
+{"Location", &DMWRITE, DMT_STRING, get_WiFiEndPointProfile_Location, set_WiFiEndPointProfile_Location, NULL, NULL, BBFDM_BOTH},
+{"Priority", &DMWRITE, DMT_UNINT, get_WiFiEndPointProfile_Priority, set_WiFiEndPointProfile_Priority, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.EndPoint.{i}.Profile.{i}.Security. *** */
+DMLEAF tWiFiEndPointProfileSecurityParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"ModeEnabled", &DMWRITE, DMT_STRING, get_WiFiEndPointProfileSecurity_ModeEnabled, set_WiFiEndPointProfileSecurity_ModeEnabled, NULL, NULL, BBFDM_BOTH},
+{"WEPKey", &DMWRITE, DMT_HEXBIN, get_empty, set_WiFiEndPointProfileSecurity_WEPKey, NULL, NULL, BBFDM_BOTH},
+{"PreSharedKey", &DMWRITE, DMT_HEXBIN, get_empty, set_WiFiEndPointProfileSecurity_PreSharedKey, NULL, NULL, BBFDM_BOTH},
+{"KeyPassphrase", &DMWRITE, DMT_STRING, get_empty, set_WiFiEndPointProfileSecurity_KeyPassphrase, NULL, NULL, BBFDM_BOTH},
+{"MFPConfig", &DMWRITE, DMT_STRING, get_WiFiEndPointProfileSecurity_MFPConfig, set_WiFiEndPointProfileSecurity_MFPConfig, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.WiFi.EndPoint.{i}.WPS. *** */
+DMLEAF tWiFiEndPointWPSParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_WiFiEndPointWPS_Enable, set_WiFiEndPointWPS_Enable, NULL, NULL, BBFDM_BOTH},
+{"ConfigMethodsSupported", &DMREAD, DMT_STRING, get_WiFiEndPointWPS_ConfigMethodsSupported, NULL, NULL, NULL, BBFDM_BOTH},
+{"ConfigMethodsEnabled", &DMWRITE, DMT_STRING, get_WiFiEndPointWPS_ConfigMethodsEnabled, set_WiFiEndPointWPS_ConfigMethodsEnabled, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_WiFiEndPointWPS_Status, NULL, NULL, NULL, BBFDM_BOTH},
+{"Version", &DMREAD, DMT_STRING, get_WiFiEndPointWPS_Version, NULL, NULL, NULL, BBFDM_BOTH},
+{"PIN", &DMWRITE, DMT_UNINT, get_WiFiEndPointWPS_PIN, set_WiFiEndPointWPS_PIN, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/**************************************************************************
+* LINKER
+***************************************************************************/
+int get_linker_Wifi_Radio(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) {
+	if(data && ((struct wifi_radio_args *)data)->wifi_radio_sec) {
+		*linker = section_name(((struct wifi_radio_args *)data)->wifi_radio_sec);
+		return 0;
+	}
+	*linker = "";
+	return 0;
+}
+
+int get_linker_Wifi_Ssid(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) {
+	if(data && ((struct wifi_ssid_args *)data)->ifname) {
+		*linker = ((struct wifi_ssid_args *)data)->ifname;
+		return 0;
+	}
+	*linker = "";
+	return 0;
+}
+
+int get_linker_associated_device(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) {
+	struct wifi_associative_device_args* cur_wifi_associative_device_args = (struct wifi_associative_device_args*)data;
+	if(data && cur_wifi_associative_device_args->macaddress) {
+		*linker= cur_wifi_associative_device_args->macaddress;
+		return 0;
+	}
+	*linker = "";
+	return 0;
+}
+/**************************************************************************
+* INIT
+***************************************************************************/
+inline int init_wifi_radio(struct wifi_radio_args *args, struct uci_section *s)
+{
+	args->wifi_radio_sec = s;
+	return 0;
+}
+
+inline int init_wifi_ssid(struct wifi_ssid_args *args, struct uci_section *s, char *wiface, char *linker)
+{
+	args->wifi_ssid_sec = s;
+	args->ifname = wiface;
+	args->linker = linker;
+	return 0;
+}
+
+inline int init_wifi_acp(struct wifi_acp_args *args, struct uci_section *s, char *wiface)
+{
+	args->wifi_acp_sec = s;
+	args->ifname = wiface;
+	return 0;
+}
+
+inline int init_wifi_enp(struct wifi_enp_args *args, struct uci_section *s, char *wiface)
+{
+	args->wifi_enp_sec = s;
+	args->ifname = wiface;
+	return 0;
+}
+/**************************************************************************
+* SET & GET VALUE
+***************************************************************************/
+/*#Device.WiFi.RadioNumberOfEntries!UCI:wireless/wifi-device/*/
+int get_WiFi_RadioNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	int nbre= 0;
+
+	uci_foreach_sections("wireless", "wifi-device", s) {
+		nbre++;
+	}
+	dmasprintf(value, "%d", nbre);
+	return 0;
+}
+
+/*#Device.WiFi.SSIDNumberOfEntries!UCI:wireless/wifi-iface/*/
+int get_WiFi_SSIDNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	int nbre= 0;
+
+	uci_foreach_sections("wireless", "wifi-iface", s) {
+		nbre++;
+	}
+	dmasprintf(value, "%d", nbre);
+	return 0;
+}
+
+/*#Device.WiFi.AccessPointNumberOfEntries!UCI:wireless/wifi-iface/*/
+int get_WiFi_AccessPointNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	int nbre= 0;
+	char *mode= NULL;
+
+	uci_foreach_sections("wireless", "wifi-iface", s) {
+		dmuci_get_value_by_section_string(s, "mode", &mode);
+		if((strlen(mode)>0 || mode[0] != '\0') && strcmp(mode, "ap") != 0)
+			continue;
+		nbre++;
+	}
+	dmasprintf(value, "%d", nbre);
+	return 0;
+}
+
+/*#Device.WiFi.EndPointNumberOfEntries!UCI:wireless/wifi-iface/*/
+int get_WiFi_EndPointNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	int nbre= 0;
+	char *mode= NULL;
+
+	uci_foreach_sections("wireless", "wifi-iface", s) {
+		dmuci_get_value_by_section_string(s, "mode", &mode);
+		if(strcmp(mode, "wet") == 0 || strcmp(mode, "sta") == 0)
+			nbre++;
+	}
+	dmasprintf(value, "%d", nbre);
+	return 0;
+}
+
+int get_wifi_bandsteering_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("wireless", "bandsteering", "enabled", value);
+	return 0;
+}
+
+int set_wifi_bandsteering_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b) {
+				dmuci_set_value("wireless", "bandsteering", "enabled", "1");
+			}
+			else {
+				dmuci_set_value("wireless", "bandsteering", "enabled", "0");
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.SSID.{i}.Enable!UCI:wireless/wifi-iface,@i-1/disabled*/
+int get_wifi_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *val;
+	dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->wifi_ssid_sec, "disabled", &val);
+	if ((val[0] == '\0') || (val[0] == '0'))
+		*value = "1";
+	else
+		*value = "0";
+	return 0;
+}
+
+int set_wifi_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->wifi_ssid_sec, "disabled", "0");
+			else
+				dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->wifi_ssid_sec, "disabled", "1");
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.SSID.{i}.Status!UCI:wireless/wifi-iface,@i-1/disabled*/
+int get_wifi_status (char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->wifi_ssid_sec, "disabled", value);
+	if ((*value)[0] == '\0' || (*value)[0] == '0')
+		*value = "Up";
+	else
+		*value = "Down";
+	return 0;
+}
+
+/*#Device.WiFi.SSID.{i}.SSID!UCI:wireless/wifi-iface,@i-1/ssid*/
+static int get_wlan_ssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->wifi_ssid_sec, "ssid", value);
+	return 0;
+}
+
+static int set_wlan_ssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->wifi_ssid_sec, "ssid", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.SSID.{i}.BSSID!UBUS:router.wireless/status/vif,@Name/bssid*/
+static int get_wlan_bssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("router.wireless", "status", UBUS_ARGS{{"vif", ((struct wifi_ssid_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 1, "bssid");
+	return 0;
+}
+
+/*#Device.WiFi.SSID.{i}.MACAddress!UBUS:router.device/status/name,@Name/macaddr*/
+int get_WiFiSSID_MACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct wifi_ssid_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 1, "macaddr");
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.Enable!UCI:wireless/wifi-device,@i-1/disabled*/
+int get_radio_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *val;
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "disabled", &val);
+
+	if (val[0] == '1')
+		*value = "0";
+	else
+		*value = "1";
+	return 0;
+}
+
+int set_radio_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "disabled", "0");
+			else
+				dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "disabled", "1");
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.Status!UCI:wireless/wifi-device,@i-1/disabled*/
+int get_radio_status (char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "disabled", value);
+	if ((*value)[0] == '1')
+		*value = "Down";
+	else
+		*value = "Up";
+	return 0;
+}
+
+int get_WiFiRadio_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value="";
+	return 0;
+}
+
+int set_WiFiRadio_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			return FAULT_9007;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiRadio_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmasprintf(value, "%s", section_name(((struct wifi_radio_args *)data)->wifi_radio_sec));
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.MaxBitRate!UBUS:router.wireless/radios//@Name.rate*/
+int get_radio_max_bit_rate (char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	char *wlan_name, *rate;
+
+	*value = "";
+	wlan_name = section_name(((struct wifi_radio_args *)data)->wifi_radio_sec);
+	dmubus_call("router.wireless", "radios", UBUS_ARGS{}, 0, &res);
+	if(res) {
+		rate = dmjson_get_value(res, 2, wlan_name, "rate");
+		*value = strtok(rate, " Mbps");
+	}
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.OperatingFrequencyBand!UBUS:router.wireless/status/vif,@Name/frequency*/
+int get_radio_frequency(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *freq;
+	json_object *res;
+	char *wlan_name = section_name(((struct wifi_radio_args *)data)->wifi_radio_sec);
+	dmubus_call("router.wireless", "status", UBUS_ARGS{{"vif", wlan_name, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	freq = dmjson_get_value(res, 1, "frequency");
+	if(strcmp(freq, "2") == 0 ) {
+		dmastrcat(value, freq, ".4GHz");  // MEM WILL BE FREED IN DMMEMCLEAN
+		return 0;
+	}
+	dmastrcat(value, freq, "GHz");  // MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.OperatingChannelBandwidth!UCI:wireless/wifi-device,@i-1/bandwidth&UBUS:router.wireless/status/vif,@Name/bandwidth*/
+int get_radio_operating_channel_bandwidth(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *bandwith;
+	json_object *res;
+	char *wlan_name;
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "bandwidth", value);
+	if (value[0] == '\0')
+	{
+		wlan_name = section_name(((struct wifi_radio_args *)data)->wifi_radio_sec);
+		dmubus_call("router.wireless", "status", UBUS_ARGS{{"vif", wlan_name, String}}, 1, &res);
+		DM_ASSERT(res, *value = "");
+		bandwith = dmjson_get_value(res, 1, "bandwidth");
+		dmastrcat(value, bandwith, "MHz"); // MEM WILL BE FREED IN DMMEMCLEAN
+	}
+	else
+		dmastrcat(value, *value, "MHz"); // MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+int set_radio_operating_channel_bandwidth(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *pch, *spch, *dup;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dup = dmstrdup(value);
+			pch = strtok_r(dup, "Mm", &spch);
+			dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "bandwidth", pch);
+			dmfree(dup);
+			return 0;
+	}
+	return 0;
+}
+
+int get_radio_maxassoc(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "maxassoc", value);
+	return 0;
+}
+
+int set_radio_maxassoc(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "maxassoc", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_radio_dfsenable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *val;
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "band", &val);
+	if (val[0] == 'a') {
+		dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "dfsc", value);
+		if ((*value)[0] == '\0')
+			*value = "0";
+	}
+	return 0;
+}
+
+int set_radio_dfsenable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	char *val;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "band", &val);
+			if (val[0] == 'a') {
+				string_to_bool(value, &b);
+				if (b)
+					dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "dfsc", "1");
+				else
+					dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "dfsc", "0");
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.SupportedStandards!UBUS:router.wireless/radios//hwmodes*/
+int get_radio_supported_standard(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *freq, *wlan_name;
+	json_object *res;
+
+	wlan_name = section_name(((struct wifi_radio_args *)data)->wifi_radio_sec);
+	dmubus_call("router.wireless", "radios", UBUS_ARGS{}, 0, &res);
+	json_object_object_foreach(res, key, radio_obj) {
+		if(strcmp(wlan_name, key) == 0) {
+			*value = dmjson_get_value_array_all(radio_obj, DELIMITOR, 1, "hwmodes");
+		}
+	}
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.OperatingStandards!UBUS:router.wireless/radios//opmode*/
+int get_radio_operating_standard(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res = NULL;
+	dmubus_call("router.wireless", "radios", UBUS_ARGS{}, 0, &res);
+	DM_ASSERT(res, *value = "");
+	json_object_object_foreach(res, key, radio_obj) {
+		if(strcmp(section_name(((struct wifi_radio_args *)data)->wifi_radio_sec), key) == 0) {
+			*value = dmjson_get_value(radio_obj, 1, "opmode");
+			break;
+		}
+	}
+	return 0;
+}
+
+int set_radio_operating_standard(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *freq, *wlan_name;
+	json_object *res;
+	switch (action) {
+			case VALUECHECK:
+				return 0;
+			case VALUESET:
+				wlan_name = section_name(((struct wifi_radio_args *)data)->wifi_radio_sec);
+				dmubus_call("router.wireless", "status", UBUS_ARGS{{"vif", wlan_name, String}}, 1, &res);
+				freq = dmjson_get_value(res, 1, "frequency");
+				if (strcmp(freq, "5") == 0) {
+					 if (strcmp(value, "n") == 0)
+						value = "11n"; 
+					 else if (strcmp(value, "ac") == 0)
+						value = "11ac";
+					dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "hwmode", value);
+				} else {
+					if (strcmp(value, "b") == 0)
+						value = "11b";
+					else if (strcmp(value, "b,g") == 0 || strcmp(value, "g,b") == 0)
+						value = "11bg";
+					else if (strcmp(value, "g") == 0)
+						value = "11g";
+					 else if (strcmp(value, "n") == 0)
+						value = "11n";
+					dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "hwmode", value);
+				}
+				return 0;
+		}
+		return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.PossibleChannels!UBUS:router.wireless/radios//@Name.channels*/
+int get_radio_possible_channels(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	char *wlan_name;
+	
+	*value = "";
+	wlan_name = section_name(((struct wifi_radio_args *)data)->wifi_radio_sec);
+	dmubus_call("router.wireless", "radios", UBUS_ARGS{}, 0, &res);
+	if(res)
+		*value = dmjson_get_value_array_all(res, DELIMITOR, 2, wlan_name, "channels");
+	return 0;
+}
+
+int get_WiFiRadio_AutoChannelSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value="true";
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.AutoChannelRefreshPeriod!UCI:wireless/wifi-device,@i-1/scantimer*/
+int get_WiFiRadio_AutoChannelRefreshPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "scantimer", value);
+	return 0;
+}
+
+int set_WiFiRadio_AutoChannelRefreshPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "scantimer", value);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.MaxSupportedAssociations!UCI:wireless/wifi-device,@i-1/maxassoc*/
+int get_WiFiRadio_MaxSupportedAssociations(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "maxassoc", value);
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.FragmentationThreshold!UCI:wireless/wifi-device,@i-1/frag*/
+int get_WiFiRadio_FragmentationThreshold(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "frag", value);
+	return 0;
+}
+
+int set_WiFiRadio_FragmentationThreshold(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "frag", value);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.RTSThreshold!UCI:wireless/wifi-device,@i-1/rts*/
+int get_WiFiRadio_RTSThreshold(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "rts", value);
+	return 0;
+}
+
+int set_WiFiRadio_RTSThreshold(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "rts", value);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.BeaconPeriod!UCI:wireless/wifi-device,@i-1/beacon_int*/
+int get_WiFiRadio_BeaconPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "beacon_int", value);
+	return 0;
+}
+
+int set_WiFiRadio_BeaconPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "beacon_int", value);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.DTIMPeriod!UCI:wireless/wifi-device,@i-1/dtim_period*/
+int get_WiFiRadio_DTIMPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "dtim_period", value);
+	return 0;
+}
+
+int set_WiFiRadio_DTIMPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "dtim_period", value);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.SupportedOperatingChannelBandwidths!UBUS:router.wireless/radios//@Name.bandwidth*/
+int get_WiFiRadio_SupportedOperatingChannelBandwidths(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res, *jobj;
+
+	dmubus_call("router.wireless", "radios", UBUS_ARGS{{}}, 0, &res);
+	if(res)
+		*value = dmjson_get_value_array_all(res, DELIMITOR, 2, section_name(((struct wifi_radio_args *)data)->wifi_radio_sec), "bwcaps");
+
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.OperatingChannelBandwidth!UCI:wireless/wifi-device,@i-1/bandwidth*/
+int get_WiFiRadio_OperatingChannelBandwidth(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "bandwidth", value);
+	if(*value[0] == '\0') {
+		*value= "";
+		return 0;
+	}
+	dmastrcat(value, *value, "MHz");
+	return 0;
+}
+
+int set_WiFiRadio_OperatingChannelBandwidth(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "bandwidth", value);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.CurrentOperatingChannelBandwidth!UBUS:router.wireless/radios//@Name.bandwidth*/
+int get_WiFiRadio_CurrentOperatingChannelBandwidth(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+
+	dmubus_call("router.wireless", "status", UBUS_ARGS{{"vif", section_name(((struct wifi_radio_args *)data)->wifi_radio_sec), String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	if(res)
+		*value = dmjson_get_value(res, 1, "bandwidth");
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.PreambleType!UCI:wireless/wifi-device,@i-1/short_preamble*/
+int get_WiFiRadio_PreambleType(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *preamble= NULL;
+
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "short_preamble", &preamble);
+	if (preamble[0] == '\0' || strlen(preamble) == 0 || strcmp(preamble, "1") != 0)
+		*value= "long";
+	else
+		*value= "short";
+	return 0;
+}
+
+int set_WiFiRadio_PreambleType(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			if(strcmp(value, "short") == 0)
+				dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "short_preamble", "1");
+			else
+				dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "short_preamble", "0");
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiRadio_IEEE80211hSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value= "true";
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.IEEE80211hEnabled!UCI:wireless/wifi-device,@i-1/doth*/
+int get_WiFiRadio_IEEE80211hEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "doth", value);
+	return 0;
+}
+
+int set_WiFiRadio_IEEE80211hEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "doth", "1");
+			else
+				dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "doth", "0");
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.TransmitPower!UCI:wireless/wifi-device,@i-1/txpower*/
+int get_WiFiRadio_TransmitPower(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "txpower", value);
+	return 0;
+}
+
+int set_WiFiRadio_TransmitPower(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "txpower", value);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.RegulatoryDomain!UCI:wireless/wifi-device,@i-1/country*/
+int get_WiFiRadio_RegulatoryDomain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *country, **arr;
+	int length;
+
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "country", &country);
+	arr= strsplit(country, "/", &length);
+	if(strlen(arr[0]) > 0)
+		dmasprintf(value, "%s", arr[0]);
+	else
+		*value= "";
+
+	return 0;
+}
+
+int set_WiFiRadio_RegulatoryDomain(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *country, **arr;
+	int length;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "country", &country);
+			if(strlen(country)>0){
+				arr= strsplit(country, "/", &length);
+				dmasprintf(&country, "%s/%s", value, arr[1]);
+			} else
+				dmasprintf(&country, "%s/1", value);
+			dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "country", country);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.ChannelsInUse!UCI:wireless/wifi-device,@i-1/channel*/
+int get_radio_channel(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	char *wlan_name;
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "channel", value);
+	if (strcmp(*value, "auto") == 0 || (*value)[0] == '\0') {
+		wlan_name = section_name(((struct wifi_radio_args *)data)->wifi_radio_sec);
+		dmubus_call("router.wireless", "status", UBUS_ARGS{{"vif", wlan_name, String}}, 1, &res);
+		DM_ASSERT(res, *value = "");
+		*value = dmjson_get_value(res, 1, "channel");
+	}
+	return 0;
+}
+
+int set_radio_channel(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "channel", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.AutoChannelEnable!UCI:wireless/wifi-device,@i-1/channel*/
+int get_radio_auto_channel_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_radio_args *)data)->wifi_radio_sec, "channel", value);
+	if (strcmp(*value, "auto") == 0 || (*value)[0] == '\0')
+		*value = "1";
+	else
+		*value = "0";
+	return 0;
+}
+
+int set_radio_auto_channel_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	json_object *res;
+	char *wlan_name;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				value = "auto";
+			else {
+				wlan_name = section_name(((struct wifi_radio_args *)data)->wifi_radio_sec);
+				dmubus_call("router.wireless", "status", UBUS_ARGS{{"vif", wlan_name, String}}, 1, &res);
+				if(res == NULL)
+					return 0;
+				else
+					value = dmjson_get_value(res, 1, "channel");
+			}
+			dmuci_set_value_by_section(((struct wifi_radio_args *)data)->wifi_radio_sec, "channel", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*************************************************************
+ * GET STAT
+/*************************************************************/
+/*#Device.WiFi.Radio.{i}.Stats.BytesSent!UBUS:network.device/status/name,@Name/statistics.tx_bytes*/
+int get_radio_statistics_tx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", section_name(((struct wifi_radio_args *)data)->wifi_radio_sec), String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "tx_bytes");
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.Stats.BytesReceived!UBUS:network.device/status/name,@Name/statistics.rx_bytes*/
+int get_radio_statistics_rx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", section_name(((struct wifi_radio_args *)data)->wifi_radio_sec), String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "rx_bytes");
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.Stats.PacketsSent!UBUS:network.device/status/name,@Name/statistics.tx_packets*/
+int get_radio_statistics_tx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", section_name(((struct wifi_radio_args *)data)->wifi_radio_sec), String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "tx_packets");
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.Stats.PacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_packets*/
+int get_radio_statistics_rx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", section_name(((struct wifi_radio_args *)data)->wifi_radio_sec), String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "rx_packets");
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.Stats.ErrorsSent!UBUS:network.device/status/name,@Name/statistics.tx_errors*/
+int get_radio_statistics_tx_errors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", section_name(((struct wifi_radio_args *)data)->wifi_radio_sec), String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "tx_errors");
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.Stats.ErrorsReceived!UBUS:network.device/status/name,@Name/statistics.rx_errors*/
+int get_radio_statistics_rx_errors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", section_name(((struct wifi_radio_args *)data)->wifi_radio_sec), String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "rx_errors");
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.Stats.DiscardPacketsSent!UBUS:network.device/status/name,@Name/statistics.tx_dropped*/
+int get_radio_statistics_tx_discardpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", section_name(((struct wifi_radio_args *)data)->wifi_radio_sec), String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "tx_dropped");
+	return 0;
+}
+
+/*#Device.WiFi.Radio.{i}.Stats.DiscardPacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_dropped*/
+int get_radio_statistics_rx_discardpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", section_name(((struct wifi_radio_args *)data)->wifi_radio_sec), String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "rx_dropped");
+	return 0;
+}
+
+int get_WiFiRadioStats_Noise(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+
+	dmubus_call("router.wireless", "status", UBUS_ARGS{{"vif", section_name(((struct wifi_radio_args *)data)->wifi_radio_sec), String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	if(res)
+		*value = dmjson_get_value(res, 1, "noise");
+	return 0;
+	return 0;
+}
+
+/*#Device.WiFi.SSID.{i}.Stats.BytesSent!UBUS:network.device/status/name,@Name/statistics.tx_bytes*/
+int get_ssid_statistics_tx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct wifi_ssid_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "tx_bytes");
+	return 0;
+}
+
+/*#Device.WiFi.SSID.{i}.Stats.BytesReceived!UBUS:network.device/status/name,@Name/statistics.rx_bytes*/
+int get_ssid_statistics_rx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct wifi_ssid_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "rx_bytes");
+	return 0;
+}
+
+/*#Device.WiFi.SSID.{i}.Stats.PacketsSent!UBUS:network.device/status/name,@Name/statistics.tx_packets*/
+int get_ssid_statistics_tx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct wifi_ssid_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "tx_packets");
+	return 0;
+}
+
+/*#Device.WiFi.SSID.{i}.Stats.PacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_packets*/
+int get_ssid_statistics_rx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct wifi_ssid_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "rx_packets");
+	return 0;
+}
+
+/*#Device.WiFi.SSID.{i}.Stats.ErrorsSent!UBUS:network.device/status/name,@Name/statistics.tx_errors*/
+int get_WiFiSSIDStats_ErrorsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct wifi_ssid_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "tx_errors");
+	return 0;
+}
+
+/*#Device.WiFi.SSID.{i}.Stats.ErrorsReceived!UBUS:network.device/status/name,@Name/statistics.rx_errors*/
+int get_WiFiSSIDStats_ErrorsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct wifi_ssid_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "rx_errors");
+	return 0;
+}
+
+/*#Device.WiFi.SSID.{i}.Stats.DiscardPacketsSent!UBUS:network.device/status/name,@Name/statistics.tx_dropped*/
+int get_WiFiSSIDStats_DiscardPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct wifi_ssid_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "tx_dropped");
+	return 0;
+}
+
+/*#Device.WiFi.SSID.{i}.Stats.DiscardPacketsReceived!UBUS:network.device/status/name,@Name/statistics.rx_dropped*/
+int get_WiFiSSIDStats_DiscardPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res;
+	dmubus_call("network.device", "status", UBUS_ARGS{{"name", ((struct wifi_ssid_args *)data)->ifname, String}}, 1, &res);
+	DM_ASSERT(res, *value = "");
+	*value = dmjson_get_value(res, 2, "statistics", "rx_dropped");
+	return 0;
+}
+
+int get_WiFiSSIDStats_UnicastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	if (((struct wifi_ssid_args *)data)->ifname && strlen(((struct wifi_ssid_args *)data)->ifname)>0)
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(((struct wifi_ssid_args *)data)->ifname, "TX", "unicast"));
+	return 0;
+}
+
+int get_WiFiSSIDStats_UnicastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	if (((struct wifi_ssid_args *)data)->ifname && strlen(((struct wifi_ssid_args *)data)->ifname)>0)
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(((struct wifi_ssid_args *)data)->ifname, "RX", "unicast"));
+	return 0;
+}
+
+int get_WiFiSSIDStats_MulticastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	if (((struct wifi_ssid_args *)data)->ifname && strlen(((struct wifi_ssid_args *)data)->ifname)>0)
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(((struct wifi_ssid_args *)data)->ifname, "TX", "multicast"));
+	return 0;
+}
+
+int get_WiFiSSIDStats_MulticastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	if (((struct wifi_ssid_args *)data)->ifname && strlen(((struct wifi_ssid_args *)data)->ifname)>0)
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(((struct wifi_ssid_args *)data)->ifname, "RX", "multicast"));
+	return 0;
+}
+
+int get_WiFiSSIDStats_BroadcastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	if (((struct wifi_ssid_args *)data)->ifname && strlen(((struct wifi_ssid_args *)data)->ifname)>0)
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(((struct wifi_ssid_args *)data)->ifname, "TX", "broadcast"));
+	return 0;
+}
+
+int get_WiFiSSIDStats_BroadcastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	if (((struct wifi_ssid_args *)data)->ifname && strlen(((struct wifi_ssid_args *)data)->ifname)>0)
+		dmasprintf(value, "%d", get_stats_from_ifconfig_command(((struct wifi_ssid_args *)data)->ifname, "RX", "broadcast"));
+	return 0;
+}
+
+static char *get_associative_device_statistics(struct wifi_associative_device_args *wifi_associative_device, char *key)
+{
+	json_object *res, *jobj;
+	char *macaddr, *stats = "0";
+	int entries = 0;
+
+	dmubus_call("wifix", "stations", UBUS_ARGS{{"vif", wifi_associative_device->wdev, String}}, 1, &res);
+	while (res) {
+		jobj = dmjson_select_obj_in_array_idx(res, entries, 1, "stations");
+		if(jobj) {
+			macaddr = dmjson_get_value(jobj, 1, "macaddr");
+			if (!strcmp(macaddr, wifi_associative_device->macaddress)) {
+				stats = dmjson_get_value(jobj, 2, "stats", key);
+				if(*stats != '\0')
+					return stats;
+			}
+			entries++;
+		}
+		else
+			break;
+	}
+	return stats;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Stats.BytesSent!UBUS:wifix/stations/vif,@Name/stats.tx_total_bytes*/
+int get_access_point_associative_device_statistics_tx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr = (struct wifi_associative_device_args*)data;
+
+	*value = get_associative_device_statistics(cur_wifi_associative_device_args_ptr, "tx_total_bytes");
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Stats.BytesReceived!UBUS:wifix/stations/vif,@Name/stats.rx_data_bytes*/
+int get_access_point_associative_device_statistics_rx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr = (struct wifi_associative_device_args*)data;
+
+	*value = get_associative_device_statistics(cur_wifi_associative_device_args_ptr, "rx_data_bytes");
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Stats.PacketsSent!UBUS:wifix/stations/vif,@Name/stats.tx_total_pkts*/
+int get_access_point_associative_device_statistics_tx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr = (struct wifi_associative_device_args*)data;
+
+	*value = get_associative_device_statistics(cur_wifi_associative_device_args_ptr, "tx_total_pkts");
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Stats.PacketsReceived!UBUS:wifix/stations/vif,@Name/stats.rx_data_pkts*/
+int get_access_point_associative_device_statistics_rx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr = (struct wifi_associative_device_args*)data;
+
+	*value = get_associative_device_statistics(cur_wifi_associative_device_args_ptr, "rx_data_pkts");
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Stats.ErrorsSent!UBUS:wifix/stations/vif,@Name/stats.tx_failures*/
+int get_access_point_associative_device_statistics_tx_errors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr = (struct wifi_associative_device_args*)data;
+
+	*value = get_associative_device_statistics(cur_wifi_associative_device_args_ptr, "tx_failures");
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Stats.RetransCount!UBUS:wifix/stations/vif,@Name/stats.tx_pkts_retries*/
+int get_access_point_associative_device_statistics_retrans_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr = (struct wifi_associative_device_args*)data;
+
+	*value = get_associative_device_statistics(cur_wifi_associative_device_args_ptr, "tx_pkts_retries");
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Stats.FailedRetransCount!UBUS:wifix/stations/vif,@Name/stats.tx_pkts_retry_exhausted*/
+int get_access_point_associative_device_statistics_failed_retrans_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr = (struct wifi_associative_device_args*)data;
+
+	*value = get_associative_device_statistics(cur_wifi_associative_device_args_ptr, "tx_pkts_retry_exhausted");
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Stats.RetryCount!UBUS:wifix/stations/vif,@Name/stats.tx_pkts_retries*/
+int get_access_point_associative_device_statistics_retry_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr = (struct wifi_associative_device_args*)data;
+
+	*value = get_associative_device_statistics(cur_wifi_associative_device_args_ptr, "tx_pkts_retries");
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Stats.MultipleRetryCount!UBUS:wifix/stations/vif,@Name/stats.tx_data_pkts_retried*/
+int get_access_point_associative_device_statistics_multiple_retry_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr = (struct wifi_associative_device_args*)data;
+
+	*value = get_associative_device_statistics(cur_wifi_associative_device_args_ptr, "tx_data_pkts_retried");
+	return 0;
+}
+
+/**************************************************************************
+* SET & GET VALUE
+***************************************************************************/
+/*#Device.WiFi.SSID.{i}.SSIDAdvertisementEnabled!UCI:wireless/wifi-iface,@i-1/hidden*/
+static int get_wlan_ssid_advertisement_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *hidden;
+	dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->wifi_ssid_sec, "hidden", &hidden);
+	if (hidden[0] == '1' && hidden[1] == '\0')
+		*value = "0";
+	else
+		*value = "1";
+	return 0;
+}
+
+static int set_wlan_ssid_advertisement_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->wifi_ssid_sec, "hidden", "");
+			else
+				dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->wifi_ssid_sec, "hidden", "1");
+			return 0;
+
+	}
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.WMMEnable!UCI:wireless/wifi-device,@i-1/wmm*/
+static int get_wmm_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	bool b;
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "device", value);
+	dmuci_get_option_value_string("wireless", *value, "wmm", value);
+	string_to_bool(*value, &b);
+		if (b)
+			*value = "true";
+		else
+			*value = "false";
+
+	return 0;
+}
+
+static int set_wmm_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	char *device;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "device", &device);
+			if (b) {
+				dmuci_set_value("wireless", device, "wmm", "1");
+				dmuci_set_value("wireless", device, "wmm_noack", "1");
+				dmuci_set_value("wireless", device, "wmm_apsd", "1");
+			}
+			else {
+				dmuci_set_value("wireless", device, "wmm", "0");
+				dmuci_set_value("wireless", device, "wmm_noack", "");
+				dmuci_set_value("wireless", device, "wmm_apsd", "");
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_access_point_total_associations(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	json_object *res, *jobj;
+	int entries = 0;
+	dmubus_call("wifix", "stations", UBUS_ARGS{{"vif", ((struct wifi_ssid_args *)data)->ifname, String}}, 1, &res);
+
+	while (1) {
+		jobj = dmjson_select_obj_in_array_idx(res, entries, 1, "stations");
+		if (jobj == NULL)
+			break;
+		entries++;
+	}
+	dmasprintf(value, "%d", entries); // MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.MaxAssociatedDevices!UCI:wireless/wifi-iface,@i-1/maxassoc*/
+int get_access_point_maxassoc(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *device;
+	dmuci_get_value_by_section_string(((struct wifi_ssid_args *)data)->wifi_ssid_sec, "device", &device);
+	dmuci_get_option_value_string("wireless", device, "maxassoc", value);
+	return 0;
+}
+
+int set_access_point_maxassoc(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *device;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "device", &device);
+			dmuci_set_value("wireless", device, "maxassoc", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.MACAddressControlEnabled!UCI:wireless/wifi-iface,@i-1/macfilter*/
+int get_access_point_control_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *macfilter;
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "macfilter", &macfilter);
+	if (strcmp(macfilter, "deny") == 0 || strcmp(macfilter, "disable") == 0)
+		*value = "false";
+	else
+		*value = "true";
+	return 0;
+}
+
+int get_WiFiAccessPoint_WMMCapability(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value= "true";
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.MaxAllowedAssociations!UCI:wireless/wifi-iface,@i-1/maxassoc*/
+int get_WiFiAccessPoint_MaxAllowedAssociations(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *device;
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "device", &device);
+	dmuci_get_option_value_string("wireless", device, "maxassoc", value);
+	return 0;
+}
+
+int set_WiFiAccessPoint_MaxAllowedAssociations(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *device;
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "device", &device);
+			dmuci_set_value("wireless", device, "maxassoc", value);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.IsolationEnable!UCI:wireless/wifi-iface,@i-1/isolate*/
+int get_WiFiAccessPoint_IsolationEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "isolate", value);
+	return 0;
+}
+
+int set_WiFiAccessPoint_IsolationEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "isolate", "1");
+			else
+				dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "isolate", "0");
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiAccessPoint_AllowedMACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_list *val;
+	dmuci_get_value_by_section_list(((struct wifi_acp_args *)data)->wifi_acp_sec, "maclist", &val);
+	if (val)
+		*value = dmuci_list_to_string(val, " ");
+	else
+		*value = "";
+	return 0;
+}
+
+int set_WiFiAccessPoint_AllowedMACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	int length, i;
+	char **arr;
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			arr= strsplit(value, " ", &length);
+			for (i=0; i<length; i++){
+				dmuci_add_list_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "maclist", arr[i]);
+			}
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiAccessPoint_UAPSDCapability(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value= "true";
+	return 0;
+}
+
+int set_access_point_control_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "macfilter", "allow");
+			else
+				dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "macfilter", "disable");
+
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.UAPSDEnable!UCI:wireless/wifi-iface,@i-1/wmm_apsd*/
+int get_WiFiAccessPoint_UAPSDEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "wmm_apsd", value);
+	return 0;
+}
+
+int set_WiFiAccessPoint_UAPSDEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				value = "1";
+			else
+				value = "0";
+			dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "wmm_apsd", value);
+			break;
+	}
+	return 0;
+}
+int get_access_point_security_supported_modes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "None, WEP-64, WEP-128, WPA-Personal, WPA2-Personal, WPA-WPA2-Personal, WPA-Enterprise, WPA2-Enterprise, WPA-WPA2-Enterprise";
+	return 0;
+}
+
+static void get_value_security_mode(char **value, char *encryption, char *cipher)
+{
+	if (strcmp(encryption, "none") == 0)
+		*value = "None";
+	else if (strcmp(encryption, "wep-open") == 0 || strcmp(encryption, "wep-shared") == 0)
+		*value = "WEP-64";
+	else if (strcmp(encryption, "psk") == 0)
+		*value = "WPA-Personal";
+	else if (strcmp(encryption, "wpa") == 0)
+		*value = "WPA-Enterprise";
+	else if ((strcmp(encryption, "psk2") == 0 && strcmp(cipher, "auto") == 0) || (strcmp(encryption, "psk2") == 0 && strcmp(cipher, "ccmp") == 0) || (strcmp(encryption, "psk2") == 0 && *cipher == '\0'))
+		*value = "WPA2-Personal";
+	else if (strcmp(encryption, "wpa2") == 0)
+		*value = "WPA2-Enterprise";
+	else if ((strcmp(encryption, "mixed-psk") == 0 && strcmp(cipher, "auto") == 0) || (strcmp(encryption, "mixed-psk") == 0 && strcmp(cipher, "ccmp") == 0) || (strcmp(encryption, "mixed-psk") == 0 && strcmp(cipher, "tkip+ccmp") == 0) || (strcmp(encryption, "mixed-psk") == 0 && *cipher == '\0'))
+		*value = "WPA-WPA2-Personal";
+	else if (strcmp(encryption, "wpa-mixed") == 0 || strcmp(encryption, "mixed-wpa") == 0)
+		*value = "WPA-WPA2-Enterprise";
+}
+
+int get_access_point_security_modes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *encryption, *cipher, *mode;
+
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", &encryption);
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "cipher", &cipher);
+	if (*encryption == '\0' && *cipher == '\0') {
+		*value = "None";
+		return 0;
+	}
+	else
+		get_value_security_mode(&mode, encryption, cipher);
+
+	*value = mode;
+	return 0;
+}
+
+int set_access_point_security_modes(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *option, *gnw;
+	char *encryption, *cipher, *mode;
+	char strk64[4][11];
+
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", &encryption);
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "cipher", &cipher);
+	get_value_security_mode(&mode, encryption, cipher);
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, mode) != 0) {
+				if (strcmp(value, "None") == 0) {
+					reset_wlan(((struct wifi_acp_args *)data)->wifi_acp_sec);
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", "none");
+				}
+				else if (strcmp(value, "WEP-64") == 0 || strcmp(value, "WEP-128") == 0) {
+					reset_wlan(((struct wifi_acp_args *)data)->wifi_acp_sec);
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", "wep-open");
+					wepkey64("Iopsys", strk64);
+					int i = 0;
+					while (i < 4) {
+						dmasprintf(&option, "key%d", i + 1);
+						dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, option, strk64[i]);
+						dmfree(option);
+						i++;
+					}
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "key", "1");
+				}
+				else if (strcmp(value, "WPA-Personal") == 0) {
+					reset_wlan(((struct wifi_acp_args *)data)->wifi_acp_sec);
+					gnw = get_nvram_wpakey();
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", "psk");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "key", gnw);
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "cipher", "tkip");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "gtk_rekey", "3600");
+					dmfree(gnw);
+				}
+				else if (strcmp(value, "WPA-Enterprise") == 0) {
+					reset_wlan(((struct wifi_acp_args *)data)->wifi_acp_sec);
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", "wpa");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "radius_server", "");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "radius_port", "1812");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "radius_secret", "");
+				}
+				else if (strcmp(value, "WPA2-Personal") == 0) {
+					reset_wlan(((struct wifi_acp_args *)data)->wifi_acp_sec);
+					gnw = get_nvram_wpakey();
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", "psk2");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "key", gnw);
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "cipher", "ccmp");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "gtk_rekey", "3600");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "wps", "1");
+					dmfree(gnw);
+				}
+				else if (strcmp(value, "WPA2-Enterprise") == 0) {
+					reset_wlan(((struct wifi_acp_args *)data)->wifi_acp_sec);
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", "wpa2");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "radius_server", "");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "radius_port", "1812");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "radius_secret", "");
+				}
+				else if (strcmp(value, "WPA-WPA2-Personal") == 0) {
+					reset_wlan(((struct wifi_acp_args *)data)->wifi_acp_sec);
+					gnw = get_nvram_wpakey();
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", "mixed-psk");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "key", gnw);
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "cipher", "tkip+ccmp");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "gtk_rekey", "3600");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "wps", "1");
+					dmfree(gnw);
+				}
+				else if (strcmp(value, "WPA-WPA2-Enterprise") == 0) {
+					reset_wlan(((struct wifi_acp_args *)data)->wifi_acp_sec);
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", "wpa-mixed");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "radius_server", "");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "radius_port", "1812");
+					dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "radius_secret", "");
+				}
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int set_access_point_security_wepkey(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *key_index, *encryption;
+	char buf[8];
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", &encryption);
+			if (strcmp(encryption, "wep-open") == 0 || strcmp(encryption, "wep-shared") == 0 ) {
+				dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "key_index", &key_index);
+				sprintf(buf,"key%s", key_index);
+				dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, buf, value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_access_point_security_wepkey_index(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *key_index;
+
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "key_index", &key_index);
+	if (*key_index == '\0')
+		*value = "1";
+	else
+		*value = key_index;
+	return 0;
+}
+
+int set_access_point_security_wepkey_index(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (atoi(value)>=1 && atoi(value)<=4) {
+				dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "key_index", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int set_access_point_security_shared_key(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *encryption;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", &encryption);
+			if (strcmp(encryption, "psk") == 0 || strcmp(encryption, "psk2") == 0 || strcmp(encryption, "mixed-psk") == 0 ) {
+				dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "key", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int set_access_point_security_passphrase(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *encryption;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", &encryption);
+			if (strcmp(encryption, "psk") == 0 || strcmp(encryption, "psk2") == 0 || strcmp(encryption, "mixed-psk") == 0 ) {
+				set_access_point_security_shared_key(refparam, ctx, data, instance, value, action);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Security.RekeyingInterval!UCI:wireless/wifi-iface,@i-1/gtk_rekey*/
+int get_access_point_security_rekey_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "gtk_rekey", value);
+	return 0;
+}
+
+int set_access_point_security_rekey_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *key_index, *encryption;
+	char buf[8];
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", &encryption);
+			if (strcmp(encryption, "wep-open") == 0 || strcmp(encryption, "wep-shared") == 0 || strcmp(encryption, "none") == 0)
+				return 0;
+			else {
+				dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "gtk_rekey", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Security.RadiusServerIPAddr!UCI:wireless/wifi-iface,@i-1/radius_server*/
+int get_access_point_security_radius_ip_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "radius_server", value);
+	return 0;
+}
+
+int set_access_point_security_radius_ip_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *key_index, *encryption;
+	char buf[8];
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", &encryption);
+			if (strcmp(encryption, "wpa") == 0 || strcmp(encryption, "wpa2") == 0 || strcmp(encryption, "mixed-wpa") == 0 || strcmp(encryption, "wpa-mixed") == 0)
+				dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "radius_server", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Security.RadiusServerPort!UCI:wireless/wifi-iface,@i-1/radius_port*/
+int get_access_point_security_radius_server_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "radius_port", value);
+	return 0;
+}
+
+int set_access_point_security_radius_server_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *key_index, *encryption;
+	char buf[8];
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", &encryption);
+			if (strcmp(encryption, "wpa") == 0 || strcmp(encryption, "wpa2") == 0 || strcmp(encryption, "mixed-wpa") == 0 || strcmp(encryption, "wpa-mixed") == 0)
+				dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "radius_port", value);
+			return 0;
+	}
+	return 0;
+}
+
+int set_access_point_security_radius_secret(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *key_index, *encryption;
+	char buf[8];
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "encryption", &encryption);
+			if (strcmp(encryption, "wpa") == 0 || strcmp(encryption, "wpa2") == 0 || strcmp(encryption, "mixed-wpa") == 0 || strcmp(encryption, "wpa-mixed") == 0)
+				dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "radius_secret", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Security.MFPConfig!UCI:wireless/wifi-iface,@i-1/ieee80211w*/
+int get_WiFiAccessPointSecurity_MFPConfig(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "ieee80211w", value);
+	return 0;
+}
+
+int set_WiFiAccessPointSecurity_MFPConfig(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "ieee80211w", value);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.WPS.Enable!UCI:wireless/wifi-iface,@i-1/wps*/
+int get_WiFiAccessPointWPS_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "wps", value);
+	if(*value[0] == '\0')
+		*value= "0";
+	return 0;
+}
+
+int set_WiFiAccessPointWPS_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	char *boolS;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "wps", "1");
+			else
+				dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "wps", "0");
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiAccessPointWPS_ConfigMethodsSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value= "PushButton,Label,PIN";
+	return 0;
+}
+
+int get_WiFiAccessPointWPS_ConfigMethodsEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *pushbut= NULL, *label= NULL, *pin= NULL, *methodenabled= NULL, *tmp, *str1, *str2, *str3;
+	bool a, b, c;
+	dmuci_get_value_by_section_string(((struct wifi_enp_args *)data)->wifi_enp_sec, "wps_pushbutton", &pushbut);
+	dmuci_get_value_by_section_string(((struct wifi_enp_args *)data)->wifi_enp_sec, "wps_label", &label);
+	dmuci_get_value_by_section_string(((struct wifi_enp_args *)data)->wifi_enp_sec, "wps_pin", &pin);
+
+	if(pushbut == NULL || pushbut[0]=='\0' || strcmp(pushbut, "1")!=0)
+		str1= dmstrdup("");
+	else
+		str1= dmstrdup("PushButton");
+
+	if(label == NULL || label[0]=='\0' || strcmp(label, "1")!=0)
+		str2= dmstrdup("");
+	else {
+		if(pushbut == NULL || pushbut[0]=='\0' || strcmp(pushbut, "1")!=0)
+			str2= dmstrdup("Label");
+		else
+			str2= dmstrdup(",Label");
+	}
+
+	if(pin == NULL || pin[0]=='\0')
+		str3= dmstrdup("");
+	else {
+		if((pushbut != NULL && pushbut[0]!='\0' && strcmp(pushbut, "1")==0) || (label != NULL && label[0]!='\0' && strcmp(label, "1")==0))
+			str3= dmstrdup(",PIN");
+		else
+			str3= dmstrdup("PIN");
+	}
+
+	dmasprintf(value,"%s%s%s", str1, str2, str3);
+	return 0;
+}
+
+int set_WiFiAccessPointWPS_ConfigMethodsEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.WPS.Status!UCI:wireless/wifi-iface,@i-1/wps*/
+int get_WiFiAccessPointWPS_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *wps_status;
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "wps", &wps_status);
+	if(strcmp(wps_status, "0") == 0)
+		*value= "Disabled";
+	else
+		*value= "Configured";
+	return 0;
+}
+
+int get_WiFiAccessPointWPS_Version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.WPS.PIN!UCI:wireless/wifi-iface,@i-1/wps_pin*/
+int get_WiFiAccessPointWPS_PIN(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "wps_pin", value);
+	return 0;
+}
+
+int set_WiFiAccessPointWPS_PIN(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "wps_pin", value);
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiAccessPointAccounting_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_WiFiAccessPointAccounting_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Accounting.ServerIPAddr!UCI:wireless/wifi-iface,@i-1/acct_server*/
+int get_WiFiAccessPointAccounting_ServerIPAddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "acct_server", value);
+	return 0;
+}
+
+int set_WiFiAccessPointAccounting_ServerIPAddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "acct_server", value);
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiAccessPointAccounting_SecondaryServerIPAddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_WiFiAccessPointAccounting_SecondaryServerIPAddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Accounting.ServerPort!UCI:wireless/wifi-iface,@i-1/acct_port*/
+int get_WiFiAccessPointAccounting_ServerPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "acct_port", value);
+	return 0;
+}
+
+int set_WiFiAccessPointAccounting_ServerPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "acct_port", value);
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiAccessPointAccounting_SecondaryServerPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_WiFiAccessPointAccounting_SecondaryServerPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.Accounting.Secret!UCI:wireless/wifi-iface,@i-1/acct_secret*/
+int get_WiFiAccessPointAccounting_Secret(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "acct_secret", value);
+	return 0;
+}
+
+int set_WiFiAccessPointAccounting_Secret(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "acct_secret", value);
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiAccessPointAccounting_SecondarySecret(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_WiFiAccessPointAccounting_SecondarySecret(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiAccessPointAccounting_InterimInterval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_WiFiAccessPointAccounting_InterimInterval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+
+int get_radio_supported_frequency_bands(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "2.4GHz, 5GHz";
+	return 0;
+}
+
+int get_access_point_associative_device_lastdatadownlinkrate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr=(struct wifi_associative_device_args*)data;
+	dmasprintf(value, "%d", cur_wifi_associative_device_args_ptr->lastdatadownloadlinkrate);
+	return 0;
+}
+
+int get_access_point_associative_device_lastdatauplinkrate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr=(struct wifi_associative_device_args*)data;
+	dmasprintf(value, "%d", cur_wifi_associative_device_args_ptr->lastdatauplinkrate);
+	return 0;
+}
+
+int get_access_point_associative_device_signalstrength(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr=(struct wifi_associative_device_args*)data;
+	dmasprintf(value, "%d", cur_wifi_associative_device_args_ptr->signalstrength);
+	return 0;
+}
+
+int get_WiFiAccessPointAssociatedDevice_Retransmissions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr=(struct wifi_associative_device_args*)data;
+	dmasprintf(value, "%d", cur_wifi_associative_device_args_ptr->retransmissions);
+	return 0;
+}
+
+int get_WiFiAccessPointAssociatedDevice_AssociationTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr=(struct wifi_associative_device_args*)data;
+	dmasprintf(value, "%s", cur_wifi_associative_device_args_ptr->assoctime?int_period_to_date_time_format(cur_wifi_associative_device_args_ptr->assoctime):"0");
+	return 0;
+}
+
+int get_access_point_associative_device_mac(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr=(struct wifi_associative_device_args*)data;
+	dmasprintf(value, cur_wifi_associative_device_args_ptr->macaddress);
+	return 0;
+}
+
+int get_access_point_associative_device_active(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr=(struct wifi_associative_device_args*)data;
+	dmasprintf(value, "%s", cur_wifi_associative_device_args_ptr->active?"true":"false");
+	return 0;
+}
+
+
+int get_WiFiAccessPointAssociatedDevice_Noise(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_associative_device_args *cur_wifi_associative_device_args_ptr=(struct wifi_associative_device_args*)data;
+	dmasprintf(value, "%d", cur_wifi_associative_device_args_ptr->noise);
+	return 0;
+}
+
+int get_access_point_ieee80211r_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_acp_args *)data)->wifi_acp_sec, "ieee80211r", value);
+	if ((*value)[0] == '\0')
+		*value = "0";
+	return 0;
+}
+
+int set_access_point_ieee80211r_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmuci_set_value_by_section(((struct wifi_acp_args *)data)->wifi_acp_sec, "ieee80211r", b?"1":"0");
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.EndPoint.{i}.Enable!UCI:wireless/wifi-iface,@i-1/disabled*/
+int get_WiFiEndPoint_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *val;
+	dmuci_get_value_by_section_string(((struct wifi_enp_args *)data)->wifi_enp_sec, "disabled", &val);
+	if ((val[0] == '\0') || (val[0] == '0'))
+		*value = "1";
+	else
+		*value = "0";
+	return 0;
+}
+
+int set_WiFiEndPoint_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action)	{
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value_by_section(((struct wifi_enp_args *)data)->wifi_enp_sec, "disabled", "0");
+			else
+				dmuci_set_value_by_section(((struct wifi_enp_args *)data)->wifi_enp_sec, "disabled", "1");
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.EndPoint.{i}.Status!UCI:wireless/wifi-iface,@i-1/disabled*/
+int get_WiFiEndPoint_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_enp_args *)data)->wifi_enp_sec, "disabled", value);
+	if ((*value)[0] == '\0' || (*value)[0] == '0')
+		*value = "Up";
+	else
+		*value = "Down";
+	return 0;
+}
+
+int get_WiFiEndPoint_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(((struct wifi_enp_args *)data)->wifi_enp_sec), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "endpointalias", value);
+	return 0;
+	return 0;
+}
+
+int set_WiFiEndPoint_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(((struct wifi_enp_args *)data)->wifi_enp_sec), &dmmap_section);
+			dmuci_set_value_by_section(dmmap_section, "endpointalias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_WiFiEndPoint_ProfileReference(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_WiFiEndPoint_ProfileReference(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiEndPoint_SSIDReference(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cWiFi%cSSID%c", dmroot, dm_delim, dm_delim, dm_delim), ((struct wifi_enp_args *)data)->ifname, value); // MEM WILL BE FREED IN DMMEMCLEAN
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+int get_WiFiEndPointProfile_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value="1";
+	return 0;
+}
+
+int set_WiFiEndPointProfile_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiEndPointProfile_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value="Active";
+	return 0;
+}
+
+int get_WiFiEndPointProfile_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section, *dm;
+	char *epinst= NULL;
+
+	get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name((struct uci_section*)data), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "endpointinstance", &epinst);
+	get_dmmap_section_of_config_section_eq("dmmap_wireless", "ep_profile", "ep_key", epinst, &dm);
+	dmuci_get_value_by_section_string(dm, "ep_profile_alias", value);
+	return 0;
+}
+
+int set_WiFiEndPointProfile_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section, *dm;
+	char *epinst= NULL;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name((struct uci_section*)data), &dmmap_section);
+			dmuci_get_value_by_section_string(dmmap_section, "endpointinstance", &epinst);
+			get_dmmap_section_of_config_section_eq("dmmap_wireless", "ep_profile", "ep_key", epinst, &dm);
+			DMUCI_SET_VALUE_BY_SECTION(icwmpd, dm, "ep_profile_alias", value);
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.EndPoint.{i}.Profile.{i}.SSID!UCI:wireless/wifi-iface,@i-1/ssid*/
+int get_WiFiEndPointProfile_SSID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section*)data, "ssid", value);
+	return 0;
+}
+
+int set_WiFiEndPointProfile_SSID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section*)data, "ssid", value);
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiEndPointProfile_Location(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int set_WiFiEndPointProfile_Location(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiEndPointProfile_Priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value="0";
+	return 0;
+}
+
+int set_WiFiEndPointProfile_Priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.EndPoint.{i}.Profile.{i}.Security.SSID!UCI:wireless/wifi-iface,@i-1/encryption*/
+int get_WiFiEndPointProfileSecurity_ModeEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *encryption, *cipher, *mode;
+
+	dmuci_get_value_by_section_string((struct uci_section *)data, "encryption", &encryption);
+	dmuci_get_value_by_section_string((struct uci_section *)data, "cipher", &cipher);
+	if (*encryption == '\0' && *cipher == '\0') {
+		*value = "None";
+		return 0;
+	}
+	else
+		get_value_security_mode(&mode, encryption, cipher);
+
+	*value = mode;
+	return 0;
+}
+
+int set_WiFiEndPointProfileSecurity_ModeEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *option, *gnw;
+	char *encryption, *cipher, *mode;
+	char strk64[4][11];
+
+	dmuci_get_value_by_section_string((struct uci_section*)data, "encryption", &encryption);
+	dmuci_get_value_by_section_string((struct uci_section*)data, "cipher", &cipher);
+	get_value_security_mode(&mode, encryption, cipher);
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, mode) != 0) {
+				if (strcmp(value, "None") == 0) {
+					reset_wlan((struct uci_section*)data);
+					dmuci_set_value_by_section((struct uci_section*)data, "encryption", "none");
+				}
+				else if (strcmp(value, "WEP-64") == 0 || strcmp(value, "WEP-128") == 0) {
+					reset_wlan((struct uci_section*)data);
+					dmuci_set_value_by_section((struct uci_section*)data, "encryption", "wep-open");
+					wepkey64("Iopsys", strk64);
+					int i = 0;
+					while (i < 4) {
+						dmasprintf(&option, "key%d", i + 1);
+						dmuci_set_value_by_section((struct uci_section*)data, option, strk64[i]);
+						dmfree(option);
+						i++;
+					}
+					dmuci_set_value_by_section((struct uci_section*)data, "key", "1");
+				}
+				else if (strcmp(value, "WPA-Personal") == 0) {
+					reset_wlan((struct uci_section*)data);
+					gnw = get_nvram_wpakey();
+					dmuci_set_value_by_section((struct uci_section*)data, "encryption", "psk");
+					dmuci_set_value_by_section((struct uci_section*)data, "key", gnw);
+					dmuci_set_value_by_section((struct uci_section*)data, "cipher", "tkip");
+					dmuci_set_value_by_section((struct uci_section*)data, "gtk_rekey", "3600");
+					dmfree(gnw);
+				}
+				else if (strcmp(value, "WPA-Enterprise") == 0) {
+						reset_wlan(((struct wifi_acp_args *)data)->wifi_acp_sec);
+						dmuci_set_value_by_section((struct uci_section*)data, "encryption", "wpa");
+						dmuci_set_value_by_section((struct uci_section*)data, "radius_server", "");
+						dmuci_set_value_by_section((struct uci_section*)data, "radius_port", "1812");
+						dmuci_set_value_by_section((struct uci_section*)data, "radius_secret", "");
+				}
+				else if (strcmp(value, "WPA2-Personal") == 0) {
+					reset_wlan((struct uci_section*)data);
+					gnw = get_nvram_wpakey();
+					dmuci_set_value_by_section((struct uci_section*)data, "encryption", "psk2");
+					dmuci_set_value_by_section((struct uci_section*)data, "key", gnw);
+					dmuci_set_value_by_section((struct uci_section*)data, "cipher", "ccmp");
+					dmuci_set_value_by_section((struct uci_section*)data, "gtk_rekey", "3600");
+					dmuci_set_value_by_section((struct uci_section*)data, "wps", "1");
+					dmfree(gnw);
+				}
+				else if (strcmp(value, "WPA2-Enterprise") == 0) {
+					reset_wlan((struct uci_section*)data);
+					dmuci_set_value_by_section((struct uci_section*)data, "encryption", "wpa2");
+					dmuci_set_value_by_section((struct uci_section*)data, "radius_server", "");
+					dmuci_set_value_by_section((struct uci_section*)data, "radius_port", "1812");
+					dmuci_set_value_by_section((struct uci_section*)data, "radius_secret", "");
+				}
+				else if (strcmp(value, "WPA-WPA2-Personal") == 0) {
+					reset_wlan((struct uci_section*)data);
+					gnw = get_nvram_wpakey();
+					dmuci_set_value_by_section((struct uci_section*)data, "encryption", "mixed-psk");
+					dmuci_set_value_by_section((struct uci_section*)data, "key", gnw);
+					dmuci_set_value_by_section((struct uci_section*)data, "cipher", "tkip+ccmp");
+					dmuci_set_value_by_section((struct uci_section*)data, "gtk_rekey", "3600");
+					dmuci_set_value_by_section((struct uci_section*)data, "wps", "1");
+					dmfree(gnw);
+				}
+				else if (strcmp(value, "WPA-WPA2-Enterprise") == 0) {
+					reset_wlan((struct uci_section*)data);
+					dmuci_set_value_by_section((struct uci_section*)data, "encryption", "wpa-mixed");
+					dmuci_set_value_by_section((struct uci_section*)data, "radius_server", "");
+					dmuci_set_value_by_section((struct uci_section*)data, "radius_port", "1812");
+					dmuci_set_value_by_section((struct uci_section*)data, "radius_secret", "");
+				}
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int set_WiFiEndPointProfileSecurity_WEPKey(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *key_index, *encryption;
+	char buf[8];
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section*)data, "encryption", &encryption);
+			if (strcmp(encryption, "wep-open") == 0 || strcmp(encryption, "wep-shared") == 0 ) {
+				dmuci_get_value_by_section_string((struct uci_section*)data, "key_index", &key_index);
+				sprintf(buf,"key%s", key_index);
+				dmuci_set_value_by_section((struct uci_section*)data, buf, value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int set_WiFiEndPointProfileSecurity_PreSharedKey(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *encryption;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section*)data, "encryption", &encryption);
+			if (strcmp(encryption, "psk") == 0 || strcmp(encryption, "psk2") == 0 || strcmp(encryption, "mixed-psk") == 0 ) {
+				dmuci_set_value_by_section((struct uci_section*)data, "key", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int set_WiFiEndPointProfileSecurity_KeyPassphrase(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *encryption;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_value_by_section_string((struct uci_section*)data, "encryption", &encryption);
+			if (strcmp(encryption, "psk") == 0 || strcmp(encryption, "psk2") == 0 || strcmp(encryption, "mixed-psk") == 0 ) {
+				set_WiFiEndPointProfileSecurity_PreSharedKey(refparam, ctx, data, instance, value, action);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.EndPoint.{i}.Profile.{i}.Security.MFPConfig!UCI:wireless/wifi-iface,@i-1/ieee80211w*/
+int get_WiFiEndPointProfileSecurity_MFPConfig(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section*)data, "ieee80211w", value);
+	return 0;
+}
+
+int set_WiFiEndPointProfileSecurity_MFPConfig(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section*)data, "ieee80211w", value);
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiEndPointStats_LastDataDownlinkRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_WiFiEndPointStats_LastDataUplinkRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_WiFiEndPointStats_SignalStrength(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_WiFiEndPointStats_Retransmissions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+int get_WiFiEndPointSecurity_ModesSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+/*#Device.WiFi.EndPoint.{i}.WPS.Enable!UCI:wireless/wifi-iface,@i-1/wps*/
+int get_WiFiEndPointWPS_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_enp_args *)data)->wifi_enp_sec, "wps", value);
+	if(*value[0] == '\0')
+		*value= "0";
+	return 0;
+}
+
+int set_WiFiEndPointWPS_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	char *boolS;
+
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section(((struct wifi_enp_args *)data)->wifi_enp_sec, "wps", "1");
+			else
+				dmuci_set_value_by_section(((struct wifi_enp_args *)data)->wifi_enp_sec, "wps", "0");
+			break;
+	}
+	return 0;
+}
+
+int get_WiFiEndPointWPS_ConfigMethodsSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value= "PushButton,Label,PIN";
+	return 0;
+}
+
+int get_WiFiEndPointWPS_ConfigMethodsEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *pushbut= NULL, *label= NULL, *pin= NULL, *methodenabled= NULL, *tmp, *str1, *str2, *str3;
+	bool a, b, c;
+	dmuci_get_value_by_section_string(((struct wifi_enp_args *)data)->wifi_enp_sec, "wps_pushbutton", &pushbut);
+	dmuci_get_value_by_section_string(((struct wifi_enp_args *)data)->wifi_enp_sec, "wps_label", &label);
+	dmuci_get_value_by_section_string(((struct wifi_enp_args *)data)->wifi_enp_sec, "wps_pin", &pin);
+
+	if(pushbut == NULL || pushbut[0]=='\0' || strcmp(pushbut, "1")!=0)
+		str1= dmstrdup("");
+	else
+		str1= dmstrdup("PushButton");
+
+	if(label == NULL || label[0]=='\0' || strcmp(label, "1")!=0)
+		str2= dmstrdup("");
+	else {
+		if(pushbut == NULL || pushbut[0]=='\0' || strcmp(pushbut, "1")!=0)
+			str2= dmstrdup("Label");
+		else
+			str2= dmstrdup(",Label");
+	}
+
+	if(pin == NULL || pin[0]=='\0')
+		str3= dmstrdup("");
+	else {
+		if((pushbut != NULL && pushbut[0]!='\0' && strcmp(pushbut, "1")==0) || (label != NULL && label[0]!='\0' && strcmp(label, "1")==0))
+			str3= dmstrdup(",PIN");
+		else
+			str3= dmstrdup("PIN");
+	}
+
+	dmasprintf(value,"%s%s%s", str1, str2, str3);
+	return 0;
+}
+
+int set_WiFiEndPointWPS_ConfigMethodsEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			//TODO
+			break;
+	}
+	return 0;
+}
+
+/*#Device.WiFi.EndPoint.{i}.WPS.Status!UCI:wireless/wifi-iface,@i-1/wps*/
+int get_WiFiEndPointWPS_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *wps_status;
+	dmuci_get_value_by_section_string(((struct wifi_enp_args *)data)->wifi_enp_sec, "wps", &wps_status);
+	if(strcmp(wps_status, "0") == 0 || *value[0] == '\0')
+		*value= "Disabled";
+	else
+		*value= "Configured";
+	return 0;
+}
+
+int get_WiFiEndPointWPS_Version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	//TODO
+	return 0;
+}
+
+/*#Device.WiFi.EndPoint.{i}.WPS.PIN!UCI:wireless/wifi-iface,@i-1/wps_pin*/
+int get_WiFiEndPointWPS_PIN(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string(((struct wifi_enp_args *)data)->wifi_enp_sec, "wps_pin", value);
+	return 0;
+}
+
+int set_WiFiEndPointWPS_PIN(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action)	{
+		case VALUECHECK:
+			break;
+		case VALUESET:
+			dmuci_set_value_by_section(((struct wifi_enp_args *)data)->wifi_enp_sec, "wps_pin", value);
+			break;
+	}
+	return 0;
+}
+
+int get_neighboring_wifi_diagnostics_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *ss;
+	json_object *res, *neighboring_wifi_obj;
+
+	uci_foreach_sections("wireless", "wifi-device", ss) {
+		dmubus_call("router.wireless", "scanresults", UBUS_ARGS{{"radio", section_name(ss), String}}, 1, &res);
+		neighboring_wifi_obj = dmjson_select_obj_in_array_idx(res, 0, 1, "access_points");
+		if(neighboring_wifi_obj) {
+			*value = "Complete";
+			break;
+		}
+		else
+			*value = "None";
+	}
+	return 0;
+}
+
+int set_neighboring_wifi_diagnostics_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *ss;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "Requested") == 0) {
+				uci_foreach_sections("wireless", "wifi-device", ss) {
+					dmubus_call_set("router.wireless", "scan", UBUS_ARGS{{"radio", section_name(ss), String}}, 1);
+				}
+				dmubus_call_set("tr069", "inform", UBUS_ARGS{{"event", "8 DIAGNOSTICS COMPLETE", String}}, 1);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_neighboring_wifi_diagnostics_result_number_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *ss;
+	json_object *res, *jobj;
+	int entries = 0, result = 0;
+	*value = "0";
+
+	uci_foreach_sections("wireless", "wifi-device", ss) {
+		dmubus_call("router.wireless", "scanresults", UBUS_ARGS{{"radio", section_name(ss), String}}, 1, &res);
+		while (res) {
+			jobj = dmjson_select_obj_in_array_idx(res, entries, 1, "access_points");
+			if(jobj)
+				entries++;
+			else
+				break;
+		}
+		result = result + entries;
+		entries = 0;
+	}
+	dmasprintf(value, "%d", result); // MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+int get_neighboring_wifi_diagnostics_result_ssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_neighboring_diagnostic_args *cur_wifi_neighboring_diagnostic_args_ptr=(struct wifi_neighboring_diagnostic_args*)data;
+	dmasprintf(value, cur_wifi_neighboring_diagnostic_args_ptr->ssid);
+	return 0;
+}
+
+int get_neighboring_wifi_diagnostics_result_bssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_neighboring_diagnostic_args *cur_wifi_neighboring_diagnostic_args_ptr=(struct wifi_neighboring_diagnostic_args*)data;
+	dmasprintf(value, cur_wifi_neighboring_diagnostic_args_ptr->bssid);
+	return 0;
+}
+
+int get_neighboring_wifi_diagnostics_result_channel(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_neighboring_diagnostic_args *cur_wifi_neighboring_diagnostic_args_ptr=(struct wifi_neighboring_diagnostic_args*)data;
+	dmasprintf(value, "%d", cur_wifi_neighboring_diagnostic_args_ptr->channel);
+	return 0;
+}
+
+int get_neighboring_wifi_diagnostics_result_signal_strength(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_neighboring_diagnostic_args *cur_wifi_neighboring_diagnostic_args_ptr=(struct wifi_neighboring_diagnostic_args*)data;
+	dmasprintf(value, "%d", cur_wifi_neighboring_diagnostic_args_ptr->signalstrength);
+	return 0;
+}
+
+int get_neighboring_wifi_diagnostics_result_operating_frequency_band(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_neighboring_diagnostic_args *cur_wifi_neighboring_diagnostic_args_ptr=(struct wifi_neighboring_diagnostic_args*)data;
+	dmasprintf(value, cur_wifi_neighboring_diagnostic_args_ptr->operatingfrequencyband);
+	return 0;
+}
+
+int get_neighboring_wifi_diagnostics_result_noise(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct wifi_neighboring_diagnostic_args *cur_wifi_neighboring_diagnostic_args_ptr=(struct wifi_neighboring_diagnostic_args*)data;
+	dmasprintf(value, "%d", cur_wifi_neighboring_diagnostic_args_ptr->noise);
+	return 0;
+}
+
+/**************************************************************************
+* SET AND GET ALIAS
+***************************************************************************/
+static int get_radio_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_wireless", "wifi-device", section_name(((struct wifi_radio_args *)data)->wifi_radio_sec), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "radioalias", value);
+	return 0;
+}
+
+static int set_radio_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			get_dmmap_section_of_config_section("dmmap_wireless", "wifi-device", section_name(((struct wifi_radio_args *)data)->wifi_radio_sec), &dmmap_section);
+			dmuci_set_value_by_section(dmmap_section, "radioalias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_ssid_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(((struct wifi_ssid_args *)data)->wifi_ssid_sec), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "ssidalias", value);
+	return 0;
+}
+
+int set_ssid_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(((struct wifi_ssid_args *)data)->wifi_ssid_sec), &dmmap_section);
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, "ssidalias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_access_point_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(((struct wifi_acp_args *)data)->wifi_acp_sec), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "accesspointalias", value);
+	return 0;
+}
+
+int set_access_point_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(((struct wifi_acp_args *)data)->wifi_acp_sec), &dmmap_section);
+			dmuci_set_value_by_section(dmmap_section, "accesspointalias", value);
+			return 0;
+	}
+	return 0;
+}
+/*************************************************************
+ * GET & SET LOWER LAYER
+/*************************************************************/
+int get_ssid_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	if (((struct wifi_ssid_args *)data)->linker[0] != '\0') {
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cWiFi%cRadio%c", dmroot, dm_delim, dm_delim, dm_delim), ((struct wifi_ssid_args *)data)->linker, value); // MEM WILL BE FREED IN DMMEMCLEAN
+		if (*value == NULL)
+			*value = "";
+	}
+	return 0;
+}
+
+int set_ssid_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *linker, *newvalue= NULL;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (value[strlen(value)-1]!='.') {
+				dmasprintf(&newvalue, "%s.", value);
+				adm_entry_get_linker_value(ctx, newvalue, &linker);
+			} else
+				adm_entry_get_linker_value(ctx, value, &linker);
+			if (linker) {
+				dmuci_set_value_by_section(((struct wifi_ssid_args *)data)->wifi_ssid_sec, "device", linker);
+				dmfree(linker);
+			} else {
+				return FAULT_9005;
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_ap_ssid_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	adm_entry_get_linker_param(ctx, dm_print_path("%s%cWiFi%cSSID%c", dmroot, dm_delim, dm_delim, dm_delim), ((struct wifi_acp_args *)data)->ifname, value); // MEM WILL BE FREED IN DMMEMCLEAN
+	if (*value == NULL)
+		*value = "";
+	return 0;
+}
+
+/*************************************************************
+ * ADD DEL OBJ
+/*************************************************************/
+int add_wifi_ssid(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	char *value, *v;
+	char ssid[16] = {0};
+	char *inst;
+	struct uci_section *s = NULL;
+	struct uci_section *dmmap_wifi=NULL;
+
+	check_create_dmmap_package("dmmap_wireless");
+	inst = get_last_instance_icwmpd("dmmap_wireless", "wifi-iface", "ssidinstance");
+	sprintf(ssid, "Iopsys_%d", inst ? (atoi(inst)+1) : 1);
+	dmuci_add_section("wireless", "wifi-iface", &s, &value);
+	dmuci_set_value_by_section(s, "device", "wl0");
+	dmuci_set_value_by_section(s, "encryption", "none");
+	dmuci_set_value_by_section(s, "macfilter", "0");
+	dmuci_set_value_by_section(s, "mode", "ap");
+	dmuci_set_value_by_section(s, "ssid", ssid);
+
+	dmuci_add_section_icwmpd("dmmap_wireless", "wifi-iface", &dmmap_wifi, &v);
+	dmuci_set_value_by_section(dmmap_wifi, "section_name", section_name(s));
+	*instance = update_instance_icwmpd(dmmap_wifi, inst, "ssidinstance");
+	return 0;
+}
+
+int delete_wifi_ssid(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	int found = 0;
+	char *lan_name;
+	struct uci_section *s = NULL;
+	struct uci_section *ss = NULL, *dmmap_section= NULL;
+
+	switch (del_action) {
+		case DEL_INST:
+			get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(((struct wifi_ssid_args *)data)->wifi_ssid_sec), &dmmap_section);
+			if(dmmap_section != NULL)
+				dmuci_delete_by_section(dmmap_section, NULL, NULL);
+			dmuci_delete_by_section(((struct wifi_ssid_args *)data)->wifi_ssid_sec, NULL, NULL);
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("wireless", "wifi-iface", s) {
+				if (found != 0){
+					get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(ss), &dmmap_section);
+					if(dmmap_section != NULL)
+						dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL){
+				get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(ss), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int addObjWiFiEndPoint(char *refparam, struct dmctx *ctx, void *data, char **instance)
+{
+	char *value, *v, *ssid;
+	char *instancepara, *instancepara1, *instancepara2;
+	struct uci_section *endpoint_sec = NULL, *dmmap_sec= NULL;
+	int inst;
+
+	check_create_dmmap_package("dmmap_wireless");
+	instancepara1 = get_last_instance_lev2_icwmpd("wireless", "wifi-iface", "dmmap_wireless", "endpointinstance", "mode", "wet")?get_last_instance_lev2_icwmpd("wireless", "wifi-iface", "dmmap_wireless", "endpointinstance", "mode", "wet"):"0";
+	instancepara2 = get_last_instance_lev2_icwmpd("wireless", "wifi-iface", "dmmap_wireless", "endpointinstance", "mode", "sta")?get_last_instance_lev2_icwmpd("wireless", "wifi-iface", "dmmap_wireless", "endpointinstance", "mode", "sta"):"0";
+	instancepara=atoi(instancepara1)>atoi(instancepara2)?dmstrdup(instancepara1):dmstrdup(instancepara2);
+	dmuci_add_section("wireless", "wifi-iface", &endpoint_sec, &value);
+	dmuci_set_value_by_section(endpoint_sec, "device", "wl1");
+	dmuci_set_value_by_section(endpoint_sec, "mode", "wet");
+	dmuci_set_value_by_section(endpoint_sec, "network", "lan");
+
+	dmuci_add_section_icwmpd("dmmap_wireless", "wifi-iface", &dmmap_sec, &v);
+	dmuci_set_value_by_section(dmmap_sec, "section_name", section_name(endpoint_sec));
+	*instance = update_instance_icwmpd(dmmap_sec, instancepara, "endpointinstance");
+	return 0;
+}
+
+int delObjWiFiEndPoint(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *s = NULL;
+	struct uci_section *ss = NULL;
+	struct uci_section *dmmap_section;
+	char *mode;
+	int found = 0;
+
+	switch (del_action) {
+	case DEL_INST:
+		get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(((struct wifi_ssid_args *)data)->wifi_ssid_sec), &dmmap_section);
+		if(dmmap_section != NULL)
+			dmuci_set_value_by_section(((struct wifi_enp_args *)data)->wifi_enp_sec, "endpointinstance", "");
+		dmuci_set_value_by_section(((struct wifi_enp_args *)data)->wifi_enp_sec, "mode", "");
+		break;
+	case DEL_ALL:
+		uci_foreach_sections("wireless", "wifi-iface", s) {
+			dmuci_get_value_by_section_string(s, "mode", &mode);
+			if(strcmp(mode, "sta")!=0 && strcmp(mode, "wet")!=0)
+				continue;
+			dmuci_set_value_by_section(s, "mode", "");
+			get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(s), &dmmap_section);
+			if(dmmap_section != NULL)
+				dmuci_set_value_by_section(((struct wifi_enp_args *)data)->wifi_enp_sec, "endpointinstance", "");
+		}
+	}
+	return 0;
+}
+/*************************************************************
+ * ENTRY METHOD
+/*************************************************************/
+/*#Device.WiFi.Radio.{i}.!UCI:wireless/wifi-device/dmmap_wireless*/
+int browseWifiRadioInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *wnum = NULL, *wnum_last = NULL;
+	char buf[12];
+	struct uci_section *s = NULL;
+	struct wifi_radio_args curr_wifi_radio_args = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("wireless", "wifi-device", "dmmap_wireless", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		init_wifi_radio(&curr_wifi_radio_args, p->config_section);
+		wnum =  handle_update_instance(1, dmctx, &wnum_last, update_instance_alias, 3, p->dmmap_section, "radioinstance", "radioalias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_wifi_radio_args, wnum) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+/*#Device.WiFi.SSID.{i}.!UCI:wireless/wifi-iface/dmmap_wireless*/
+int browseWifiSsidInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *wnum = NULL, *ssid_last = NULL, *ifname, *acpt_last = NULL, *linker;
+	struct uci_section *ss = NULL;
+	json_object *res;
+	struct wifi_ssid_args curr_wifi_ssid_args = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("wireless", "wifi-iface", "dmmap_wireless", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		dmuci_get_value_by_section_string(p->config_section, "ifname", &ifname);
+		dmuci_get_value_by_section_string(p->config_section, "device", &linker);
+		init_wifi_ssid(&curr_wifi_ssid_args, p->config_section, ifname, linker);
+		wnum =  handle_update_instance(1, dmctx, &ssid_last, update_instance_alias, 3, p->dmmap_section, "ssidinstance", "ssidalias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_wifi_ssid_args, wnum) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+/*#Device.WiFi.AccessPoint.{i}.!UCI:wireless/wifi-iface/dmmap_wireless*/
+int browseWifiAccessPointInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *wnum = NULL, *ssid_last = NULL, *ifname, *acpt_last = NULL, *mode= NULL;
+	struct uci_section *ss = NULL;
+	json_object *res;
+	struct wifi_acp_args curr_wifi_acp_args = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("wireless", "wifi-iface", "dmmap_wireless", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		dmuci_get_value_by_section_string(p->config_section, "mode", &mode);
+		if ((strlen(mode)>0 || mode[0] != '\0') &&strcmp(mode, "ap") != 0)
+			continue;
+		dmuci_get_value_by_section_string(p->config_section, "ifname", &ifname);
+		init_wifi_acp(&curr_wifi_acp_args, p->config_section, ifname);
+		wnum =  handle_update_instance(1, dmctx, &acpt_last, update_instance_alias, 3, p->dmmap_section, "accesspointinstance", "accesspointalias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_wifi_acp_args, wnum) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+/*#Device.WiFi.EndPoint.{i}.!UCI:wireless/wifi-iface/dmmap_wireless*/
+int browseWiFiEndPointInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *wnum = NULL, *ssid_last = NULL, *ifname, *acpt_last = NULL, *mode= NULL;
+	struct uci_section *ss = NULL;
+	json_object *res;
+	struct wifi_enp_args curr_wifi_enp_args = {0};
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("wireless", "wifi-iface", "dmmap_wireless", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		dmuci_get_value_by_section_string(p->config_section, "mode", &mode);
+		if(strcmp(mode, "wet")!=0 && strcmp(mode, "sta")!=0)
+			continue;
+		dmuci_get_value_by_section_string(p->config_section, "ifname", &ifname);
+		init_wifi_enp(&curr_wifi_enp_args, p->config_section, ifname);
+		wnum =  handle_update_instance(1, dmctx, &acpt_last, update_instance_alias, 3, p->dmmap_section, "endpointinstance", "endpointalias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&curr_wifi_enp_args, wnum) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+int browse_wifi_associated_device(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	json_object *res, *associated_client_obj;
+	struct uci_section *ss = NULL;
+	char *value, *ap_ifname, *idx, *idx_last = NULL;
+	int id = 0, entries = 0;
+	char *macaddr= NULL, *active= NULL, *lastdatadownloadlinkrate= NULL, *lastdatauplinkrate= NULL, *signalstrength= NULL, *noise= NULL, *retrans= NULL, *assoctimestr= NULL;
+	struct wifi_associative_device_args cur_wifi_associative_device_args = {0};
+	struct uci_section *dmmap_section;
+
+	uci_foreach_sections("wireless", "wifi-iface", ss) {
+		get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(ss), &dmmap_section);
+		dmuci_get_value_by_section_string(dmmap_section, "accesspointinstance", &value);
+		if(!strcmp(value, prev_instance)){
+			dmuci_get_value_by_section_string(ss, "ifname", &ap_ifname);
+			break;
+		}
+	}
+
+	dmubus_call("wifix", "stations", UBUS_ARGS{{"vif", ap_ifname, String}}, 1, &res);
+	while (res) {
+		associated_client_obj = dmjson_select_obj_in_array_idx(res, entries, 1, "stations");
+		if(associated_client_obj) {
+			cur_wifi_associative_device_args.wdev = ap_ifname;
+			macaddr = dmjson_get_value(associated_client_obj, 1, "macaddr");
+			if(macaddr!=NULL && strlen(macaddr)>0)
+				dmasprintf(&(cur_wifi_associative_device_args.macaddress),dmjson_get_value(associated_client_obj, 1, "macaddr"));
+			cur_wifi_associative_device_args.active = 1;
+			lastdatadownloadlinkrate = dmjson_get_value(associated_client_obj, 2, "stats", "rate_of_last_rx_pkt");
+			if(lastdatadownloadlinkrate!=NULL && strlen(lastdatadownloadlinkrate)>0)
+				cur_wifi_associative_device_args.lastdatadownloadlinkrate = atoi(lastdatadownloadlinkrate);
+			else
+				cur_wifi_associative_device_args.lastdatadownloadlinkrate = 0;
+			lastdatauplinkrate = dmjson_get_value(associated_client_obj, 2, "stats", "rate_of_last_tx_pkt");
+			if(lastdatauplinkrate!=NULL && strlen(lastdatauplinkrate)>0)
+				cur_wifi_associative_device_args.lastdatauplinkrate = atoi(lastdatauplinkrate);
+			else
+				cur_wifi_associative_device_args.lastdatauplinkrate = 0;
+			signalstrength=dmjson_get_value(associated_client_obj, 1, "rssi");
+			if(signalstrength!=NULL && strlen(signalstrength)>0)
+				cur_wifi_associative_device_args.signalstrength = atoi(signalstrength);
+			else
+				cur_wifi_associative_device_args.signalstrength = 0;
+			noise=dmjson_get_value(associated_client_obj, 1, "snr");
+			if(noise!=NULL && strlen(noise)>0)
+				cur_wifi_associative_device_args.noise = atoi(noise);
+			else
+				cur_wifi_associative_device_args.noise = 0;
+			retrans= dmjson_get_value(associated_client_obj, 2, "stats", "tx_pkts_retries");
+			cur_wifi_associative_device_args.retransmissions= atoi(retrans);
+
+			assoctimestr=dmjson_get_value(associated_client_obj, 1, "in_network");
+			if(assoctimestr!=NULL && strlen(assoctimestr)>0)
+				cur_wifi_associative_device_args.assoctime = atoi(assoctimestr);
+			else
+				cur_wifi_associative_device_args.assoctime = 0;
+
+			entries++;
+			idx = handle_update_instance(3, dmctx, &idx_last, update_instance_without_section, 1, ++id);
+			if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&cur_wifi_associative_device_args, idx) == DM_STOP)
+				break;
+		}
+		else
+			break;
+	}
+	return 0;
+}
+
+int browseWifiNeighboringWiFiDiagnosticResultInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct wifi_neighboring_diagnostic_args cur_wifi_neighboring_diagnostic_args = {0};
+	json_object *res, *neighboring_wifi_obj;
+	struct uci_section *ss;
+	char *bssid, *ssid, *signalstrength, *channel, *frequency, *noise, *idx, *idx_last = NULL;
+	int entries = 0, id = 0;
+
+	uci_foreach_sections("wireless", "wifi-device", ss) {
+		dmubus_call("router.wireless", "scanresults", UBUS_ARGS{{"radio", section_name(ss), String}}, 1, &res);
+		while (res) {
+			neighboring_wifi_obj = dmjson_select_obj_in_array_idx(res, entries, 1, "access_points");
+			if(neighboring_wifi_obj) {
+				bssid=dmjson_get_value(neighboring_wifi_obj, 1, "bssid");
+				if(bssid!=NULL && strlen(bssid)>0)
+					dmasprintf(&(cur_wifi_neighboring_diagnostic_args.bssid),dmjson_get_value(neighboring_wifi_obj, 1, "bssid"));
+				ssid=dmjson_get_value(neighboring_wifi_obj, 1, "ssid");
+				if(ssid!=NULL && strlen(ssid)>0)
+					dmasprintf(&(cur_wifi_neighboring_diagnostic_args.ssid),dmjson_get_value(neighboring_wifi_obj, 1, "ssid"));
+				channel=dmjson_get_value(neighboring_wifi_obj, 1, "channel");
+				if(channel!=NULL && strlen(channel)>0)
+					cur_wifi_neighboring_diagnostic_args.channel= atoi(channel);
+				else
+					cur_wifi_neighboring_diagnostic_args.channel = 0;
+				signalstrength=dmjson_get_value(neighboring_wifi_obj, 1, "rssi");
+				if(signalstrength!=NULL && strlen(signalstrength)>0)
+					cur_wifi_neighboring_diagnostic_args.signalstrength= atoi(signalstrength);
+				else
+					cur_wifi_neighboring_diagnostic_args.signalstrength = 0;
+				frequency=dmjson_get_value(neighboring_wifi_obj, 1, "frequency");
+				if(frequency!=NULL && strlen(frequency)>0)
+					dmasprintf(&(cur_wifi_neighboring_diagnostic_args.operatingfrequencyband),dmjson_get_value(neighboring_wifi_obj, 1, "frequency"));
+				noise=dmjson_get_value(neighboring_wifi_obj, 1, "noise");
+				if(noise!=NULL && strlen(noise)>0)
+					cur_wifi_neighboring_diagnostic_args.noise= atoi(noise);
+				else
+					cur_wifi_neighboring_diagnostic_args.noise = 0;
+				entries++;
+				idx = handle_update_instance(3, dmctx, &idx_last, update_instance_without_section, 1, ++id);
+				if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&cur_wifi_neighboring_diagnostic_args, idx) == DM_STOP)
+					break;
+			}
+			else
+				break;
+		}
+		entries = 0;
+	}
+	return 0;
+}
+
+int browseWiFiEndPointProfileInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	struct uci_section *s= NULL;
+	char *v, *instance, *instnbr = NULL, *ep_instance;
+	struct wifi_enp_args *ep_args = (struct wifi_enp_args *)prev_data;
+	struct uci_section *dmmap_section= NULL;
+
+	check_create_dmmap_package("dmmap_wireless");
+
+	get_dmmap_section_of_config_section("dmmap_wireless", "wifi-iface", section_name(ep_args->wifi_enp_sec), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "endpointinstance", &ep_instance);
+	s=is_dmmap_section_exist_eq("dmmap_wireless", "ep_profile", "ep_key", ep_instance);
+	if(!s)
+		dmuci_add_section_icwmpd("dmmap_wireless", "ep_profile", &s, &v);
+	DMUCI_SET_VALUE_BY_SECTION(icwmpd, s, "ep_key", ep_instance);
+	instance =  handle_update_instance(1, dmctx, &instnbr, update_instance_alias, 3, s, "ep_profile_instance", "ep_profile_alias");
+
+	DM_LINK_INST_OBJ(dmctx, parent_node, ep_args->wifi_enp_sec, "1");
+	return 0;
+}
diff --git a/dmtree/tr181/wifi.h b/dmtree/tr181/wifi.h
new file mode 100644
index 0000000000000000000000000000000000000000..fa5970147dc0e1e5680d39f4bbd20c6c629dcb64
--- /dev/null
+++ b/dmtree/tr181/wifi.h
@@ -0,0 +1,337 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2016 Inteno Broadband Technology AB
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ *		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#ifndef __WIFI_H
+#define __WIFI_H
+
+struct wifi_radio_args
+{
+	struct uci_section *wifi_radio_sec;
+};
+
+struct wifi_ssid_args
+{
+	struct uci_section *wifi_ssid_sec;
+	char *ifname;
+	char *linker;
+};
+
+struct wifi_enp_args
+{
+	struct uci_section *wifi_enp_sec;
+	char *ifname;
+};
+
+struct wifi_acp_args
+{
+	struct uci_section *wifi_acp_sec;
+	char *ifname;
+};
+
+struct wifi_associative_device_args
+{
+	int active;
+	int lastdatadownloadlinkrate;
+	int lastdatauplinkrate;
+	int signalstrength;
+	char *macaddress;
+	char *wdev;
+	int noise;
+	int retransmissions;
+	int assoctime;
+
+};
+
+struct wifi_neighboring_diagnostic_args
+{
+	char *ssid;
+	char *bssid;
+	char *operatingfrequencyband;
+	int channel;
+	int signalstrength;
+	int noise;
+};
+
+extern DMOBJ tWiFiObj[];
+extern DMLEAF tWiFiParams[];
+extern DMOBJ tWiFiRadioObj[];
+extern DMOBJ tWiFiAccessPointObj[];
+extern DMOBJ tWiFiSSIDObj[];
+extern DMLEAF tWiFiAccessPointParams[];
+extern DMLEAF tWiFiSSIDParams[];
+extern DMLEAF tWiFiRadioParams[];
+extern DMLEAF tWiFiAccessPointSecurityParams[];
+extern DMLEAF tWiFiAccessPointAssociatedDeviceParams[];
+extern DMLEAF tWiFiAcessPointIEEE80211rParams[];
+extern DMOBJ tWiFiAccessPointAssociatedDeviceObj[];
+extern DMLEAF tWiFiAccessPointAssociatedDeviceStatsParams[];
+extern DMLEAF tWiFiRadioStatsParams[];
+extern DMLEAF tWiFiSSIDStatsParams[];
+extern DMOBJ tWiFiNeighboringWiFiDiagnosticObj[];
+extern DMLEAF tWiFiNeighboringWiFiDiagnosticParams[];
+extern DMLEAF tWiFiNeighboringWiFiDiagnosticResultParams[];
+extern DMLEAF tWiFiAccessPointWPSParams[];
+extern DMLEAF tWiFiAccessPointAccountingParams[];
+extern DMOBJ tWiFiEndPointObj[];
+extern DMLEAF tWiFiEndPointParams[];
+extern DMLEAF tWiFiEndPointStatsParams[];
+extern DMLEAF tWiFiEndPointSecurityParams[];
+extern DMLEAF tWiFiEndPointWPSParams[];
+extern DMOBJ tWiFiEndPointProfileObj[];
+extern DMLEAF tWiFiEndPointProfileParams[];
+extern DMLEAF tWiFiEndPointProfileSecurityParams[];
+
+int browseWifiSsidInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseWifiAccessPointInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseWifiRadioInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browse_wifi_associated_device(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseWifiNeighboringWiFiDiagnosticResultInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseWiFiEndPointInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseWiFiEndPointProfileInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int add_wifi_ssid(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_wifi_ssid(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+int addObjWiFiEndPoint(char *refparam, struct dmctx *ctx, void *data, char **instance);
+int delObjWiFiEndPoint(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_WiFi_RadioNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFi_SSIDNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFi_AccessPointNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFi_EndPointNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_wifi_bandsteering_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_wifi_bandsteering_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+static int get_radio_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_max_bit_rate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_frequency(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_supported_frequency_bands(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_operating_channel_bandwidth(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_maxassoc(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_dfsenable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_supported_standard(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_operating_standard(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_channel(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_auto_channel_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_possible_channels(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_AutoChannelSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_AutoChannelRefreshPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_statistics_tx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_statistics_rx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_statistics_tx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_statistics_rx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_statistics_tx_errors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_statistics_rx_errors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_statistics_tx_discardpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_radio_statistics_rx_discardpackets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ssid_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_wifi_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_wifi_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+static int get_wlan_ssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ssid_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+static int get_wlan_bssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ssid_statistics_tx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ssid_statistics_rx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ssid_statistics_tx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ssid_statistics_rx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_wifi_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_wifi_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ap_ssid_ref(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+static int get_wlan_ssid_advertisement_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+static int get_wmm_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_total_associations(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_maxassoc(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_control_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_security_supported_modes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_security_modes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_security_wepkey_index(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_security_rekey_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_security_radius_ip_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_security_radius_server_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_ieee80211r_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_associative_device_lastdatadownlinkrate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_associative_device_lastdatauplinkrate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_associative_device_signalstrength(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_associative_device_mac(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_associative_device_active(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_associative_device_statistics_tx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_associative_device_statistics_rx_bytes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_associative_device_statistics_tx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_associative_device_statistics_rx_packets(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_associative_device_statistics_tx_errors(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_associative_device_statistics_retrans_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_associative_device_statistics_failed_retrans_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_associative_device_statistics_retry_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_access_point_associative_device_statistics_multiple_retry_count(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_neighboring_wifi_diagnostics_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_neighboring_wifi_diagnostics_result_number_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_neighboring_wifi_diagnostics_result_ssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_neighboring_wifi_diagnostics_result_bssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_neighboring_wifi_diagnostics_result_channel(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_neighboring_wifi_diagnostics_result_signal_strength(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_neighboring_wifi_diagnostics_result_operating_frequency_band(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_neighboring_wifi_diagnostics_result_noise(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_linker_Wifi_Radio(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_linker_Wifi_Ssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_linker_associated_device(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+int get_WiFiRadio_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_MaxSupportedAssociations(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_FragmentationThreshold(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_RTSThreshold(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_SupportedOperatingChannelBandwidths(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_OperatingChannelBandwidth(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_CurrentOperatingChannelBandwidth(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_BeaconPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_DTIMPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointWPS_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointWPS_ConfigMethodsSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointWPS_ConfigMethodsEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointWPS_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointWPS_Version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointWPS_PIN(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointAssociatedDevice_Noise(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointAccounting_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointAccounting_ServerIPAddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointAccounting_SecondaryServerIPAddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointAccounting_ServerPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointAccounting_SecondaryServerPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointAccounting_Secret(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointAccounting_SecondarySecret(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointAccounting_InterimInterval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiSSID_MACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiSSIDStats_ErrorsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiSSIDStats_ErrorsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiSSIDStats_DiscardPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiSSIDStats_DiscardPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPoint_UAPSDCapability(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPoint_WMMCapability(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPoint_UAPSDCapability(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPoint_UAPSDEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointAssociatedDevice_Retransmissions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointSecurity_MFPConfig(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPoint_MaxAllowedAssociations(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiSSIDStats_MulticastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiSSIDStats_MulticastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiSSIDStats_BroadcastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiSSIDStats_BroadcastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_PreambleType(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_IEEE80211hSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_IEEE80211hEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_TransmitPower(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadio_RegulatoryDomain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiRadioStats_Noise(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiSSIDStats_UnicastPacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiSSIDStats_UnicastPacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPoint_IsolationEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPointAssociatedDevice_AssociationTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPoint_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPoint_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPoint_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPoint_ProfileReference(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPoint_SSIDReference(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointStats_LastDataDownlinkRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointStats_LastDataUplinkRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointStats_SignalStrength(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointStats_Retransmissions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointSecurity_ModesSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointWPS_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointWPS_ConfigMethodsSupported(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointWPS_ConfigMethodsEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointWPS_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointWPS_Version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointWPS_PIN(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiAccessPoint_AllowedMACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointProfile_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointProfile_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointProfile_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointProfile_SSID(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointProfile_Location(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointProfile_Priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointProfileSecurity_ModeEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_WiFiEndPointProfileSecurity_MFPConfig(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+static int set_radio_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_radio_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_radio_operating_channel_bandwidth(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_radio_maxassoc(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_radio_dfsenable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_radio_operating_standard(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_radio_channel(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_radio_auto_channel_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiRadio_AutoChannelRefreshPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_ssid_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_wifi_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+static int set_wlan_ssid(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_ssid_lower_layer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_access_point_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_wifi_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+static int set_wlan_ssid_advertisement_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_access_point_maxassoc(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_access_point_control_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_access_point_security_modes(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_access_point_security_wepkey(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_access_point_security_wepkey_index(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_access_point_security_shared_key(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_access_point_security_passphrase(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_access_point_security_rekey_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_access_point_security_radius_ip_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_access_point_security_radius_server_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_access_point_security_radius_secret(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_access_point_ieee80211r_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_neighboring_wifi_diagnostics_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+static int set_wmm_enabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiRadio_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiRadio_FragmentationThreshold(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiRadio_RTSThreshold(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiRadio_OperatingChannelBandwidth(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiRadio_BeaconPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiRadio_DTIMPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPointWPS_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPointWPS_ConfigMethodsEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPointWPS_PIN(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPointAccounting_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPointAccounting_ServerIPAddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPointAccounting_SecondaryServerIPAddr(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPointAccounting_ServerPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPointAccounting_SecondaryServerPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPointAccounting_Secret(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPointAccounting_SecondarySecret(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPointAccounting_InterimInterval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPoint_UAPSDEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPointSecurity_MFPConfig(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPoint_MaxAllowedAssociations(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiRadio_PreambleType(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiRadio_IEEE80211hEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiRadio_TransmitPower(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiRadio_RegulatoryDomain(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPoint_IsolationEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPointWPS_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPoint_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPoint_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPoint_ProfileReference(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPointWPS_ConfigMethodsEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPointWPS_PIN(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiAccessPoint_AllowedMACAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPointProfile_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPointProfile_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPointProfile_SSID(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPointProfile_Location(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPointProfile_Priority(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPointProfileSecurity_ModeEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPointProfileSecurity_WEPKey(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPointProfileSecurity_PreSharedKey(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPointProfileSecurity_KeyPassphrase(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_WiFiEndPointProfileSecurity_MFPConfig(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+#endif
diff --git a/dmtree/tr181/x_iopsys_eu_buttons.c b/dmtree/tr181/x_iopsys_eu_buttons.c
new file mode 100644
index 0000000000000000000000000000000000000000..02395fa73ce78773e7983047dbc2a86f521e4be6
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_buttons.c
@@ -0,0 +1,170 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *	  Author Omar Kallel <omar.kallel@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <ctype.h>
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "x_iopsys_eu_buttons.h"
+
+/*** DMROOT.X_IOPSYS_EU_Buttons.{i}. ****/
+DMLEAF X_IOPSYS_EU_ButtonParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_x_iopsys_eu_button_alias, set_x_iopsys_eu_button_alias, NULL, NULL, BBFDM_BOTH},
+{"button", &DMREAD, DMT_STRING, get_x_iopsys_eu_button_name, NULL, NULL, NULL, BBFDM_BOTH},
+{"hotplug", &DMREAD, DMT_STRING, get_x_iopsys_eu_button_hotplug, NULL, NULL, NULL, BBFDM_BOTH},
+{"hotplug_long", &DMREAD, DMT_STRING, get_x_iopsys_eu_button_hotplug_long, NULL, NULL, NULL, BBFDM_BOTH},
+{"minpress", &DMWRITE, DMT_UNINT, get_x_iopsys_eu_button_minpress, set_x_iopsys_eu_button_minpress, NULL, NULL, BBFDM_BOTH},
+{"longpress", &DMWRITE, DMT_UNINT, get_x_iopsys_eu_button_longpress, set_x_iopsys_eu_button_longpress, NULL, NULL, BBFDM_BOTH},
+{"enable", &DMWRITE, DMT_BOOL, get_x_iopsys_eu_button_enable, set_x_iopsys_eu_button_enable, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+int browseXIopsysEuButton(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *ibutton = NULL, *ibutton_last = NULL;
+	struct uci_section *s = NULL;
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("buttons", "button", "dmmap_buttons", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		ibutton =  handle_update_instance(1, dmctx, &ibutton_last, update_instance_alias, 3, p->dmmap_section, "buttoninstance", "buttonalias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, ibutton) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+/************************************************************************************* 
+**** function related to button ****
+**************************************************************************************/
+
+int get_x_iopsys_eu_button_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_list *val;
+
+	dmuci_get_value_by_section_list((struct uci_section *)data, "button", &val);
+	if (val)
+		*value = dmuci_list_to_string(val, " ");
+	else
+		*value = "";
+	return 0;
+}
+
+int get_x_iopsys_eu_button_hotplug(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "hotplug", value);
+	return 0;
+}
+
+int get_x_iopsys_eu_button_hotplug_long(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "hotplug_long", value);
+	return 0;
+}
+
+int get_x_iopsys_eu_button_minpress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "minpress", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_button_minpress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "minpress", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_button_longpress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "longpress", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_button_longpress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "longpress", value);
+			return 0;
+	}
+	return 0;
+}
+
+
+int get_x_iopsys_eu_button_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "enable", value);
+	if ((*value)[0] == '\0') {
+		*value = "1";
+	}
+	return 0;
+}
+
+int set_x_iopsys_eu_button_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section((struct uci_section *)data, "enable", "");
+			else
+				dmuci_set_value_by_section((struct uci_section *)data, "enable", "0");
+			return 0;
+	}
+	return 0;
+}
+////////////////////////SET AND GET ALIAS/////////////////////////////////
+
+int get_x_iopsys_eu_button_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_buttons", "button", section_name((struct uci_section *)data), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "buttonalias", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_button_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_buttons", "button", section_name((struct uci_section *)data), &dmmap_section);
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, "buttonalias", value);
+			return 0;
+	}
+	return 0;
+}
diff --git a/dmtree/tr181/x_iopsys_eu_buttons.h b/dmtree/tr181/x_iopsys_eu_buttons.h
new file mode 100644
index 0000000000000000000000000000000000000000..4dee96293a36bafa60ed532a41e20d5406af07dd
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_buttons.h
@@ -0,0 +1,30 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *	  Author Omar Kallel <omar.kallel@pivasoftware.com>
+ *
+ */
+
+#ifndef __SE_BUTTONS_H
+#define __SE_BUTTONS_H
+
+extern DMLEAF X_IOPSYS_EU_ButtonParams[];
+int browseXIopsysEuButton(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int get_x_iopsys_eu_button_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_x_iopsys_eu_button_hotplug(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_x_iopsys_eu_button_hotplug_long(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_x_iopsys_eu_button_minpress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_button_minpress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_button_longpress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_button_longpress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_button_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_button_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_button_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_button_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif
diff --git a/dmtree/tr181/x_iopsys_eu_dropbear.c b/dmtree/tr181/x_iopsys_eu_dropbear.c
new file mode 100644
index 0000000000000000000000000000000000000000..257804f951b1ab23100c378053e4a6b14f81fe7c
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_dropbear.c
@@ -0,0 +1,455 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <ctype.h>
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "x_iopsys_eu_dropbear.h"
+
+/*** DMROOT.X_IOPSYS_EU_Dropbear.{i}. ****/
+DMLEAF X_IOPSYS_EU_DropbearParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_x_iopsys_eu_dropbear_alias, set_x_iopsys_eu_dropbear_alias, NULL, NULL, BBFDM_BOTH},
+{"PasswordAuth", &DMWRITE, DMT_BOOL, get_x_iopsys_eu_dropbear_password_auth, set_x_iopsys_eu_dropbear_password_auth, NULL, NULL, BBFDM_BOTH},
+{"RootPasswordAuth", &DMWRITE, DMT_BOOL, get_x_iopsys_eu_dropbear_root_password_auth, set_x_iopsys_eu_dropbear_root_password_auth, NULL, NULL, BBFDM_BOTH},
+{"Port", &DMWRITE, DMT_UNINT, get_x_iopsys_eu_dropbear_port, set_x_iopsys_eu_dropbear_port, NULL, NULL, BBFDM_BOTH},
+{"RootLogin", &DMWRITE, DMT_BOOL, get_x_iopsys_eu_dropbear_root_login, set_x_iopsys_eu_dropbear_root_login, NULL, NULL, BBFDM_BOTH},
+{"GatewayPorts", &DMWRITE, DMT_BOOL, get_x_iopsys_eu_dropbear_gateway_ports, set_x_iopsys_eu_dropbear_gateway_ports, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_x_iopsys_eu_dropbear_interface, set_x_iopsys_eu_dropbear_interface, NULL, NULL, BBFDM_BOTH},
+{"rsakeyfile", &DMWRITE, DMT_STRING, get_x_iopsys_eu_dropbear_rsakeyfile, set_x_iopsys_eu_dropbear_rsakeyfile, NULL, NULL, BBFDM_BOTH},
+{"dsskeyfile", &DMWRITE, DMT_STRING, get_x_iopsys_eu_dropbear_dsskeyfile, set_x_iopsys_eu_dropbear_dsskeyfile, NULL, NULL, BBFDM_BOTH},
+{"SSHKeepAlive", &DMWRITE, DMT_UNINT, get_x_iopsys_eu_dropbear_ssh_keepalive, set_x_iopsys_eu_dropbear_ssh_keepalive, NULL, NULL, BBFDM_BOTH},
+{"IdleTimeout", &DMWRITE, DMT_UNINT, get_x_iopsys_eu_dropbear_idle_timeout, set_x_iopsys_eu_dropbear_idle_timeout, NULL, NULL, BBFDM_BOTH},
+{"verbose", &DMWRITE, DMT_BOOL, get_x_iopsys_eu_dropbear_verbose, set_x_iopsys_eu_dropbear_verbose, NULL, NULL, BBFDM_BOTH},
+{"BannerFile", &DMWRITE, DMT_STRING, get_x_iopsys_eu_dropbear_banner_file, set_x_iopsys_eu_dropbear_banner_file, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+int browseXIopsysEuDropbear(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *idropbear = NULL, *idropbear_last = NULL;
+	struct uci_section *s = NULL;
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("dropbear", "dropbear", "dmmap_dropbear", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		idropbear =  handle_update_instance(1, dmctx, &idropbear_last, update_instance_alias_icwmpd, 3, p->dmmap_section, "dropbearinstance", "dropbearalias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, idropbear) == DM_STOP)
+			break;
+	}
+	return 0;
+}
+
+/************************************************************************************* 
+**** function ****
+**************************************************************************************/
+int get_x_iopsys_eu_dropbear_password_auth(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "PasswordAuth", value);
+	if ((*value)[0] == '\0' || ((*value)[0] == 'o' && (*value)[1] == 'n') || (*value)[0] == '1') {
+		*value = "1";
+	}
+	else
+		*value = "0";
+	return 0;
+}
+
+int set_x_iopsys_eu_dropbear_password_auth(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section((struct uci_section *)data, "PasswordAuth", "1");
+			else
+				dmuci_set_value_by_section((struct uci_section *)data, "PasswordAuth", "0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_dropbear_root_password_auth(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "RootPasswordAuth", value);
+	if ((*value)[0] == '\0' || ((*value)[0] == 'o' && (*value)[1] == 'n') || (*value)[0] == '1') {
+		*value = "1";
+	}
+	else
+		*value = "0";
+	return 0;
+}
+
+int set_x_iopsys_eu_dropbear_root_password_auth(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section((struct uci_section *)data, "RootPasswordAuth", "1");
+			else
+				dmuci_set_value_by_section((struct uci_section *)data, "RootPasswordAuth", "0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_dropbear_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "Port", value);
+	if ((*value)[0] == '\0') {
+		*value = "22";
+	}
+	return 0;
+}
+
+int set_x_iopsys_eu_dropbear_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (value[0] == '\0')
+				dmuci_set_value_by_section((struct uci_section *)data, "Port", "22");
+			else
+				dmuci_set_value_by_section((struct uci_section *)data, "Port", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_dropbear_root_login(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "RootLogin", value);
+	if ((*value)[0] == '\0' || ((*value)[0] == 'o' && (*value)[1] == 'n') || (*value)[0] == '1' ) {
+		*value = "1";
+	}
+	else
+		*value = "0";
+	return 0;
+}
+
+int set_x_iopsys_eu_dropbear_root_login(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section((struct uci_section *)data, "RootLogin", "1");
+			else
+				dmuci_set_value_by_section((struct uci_section *)data, "RootLogin", "0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_dropbear_verbose(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "verbose", value);
+	if ((*value)[0] == '\0' || (*value)[0] == '0' ) {
+		*value = "0";
+	}
+	else
+		*value = "1";
+	return 0;
+}
+
+int set_x_iopsys_eu_dropbear_verbose(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section((struct uci_section *)data, "verbose", "1");
+			else
+				dmuci_set_value_by_section((struct uci_section *)data, "verbose", "0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_dropbear_gateway_ports(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "GatewayPorts", value);
+	if ((*value)[0] == '\0' || (*value)[0] == '0' ) {
+		*value = "0";
+	}
+	else
+		*value = "1";
+	return 0;
+}
+
+int set_x_iopsys_eu_dropbear_gateway_ports(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section((struct uci_section *)data, "GatewayPorts", "1");
+			else
+				dmuci_set_value_by_section((struct uci_section *)data, "GatewayPorts", "");
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_dropbear_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "Interface", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_dropbear_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "Interface", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_dropbear_rsakeyfile(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "rsakeyfile", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_dropbear_rsakeyfile(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "rsakeyfile", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_dropbear_dsskeyfile(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "dsskeyfile", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_dropbear_dsskeyfile(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "dsskeyfile", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_dropbear_ssh_keepalive(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "SSHKeepAlive", value);
+	if ((*value)[0] == '\0') {
+		*value = "300";
+	}
+	return 0;
+}
+
+int set_x_iopsys_eu_dropbear_ssh_keepalive(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcmp(value, "300") == 0)
+				dmuci_set_value_by_section((struct uci_section *)data, "SSHKeepAlive", "");
+			else
+				dmuci_set_value_by_section((struct uci_section *)data, "SSHKeepAlive", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_dropbear_idle_timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "IdleTimeout", value);
+	if ((*value)[0] == '\0') {
+		*value = "300";
+	}
+	return 0;
+}
+
+int set_x_iopsys_eu_dropbear_idle_timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (value[0] == '0')
+				dmuci_set_value_by_section((struct uci_section *)data, "IdleTimeout", "");
+			else
+				dmuci_set_value_by_section((struct uci_section *)data, "IdleTimeout", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_dropbear_banner_file(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "BannerFile", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_dropbear_banner_file(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section((struct uci_section *)data, "BannerFile", value);
+			return 0;
+	}
+	return 0;
+}
+
+////////////////////////SET AND GET ALIAS/////////////////////////////////
+
+int get_x_iopsys_eu_dropbear_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_dropbear", "dropbear", section_name((struct uci_section *)data), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "dropbearalias", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_dropbear_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_dropbear", "dropbear", section_name((struct uci_section *)data), &dmmap_section);
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, "dropbearalias", value);
+			return 0;
+	}
+	return 0;
+}
+
+/***** ADD DEL OBJ *******/
+int add_dropbear_instance(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{
+	char *value, *v;
+	char *instance;
+	struct uci_section *dropbear_sec = NULL, *dmmap_sec= NULL;
+
+	check_create_dmmap_package("dmmap_dropbear");
+	instance = get_last_instance_icwmpd("dmmap_dropbear", "dropbear", "dropbearinstance");
+
+	dmuci_add_section("dropbear", "dropbear", &dropbear_sec, &value);
+	dmuci_set_value_by_section(dropbear_sec, "verbose", "0");
+	dmuci_set_value_by_section(dropbear_sec, "Port", "22");
+	dmuci_set_value_by_section(dropbear_sec, "RootLogin", "1");
+	dmuci_set_value_by_section(dropbear_sec, "GatewayPorts", "0");
+	dmuci_set_value_by_section(dropbear_sec, "SSHKeepAlive", "300");
+	dmuci_set_value_by_section(dropbear_sec, "IdleTimeout", "0");
+
+	dmuci_add_section_icwmpd("dmmap_dropbear", "dropbear", &dmmap_sec, &v);
+	dmuci_set_value_by_section(dmmap_sec, "section_name", section_name(dropbear_sec));
+	*instancepara = update_instance_icwmpd(dmmap_sec, instance, "dropbearinstance");
+	return 0;
+}
+
+int delete_dropbear_instance(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *s = NULL;
+	struct uci_section *ss = NULL;
+	struct uci_section *dmmap_section;
+	int found = 0;
+
+	switch (del_action) {
+		case DEL_INST:
+			if(is_section_unnamed(section_name((struct uci_section *)data))){
+				LIST_HEAD(dup_list);
+				delete_sections_save_next_sections("dmmap_dropbear", "dropbear", "dropbearinstance", section_name((struct uci_section *)data), atoi(instance), &dup_list);
+				update_dmmap_sections(&dup_list, "dropbearinstance", "dmmap_dropbear", "dropbear");
+				dmuci_delete_by_section_unnamed((struct uci_section *)data, NULL, NULL);
+			} else {
+				get_dmmap_section_of_config_section("dmmap_dropbear", "dropbear", section_name((struct uci_section *)data), &dmmap_section);
+				dmuci_delete_by_section_unnamed_icwmpd(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section((struct uci_section *)data, NULL, NULL);
+			}
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("dropbear", "dropbear", s) {
+				if (found != 0){
+					get_dmmap_section_of_config_section("dmmap_dropbear", "dropbear", section_name(ss), &dmmap_section);
+					if(dmmap_section != NULL)
+						dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL){
+				get_dmmap_section_of_config_section("dmmap_dropbear", "dropbear", section_name(ss), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+		return 0;
+	}
+	return 0;
+}
+
diff --git a/dmtree/tr181/x_iopsys_eu_dropbear.h b/dmtree/tr181/x_iopsys_eu_dropbear.h
new file mode 100644
index 0000000000000000000000000000000000000000..2936ac171f3e000df36a87dfe16d357faf6d8415
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_dropbear.h
@@ -0,0 +1,46 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *
+ */
+
+#ifndef __SE_DROPBEAR_H
+#define __SE_DROPBEAR_H
+
+extern DMLEAF X_IOPSYS_EU_DropbearParams[];
+int browseXIopsysEuDropbear(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int get_x_iopsys_eu_dropbear_password_auth(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_dropbear_password_auth(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_dropbear_root_password_auth(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_dropbear_root_password_auth(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_dropbear_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_dropbear_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_dropbear_root_login(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_dropbear_root_login(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_dropbear_verbose(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_dropbear_verbose(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_dropbear_gateway_ports(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_dropbear_gateway_ports(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_dropbear_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_dropbear_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_dropbear_rsakeyfile(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_dropbear_rsakeyfile(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_dropbear_dsskeyfile(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_dropbear_dsskeyfile(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_dropbear_ssh_keepalive(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_dropbear_ssh_keepalive(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_dropbear_idle_timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_dropbear_idle_timeout(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_dropbear_banner_file(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_dropbear_banner_file(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_dropbear_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_dropbear_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int add_dropbear_instance(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_dropbear_instance(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+#endif
diff --git a/dmtree/tr181/x_iopsys_eu_ice.c b/dmtree/tr181/x_iopsys_eu_ice.c
new file mode 100644
index 0000000000000000000000000000000000000000..72ed752ef28e6271d5b29597af757a4aa3d428a8
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_ice.c
@@ -0,0 +1,79 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *
+ */ 
+ 
+#include <uci.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "x_iopsys_eu_ice.h"
+
+/*** DMROOT.X_IOPSYS_EU_ICE. ***/
+DMLEAF tSe_IceParam[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_ice_cloud_enable, set_ice_cloud_enable, NULL, NULL, BBFDM_BOTH},
+{"Server", &DMWRITE, DMT_STRING, get_ice_cloud_server, set_ice_cloud_server, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+int get_ice_cloud_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	bool b;
+	dmuci_get_option_value_string("ice", "cloud", "enabled", value);
+
+	string_to_bool(*value, &b);
+	if (b)
+		*value = "1";
+	else
+		*value = "0";
+	return 0;
+}
+
+int set_ice_cloud_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value("ice", "cloud", "enabled", "1");
+			else
+				dmuci_set_value("ice", "cloud", "enabled", "0");
+			return 0;
+	}
+}
+
+int get_ice_cloud_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("ice", "cloud", "server", value);
+	return 0;
+}
+
+int set_ice_cloud_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (value[0] == '\0')
+				return 0;
+			dmuci_set_value("ice", "cloud", "server", value);
+			return 0;
+	}
+	return 0;
+}
diff --git a/dmtree/tr181/x_iopsys_eu_ice.h b/dmtree/tr181/x_iopsys_eu_ice.h
new file mode 100644
index 0000000000000000000000000000000000000000..14d7165618d4af05a596ef5689219970155723c9
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_ice.h
@@ -0,0 +1,23 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *
+ */ 
+
+#ifndef __SE_ICE_H
+#define __SE_ICE_H
+
+extern DMLEAF tSe_IceParam[];
+
+int get_ice_cloud_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_ice_cloud_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int set_ice_cloud_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_ice_cloud_server(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif
diff --git a/dmtree/tr181/x_iopsys_eu_igmp.c b/dmtree/tr181/x_iopsys_eu_igmp.c
new file mode 100644
index 0000000000000000000000000000000000000000..20a74b55557cb860d0100b08ef507086fc644210
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_igmp.c
@@ -0,0 +1,410 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *
+ */ 
+
+#include <uci.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "x_iopsys_eu_igmp.h"
+
+DMLEAF tSe_IgmpParam[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"DifferentiateService", &DMWRITE, DMT_STRING, get_igmp_dscp_mark, set_igmp_dscp_mark, NULL, NULL, BBFDM_BOTH},
+{"ProxyInterface", &DMWRITE, DMT_STRING, get_igmp_proxy_interface, set_igmp_proxy_interface, NULL, NULL, BBFDM_BOTH},
+{"DefaultVersion", &DMWRITE, DMT_STRING, get_igmp_default_version, set_igmp_default_version, NULL, NULL, BBFDM_BOTH},
+{"QueryInterval", &DMWRITE, DMT_UNINT, get_igmp_query_interval, set_igmp_query_interval, NULL, NULL, BBFDM_BOTH},
+{"QueryResponseInterval", &DMWRITE, DMT_UNINT, get_igmp_query_response_interval, set_igmp_query_response_interval, NULL, NULL, BBFDM_BOTH},
+{"LastMemberQueryInterval", &DMWRITE, DMT_UNINT, get_igmp_last_member_queryinterval, set_igmp_last_member_queryinterval, NULL, NULL, BBFDM_BOTH},
+{"RobustnessValue", &DMWRITE, DMT_INT, get_igmp_robustness_value, set_igmp_robustness_value, NULL, NULL, BBFDM_BOTH},
+{"LanToLanMulticastEnable", &DMWRITE, DMT_BOOL, get_igmp_multicast_enable, set_igmp_multicast_enable, NULL, NULL, BBFDM_BOTH, BBFDM_BOTH},
+{"MaxGroup", &DMWRITE, DMT_UNINT, get_igmp_maxgroup, set_igmp_maxgroup, NULL, NULL, BBFDM_BOTH},
+{"MaxSources", &DMWRITE, DMT_UNINT, get_igmp_maxsources, set_igmp_maxsources, NULL, NULL, BBFDM_BOTH},
+{"MaxMembers", &DMWRITE, DMT_UNINT, get_igmp_maxmembers, set_igmp_maxmembers, NULL, NULL, BBFDM_BOTH},
+{"FastLeaveEnable", &DMWRITE, DMT_BOOL, get_igmp_fastleave_enable, set_igmp_fastleave_enable, NULL, NULL, BBFDM_BOTH},
+{"JoinImmediateEnable", &DMWRITE, DMT_BOOL, get_igmp_joinimmediate_enable, set_igmp_joinimmediate_enable, NULL, NULL, BBFDM_BOTH},
+{"ProxyEnable", &DMWRITE, DMT_BOOL, get_igmp_proxy_enable, set_igmp_proxy_enable, NULL, NULL, BBFDM_BOTH},
+{"SnoopingMode", &DMWRITE, DMT_STRING, get_igmp_snooping_mode, set_igmp_snooping_mode, NULL, NULL, BBFDM_BOTH},
+{"SnoopingInterfaces", &DMWRITE, DMT_STRING, get_igmp_snooping_interface, set_igmp_snooping_interface, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+int get_igmp_dscp_mark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_dscp_mark", value); 
+	return 0;
+}
+
+int set_igmp_dscp_mark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("mcpd", "mcpd", "igmp_dscp_mark", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_igmp_proxy_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *p;
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_proxy_interfaces", value);
+	*value = dmstrdup(*value);  // MEM WILL BE FREED IN DMMEMCLEAN
+	p = *value;
+	while (*p++) {
+		if (*p == ' ') *p = ',';
+	}
+	return 0;
+}
+
+int set_igmp_proxy_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	int i;
+	char *p;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (value[0] == '\0')
+				return 0;
+			value = dmstrdup(value);
+			p = value;
+			while (*p++) {
+				if (*p == ',') *p = ' ';
+			}
+			compress_spaces(value);
+			dmuci_set_value("mcpd", "mcpd", "igmp_proxy_interfaces", value);
+			dmfree(value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_igmp_default_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_default_version", value);
+	return 0;
+} 
+
+int set_igmp_default_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("mcpd", "mcpd", "igmp_default_version", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_igmp_query_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_query_interval", value); 
+	return 0;
+} 
+
+int set_igmp_query_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("mcpd", "mcpd", "igmp_query_interval", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_igmp_query_response_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_query_response_interval", value);
+	return 0;
+} 
+
+int set_igmp_query_response_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("mcpd", "mcpd", "igmp_query_response_interval", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_igmp_last_member_queryinterval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_last_member_query_interval", value);
+	return 0;
+} 
+
+int set_igmp_last_member_queryinterval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("mcpd", "mcpd", "igmp_last_member_query_interval", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_igmp_robustness_value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_robustness_value", value);
+	return 0;
+} 
+
+int set_igmp_robustness_value(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("mcpd", "mcpd", "igmp_robustness_value", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_igmp_multicast_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_lan_to_lan_multicast", value);
+	if ((*value)[0] == '\0') {
+		*value = "0";
+	}
+	return 0;
+}
+
+int set_igmp_multicast_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value("mcpd", "mcpd", "igmp_lan_to_lan_multicast", "1");
+			else
+				dmuci_set_value("mcpd", "mcpd", "igmp_lan_to_lan_multicast", "");
+			return 0;
+	}
+	return 0;
+}
+
+int get_igmp_fastleave_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_fast_leave", value);
+	if ((*value)[0] == '\0') {
+		*value = "0";
+	}
+	return 0;
+}
+
+int set_igmp_fastleave_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value("mcpd", "mcpd", "igmp_fast_leave", "1");
+			else
+				dmuci_set_value("mcpd", "mcpd", "igmp_fast_leave", "");
+			return 0;
+	}
+	return 0;
+}
+
+int get_igmp_joinimmediate_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_join_immediate", value);
+	if ((*value)[0] == '\0') {
+		*value = "0";
+	}
+	return 0;
+}
+
+int set_igmp_joinimmediate_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value("mcpd", "mcpd", "igmp_join_immediate", "1");
+			else
+				dmuci_set_value("mcpd", "mcpd", "igmp_join_immediate", "");
+			return 0;
+	}
+	return 0;
+}
+
+int get_igmp_proxy_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_proxy_enable", value);
+	if ((*value)[0] == '\0') {
+		*value = "0";
+	}
+	return 0;
+}
+
+int set_igmp_proxy_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if (b)
+				dmuci_set_value("mcpd", "mcpd", "igmp_proxy_enable", "1");
+			else
+				dmuci_set_value("mcpd", "mcpd", "igmp_proxy_enable", "");
+			return 0;
+	}
+	return 0;
+}
+
+int get_igmp_maxgroup(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_max_groups", value); 
+	return 0;
+} 
+
+int set_igmp_maxgroup(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("mcpd", "mcpd", "igmp_max_groups", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_igmp_maxsources(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_max_sources", value);
+	return 0;
+} 
+
+int set_igmp_maxsources(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("mcpd", "mcpd", "igmp_max_sources", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_igmp_maxmembers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_max_members", value);
+	return 0;
+}
+
+int set_igmp_maxmembers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("mcpd", "mcpd", "igmp_max_members", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_igmp_snooping_mode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_snooping_enable", value);
+	return 0;
+}
+
+int set_igmp_snooping_mode(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("mcpd", "mcpd", "igmp_snooping_enable", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_igmp_snooping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *p;
+
+	dmuci_get_option_value_string("mcpd", "mcpd", "igmp_snooping_interfaces", value);
+	*value = dmstrdup(*value);  // MEM WILL BE FREED IN DMMEMCLEAN
+	p = *value;
+	while (*p++) {
+		if (*p == ' ') *p = ',';
+	}
+
+	return 0;
+}
+
+int set_igmp_snooping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	int i;
+	char *p;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (value[0] == '\0')
+				return 0;
+			value = dmstrdup(value);
+			p = value;
+			while (*p++) {
+				if (*p == ',') *p = ' ';
+			}
+			compress_spaces(value);
+			dmuci_set_value("mcpd", "mcpd", "igmp_snooping_interfaces", value);
+			dmfree(value);
+			return 0;
+	}
+	return 0;
+}
diff --git a/dmtree/tr181/x_iopsys_eu_igmp.h b/dmtree/tr181/x_iopsys_eu_igmp.h
new file mode 100644
index 0000000000000000000000000000000000000000..c1924fa788c3de069952177d64c651e6fe6a50e4
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_igmp.h
@@ -0,0 +1,50 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *
+ */ 
+
+#ifndef __SE_IGMP_H
+#define __SE_IGMP_H
+
+extern DMLEAF tSe_IgmpParam[];
+
+int get_igmp_dscp_mark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_dscp_mark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_igmp_proxy_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_proxy_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_igmp_default_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_default_version(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_igmp_query_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_query_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_igmp_query_response_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_query_response_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_igmp_last_member_queryinterval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_last_member_queryinterval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_igmp_robustness_value(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_robustness_value(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_igmp_multicast_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_multicast_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_igmp_fastleave_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_fastleave_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_igmp_joinimmediate_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_joinimmediate_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_igmp_proxy_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_proxy_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_igmp_maxgroup(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_maxgroup(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_igmp_maxsources(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_maxsources(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_igmp_maxmembers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_maxmembers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_igmp_snooping_mode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_snooping_mode(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_igmp_snooping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_igmp_snooping_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif
\ No newline at end of file
diff --git a/dmtree/tr181/x_iopsys_eu_ipacccfg.c b/dmtree/tr181/x_iopsys_eu_ipacccfg.c
new file mode 100644
index 0000000000000000000000000000000000000000..7573cd267f6bf08e07d860eb006cdbde5ee0dd0b
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_ipacccfg.c
@@ -0,0 +1,825 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *	  Author Omar Kallel <omar.kallel@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <ctype.h>
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "x_iopsys_eu_ipacccfg.h"
+
+/*** DMROOT.X_IOPSYS_EU_IpAccCfg. ***/
+DMOBJ tSe_IpAccObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{CUSTOM_PREFIX"IpAccListCfgObj", &DMWRITE, add_ipacccfg_rule, delete_ipacccfg_rule, NULL, browseAccListInst, NULL, NULL, NULL, tSe_IpAccCfgParam, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"PortForwarding", &DMWRITE, add_ipacccfg_port_forwarding, delete_ipacccfg_port_forwarding, NULL, browseport_forwardingInst, NULL, NULL, NULL, tSe_PortForwardingParam, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tSe_PortForwardingParam[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_port_forwarding_alias, set_port_forwarding_alias, NULL, NULL, BBFDM_BOTH},
+{"Name", &DMWRITE, DMT_STRING, get_port_forwarding_name, set_port_forwarding_name, NULL, NULL, BBFDM_BOTH},
+{"Enable", &DMWRITE, DMT_BOOL, get_port_forwarding_enable, set_port_forwarding_enable, NULL, NULL, BBFDM_BOTH},
+{"EnalbeNatLoopback", &DMWRITE, DMT_BOOL, get_port_forwarding_loopback, set_port_forwarding_loopback, NULL, NULL, BBFDM_BOTH},
+{"Protocol", &DMWRITE, DMT_STRING, get_port_forwarding_protocol, set_port_forwarding_protocol, NULL, NULL, BBFDM_BOTH},
+{"ExternalZone", &DMWRITE, DMT_STRING, get_port_forwarding_external_zone, set_port_forwarding_external_zone, NULL, NULL, BBFDM_BOTH},
+{"InternalZone", &DMWRITE, DMT_STRING, get_port_forwarding_internal_zone, set_port_forwarding_internal_zone, NULL, NULL, BBFDM_BOTH},
+{"ExternalPort", &DMWRITE, DMT_STRING, get_port_forwarding_external_port, set_port_forwarding_external_port, NULL, NULL, BBFDM_BOTH},
+{"InternalPort", &DMWRITE, DMT_STRING, get_port_forwarding_internal_port, set_port_forwarding_internal_port, NULL, NULL, BBFDM_BOTH},
+{"SourcePort", &DMWRITE, DMT_STRING, get_port_forwarding_source_port, set_port_forwarding_source_port, NULL, NULL, BBFDM_BOTH},
+{"InternalIpAddress", &DMWRITE, DMT_STRING, get_port_forwarding_internal_ipaddress, set_port_forwarding_internal_ipaddress, NULL, NULL, BBFDM_BOTH},
+{"ExternalIpAddress", &DMWRITE, DMT_STRING, get_port_forwarding_external_ipaddress, set_port_forwarding_external_ipaddress, NULL, NULL, BBFDM_BOTH},
+{"SourceIpAddress", &DMWRITE, DMT_STRING, get_port_forwarding_source_ipaddress, set_port_forwarding_source_ipaddress, NULL, NULL, BBFDM_BOTH},
+{"SourceMacAddress", &DMWRITE, DMT_STRING, get_port_forwarding_src_mac, set_port_forwarding_src_mac, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tSe_IpAccCfgParam[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_x_iopsys_eu_cfgobj_address_alias, set_x_iopsys_eu_cfgobj_address_alias, NULL, NULL, BBFDM_BOTH},
+{"Enable", &DMWRITE, DMT_BOOL, get_x_bcm_com_ip_acc_list_cfgobj_enable, set_x_bcm_com_ip_acc_list_cfgobj_enable, NULL, NULL, BBFDM_BOTH},
+{"IPVersion", &DMWRITE, DMT_STRING, get_x_bcm_com_ip_acc_list_cfgobj_ipversion, set_x_bcm_com_ip_acc_list_cfgobj_ipversion, NULL, NULL, BBFDM_BOTH},
+{"Protocol", &DMWRITE, DMT_STRING, get_x_bcm_com_ip_acc_list_cfgobj_protocol, set_x_bcm_com_ip_acc_list_cfgobj_protocol, NULL, NULL, BBFDM_BOTH},
+{"FilterName", &DMWRITE, DMT_STRING, get_x_bcm_com_ip_acc_list_cfgobj_name, set_x_bcm_com_ip_acc_list_cfgobj_name, NULL, NULL, BBFDM_BOTH},
+{"AccAddressAndNetMask", &DMWRITE, DMT_STRING, get_x_iopsys_eu_cfgobj_address_netmask, set_x_iopsys_eu_cfgobj_address_netmask, NULL, NULL, BBFDM_BOTH},
+{"AccPort", &DMWRITE, DMT_STRING, get_x_bcm_com_ip_acc_list_cfgobj_acc_port, set_x_bcm_com_ip_acc_list_cfgobj_acc_port, NULL, NULL, BBFDM_BOTH},
+{"Target", &DMWRITE, DMT_STRING, get_x_bcm_com_ip_acc_list_cfgobj_target, set_x_bcm_com_ip_acc_list_cfgobj_target, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/************************************************************************************* 
+**** function related to get_object_ip_acc_list_cfgobj ****
+**************************************************************************************/
+int get_x_bcm_com_ip_acc_list_cfgobj_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+		
+	dmuci_get_value_by_section_string(ipaccsection, "enabled", value);
+	if ((*value)[0] == '\0') {
+		*value = "1";
+	}		
+	return 0;
+}
+
+int set_x_bcm_com_ip_acc_list_cfgobj_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	int check;
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b) {
+				value = "";
+			}
+			else {
+				value = "0";
+			}
+			dmuci_set_value_by_section(ipaccsection, "enabled", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_bcm_com_ip_acc_list_cfgobj_ipversion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(ipaccsection, "family", value);
+	return 0;
+}
+
+int set_x_bcm_com_ip_acc_list_cfgobj_ipversion(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(ipaccsection, "family", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_bcm_com_ip_acc_list_cfgobj_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(ipaccsection, "proto", value);
+	return 0;
+}
+
+int set_x_bcm_com_ip_acc_list_cfgobj_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(ipaccsection, "proto", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_bcm_com_ip_acc_list_cfgobj_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(ipaccsection, "name", value);
+	return 0;
+}
+
+int set_x_bcm_com_ip_acc_list_cfgobj_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(ipaccsection, "name", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_cfgobj_address_netmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_list *val;
+	struct uci_element *e = NULL;
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+	struct uci_list *list = NULL;
+	
+	dmuci_get_value_by_section_list(ipaccsection, "src_ip", &val);
+	if (val) {
+		*value = dmuci_list_to_string(val, ",");
+	}
+	else
+		*value = "";
+	if ((*value)[0] == '\0') {
+		*value = "0.0.0.0/0";
+		return 0;
+	}
+	return 0;
+}
+
+int set_x_iopsys_eu_cfgobj_address_netmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *pch, *spch, *val;
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_delete_by_section(ipaccsection, "src_ip", "");
+			val = dmstrdup(value);
+			pch = strtok_r(val, " ,", &spch);
+			while (pch != NULL) {
+				dmuci_add_list_value_by_section(ipaccsection, "src_ip", pch);
+				pch = strtok_r(NULL, " ,", &spch);
+			}
+			dmfree(val);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_bcm_com_ip_acc_list_cfgobj_acc_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+	
+	dmuci_get_value_by_section_string(ipaccsection, "dest_port", value);
+	return 0;
+}
+
+int set_x_bcm_com_ip_acc_list_cfgobj_acc_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(ipaccsection, "dest_port", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_bcm_com_ip_acc_list_cfgobj_target(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(ipaccsection, "target", value);
+	return 0;
+}
+
+int set_x_bcm_com_ip_acc_list_cfgobj_target(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(ipaccsection, "target", value);
+			return 0;
+	}
+	return 0;
+}
+
+/************************************************************************************* 
+**** function related to get_cache_object_port_forwarding ****
+**************************************************************************************/
+int get_port_forwarding_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(forwardsection, "name", value);
+	return 0;
+}
+
+int set_port_forwarding_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(forwardsection, "name", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_port_forwarding_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(forwardsection, "enabled", value);
+	return 0;
+}
+
+int set_port_forwarding_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	int check;
+	struct uci_section *forwardsection = (struct uci_section *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section(forwardsection, "enabled", "1");
+			else 
+				dmuci_set_value_by_section(forwardsection, "enabled", "0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_port_forwarding_loopback(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *forwardsection = (struct uci_section *)data;
+		
+	dmuci_get_value_by_section_string(forwardsection, "reflection", value);
+	if((*value)[0] == '\0') {
+		*value = "1";
+	}
+	return 0;
+}
+
+int set_port_forwarding_loopback(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct uci_section *forwardsection = (struct uci_section *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section(forwardsection, "reflection", "1");
+			else 
+				dmuci_set_value_by_section(forwardsection, "reflection", "0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_port_forwarding_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *forwardsection = (struct uci_section *)data;
+		
+	dmuci_get_value_by_section_string(forwardsection, "proto", value);
+	return 0;
+}
+
+int set_port_forwarding_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *pch;
+	struct uci_section *forwardsection = (struct uci_section *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(forwardsection, "proto", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_port_forwarding_external_zone(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(forwardsection, "src", value);
+	return 0;
+}
+
+int set_port_forwarding_external_zone(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *pch;
+	struct uci_section *forwardsection = (struct uci_section *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(forwardsection, "src", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_port_forwarding_internal_zone(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(forwardsection, "dest", value);
+	return 0;
+}
+
+int set_port_forwarding_internal_zone(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *pch;
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(forwardsection, "dest", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_port_forwarding_external_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(forwardsection, "src_dport", value);
+	return 0;
+}
+
+int set_port_forwarding_external_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *pch;
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(forwardsection, "src_dport", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_port_forwarding_internal_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(forwardsection, "dest_port", value);
+	if ((*value)[0] == '\0') {
+		*value = "any";
+	}
+	return 0;
+}
+
+int set_port_forwarding_internal_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *pch;
+	struct uci_section *forwardsection = (struct uci_section *)data;
+	
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcasecmp(value, "any") == 0) {
+				value = "";
+			}
+			dmuci_set_value_by_section(forwardsection, "dest_port", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_port_forwarding_source_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(forwardsection, "src_port", value);
+	if ((*value)[0] == '\0') {
+		*value = "any";
+	}
+	return 0;
+}
+
+int set_port_forwarding_source_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *pch;
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcasecmp(value, "any") == 0) {
+				value = "";
+			}
+			dmuci_set_value_by_section(forwardsection, "src_port", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_port_forwarding_internal_ipaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(forwardsection, "dest_ip", value);
+	return 0;
+}
+
+int set_port_forwarding_internal_ipaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *pch;
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(forwardsection, "dest_ip", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_port_forwarding_external_ipaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(forwardsection, "src_dip", value);
+	if ((*value)[0] == '\0') {
+		*value = "any";
+	}
+	return 0;
+}
+
+int set_port_forwarding_external_ipaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *pch;
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcasecmp(value, "any") == 0) {
+				value = "";
+			}
+			dmuci_set_value_by_section(forwardsection, "src_dip", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_port_forwarding_source_ipaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_list *val;
+	struct uci_element *e = NULL;
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_list(forwardsection, "src_ip", &val);
+	if (val) {
+		*value = dmuci_list_to_string(val, ",");
+	}
+	else {
+		*value = "";
+	}
+	if ((*value)[0] == '\0') {
+		*value = "any";
+	}
+	return 0;
+}
+
+int set_port_forwarding_source_ipaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *pch, *val, *spch;
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if (strcasecmp(value, "any") == 0) {
+				dmuci_delete_by_section(forwardsection, "src_ip", "");
+			}
+			else {
+				dmuci_delete_by_section(forwardsection, "src_ip", "");
+				val = dmstrdup(value);
+				pch = strtok_r(val, " ,", &spch);
+				while (pch != NULL) {
+					dmuci_add_list_value_by_section(forwardsection, "src_ip", pch);
+					pch = strtok_r(NULL, " ,", &spch);
+				}
+				dmfree(val);
+			}						
+			return 0;
+	}
+	return 0;
+}
+
+int get_port_forwarding_src_mac(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_list *list = NULL;
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_list(forwardsection, "src_mac", &list);
+	*value = dmuci_list_to_string(list, " ");
+	return 0;
+}
+
+int set_port_forwarding_src_mac(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *pch, *spch;
+	struct uci_section *forwardsection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_delete_by_section(forwardsection, "src_mac", NULL);
+			value = dmstrdup(value);
+			pch = strtok_r(value, " ", &spch);
+			while (pch != NULL) {
+				dmuci_add_list_value_by_section(forwardsection, "src_mac", pch);
+				pch = strtok_r(NULL, " ", &spch);
+			}
+			dmfree(value);
+			return 0;
+	}
+	return 0;
+}
+
+/***** ADD DEL OBJ *******/
+int add_ipacccfg_rule(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{
+	char *value, *v;
+	char *instance;
+	struct uci_section *rule = NULL, *dmmap_rule= NULL;
+	
+	check_create_dmmap_package("dmmap_firewall");
+	instance = get_last_instance_icwmpd("dmmap_firewall", "rule", "fruleinstance");
+	dmuci_add_section_and_rename("firewall", "rule", &rule, &value);
+	dmuci_set_value_by_section(rule, "type", "generic");
+	dmuci_set_value_by_section(rule, "name", "new_rule");
+	dmuci_set_value_by_section(rule, "proto", "all");
+	dmuci_set_value_by_section(rule, "target", "ACCPET");
+	dmuci_set_value_by_section(rule, "family", "ipv4");
+	dmuci_set_value_by_section(rule, "enabled", "1");
+	dmuci_set_value_by_section(rule, "hidden", "1");
+	dmuci_set_value_by_section(rule, "parental", "0");
+
+	dmuci_add_section_icwmpd("dmmap_firewall", "rule", &dmmap_rule, &v);
+	dmuci_set_value_by_section(dmmap_rule, "section_name", section_name(rule));
+	*instancepara = update_instance_icwmpd(dmmap_rule, instance, "fruleinstance");
+
+	return 0;
+}
+
+int delete_ipacccfg_rule(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *s = NULL; 
+	struct uci_section *ss = NULL;
+	int found = 0;
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+	struct uci_section *dmmap_section;
+
+	switch (del_action) {
+		case DEL_INST:
+			get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name(ipaccsection), &dmmap_section);
+			dmuci_delete_by_section(dmmap_section, NULL, NULL);
+			dmuci_delete_by_section(ipaccsection, NULL, NULL);
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("firewall", "rule", s) {
+				if (found != 0){
+					get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name(s), &dmmap_section);
+					if(dmmap_section != NULL)
+						dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL){
+				get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name(ss), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			break;
+	}
+
+	return 0;
+}
+
+int add_ipacccfg_port_forwarding(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{
+	char *value, *v;
+	char *instance;
+	struct uci_section *redirect = NULL, *dmmap_redirect= NULL;
+	
+	check_create_dmmap_package("dmmap_firewall");
+	instance = get_last_instance_icwmpd("dmmap_firewall", "redirect", "forwardinstance");
+	dmuci_add_section_and_rename("firewall", "redirect", &redirect, &value);
+	dmuci_set_value_by_section(redirect, "enabled", "0");
+	dmuci_set_value_by_section(redirect, "target", "DNAT");
+	dmuci_set_value_by_section(redirect, "proto", "tcp udp");
+
+	dmuci_add_section_icwmpd("dmmap_firewall", "redirect", &dmmap_redirect, &v);
+	dmuci_set_value_by_section(dmmap_redirect, "section_name", section_name(redirect));
+	*instancepara = update_instance_icwmpd(dmmap_redirect, instance, "forwardinstance");
+	return 0;
+}
+
+
+int delete_ipacccfg_port_forwarding(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	int found = 0;
+	struct pforwardrgs *forwardargs;
+	struct uci_section *s = NULL;
+	struct uci_section *ss = NULL;
+	struct uci_section *forwardsection = (struct uci_section *)data;
+	struct uci_section *dmmap_section;
+	
+	switch (del_action) {
+		case DEL_INST:
+			get_dmmap_section_of_config_section("dmmap_firewall", "redirect", section_name(forwardsection), &dmmap_section);
+			dmuci_delete_by_section(dmmap_section, NULL, NULL);
+			dmuci_delete_by_section(forwardsection, NULL, NULL);
+			break;
+		case DEL_ALL:
+			uci_foreach_option_eq("firewall", "redirect", "target", "DNAT", s) {
+				if (found != 0){
+					get_dmmap_section_of_config_section("dmmap_firewall", "redirect", section_name(s), &dmmap_section);
+					if(dmmap_section != NULL)
+						dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL){
+				get_dmmap_section_of_config_section("dmmap_firewall", "redirect", section_name(ss), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			break;
+	}
+	return 0;
+}
+
+////////////////////////SET AND GET ALIAS/////////////////////////////////
+int get_x_iopsys_eu_cfgobj_address_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name(ipaccsection), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "frulealias", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_cfgobj_address_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *ipaccsection = (struct uci_section *)data;
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name(ipaccsection), &dmmap_section);
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, "frulealias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_port_forwarding_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *forwardsection = (struct uci_section *)data;
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_firewall", "redirect", section_name(forwardsection), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "forwardalias", value);
+	return 0;
+}
+
+int set_port_forwarding_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *forwardsection = (struct uci_section *)data;
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_firewall", "redirect", section_name(forwardsection), &dmmap_section);
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, "forwardalias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int browseAccListInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *irule = NULL, *irule_last = NULL;
+	struct uci_section *s = NULL;
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("firewall", "rule", "dmmap_firewall", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		irule =  handle_update_instance(1, dmctx, &irule_last, update_instance_alias_icwmpd, 3, p->dmmap_section, "fruleinstance", "frulealias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, irule) == DM_STOP)
+			return 0;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+int browseport_forwardingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *iforward = NULL, *iforward_last = NULL;
+	struct uci_section *s = NULL;
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap_eq("firewall", "redirect", "dmmap_firewall", "target", "DNAT", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		iforward =  handle_update_instance(1, dmctx, &iforward_last, update_instance_alias, 3, p->dmmap_section, "forwardinstance", "forwardalias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, iforward) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
diff --git a/dmtree/tr181/x_iopsys_eu_ipacccfg.h b/dmtree/tr181/x_iopsys_eu_ipacccfg.h
new file mode 100644
index 0000000000000000000000000000000000000000..55b3ee1715c3a75d354c0ff69e228eafc63cc3c0
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_ipacccfg.h
@@ -0,0 +1,76 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *	  Author Omar Kallel <omar.kallel@pivasoftware.com>
+ *
+ */
+
+#ifndef __SE_IPACCCFG_H
+#define __SE_IPACCCFG_H
+
+extern DMOBJ tSe_IpAccObj[];
+extern DMLEAF tSe_IpAccCfgParam[];
+extern DMLEAF tSe_PortForwardingParam[];
+
+
+int browseport_forwardingInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browseAccListInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int add_ipacccfg_port_forwarding(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_ipacccfg_port_forwarding(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int add_ipacccfg_rule(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_ipacccfg_rule(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_port_forwarding_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_port_forwarding_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_port_forwarding_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_port_forwarding_loopback(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_port_forwarding_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_port_forwarding_external_zone(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_port_forwarding_internal_zone(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_port_forwarding_external_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_port_forwarding_internal_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_port_forwarding_source_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_port_forwarding_internal_ipaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_port_forwarding_external_ipaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_port_forwarding_source_ipaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_port_forwarding_src_mac(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_x_iopsys_eu_cfgobj_address_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_x_bcm_com_ip_acc_list_cfgobj_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_x_bcm_com_ip_acc_list_cfgobj_ipversion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_x_bcm_com_ip_acc_list_cfgobj_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_x_bcm_com_ip_acc_list_cfgobj_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_x_iopsys_eu_cfgobj_address_netmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_x_bcm_com_ip_acc_list_cfgobj_acc_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_x_bcm_com_ip_acc_list_cfgobj_target(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int set_port_forwarding_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_port_forwarding_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_port_forwarding_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_port_forwarding_loopback(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_port_forwarding_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_port_forwarding_external_zone(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_port_forwarding_internal_zone(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_port_forwarding_external_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_port_forwarding_internal_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_port_forwarding_source_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_port_forwarding_internal_ipaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_port_forwarding_external_ipaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_port_forwarding_source_ipaddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_port_forwarding_src_mac(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_x_iopsys_eu_cfgobj_address_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_x_bcm_com_ip_acc_list_cfgobj_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_x_bcm_com_ip_acc_list_cfgobj_ipversion(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_x_bcm_com_ip_acc_list_cfgobj_protocol(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_x_bcm_com_ip_acc_list_cfgobj_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_x_iopsys_eu_cfgobj_address_netmask(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_x_bcm_com_ip_acc_list_cfgobj_acc_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_x_bcm_com_ip_acc_list_cfgobj_target(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif
diff --git a/dmtree/tr181/x_iopsys_eu_logincfg.c b/dmtree/tr181/x_iopsys_eu_logincfg.c
new file mode 100644
index 0000000000000000000000000000000000000000..9ec1d10d681d52a9d9a300bb1c4114bdcf898773
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_logincfg.c
@@ -0,0 +1,63 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "x_iopsys_eu_logincfg.h"
+
+/*** DMROOT.X_IOPSYS_EU_LoginCfg. ***/
+DMLEAF tSe_LoginCfgParam[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"AdminPassword", &DMWRITE, DMT_STRING, get_empty, set_x_bcm_admin_password, NULL, NULL, BBFDM_BOTH},
+{"SupportPassword", &DMWRITE, DMT_STRING, get_empty, set_x_bcm_support_password, NULL, NULL, BBFDM_BOTH},
+{"UserPassword", &DMWRITE, DMT_STRING, get_empty, set_x_bcm_user_password, NULL, NULL, BBFDM_BOTH},
+{"RootPassword", &DMWRITE, DMT_STRING, get_empty, set_x_bcm_root_password, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+int set_x_bcm_password(char *refparam, struct dmctx *ctx, int action, char *value, char *user_type)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("passwords", user_type, "password", value);
+			return 0;
+	}
+	return 0;
+}
+
+int set_x_bcm_admin_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	set_x_bcm_password(refparam, ctx, action, value, "admin");
+	return 0;
+}
+
+int set_x_bcm_support_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	set_x_bcm_password(refparam, ctx, action, value, "support");
+	return 0;
+}
+
+int set_x_bcm_user_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	set_x_bcm_password(refparam, ctx, action, value, "user");
+	return 0;
+}
+
+int set_x_bcm_root_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	set_x_bcm_password(refparam, ctx, action, value, "root");
+	return 0;
+}
diff --git a/dmtree/tr181/x_iopsys_eu_logincfg.h b/dmtree/tr181/x_iopsys_eu_logincfg.h
new file mode 100644
index 0000000000000000000000000000000000000000..b0e74072d22dbabd1b0d59c00ca37b4492a6b9a9
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_logincfg.h
@@ -0,0 +1,22 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *
+ */
+
+#ifndef __SE_LOGINCFG_H
+#define __SE_LOGINCFG_H
+
+extern DMLEAF tSe_LoginCfgParam[];
+
+int set_x_bcm_admin_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_x_bcm_support_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_x_bcm_user_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_x_bcm_root_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif
diff --git a/dmtree/tr181/x_iopsys_eu_owsd.c b/dmtree/tr181/x_iopsys_eu_owsd.c
new file mode 100644
index 0000000000000000000000000000000000000000..76ee5643ccd8342f54058e057355809683b24612
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_owsd.c
@@ -0,0 +1,562 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *	  Author Omar Kallel <omar.kallel@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <ctype.h>
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "dmentry.h"
+#include "x_iopsys_eu_owsd.h"
+
+/*** DMROOT.X_IOPSYS_EU_Owsd. ***/
+DMLEAF XIopsysEuOwsdParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Socket", &DMWRITE, DMT_STRING, get_x_iopsys_eu_owsd_global_sock, set_x_iopsys_eu_owsd_global_sock, NULL, NULL, BBFDM_BOTH},
+{"Redirect", &DMWRITE, DMT_STRING, get_x_iopsys_eu_owsd_global_redirect, set_x_iopsys_eu_owsd_global_redirect, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMOBJ XIopsysEuOwsdObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{CUSTOM_PREFIX"UbusProxy", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, UbusProxyParams, NULL, BBFDM_BOTH},
+{CUSTOM_PREFIX"ListenObj", &DMWRITE, add_owsd_listen, delete_owsd_listen_instance, NULL, browseXIopsysEuOwsdListenObj, NULL, NULL, NULL, X_IOPSYS_EU_ListenObjParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF UbusProxyParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_x_iopsys_eu_owsd_ubus_proxy_enable, set_x_iopsys_eu_owsd_ubus_proxy_enable, NULL, NULL, BBFDM_BOTH},
+{"UbusProxyCert", &DMWRITE, DMT_STRING, get_x_iopsys_eu_owsd_ubus_proxy_cert, set_x_iopsys_eu_owsd_ubus_proxy_cert, NULL, NULL, BBFDM_BOTH},
+{"UbusProxyKey", &DMWRITE, DMT_STRING, get_x_iopsys_eu_owsd_ubus_proxy_key, set_x_iopsys_eu_owsd_ubus_proxy_key, NULL, NULL, BBFDM_BOTH},
+{"UbusProxyCa", &DMWRITE, DMT_STRING, get_x_iopsys_eu_owsd_ubus_proxy_ca, set_x_iopsys_eu_owsd_ubus_proxy_ca, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF X_IOPSYS_EU_ListenObjParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Alias", &DMWRITE, DMT_STRING, get_x_iopsys_eu_owsd_listenobj_alias, set_x_iopsys_eu_owsd_listenobj_alias, NULL, NULL, BBFDM_BOTH},
+{"Port", &DMWRITE, DMT_UNINT, get_x_iopsys_eu_owsd_listenobj_port, set_x_iopsys_eu_owsd_listenobj_port, NULL, NULL, BBFDM_BOTH},
+{"Interface", &DMWRITE, DMT_STRING, get_x_iopsys_eu_owsd_listenobj_interface, set_x_iopsys_eu_owsd_listenobj_interface, NULL, NULL, BBFDM_BOTH},
+{"Ipv6", &DMWRITE, DMT_BOOL, get_x_iopsys_eu_owsd_listenobj_ipv6_enable, set_x_iopsys_eu_owsd_listenobj_ipv6_enable, NULL, NULL, BBFDM_BOTH},
+{"Whitelist_interface", &DMWRITE, DMT_BOOL, get_x_iopsys_eu_owsd_listenobj_whitelist_interface, set_x_iopsys_eu_owsd_listenobj_whitelist_interface, NULL, NULL, BBFDM_BOTH},
+{"Whitelist_dhcp", &DMWRITE, DMT_BOOL, get_x_iopsys_eu_owsd_listenobj_whitelist_dhcp, set_x_iopsys_eu_owsd_listenobj_whitelist_dhcp, NULL, NULL, BBFDM_BOTH},
+{"Origin", &DMWRITE, DMT_STRING, get_x_iopsys_eu_owsd_listenobj_origin, set_x_iopsys_eu_owsd_listenobj_origin, NULL, NULL, BBFDM_BOTH},
+{"UbusCert", &DMWRITE, DMT_STRING, get_x_iopsys_eu_owsd_ubus_cert, set_x_iopsys_eu_owsd_ubus_cert, NULL, NULL, BBFDM_BOTH},
+{"UbusKey", &DMWRITE, DMT_STRING, get_x_iopsys_eu_owsd_ubus_key, set_x_iopsys_eu_owsd_ubus_key, NULL, NULL, BBFDM_BOTH},
+{"UbusCa", &DMWRITE, DMT_STRING, get_x_iopsys_eu_owsd_ubus_ca, set_x_iopsys_eu_owsd_ubus_ca, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+int browseXIopsysEuOwsdListenObj(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *iowsd_listen = NULL, *iowsd_listen_last = NULL;
+	struct uci_section *s = NULL;
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("owsd", "owsd-listen", "dmmap_owsd", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		iowsd_listen =  handle_update_instance(1, dmctx, &iowsd_listen_last, update_instance_alias_icwmpd, 3, p->dmmap_section, "olisteninstance", "olistenalias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, iowsd_listen) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+/************************************************************************************* 
+**** function related to owsd_origin ****
+**************************************************************************************/
+int get_x_iopsys_eu_owsd_global_sock(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("owsd", "global", "sock", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_global_sock(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("owsd", "global", "sock", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_owsd_global_redirect(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("owsd", "global", "redirect", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_global_redirect(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("owsd", "global", "redirect", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*************************************************************************************
+**** function related to owsd_listenobj ****
+**************************************************************************************/
+int get_x_iopsys_eu_owsd_listenobj_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+	dmuci_get_value_by_section_string(owsd_listensection, "port", value);
+	if ((*value)[0] == '\0') {
+		*value = "";
+	}		
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_listenobj_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(owsd_listensection, "port", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_owsd_listenobj_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *iface;
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(owsd_listensection, "interface", &iface);
+	if (iface[0] != '\0') {
+		adm_entry_get_linker_param(ctx, dm_print_path("%s%cIP%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), iface, value); // MEM WILL BE FREED IN DMMEMCLEAN
+		if (*value == NULL)
+			*value = "";
+	}
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_listenobj_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *linker;
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			adm_entry_get_linker_value(ctx, value, &linker);
+			if (linker) {
+				dmuci_set_value_by_section(owsd_listensection, "interface", linker);
+				dmfree(linker);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_owsd_listenobj_ipv6_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(owsd_listensection, "ipv6", value);
+	if ((*value)[0] != '\0' && (*value)[0] == 'o' && (*value)[1] == 'n' ) {
+		*value = "1";
+	}
+	else
+		*value = "0";
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_listenobj_ipv6_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section(owsd_listensection, "ipv6", "on");
+			else
+				dmuci_set_value_by_section(owsd_listensection, "ipv6", "off");
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_owsd_listenobj_whitelist_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+	dmuci_get_value_by_section_string(owsd_listensection, "whitelist_interface_as_origin", value);
+	if ((*value)[0] == '\0' ) {
+		*value = "0";
+	}
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_listenobj_whitelist_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section(owsd_listensection, "whitelist_interface_as_origin", "1");
+			else
+				dmuci_set_value_by_section(owsd_listensection, "whitelist_interface_as_origin", "0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_owsd_listenobj_whitelist_dhcp(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+	dmuci_get_value_by_section_string(owsd_listensection, "whitelist_dhcp_domains", value);
+	if ((*value)[0] == '\0') {
+		*value = "0";
+	}
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_listenobj_whitelist_dhcp(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value_by_section(owsd_listensection, "whitelist_dhcp_domains", "1");
+			else
+				dmuci_set_value_by_section(owsd_listensection, "whitelist_dhcp_domains", "0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_owsd_listenobj_origin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_list *val;
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_list(owsd_listensection, "origin", &val);
+	if (val)
+		*value = dmuci_list_to_string(val, " ");
+	else
+		*value = "";
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_listenobj_origin(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	char *pch, *spch;
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_delete_by_section(owsd_listensection, "origin", NULL);
+			value = dmstrdup(value);
+			pch = strtok_r(value, " ", &spch);
+			while (pch != NULL) {
+				dmuci_add_list_value_by_section(owsd_listensection, "origin", pch);
+				pch = strtok_r(NULL, " ", &spch);
+			}
+			dmfree(value);
+			return 0;
+	}
+	return 0;
+}
+
+////////////////////////SET AND GET ALIAS/////////////////////////////////
+int get_x_iopsys_eu_owsd_listenobj_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_owsd", "owsd-listen", section_name(owsd_listensection), &dmmap_section);
+	dmuci_get_value_by_section_string(dmmap_section, "olistenalias", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_listenobj_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+	struct uci_section *dmmap_section;
+
+	get_dmmap_section_of_config_section("dmmap_owsd", "owsd-listen", section_name(owsd_listensection), &dmmap_section);
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(dmmap_section, "olistenalias", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_owsd_ubus_proxy_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("owsd","ubusproxy","enable", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_ubus_proxy_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("owsd", "ubusproxy", "enable", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_owsd_ubus_proxy_cert(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("owsd","ubusproxy","peer_cert", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_ubus_proxy_cert(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("owsd", "ubusproxy", "peer_cert", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_owsd_ubus_proxy_key(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("owsd","ubusproxy","peer_key", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_ubus_proxy_key(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("owsd", "ubusproxy", "peer_key", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_owsd_ubus_proxy_ca(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("owsd","ubusproxy","peer_ca", value);
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_ubus_proxy_ca(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value("owsd", "ubusproxy", "peer_ca", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_owsd_ubus_cert(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+	char *net_cur_mode = NULL;
+	dmuci_get_option_value_string("netmode", "setup", "curmode", &net_cur_mode);
+
+	if(strstr(net_cur_mode, "repeater") || strstr(net_cur_mode, "extender")) {
+		dmuci_get_value_by_section_string(owsd_listensection, "cert", value);
+	}
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_ubus_cert(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+	char *net_cur_mode = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_option_value_string("netmode", "setup", "curmode", &net_cur_mode);
+			if(strstr(net_cur_mode, "repeater") || strstr(net_cur_mode, "extender")){
+				if(strcmp(section_name(owsd_listensection), "wan_https")== 0)
+					dmuci_set_value_by_section(owsd_listensection, "cert", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_owsd_ubus_key(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+	char *net_cur_mode= NULL;
+
+	dmuci_get_option_value_string("netmode", "setup", "curmode", &net_cur_mode);
+	if(strstr(net_cur_mode, "repeater") || strstr(net_cur_mode, "extender")) {
+		dmuci_get_value_by_section_string(owsd_listensection, "key", value);
+	}
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_ubus_key(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+	char *net_cur_mode = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_option_value_string("netmode", "setup", "curmode", &net_cur_mode);
+			if(strstr(net_cur_mode, "repeater") || strstr(net_cur_mode, "extender")) {
+				if(strcmp(section_name(owsd_listensection), "wan_https")== 0)
+					dmuci_set_value_by_section(owsd_listensection, "key", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+int get_x_iopsys_eu_owsd_ubus_ca(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+	char *net_cur_mode = NULL;
+
+	dmuci_get_option_value_string("netmode", "setup", "curmode", &net_cur_mode);
+	if(strstr(net_cur_mode, "repeater") || strstr(net_cur_mode, "extender")){
+		dmuci_get_value_by_section_string(owsd_listensection, "ca", value);
+	}
+	return 0;
+}
+
+int set_x_iopsys_eu_owsd_ubus_ca(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+	char *net_cur_mode = NULL;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_get_option_value_string("netmode", "setup", "curmode", &net_cur_mode);
+			if(strstr(net_cur_mode, "repeater") || strstr(net_cur_mode, "extender")) {
+				if(strcmp(section_name(owsd_listensection), "wan_https")== 0)
+					dmuci_set_value_by_section(owsd_listensection, "ca", value);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/***** ADD DEL OBJ *******/
+int add_owsd_listen(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{
+	char *value, *v;
+	char *instance;
+	struct uci_section *listen_sec = NULL, *dmmap_sec= NULL;
+
+	check_create_dmmap_package("dmmap_owsd");
+	instance = get_last_instance_icwmpd("dmmap_owsd", "owsd-listen", "olisteninstance");
+
+	dmuci_add_section("owsd", "owsd-listen", &listen_sec, &value);
+	dmuci_set_value_by_section(listen_sec, "ipv6", "on");
+	dmuci_set_value_by_section(listen_sec, "whitelist_interface_as_origin", "1");
+	dmuci_add_list_value_by_section(listen_sec, "origin", "*");
+
+	dmuci_add_section_icwmpd("dmmap_owsd", "owsd-listen", &dmmap_sec, &v);
+	dmuci_set_value_by_section(dmmap_sec, "section_name", section_name(listen_sec));
+	*instancepara = update_instance_icwmpd(dmmap_sec, instance, "olisteninstance");
+
+	return 0;
+}
+
+int delete_owsd_listen_instance(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	struct uci_section *s = NULL;
+	struct uci_section *ss = NULL;
+	struct uci_section *owsd_listensection = (struct uci_section *)data;
+	struct uci_section *dmmap_section;
+
+	int found = 0;
+	switch (del_action) {
+		case DEL_INST:
+			if(is_section_unnamed(section_name(owsd_listensection))){
+				LIST_HEAD(dup_list);
+				delete_sections_save_next_sections("dmmap_owsd", "owsd-listen", "olisteninstance", section_name(owsd_listensection), atoi(instance), &dup_list);
+				update_dmmap_sections(&dup_list, "olisteninstance", "dmmap_owsd", "owsd-listen");
+				dmuci_delete_by_section_unnamed(owsd_listensection, NULL, NULL);
+			} else {
+				get_dmmap_section_of_config_section("dmmap_owsd", "owsd-listen", section_name(owsd_listensection), &dmmap_section);
+				dmuci_delete_by_section_unnamed_icwmpd(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(owsd_listensection, NULL, NULL);
+			}
+			break;
+		case DEL_ALL:
+			uci_foreach_sections("owsd", "owsd-listen", s) {
+				if (found != 0){
+					get_dmmap_section_of_config_section("dmmap_owsd", "listen", section_name(s), &dmmap_section);
+					if(dmmap_section != NULL)
+						dmuci_delete_by_section(dmmap_section, NULL, NULL);
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL){
+				get_dmmap_section_of_config_section("dmmap_owsd", "listen", section_name(ss), &dmmap_section);
+				if(dmmap_section != NULL)
+					dmuci_delete_by_section(dmmap_section, NULL, NULL);
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			return 0;
+	}
+	return 0;
+}
diff --git a/dmtree/tr181/x_iopsys_eu_owsd.h b/dmtree/tr181/x_iopsys_eu_owsd.h
new file mode 100644
index 0000000000000000000000000000000000000000..fbe6f57343e3f3b16bbb5bb9cf5ff57a14bb1b1d
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_owsd.h
@@ -0,0 +1,61 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *	  Author Omar Kallel <omar.kallel@pivasoftware.com>
+ *
+ */
+
+#ifndef __SE_OWSD_H
+#define __SE_OWSD_H
+
+
+extern DMLEAF XIopsysEuOwsdParams[];
+extern DMOBJ XIopsysEuOwsdObj[];
+extern DMLEAF X_IOPSYS_EU_ListenObjParams[];
+extern DMLEAF UbusProxyParams[];
+
+int browseXIopsysEuOwsdListenObj(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int add_owsd_listen(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_owsd_listen_instance(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+
+int get_x_iopsys_eu_owsd_global_sock(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_global_sock(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_owsd_global_redirect(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_global_redirect(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_owsd_listenobj_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_listenobj_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_owsd_listenobj_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_listenobj_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_owsd_listenobj_ipv6_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_listenobj_ipv6_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_owsd_listenobj_whitelist_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_listenobj_whitelist_interface(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_owsd_listenobj_whitelist_dhcp(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_listenobj_whitelist_dhcp(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_owsd_listenobj_origin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_listenobj_origin(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_owsd_listenobj_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_listenobj_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_owsd_ubus_proxy_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_ubus_proxy_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_owsd_ubus_proxy_cert(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_ubus_proxy_cert(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_owsd_ubus_proxy_key(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_ubus_proxy_key(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_owsd_ubus_proxy_ca(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_ubus_proxy_ca(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_owsd_ubus_cert(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_ubus_cert(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_owsd_ubus_key(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_ubus_key(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_x_iopsys_eu_owsd_ubus_ca(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_owsd_ubus_ca(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif
diff --git a/dmtree/tr181/x_iopsys_eu_power_mgmt.c b/dmtree/tr181/x_iopsys_eu_power_mgmt.c
new file mode 100644
index 0000000000000000000000000000000000000000..07bf8a01351a08ed7736558709f41d71a9dfd7bb
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_power_mgmt.c
@@ -0,0 +1,124 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2012-2014 PIVA SOFTWARE (www.pivasoftware.com)
+*		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *		Author: Feten Besbes <feten.besbes@pivasoftware.com>
+ *		Author: Mohamed Kallel <mohamed.kallel@pivasoftware.com>
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ */
+
+#include <unistd.h>
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmcommon.h"
+#include "x_iopsys_eu_power_mgmt.h"
+
+/*** DMROOT.X_IOPSYS_EU_PowerManagement. ***/
+DMLEAF tSe_PowerManagementParam[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"EthernetAutoPowerDownEnable", &DMWRITE, DMT_BOOL, get_pwr_mgmt_value_ethapd, set_power_mgmt_param_ethapd, NULL, NULL, BBFDM_BOTH},
+{"EnergyEfficientEthernetEnable", &DMWRITE, DMT_BOOL, get_pwr_mgmt_value_eee, set_power_mgmt_param_eee, NULL, NULL, BBFDM_BOTH},
+{"NumberOfEthernetInterfacesPoweredUp", &DMREAD, DMT_UNINT, get_pwr_nbr_interfaces_up, NULL, NULL, NULL, BBFDM_BOTH},
+{"NumberOfEthernetInterfacesPoweredDown", &DMREAD, DMT_UNINT, get_pwr_nbr_interfaces_down, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+int get_pwr_mgmt_value_ethapd(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("power_mgmt", "power_mgmt", "ethapd", value);
+	return 0;
+}
+
+int get_pwr_mgmt_value_eee(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("power_mgmt", "power_mgmt", "eee", value);
+	return 0;
+}
+
+int get_pwr_nbr_interfaces_up(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char buf[256];
+	int pp, r;
+
+	*value = "";
+	pp = dmcmd("pwrctl", 1, "show"); //TODO wait ubus command
+	if (pp) {
+		r = dmcmd_read(pp, buf, 256);
+		close(pp);
+		//TODO output command is changed
+		return 0;
+	}
+	return 0;
+}
+
+int get_pwr_nbr_interfaces_down(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char buf[256];
+	int pp, r;
+
+	*value = "";
+	pp = dmcmd("pwrctl", 1, "show"); //TODO wait ubus command
+	if (pp) {
+		r = dmcmd_read(pp, buf, 256);
+		close(pp);
+		//TODO output command is changed
+		return 0;
+	}
+	return 0;
+}
+
+int set_power_mgmt_param_ethapd(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value("power_mgmt", "power_mgmt", "ethapd", "1");
+			else
+				dmuci_set_value("power_mgmt", "power_mgmt", "ethapd", "0");
+			return 0;
+	}
+	return 0;
+}
+
+int set_power_mgmt_param_eee(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			if(b)
+				dmuci_set_value("power_mgmt", "power_mgmt", "eee", "1");
+			else
+				dmuci_set_value("power_mgmt", "power_mgmt", "eee", "0");
+			return 0;
+	}
+	return 0;
+}
+
+#if 0
+bool dm_powermgmt_enable_set(void)
+{
+	if( access("/etc/init.d/power_mgmt", F_OK ) != -1 ) {
+		return true;
+	}
+  else {
+		return false;
+	}
+}
+#endif
diff --git a/dmtree/tr181/x_iopsys_eu_power_mgmt.h b/dmtree/tr181/x_iopsys_eu_power_mgmt.h
new file mode 100644
index 0000000000000000000000000000000000000000..a4aa79aeaf507b08c0899300cf78ba4d5348d3f4
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_power_mgmt.h
@@ -0,0 +1,25 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2012-2014 PIVA SOFTWARE (www.pivasoftware.com)
+ *		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *		Author: Feten Besbes <feten.besbes@pivasoftware.com>
+ */
+
+#ifndef __POWER_MGMT_H
+#define __POWER_MGMT_H
+
+extern DMLEAF tSe_PowerManagementParam[];
+//bool dm_powermgmt_enable_set(void);
+
+int get_pwr_mgmt_value_ethapd(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_pwr_mgmt_value_eee(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_pwr_nbr_interfaces_up(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_pwr_nbr_interfaces_down(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int set_power_mgmt_param_ethapd(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_power_mgmt_param_eee(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+#endif
diff --git a/dmtree/tr181/x_iopsys_eu_syslog.c b/dmtree/tr181/x_iopsys_eu_syslog.c
new file mode 100644
index 0000000000000000000000000000000000000000..c5c853d5ecb476c208457b6b80ebdc5b9f3ecf06
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_syslog.c
@@ -0,0 +1,92 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *		Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcwmp.h"
+#include "dmcommon.h"
+#include "x_iopsys_eu_syslog.h"
+
+/*** DMROOT.X_IOPSYS_EU_SyslogCfg. ***/
+DMLEAF tSe_SyslogCfgParam[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"ServerIPAddress", &DMWRITE, DMT_STRING, get_server_ip_address, set_server_ip_address, NULL, NULL, BBFDM_BOTH},
+{"ServerPortNumber", &DMWRITE, DMT_UNINT, get_server_port_number, set_server_port_number, NULL, NULL, BBFDM_BOTH},
+{"RemoteLogLevel", &DMWRITE, DMT_UNINT, get_remote_log_level, set_remote_log_level, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+int get_server_ip_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("system", "@system[0]", "log_ip", value);
+	return 0;
+}
+
+int set_server_ip_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:			
+			return 0;
+		case VALUESET:
+			dmuci_set_value("system", "@system[0]", "log_ip", value);
+			return 0;
+	}
+	return 0;
+}
+	
+int get_server_port_number(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *tmp;
+	dmuci_get_option_value_string("system", "@system[0]", "log_port", &tmp);
+	if (tmp[0] == '\0')
+		*value = "514";
+	else
+		*value = tmp;
+	return 0;
+}
+
+int set_server_port_number(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:			
+			return 0;
+		case VALUESET:
+			dmuci_set_value("system", "@system[0]", "log_port", value);
+			return 0;
+	}
+	return 0;
+}
+
+int get_remote_log_level(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	char *tmp;
+	dmuci_get_option_value_string("system", "@system[0]", "conloglevel", &tmp);
+	if (tmp[0] == '\0')
+		*value = "7";
+	else
+		*value = tmp;
+	return 0;
+}
+
+int set_remote_log_level(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	switch (action) {
+		case VALUECHECK:			
+			return 0;
+		case VALUESET:
+			dmuci_set_value("system", "@system[0]", "conloglevel", value);
+			return 0;
+	}
+	return 0;
+}
diff --git a/dmtree/tr181/x_iopsys_eu_syslog.h b/dmtree/tr181/x_iopsys_eu_syslog.h
new file mode 100644
index 0000000000000000000000000000000000000000..2ab1c14538ef5a9d571c1ec74333e7be2eaa5806
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_syslog.h
@@ -0,0 +1,25 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *		Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *
+ */
+
+#ifndef __SE_SYSLOG_H
+#define __SE_SYSLOG_H
+
+extern DMLEAF tSe_SyslogCfgParam[];
+
+int get_server_ip_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_server_port_number(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_remote_log_level(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int set_server_ip_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_server_port_number(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_remote_log_level(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif
diff --git a/dmtree/tr181/x_iopsys_eu_wifilife.c b/dmtree/tr181/x_iopsys_eu_wifilife.c
new file mode 100644
index 0000000000000000000000000000000000000000..9f686a92abb7ef15f51a37a15f6bfd2637979798
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_wifilife.c
@@ -0,0 +1,130 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*      Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*/
+
+#include <uci.h>
+#include <ctype.h>
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "x_iopsys_eu_wifilife.h"
+
+/*** DMROOT.X_IOPSYS_EU_WiFiLife. ****/
+DMOBJ X_IOPSYS_EU_WiFiLifeObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Steering", &DMREAD, NULL, NULL, NULL, browseWifiLifeSteeringObj, NULL, NULL, NULL, WiFiLifeSteeringParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF X_IOPSYS_EU_WiFiLifeParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_x_iopsys_eu_wifilife_enable, set_x_iopsys_eu_wifilife_enable, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF WiFiLifeSteeringParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_wifilife_steering_enable, set_wifilife_steering_enable, NULL, NULL, BBFDM_BOTH},
+{"LegacyFallback", &DMWRITE, DMT_BOOL, get_wifilife_steering_legacy_fallback, set_wifilife_steering_legacy_fallback, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+int browseWifiLifeSteeringObj(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *isteer = NULL, *isteer_last = NULL;
+	struct uci_section *s = NULL;
+	struct dmmap_dup *p;
+	LIST_HEAD(dup_list);
+
+	synchronize_specific_config_sections_with_dmmap("wifilife", "steer", "dmmap_wifilife", &dup_list);
+	list_for_each_entry(p, &dup_list, list) {
+		isteer =  handle_update_instance(1, dmctx, &isteer_last, update_instance_alias, 3, p->dmmap_section, "steer_instance", "steer_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, isteer) == DM_STOP)
+			break;
+	}
+	free_dmmap_config_dup_list(&dup_list);
+	return 0;
+}
+
+/*************************************************************************************
+**** GET / SET function ****
+**************************************************************************************/
+int get_x_iopsys_eu_wifilife_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_option_value_string("wifilife", "@wifilife[0]", "enabled", value);
+	if ((*value)[0] == '\0') {
+		*value = "1";
+	}
+	return 0;
+}
+
+int set_x_iopsys_eu_wifilife_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmuci_set_value("wifilife", "@wifilife[0]", "enabled", b?"1":"0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_wifilife_steering_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "enabled", value);
+	if ((*value)[0] == '\0')
+		*value = "0";
+	return 0;
+}
+
+int set_wifilife_steering_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmuci_set_value_by_section((struct uci_section *)data, "enabled", b?"1":"0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_wifilife_steering_legacy_fallback(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	dmuci_get_value_by_section_string((struct uci_section *)data, "fallback_legacy", value);
+	if ((*value)[0] == '\0')
+		*value = "0";
+	return 0;
+}
+
+int set_wifilife_steering_legacy_fallback(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	bool b;
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmuci_set_value_by_section((struct uci_section *)data, "fallback_legacy", b?"1":"0");
+			return 0;
+	}
+	return 0;
+}
diff --git a/dmtree/tr181/x_iopsys_eu_wifilife.h b/dmtree/tr181/x_iopsys_eu_wifilife.h
new file mode 100644
index 0000000000000000000000000000000000000000..d9a8c9cead1a863e0c960da29518cddd83d5fcd9
--- /dev/null
+++ b/dmtree/tr181/x_iopsys_eu_wifilife.h
@@ -0,0 +1,27 @@
+/*
+*      This program is free software: you can redistribute it and/or modify
+*      it under the terms of the GNU General Public License as published by
+*      the Free Software Foundation, either version 2 of the License, or
+*      (at your option) any later version.
+*
+*      Copyright (C) 2019 iopsys Software Solutions AB
+*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+*/
+
+#ifndef __WIFILIFE_H
+#define __WIFILIFE_H
+
+extern DMOBJ X_IOPSYS_EU_WiFiLifeObj[];
+extern DMLEAF X_IOPSYS_EU_WiFiLifeParams[];
+extern DMLEAF WiFiLifeSteeringParams[];
+
+int browseWifiLifeSteeringObj(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int get_x_iopsys_eu_wifilife_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_x_iopsys_eu_wifilife_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_wifilife_steering_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_wifilife_steering_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_wifilife_steering_legacy_fallback(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int set_wifilife_steering_legacy_fallback(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+
+#endif // __WIFILIFE_H
diff --git a/dmtree/tr181/xmpp.c b/dmtree/tr181/xmpp.c
new file mode 100644
index 0000000000000000000000000000000000000000..49c5448de65ffe98cb435d970037f39d060321ff
--- /dev/null
+++ b/dmtree/tr181/xmpp.c
@@ -0,0 +1,653 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2018 Inteno Broadband Technology AB
+ *	    Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *      Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#include <uci.h>
+#include <ctype.h>
+#include "dmcwmp.h"
+#include "dmuci.h"
+#include "dmubus.h"
+#include "dmcommon.h"
+#include "xmpp.h"
+
+/* *** Device.XMPP. *** */
+DMOBJ tXMPPObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Connection", &DMWRITE, add_xmpp_connection, delete_xmpp_connection, NULL, browsexmpp_connectionInst, NULL, NULL, tXMPPConnectionObj, tXMPPConnectionParams, get_xmpp_connection_linker, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tXMPPParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"ConnectionNumberOfEntries", &DMREAD, DMT_UNINT, get_xmpp_connection_nbr_entry, NULL, NULL, NULL, BBFDM_BOTH},
+{"SupportedServerConnectAlgorithms", &DMREAD, DMT_STRING, get_xmpp_connection_supported_server_connect_algorithms, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.XMPP.Connection.{i}. *** */
+DMOBJ tXMPPConnectionObj[] = {
+/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/
+{"Server", &DMREAD, NULL, NULL, NULL, browsexmpp_connection_serverInst, NULL, NULL, NULL, tXMPPConnectionServerParams, NULL, BBFDM_BOTH},
+{0}
+};
+
+DMLEAF tXMPPConnectionParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_connection_enable, set_connection_enable, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_xmpp_connection_alias, set_xmpp_connection_alias, NULL, NULL, BBFDM_BOTH},
+{"Username", &DMWRITE, DMT_STRING, get_xmpp_connection_username, set_xmpp_connection_username, NULL, NULL, BBFDM_BOTH},
+{"Password", &DMWRITE, DMT_STRING, get_xmpp_connection_password, set_xmpp_connection_password, NULL, NULL, BBFDM_BOTH},
+{"Domain", &DMWRITE, DMT_STRING, get_xmpp_connection_domain, set_xmpp_connection_domain, NULL, NULL, BBFDM_BOTH},
+{"Resource", &DMWRITE, DMT_STRING, get_xmpp_connection_resource, set_xmpp_connection_resource, NULL, NULL, BBFDM_BOTH},
+{"ServerConnectAlgorithm", &DMWRITE, DMT_STRING, get_xmpp_connection_server_connect_algorithm, set_xmpp_connection_server_connect_algorithm, NULL, NULL, BBFDM_BOTH},
+{"KeepAliveInterval", &DMWRITE, DMT_LONG, get_xmpp_connection_keepalive_interval, set_xmpp_connection_keepalive_interval, NULL, NULL, BBFDM_BOTH},
+{"ServerConnectAttempts", &DMWRITE, DMT_UNINT, get_xmpp_connection_server_attempts, set_xmpp_connection_server_attempts, NULL, NULL, BBFDM_BOTH},
+{"ServerRetryInitialInterval", &DMWRITE, DMT_UNINT, get_xmpp_connection_retry_initial_interval, set_xmpp_connection_retry_initial_interval, NULL, NULL, BBFDM_BOTH},
+{"ServerRetryIntervalMultiplier", &DMWRITE, DMT_UNINT, get_xmpp_connection_retry_interval_multiplier, set_xmpp_connection_retry_interval_multiplier, NULL, NULL, BBFDM_BOTH},
+{"ServerRetryMaxInterval", &DMWRITE, DMT_UNINT, get_xmpp_connection_retry_max_interval, set_xmpp_connection_retry_max_interval, NULL, NULL, BBFDM_BOTH},
+{"UseTLS", &DMWRITE, DMT_BOOL, get_xmpp_connection_server_usetls, set_xmpp_connection_server_usetls, NULL, NULL, BBFDM_BOTH},
+{"JabberID", &DMREAD, DMT_STRING, get_xmpp_connection_jabber_id, NULL, NULL, NULL, BBFDM_BOTH},
+{"Status", &DMREAD, DMT_STRING, get_xmpp_connection_status, NULL, NULL, NULL, BBFDM_BOTH},
+{"ServerNumberOfEntries", &DMREAD, DMT_UNINT, get_xmpp_connection_server_number_of_entries, NULL, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+/* *** Device.XMPP.Connection.{i}.Server.{i}. *** */
+DMLEAF tXMPPConnectionServerParams[] = {
+/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/
+{"Enable", &DMWRITE, DMT_BOOL, get_xmpp_connection_server_enable, set_xmpp_connection_server_enable, NULL, NULL, BBFDM_BOTH},
+{"Alias", &DMWRITE, DMT_STRING, get_xmpp_connection_server_alias, set_xmpp_connection_server_alias, NULL, NULL, BBFDM_BOTH},
+{"ServerAddress", &DMWRITE, DMT_STRING, get_xmpp_connection_server_server_address, set_xmpp_connection_server_server_address, NULL, NULL, BBFDM_BOTH},
+{"Port", &DMWRITE, DMT_UNINT, get_xmpp_connection_server_port, set_xmpp_connection_server_port, NULL, NULL, BBFDM_BOTH},
+{0}
+};
+
+int add_xmpp_connection(char *refparam, struct dmctx *ctx, void *data, char **instancepara)
+{
+	struct uci_section *xmpp_connection, *xmpp_connection_server;
+	char *value1, *value2, *last_inst;
+
+	last_inst = get_last_instance("cwmp_xmpp", "xmpp_connection", "connection_instance");
+	dmuci_add_section_and_rename("cwmp_xmpp", "xmpp_connection", &xmpp_connection, &value1);
+	dmuci_add_section_and_rename("cwmp_xmpp", "xmpp_connection_server", &xmpp_connection_server, &value2);
+	dmasprintf(instancepara, "%d", atoi(last_inst)+1);
+	dmuci_set_value_by_section(xmpp_connection, "connection_instance", *instancepara);
+	dmuci_set_value_by_section(xmpp_connection, "enable", "0");
+	dmuci_set_value_by_section(xmpp_connection, "interval", "30");
+	dmuci_set_value_by_section(xmpp_connection, "attempt", "16");
+	dmuci_set_value_by_section(xmpp_connection, "serveralgorithm", "DNS-SRV");
+	dmuci_set_value_by_section(xmpp_connection_server, "id_connection", *instancepara);
+	dmuci_set_value_by_section(xmpp_connection_server, "connection_server_instance", "1");
+	dmuci_set_value_by_section(xmpp_connection_server, "enable", "0");
+	dmuci_set_value_by_section(xmpp_connection_server, "port", "5222");
+	return 0;
+}
+
+int delete_xmpp_connection(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
+{
+	int found = 0;
+	struct uci_section *s, *ss = NULL;
+	struct uci_section *connsection = (struct uci_section *)data;
+	char *prev_connection_instance;
+	
+	switch (del_action) {
+		case DEL_INST:
+			dmuci_get_value_by_section_string(connsection, "connection_instance", &prev_connection_instance);
+			uci_foreach_option_eq("cwmp_xmpp", "xmpp_connection_server", "id_connection", prev_connection_instance, s) {
+				dmuci_delete_by_section(s, NULL, NULL);
+				break;
+			}
+			dmuci_delete_by_section(connsection, NULL, NULL);
+			return 0;
+		case DEL_ALL:
+			uci_foreach_sections("cwmp_xmpp", "xmpp_connection", s) {
+					if (found != 0) {
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL) {
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			uci_foreach_sections("cwmp_xmpp", "xmpp_connection_server", s) {
+					if (found != 0) {
+					dmuci_delete_by_section(ss, NULL, NULL);
+				}
+				ss = s;
+				found++;
+			}
+			if (ss != NULL) {
+				dmuci_delete_by_section(ss, NULL, NULL);
+			}
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.ConnectionNumberOfEntries!UCI:cwmp_xmpp/xmpp_connection/*/
+int get_xmpp_connection_nbr_entry(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *s;
+	int cnt = 0;
+
+	uci_foreach_sections("cwmp_xmpp", "xmpp_connection", s) {
+		cnt++;
+	}
+	dmasprintf(value, "%d", cnt); // MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+int get_xmpp_connection_supported_server_connect_algorithms(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "DNS-SRV , ServerTable";
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.Enable!UCI:cwmp_xmpp/xmpp_connection,@i-1/enable*/
+int get_connection_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "enable", value);
+	return 0;
+}
+
+int set_connection_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) 
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmuci_set_value_by_section(connsection, "enable", b ? "1" : "0");
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.Alias!UCI:cwmp_xmpp/xmpp_connection,@i-1/connection_alias*/
+int get_xmpp_connection_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "connection_alias", value);
+	return 0;
+}
+
+int set_xmpp_connection_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(connsection, "connection_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.Username!UCI:cwmp_xmpp/xmpp_connection,@i-1/username*/
+int get_xmpp_connection_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "username", value);
+	return 0;
+}
+
+int set_xmpp_connection_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(connsection, "username", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.Password!UCI:cwmp_xmpp/xmpp_connection,@i-1/password*/
+int get_xmpp_connection_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "";
+	return 0;
+}
+
+int set_xmpp_connection_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(connsection, "password", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.Domain!UCI:cwmp_xmpp/xmpp_connection,@i-1/domain*/
+int get_xmpp_connection_domain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "domain", value);
+	return 0;
+}
+
+int set_xmpp_connection_domain(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) 
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(connsection, "domain", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.Ressource!UCI:cwmp_xmpp/xmpp_connection,@i-1/resource*/
+int get_xmpp_connection_resource(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "resource", value);
+	return 0;
+}
+
+int set_xmpp_connection_resource(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) 
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(connsection, "resource", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.ServerConnectAlgorithm!UCI:cwmp_xmpp/xmpp_connection,@i-1/serveralgorithm*/
+int get_xmpp_connection_server_connect_algorithm(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "serveralgorithm", value);
+	return 0;
+}
+
+int set_xmpp_connection_server_connect_algorithm(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) 
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			if(strcmp(value, "DNS-SRV") == 0 || strcmp(value, "ServerTable") == 0)
+				dmuci_set_value_by_section(connsection, "serveralgorithm", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.KeepAliveInterval!UCI:cwmp_xmpp/xmpp_connection,@i-1/interval*/
+int get_xmpp_connection_keepalive_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "interval", value);
+	return 0;
+}
+
+int set_xmpp_connection_keepalive_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) 
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(connsection, "interval", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.ServerConnectAttempts!UCI:cwmp_xmpp/xmpp_connection,@i-1/attempt*/
+int get_xmpp_connection_server_attempts(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "attempt", value);
+	return 0;
+}
+
+int set_xmpp_connection_server_attempts(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) 
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(connsection, "attempt", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.ServerRetryInitialInterval!UCI:cwmp_xmpp/xmpp_connection,@i-1/initial_retry_interval*/
+int get_xmpp_connection_retry_initial_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "initial_retry_interval", value);
+	return 0;
+}
+
+int set_xmpp_connection_retry_initial_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) 
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(connsection, "initial_retry_interval", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.ServerRetryIntervalMultiplier!UCI:cwmp_xmpp/xmpp_connection,@i-1/retry_interval_multiplier*/
+int get_xmpp_connection_retry_interval_multiplier(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "retry_interval_multiplier", value);
+	return 0;
+}
+
+int set_xmpp_connection_retry_interval_multiplier(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) 
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(connsection, "retry_interval_multiplier", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.ServerRetryMaxInterval!UCI:cwmp_xmpp/xmpp_connection,@i-1/retry_max_interval*/
+int get_xmpp_connection_retry_max_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "retry_max_interval", value);
+	return 0;
+}
+
+int set_xmpp_connection_retry_max_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) 
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(connsection, "retry_max_interval", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.UseTLS!UCI:cwmp_xmpp/xmpp_connection,@i-1/usetls*/
+int get_xmpp_connection_server_usetls(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "usetls", value);
+	return 0;
+}
+
+int set_xmpp_connection_server_usetls(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) 
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmuci_set_value_by_section(connsection, "usetls", b ? "1" : "0");
+			return 0;
+	}
+	return 0;
+}
+
+int get_xmpp_connection_jabber_id(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	char *resource, *domain, *username;
+
+	dmuci_get_value_by_section_string(connsection, "resource", &resource);
+	dmuci_get_value_by_section_string(connsection, "domain", &domain);
+	dmuci_get_value_by_section_string(connsection, "username", &username);
+	if(*resource != '\0' || *domain != '\0' || *username != '\0')
+		dmasprintf(value, "%s@%s/%s", username, domain, resource);
+	else
+		*value = "";
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.Status!UCI:cwmp_xmpp/xmpp_connection,@i-1/enable*/
+int get_xmpp_connection_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	char *status;
+
+	dmuci_get_value_by_section_string(connsection, "enable", &status);
+	if(strcmp(status,"1") == 0)
+			*value = "Enabled";
+		else
+			*value = "Disabled";
+	return 0;
+}
+
+int get_xmpp_connection_server_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	*value = "1";
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.Server.{i}.Enable!UCI:cwmp_xmpp/xmpp_connection,@i-1/enable*/
+int get_xmpp_connection_server_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "enable", value);
+	return 0;
+}
+
+int set_xmpp_connection_server_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			if (string_to_bool(value, &b))
+				return FAULT_9007;
+			return 0;
+		case VALUESET:
+			string_to_bool(value, &b);
+			dmuci_set_value_by_section(connsection, "enable", b ? "1" : "0");
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.Server.{i}.Alias!UCI:cwmp_xmpp/xmpp_connection,@i-1/connection_server_alias*/
+int get_xmpp_connection_server_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "connection_server_alias", value);
+	return 0;
+}
+
+int set_xmpp_connection_server_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+	bool b;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(connsection, "connection_server_alias", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.Server.{i}.ServerAddress!UCI:cwmp_xmpp/xmpp_connection,@i-1/server_address*/
+int get_xmpp_connection_server_server_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "server_address", value);
+	return 0;
+}
+
+int set_xmpp_connection_server_server_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(connsection, "server_address", value);
+			return 0;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.Server.{i}.Port!UCI:cwmp_xmpp/xmpp_connection,@i-1/port*/
+int get_xmpp_connection_server_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	dmuci_get_value_by_section_string(connsection, "port", value);
+	return 0;
+}
+
+int set_xmpp_connection_server_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	switch (action) {
+		case VALUECHECK:
+			return 0;
+		case VALUESET:
+			dmuci_set_value_by_section(connsection, "port", value);
+			return 0;
+	}
+	return 0;
+}
+
+/**************************************************************************
+* LINKER
+***************************************************************************/
+int  get_xmpp_connection_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker) {
+	char *conn_instance;
+	struct uci_section *connsection = (struct uci_section *)data;
+
+	if (connsection)
+	{
+		dmuci_get_value_by_section_string(connsection, "connection_instance", &conn_instance);
+		dmasprintf(linker,"xmppc:%s", conn_instance);
+		return 0;
+	}
+	else
+		*linker = "";
+		return 0;
+}
+
+/*************************************************************
+ * ENTRY METHOD
+/*************************************************************/
+/*#Device.XMPP.Connection.{i}.!UCI:cwmp_xmpp/xmpp_connection/dmmap_cwmp_xmpp*/
+int browsexmpp_connectionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *iconnection = NULL, *iconnection_last = NULL;
+	struct uci_section *s = NULL;
+
+	uci_foreach_sections("cwmp_xmpp", "xmpp_connection", s) {
+		iconnection = handle_update_instance(1, dmctx, &iconnection_last, update_instance_alias, 3, s, "connection_instance", "connection_instance_alias");
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)s, iconnection) == DM_STOP)
+			break;
+	}
+	return 0;
+}
+
+/*#Device.XMPP.Connection.{i}.!UCI:cwmp_xmpp/xmpp_connection_server/dmmap_cwmp_xmpp*/
+int browsexmpp_connection_serverInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
+{
+	char *iconnectionserver = NULL, *iconnectionserver_last = NULL, *prev_connection_instance;
+	struct uci_section *s = NULL, *connsection = (struct uci_section *)prev_data;
+
+	dmuci_get_value_by_section_string(connsection, "connection_instance", &prev_connection_instance);
+	uci_foreach_option_eq("cwmp_xmpp", "xmpp_connection_server", "id_connection", prev_connection_instance, s) {
+	iconnectionserver = handle_update_instance(1, dmctx, &iconnectionserver_last, update_instance_alias, 3, s, "connection_server_instance", "connection_server_instance_alias");
+	if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)s, iconnectionserver) == DM_STOP)
+		break;
+	}
+	return 0;
+}
+
diff --git a/dmtree/tr181/xmpp.h b/dmtree/tr181/xmpp.h
new file mode 100644
index 0000000000000000000000000000000000000000..c02e5da391d1dacdf28bf4d4ad15180694830a87
--- /dev/null
+++ b/dmtree/tr181/xmpp.h
@@ -0,0 +1,69 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2018 Inteno Broadband Technology AB
+ *	    Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *      Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+ *
+ */
+
+#ifndef __XMPP_H
+#define __XMPP_H
+
+extern DMOBJ tXMPPObj[];
+extern DMLEAF tXMPPParams[];
+extern DMLEAF tXMPPConnectionParams[];
+extern DMOBJ tXMPPConnectionObj[];
+extern DMLEAF tXMPPConnectionServerParams[];
+
+int browsexmpp_connectionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+int browsexmpp_connection_serverInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
+
+int add_xmpp_connection(char *refparam, struct dmctx *ctx, void *data, char **instancepara);
+int delete_xmpp_connection(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
+
+int get_xmpp_connection_nbr_entry(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_supported_server_connect_algorithms(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_connection_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_domain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_resource(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_server_connect_algorithm(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_keepalive_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_server_attempts(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_retry_initial_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_retry_interval_multiplier(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_retry_max_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_server_usetls(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_jabber_id(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_server_number_of_entries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_server_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_server_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_server_server_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+int get_xmpp_connection_server_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);
+
+int set_connection_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_password(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_domain(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_resource(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_server_connect_algorithm(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_keepalive_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_server_attempts(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_retry_initial_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_retry_interval_multiplier(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_retry_max_interval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_server_usetls(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_server_enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_server_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_server_server_address(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int set_xmpp_connection_server_port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);
+int get_xmpp_connection_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker);
+#endif
diff --git a/dmubus.c b/dmubus.c
new file mode 100644
index 0000000000000000000000000000000000000000..f6dd8fc1d1a8d77f1459a418d3dcc0c49f3c51b3
--- /dev/null
+++ b/dmubus.c
@@ -0,0 +1,316 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2012-2014 PIVA SOFTWARE (www.pivasoftware.com)
+ *		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *		Author: Feten Besbes <feten.besbes@pivasoftware.com>
+ *		Author: Mohamed Kallel <mohamed.kallel@pivasoftware.com>
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ */
+
+#include <unistd.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+#include <libubus.h>
+#include <libubox/blobmsg_json.h>
+#include <json-c/json.h>
+#include <stdio.h>
+#include "dmubus.h"
+#include "dmmem.h"
+#include "dmcommon.h"
+
+#define DELIMITOR ","
+#define UBUS_BUFFEER_SIZE 1024 * 8
+
+struct dmubus_ctx dmubus_ctx;
+#if DM_USE_LIBUBUS
+struct ubus_context *ubus_ctx;
+
+static int timeout = 1000;
+const char *ubus_socket = NULL;
+json_object *json_res = NULL;
+
+static inline bool dmblobmsg_add_object(struct blob_buf *b, json_object *obj)
+{
+	json_object_object_foreach(obj, key, val) {
+	if (!blobmsg_add_json_element(b, key, val))
+		return false;
+	}
+	return true;
+}
+
+static inline bool dmblobmsg_json_object_from_uargs(struct blob_buf *b, char *key, char *val)
+{
+	bool status;
+	json_object *jobj = json_object_new_object();
+	json_object *jstring = json_object_new_string(val);
+	json_object_object_add(jobj,key, jstring);
+	status = dmblobmsg_add_object(b, jobj);
+	json_object_put(jobj);
+	return status;
+}
+#endif
+
+static inline int ubus_arg_cmp(struct ubus_arg *src_args, int src_size, struct ubus_arg dst_args[], int dst_size)
+{
+	if (src_size != dst_size)
+		return -1;
+	int i;
+	for (i = 0; i < src_size; i++) {
+		if (strcmp( src_args[i].key, dst_args[i].key) != 0 || strcmp( src_args[i].val, dst_args[i].val) != 0)
+			return -1;
+	}
+	return 0;
+}
+
+#if DM_USE_LIBUBUS
+static void receive_call_result_data(struct ubus_request *req, int type, struct blob_attr *msg) 
+{
+	if (!msg)
+		return;
+	char *str = blobmsg_format_json_indent(msg, true, -1);
+	if (!str) {
+		json_res = NULL;
+		return;
+	}
+	json_res = json_tokener_parse((const char *)str);
+	free(str); //MEM should be free and not dmfree
+	if (json_res != NULL && (is_error(json_res))) {
+		json_object_put(json_res);
+		json_res = NULL;
+	}
+}
+#endif
+
+int dmubus_call_set(char *obj, char *method, struct ubus_arg u_args[], int u_args_size)
+{
+#if !DM_USE_LIBUBUS
+	char bufargs[256], *p;
+	int i, r;
+	p = bufargs;
+
+	if (u_args_size) {
+		sprintf(p, "{");
+		for (i = 0; i < u_args_size; i++) {
+			p += strlen(p);
+			if (i == 0){
+				if(u_args[i].type != Integer)
+					sprintf(p, "\"%s\": \"%s\"", u_args[i].key, u_args[i].val);
+				else
+					sprintf(p, "\"%s\": %s", u_args[i].key, u_args[i].val);
+			}
+			else{
+				if(u_args[i].type != Integer)
+					sprintf(p, ", \"%s\": \"%s\"", u_args[i].key, u_args[i].val);
+				else
+					sprintf(p, ", \"%s\": %s", u_args[i].key, u_args[i].val);
+			}
+		}
+		p += strlen(p);
+		sprintf(p, "}");
+		DMCMD("ubus", 7, "-S", "-t", "1", "call", obj, method, bufargs); //TODO wait to fix uloop ubus freeze
+	}
+	else {
+		DMCMD("ubus", 6, "-S", "-t", "1", "call", obj, method); //TODO wait to fix uloop ubus freeze
+	}
+	return 0;
+#else
+	struct blob_buf b = {0};
+	uint32_t id;
+	int ret;
+	json_res = NULL;
+
+	ubus_ctx = ubus_connect(ubus_socket);
+	if (!ubus_ctx)
+		return 0;
+
+	blob_buf_init(&b, 0);
+	int i=0;
+	for (i = 0; i < u_args_size; i++) {
+		if (!dmblobmsg_json_object_from_uargs(&b, u_args[i].key, u_args[i].val))
+			goto end_error;
+	}
+	ret = ubus_lookup_id(ubus_ctx, obj, &id);
+	ubus_invoke(ubus_ctx, id, method, b.head, receive_call_result_data, NULL, timeout);
+	blob_buf_free(&b);
+	if (json_res != NULL) {
+		json_object_put(json_res);
+		json_res = NULL;
+	}
+	return 0;
+
+end_error:
+	blob_buf_free(&b);
+	return NULL;
+#endif
+}
+
+static inline json_object *ubus_call_req(char *obj, char *method, struct ubus_arg u_args[], int u_args_size)
+{
+#if !DM_USE_LIBUBUS
+	json_object *res = NULL;
+	char *ubus_return, bufargs[256], *p;
+	int i, pp = 0, r;
+	p = bufargs;
+
+	if (u_args_size) {
+		sprintf(p, "{");
+		for (i = 0; i < u_args_size; i++) {
+			p += strlen(p);
+			if (i == 0)
+				sprintf(p, "\"%s\": \"%s\"", u_args[i].key, u_args[i].val);
+			else
+				sprintf(p, ", \"%s\": \"%s\"", u_args[i].key, u_args[i].val);
+		}
+		p += strlen(p);
+		sprintf(p, "}");
+		pp = dmcmd("ubus", 7, "-S", "-t", "3", "call", obj, method, bufargs); //TODO wait to fix uloop ubus freeze
+	}
+	else {
+		pp = dmcmd("ubus", 6, "-S", "-t", "3", "call", obj, method); //TODO wait to fix uloop ubus freeze
+	}
+	if (pp) {
+		dmcmd_read_alloc(pp, &ubus_return);
+		close(pp);
+		if (ubus_return) {
+			res = json_tokener_parse(ubus_return);
+			if (res != NULL && (is_error(res))) {
+				json_object_put(res);
+				res = NULL;
+			}
+		}
+	}
+	return res;
+
+#else
+	struct blob_buf b = {0};
+	uint32_t id;
+	int ret;
+	json_res = NULL;
+
+	ubus_ctx = ubus_connect(ubus_socket);
+	if (!ubus_ctx)
+		return NULL;
+
+	blob_buf_init(&b, 0);
+	int i=0;
+	for (i = 0; i < u_args_size; i++) {
+		if (!dmblobmsg_json_object_from_uargs(&b, u_args[i].key, u_args[i].val))
+			goto end_error;
+	}
+	ret = ubus_lookup_id(ubus_ctx, obj, &id);
+	ubus_invoke(ubus_ctx, id, method, b.head, receive_call_result_data, NULL, timeout);
+	blob_buf_free(&b);
+	return json_res;
+
+end_error:
+	blob_buf_free(&b);
+	return NULL;
+#endif
+}
+
+int dmubus_call(char *obj, char *method, struct ubus_arg u_args[], int u_args_size, json_object **req_res)
+{
+	struct ubus_obj *i = NULL;
+	struct ubus_meth *j = NULL;
+	struct ubus_msg *k = NULL;
+	json_object **jr;
+	bool found = false;
+	*req_res = NULL;
+	list_for_each_entry(i, &dmubus_ctx.obj_head, list) {
+		if (strcmp(obj, i->name) == 0) {
+			found = true;
+			break;
+		}
+	}
+	if (!found) {
+		i = dmcalloc(1, sizeof(struct ubus_obj));
+		//init method head
+		INIT_LIST_HEAD(&i->method_head);
+		i->name = dmstrdup(obj);
+		list_add(&i->list, &dmubus_ctx.obj_head);
+	}
+	found = false;
+	list_for_each_entry(j, &i->method_head, list) {
+		if (strcmp(method, j->name) == 0) {
+			*req_res = j->res;
+			found = true;
+			break;
+		}
+	}
+	if (!found) {
+		j = dmcalloc(1, sizeof(struct ubus_meth));
+		//init message head
+		INIT_LIST_HEAD(&j->msg_head);
+		j->name = dmstrdup(method);
+		list_add(&j->list, &i->method_head);
+		jr = &j->res;
+	}
+	// Arguments
+	if (u_args_size != 0) {
+		found = false;
+		int n=0;
+		list_for_each_entry(k, &j->msg_head, list) {
+			if (ubus_arg_cmp(k->ug, k->ug_size, u_args, u_args_size) == 0) {
+				*req_res = k->res;
+				found = true;
+				break;
+			}
+		}
+		if (!found) {
+			k = dmcalloc(1, sizeof(struct ubus_msg));
+			list_add(&k->list, &j->msg_head);
+			k->ug = dmcalloc(u_args_size, sizeof(struct ubus_arg));
+			k->ug_size = u_args_size;
+			jr = &k->res;
+			int c;
+			for (c = 0; c < u_args_size; c++) {
+				k->ug[c].key = dmstrdup(u_args[c].key);
+				k->ug[c].val = dmstrdup(u_args[c].val);
+			}
+		}
+	}
+	if (!found) {
+		*jr = ubus_call_req(obj, method, u_args, u_args_size);
+		*req_res = *jr;
+	}
+	return 0;
+}
+
+void dmubus_ctx_free(struct dmubus_ctx *ctx)
+{
+	struct ubus_obj *i, *_i;
+	struct ubus_meth *j, *_j;
+	struct ubus_msg *k, *_k;
+
+	list_for_each_entry_safe(i, _i, &ctx->obj_head, list) {
+		list_for_each_entry_safe(j, _j, &i->method_head, list) {
+			list_for_each_entry_safe(k, _k, &j->msg_head, list) {
+				if(k->ug_size != 0) {
+					int c;
+					for (c = 0; c < k->ug_size; c++) {
+						dmfree(k->ug[c].key);
+						dmfree(k->ug[c].val);
+					}
+					dmfree(k->ug);
+				}
+				list_del(&k->list);
+				if(k->res)
+					json_object_put(k->res);
+				dmfree(k);
+			}
+			list_del(&j->list);
+			if(j->res)
+				json_object_put(j->res);
+			dmfree(j->name);
+			dmfree(j);
+		}
+		list_del(&i->list);
+		dmfree(i->name);
+		dmfree(i);
+	}
+}
diff --git a/dmubus.h b/dmubus.h
new file mode 100644
index 0000000000000000000000000000000000000000..fc23ac410eaca8349fbeb07c973387313eea8143
--- /dev/null
+++ b/dmubus.h
@@ -0,0 +1,69 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2012-2014 PIVA SOFTWARE (www.pivasoftware.com)
+ *		Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *		Author: Feten Besbes <feten.besbes@pivasoftware.com>
+ *		Author: Mohamed Kallel <mohamed.kallel@pivasoftware.com>
+ *		Author: Anis Ellouze <anis.ellouze@pivasoftware.com>
+ */
+
+#ifndef __UBUS_H
+#define __UBUS_H
+
+#include <libubox/list.h>
+#include <libubox/blobmsg_json.h>
+#include <json-c/json.h>
+
+#define UBUS_ARGS (struct ubus_arg[])
+#define SIMPLE_OUTPUT -1
+#define INDENT_OUTPUT 0
+#define JSON_OUTPUT SIMPLE_OUTPUT
+
+struct dmubus_ctx {
+	struct list_head obj_head;
+};
+
+struct ubus_obj {
+	struct list_head list;
+	struct list_head method_head;
+	char *name;
+};
+
+struct ubus_meth {
+	struct list_head list;
+	struct list_head msg_head;
+	char *name;
+	json_object *res;
+};
+
+struct ubus_msg {
+	struct list_head list;
+	struct ubus_arg *ug; // ubus method param
+	int ug_size;
+	json_object *res;
+};
+
+struct ubus_arg{
+	char *key;
+	char *val;
+	int type;
+};
+
+enum ubus_args_enum {
+	String,
+	Integer,
+};
+
+extern struct dmubus_ctx dmubus_ctx;
+extern struct ubus_context *ubus_ctx;
+
+#define dm_ubus_get_value(jobj,ARGC,args...) \
+		dmjson_get_value(jobj, ARGC, ##args)
+int dmubus_call(char *obj, char *method, struct ubus_arg u_args[], int u_args_size, json_object **req_res);
+int dmubus_call_set(char *obj, char *method, struct ubus_arg u_args[], int u_args_size);
+void dmubus_ctx_free(struct dmubus_ctx *ctx);
+#endif
diff --git a/dmuci.c b/dmuci.c
new file mode 100644
index 0000000000000000000000000000000000000000..c1be3fe99bbfb08ff87f1fbc162560e245b6b021
--- /dev/null
+++ b/dmuci.c
@@ -0,0 +1,826 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author MOHAMED Kallel <mohamed.kallel@pivasoftware.com>
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *	  Author Feten Besbes <feten.besbes@pivasoftware.com>
+ *	  Author Omar Kallel <omar.kallel@pivasoftware.com>
+ *
+ */
+
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <uci.h>
+#include <ctype.h>
+#include "dmuci.h"
+#include "dmmem.h"
+
+struct uci_context *uci_ctx;
+struct uci_context *uci_varstate_ctx;
+
+NEW_UCI_PATH(icwmpd, ICWMPD_CONFIG, ICWMPD_SAVEDIR)
+struct uci_section *dmuci_walk_state_section (char *package, char *stype, void *arg1, void *arg2, int cmp , int (*filter)(struct uci_section *s, void *value), struct uci_section *prev_section, int walk) {
+	struct uci_section *s = NULL;
+	struct uci_element *e, *m;
+	char *value, *dup;
+	char *pch, *spch;
+	struct uci_list *list_value, *list_section;
+	struct uci_ptr ptr = {0};
+	uci_add_delta_path(uci_varstate_ctx, uci_varstate_ctx->savedir);
+	uci_set_savedir(uci_varstate_ctx, VARSTATE_CONFIG);
+	if (walk == GET_FIRST_SECTION) {
+		if (dmuci_lookup_ptr(uci_varstate_ctx, &ptr, package, NULL, NULL, NULL) != UCI_OK) {
+			goto end;
+		}
+		list_section = &(ptr.p)->sections;
+		e = list_to_element(list_section->next);
+	}
+	else {
+		list_section = &prev_section->package->sections;
+		e = list_to_element(prev_section->e.list.next);
+	}
+	while(&e->list != list_section) {
+		s = uci_to_section(e);
+		if (strcmp(s->type, stype) == 0) {
+			switch(cmp) {
+				case CMP_SECTION:
+					goto end;
+				default:
+					break;
+			}
+		}
+		e = list_to_element(e->list.next);
+		s = NULL;
+	}
+end:
+	return s;
+}
+char *dmuci_list_to_string(struct uci_list *list, char *delimitor)
+{
+	struct uci_element *e = NULL;
+	char val[512] = {0};
+	int del_len = strlen(delimitor);
+	if (list) {
+		uci_foreach_element(list, e)
+		{
+			int len = strlen(val);
+			if (len != 0) {
+				memcpy(val + len, delimitor, del_len);
+				strcpy(val + len + del_len, e->name);
+			}
+			else
+				strcpy(val, e->name);
+		}
+		return (dmstrdup(val)); // MEM WILL BE FREED IN DMMEMCLEAN
+	}
+	else 
+	{
+		return "";
+	}
+}
+
+static inline bool check_section_name(const char *str, bool name)
+{
+	if (!*str)
+		return false;
+	for (; *str; str++) {
+		unsigned char c = *str;
+		if (isalnum(c) || c == '_') 
+			continue;
+		if (name || (c < 33) || (c > 126)) 
+			return false;
+	}
+	return true;
+}
+
+//////////////////////////////
+void add_list_package_change(struct list_head *clist, char *package)
+{
+	struct package_change *pc;
+	list_for_each_entry(pc, clist, list) {
+		if (strcmp(pc->package, package) == 0)
+			return;
+	}
+	pc = calloc(1, sizeof(struct package_change));//TODO !!!!! Do not use dmcalloc here
+	list_add_tail(&pc->list, clist);
+	pc->package = strdup(package); //TODO !!!!! Do not use dmstrdup here
+}
+
+void free_all_list_package_change(struct list_head *clist)
+{
+	struct package_change *pc;
+	while (clist->next != clist) {
+		pc = list_entry(clist->next, struct package_change, list);
+		list_del(&pc->list);
+		free(pc->package);//TODO !!!!! Do not use dmfree here
+		free(pc);//TODO !!!!! Do not use dmfree here
+	}
+}
+///////////////////////////
+
+/**** UCI LOOKUP ****/
+int dmuci_lookup_ptr(struct uci_context *ctx, struct uci_ptr *ptr, char *package, char *section, char *option, char *value)
+{
+	/*value*/
+	ptr->value = value;
+
+	/*package*/
+	if (!package && !package[0])
+		return -1;
+	ptr->package = package;
+
+	/*section*/
+	if (!section || !section[0]) {
+		ptr->target = UCI_TYPE_PACKAGE;
+		goto lookup;
+	}
+	ptr->section = section;
+	if (ptr->section &&  !check_section_name(ptr->section , true))
+		ptr->flags |= UCI_LOOKUP_EXTENDED;
+
+	/*option*/
+	if (!option || !option[0]) {
+		ptr->target = UCI_TYPE_SECTION;
+		goto lookup;
+	}
+	ptr->target = UCI_TYPE_OPTION;
+	ptr->option = option;
+
+lookup:
+	if (uci_lookup_ptr(ctx, ptr, NULL, true) != UCI_OK || !UCI_LOOKUP_COMPLETE) {
+		return -1;
+	}
+	return 0;
+}
+
+/**** UCI GET *****/
+int dmuci_get_section_type(char *package, char *section,char **value)
+{
+	struct uci_element *e;
+	struct uci_ptr ptr = {0};
+	if (dmuci_lookup_ptr(uci_ctx, &ptr, package, section, NULL, NULL)) {
+		*value = "";
+		return -1;
+	}
+	if (ptr.s) {
+		*value = dmstrdup(ptr.s->type); // MEM WILL BE FREED IN DMMEMCLEAN
+	} else {
+		*value = "";
+		return -1;
+	}
+	return 0;
+}
+
+int dmuci_get_option_value_string(char *package, char *section, char *option, char **value)
+{
+	struct uci_element *e;
+	struct uci_ptr ptr = {0};
+	if (dmuci_lookup_ptr(uci_ctx, &ptr, package, section, option, NULL)) {
+		*value = "";
+		return -1;
+	}
+	if (ptr.o && ptr.o->type == UCI_TYPE_LIST) {
+		*value = dmuci_list_to_string(&ptr.o->v.list, " ");
+	}
+	else if (ptr.o && ptr.o->v.string) {
+		*value = dmstrdup(ptr.o->v.string); // MEM WILL BE FREED IN DMMEMCLEAN
+	} else {
+		*value = "";
+		return -1;
+	}
+	return 0;
+}
+
+int dmuci_get_option_value_list(char *package, char *section, char *option, struct uci_list **value)
+{
+	struct uci_element *e;
+	struct uci_ptr ptr = {0};
+	struct uci_list *list;
+	char *pch, *spch, *dup;
+	*value = NULL;
+	if (dmuci_lookup_ptr(uci_ctx, &ptr, package, section, option, NULL)) {
+		return -1;
+	}
+	if (ptr.o) {
+		switch(ptr.o->type) {
+			case UCI_TYPE_LIST:
+				*value = &ptr.o->v.list;
+				break;
+			case UCI_TYPE_STRING:
+				if (!ptr.o->v.string || (ptr.o->v.string)[0] == '\0')
+					return 0;
+				list = dmcalloc(1, sizeof(struct uci_list)); // MEM WILL BE FREED IN DMMEMCLEAN
+				uci_list_init(list);
+				dup = dmstrdup(ptr.o->v.string); // MEM WILL BE FREED IN DMMEMCLEAN
+				pch = strtok_r(dup, " ", &spch);
+				while (pch != NULL) {
+					e = dmcalloc(1, sizeof(struct uci_element)); // MEM WILL BE FREED IN DMMEMCLEAN
+					e->name = pch;
+					uci_list_add(list, &e->list);
+					pch = strtok_r(NULL, " ", &spch);
+				}
+				*value = list;
+				break;
+			default:
+				return -1;
+		}
+	} else {
+		return -1;
+	}
+	return 0;
+}
+
+
+struct uci_option *dmuci_get_option_ptr(char *cfg_path, char *package, char *section, char *option)
+{
+	int ret;
+	struct uci_option *o = NULL;
+	struct uci_element *e;
+	struct uci_ptr ptr = {0};
+	char *oconfdir;
+
+	oconfdir = uci_ctx->confdir;
+	uci_ctx->confdir = cfg_path;
+	if (dmuci_lookup_ptr(uci_ctx, &ptr, package, section, option, NULL)) {
+		goto end;
+	}
+	e = ptr.last;
+	switch(e->type) {
+		case UCI_TYPE_OPTION:
+			o = ptr.o;
+			break;
+		default:
+			break;
+	}
+end:
+	uci_ctx->confdir = oconfdir;
+	return o;
+}
+
+int db_get_value_string(char *package, char *section, char *option, char **value)
+{
+	struct uci_option *o;
+	o = dmuci_get_option_ptr(DB_CONFIG, package, section, option);
+	if (o) {
+		*value = o->v.string ? dmstrdup(o->v.string) : ""; // MEM WILL BE FREED IN DMMEMCLEAN
+	} else {
+		*value = "";
+		return -1;
+	}
+	return 0;
+}
+
+int db_get_value_list(char *package, char *section, char *option, struct uci_list **value)
+{
+	struct uci_option *o;
+	*value = NULL;
+
+	o = dmuci_get_option_ptr(DB_CONFIG, package, section, option);
+	if (o) {
+		*value = &o->v.list;
+	} else {
+		return -1;
+	}
+	return 0;
+}
+
+int dmuci_get_varstate_string(char *package, char *section, char *option, char **value)
+{
+	struct uci_option *o;
+	struct uci_element *e;
+	struct uci_ptr ptr = {0};
+	uci_add_delta_path(uci_varstate_ctx, uci_varstate_ctx->savedir);
+	uci_set_savedir(uci_varstate_ctx, VARSTATE_CONFIG);
+	if (dmuci_lookup_ptr(uci_varstate_ctx, &ptr, package, section, option, NULL)) {
+		*value = "";
+		return -1;
+	}
+	if (ptr.o && ptr.o->v.string) {
+		*value = ptr.o->v.string;
+	} else {
+		*value = "";
+		return -1;
+	}
+	return 0;
+}
+
+int dmuci_get_varstate_list(char *package, char *section, char *option, struct uci_list **value)
+{
+	struct uci_element *e;
+	struct uci_ptr ptr = {0};
+	*value = NULL;
+	uci_add_delta_path(uci_varstate_ctx, uci_varstate_ctx->savedir);
+	uci_set_savedir(uci_varstate_ctx, VARSTATE_CONFIG);
+	if (dmuci_lookup_ptr(uci_varstate_ctx, &ptr, package, section, option, NULL)) {
+		return -1;
+	}
+	if (ptr.o) {
+		*value = &ptr.o->v.list;
+	} else {
+		return -1;
+	}
+	return 0;
+}
+/**** UCI Commit *****/
+int dmuci_commit_package(char *package)
+{
+	struct uci_ptr ptr = {0};
+
+	if (uci_lookup_ptr(uci_ctx, &ptr, package, true) != UCI_OK) {
+		return -1;
+	}
+	if (uci_commit(uci_ctx, &ptr.p, false) != UCI_OK) {
+		return -1;
+	}
+
+	return 0;
+}
+
+int dmuci_commit(void)
+{
+	char **configs = NULL;
+	char **icwmpd_configs = NULL;
+	char **p;
+
+	if ((uci_list_configs(uci_ctx, &configs) != UCI_OK) || !configs) {
+		return -1;
+	}
+	for (p = configs; *p; p++) {
+		dmuci_commit_package(*p);
+	}
+	if(uci_ctx_icwmpd)
+	{
+		if ((uci_list_configs(uci_ctx_icwmpd, &icwmpd_configs) != UCI_OK) || !icwmpd_configs) {
+			return -1;
+		}
+		for (p = icwmpd_configs; *p; p++) {
+			DMUCI_COMMIT_PACKAGE(icwmpd, *p);
+		}
+	}
+	free(configs);
+	free(icwmpd_configs);
+	return 0;
+}
+
+/**** UCI REVERT *****/
+int dmuci_revert_package(char *package)
+{
+	struct uci_ptr ptr = {0};
+
+	if (uci_lookup_ptr(uci_ctx, &ptr, package, true) != UCI_OK) {
+		return -1;
+	}
+	if (uci_revert(uci_ctx, &ptr) != UCI_OK) {
+		return -1;
+	}
+
+	return 0;
+}
+
+int dmuci_revert(void)
+{
+	char **configs = NULL;
+	char **p;
+
+	if ((uci_list_configs(uci_ctx, &configs) != UCI_OK) || !configs) {
+		return -1;
+	}
+	for (p = configs; *p; p++) {
+		dmuci_revert_package(*p);
+	}
+	return 0;
+}
+
+/**** UCI CHANGES PACKAGES *****/
+int dmuci_change_packages(struct list_head *clist)
+{
+	char **configs = NULL;
+	char **p;
+	if ((uci_list_configs(uci_ctx, &configs) != UCI_OK) || !configs) {
+		return -1;
+	}
+	for (p = configs; *p; p++) {
+		struct uci_ptr ptr = {0};
+		if (uci_lookup_ptr(uci_ctx, &ptr, *p, true) != UCI_OK) {
+			continue;
+		}
+		if (uci_list_empty(&ptr.p->delta))
+			continue;
+		add_list_package_change(clist, *p);
+	}
+	return 0;
+}
+
+/**** UCI SET *****/
+char *dmuci_set_value(char *package, char *section, char *option, char *value)
+{
+	struct uci_ptr ptr = {0};
+
+	if (dmuci_lookup_ptr(uci_ctx, &ptr, package, section, option, value)) {
+		return "";
+	}
+
+	if (uci_set(uci_ctx, &ptr) != UCI_OK) {
+		return "";
+	}
+	if (ptr.o) {
+		return dmstrdup(ptr.o->v.string); // MEM WILL BE FREED IN DMMEMCLEAN
+	}
+	return "";
+}
+
+char *dmuci_set_varstate_value(char *package, char *section, char *option, char *value)
+{
+	char *tmp = {0};	
+	struct uci_option *o;
+	struct uci_ptr ptr = {0};
+	uci_add_delta_path(uci_varstate_ctx, uci_varstate_ctx->savedir);
+	uci_set_savedir(uci_varstate_ctx, VARSTATE_CONFIG);
+	
+	if (dmuci_lookup_ptr(uci_varstate_ctx, &ptr, package, section, option, value)) {
+		return "";
+	}
+	if (uci_set(uci_varstate_ctx, &ptr) != UCI_OK) {
+		return "";
+	}
+	uci_save(uci_varstate_ctx, ptr.p);
+	if (ptr.o) {
+		return dmstrdup(ptr.o->v.string); // MEM WILL BE FREED IN DMMEMCLEAN
+	}
+	return "";
+}
+/**** UCI ADD LIST *****/
+int dmuci_add_list_value(char *package, char *section, char *option, char *value)
+{
+
+	struct uci_ptr ptr = {0};
+
+	if (dmuci_lookup_ptr(uci_ctx, &ptr, package, section, option, value))
+		return -1;
+
+	if (uci_add_list(uci_ctx, &ptr) != UCI_OK)
+		return -1;
+
+	return 0;
+}
+
+/**** UCI DEL LIST *****/
+int dmuci_del_list_value(char *package, char *section, char *option, char *value)
+{
+	struct uci_ptr ptr = {0};
+
+	if (dmuci_lookup_ptr(uci_ctx, &ptr, package, section, option, value))
+		return -1;
+
+	if (uci_del_list(uci_ctx, &ptr) != UCI_OK)
+		return -1;
+
+	return 0;
+}
+
+/****** UCI ADD *******/
+int dmuci_add_section(char *package, char *stype, struct uci_section **s, char **value)
+{
+	struct uci_ptr ptr = {0};
+	*s = NULL;
+
+	if (dmuci_lookup_ptr(uci_ctx, &ptr, package, NULL, NULL, NULL)) {
+		*value = "";
+		return -1;
+	}
+	if (uci_add_section(uci_ctx, ptr.p, stype, s) != UCI_OK) {
+		*value = "";
+		return -1;
+	}
+
+	*value = dmstrdup((*s)->e.name); // MEM WILL BE FREED IN DMMEMCLEAN
+	return 0;
+}
+
+int dmuci_add_section_and_rename(char *package, char *stype, struct uci_section **s, char **value)
+{
+	int r;
+	r = dmuci_add_section(package, stype, s, value);
+	dmuci_rename_section_by_section(*s, *value);
+	return r;
+}
+
+int dmuci_add_state_section(char *package, char *stype, struct uci_section **s, char **value)
+{
+	struct uci_ptr ptr = {0};
+	*s = NULL;
+
+	if (dmuci_lookup_ptr(uci_varstate_ctx, &ptr, package, NULL, NULL, NULL)) {
+		*value = "";
+		return -1;
+	}
+	if (uci_add_section(uci_varstate_ctx, ptr.p, stype, s) != UCI_OK) {
+		*value = "";
+		return -1;
+	}
+	*value = dmstrdup((*s)->e.name); // MEM WILL BE FREED IN DMMEMCLEAN
+	uci_save(uci_varstate_ctx, ptr.p);
+	return 0;
+}
+
+/**** UCI DELETE *****/
+int dmuci_delete(char *package, char *section, char *option, char *value)
+{
+	struct uci_ptr ptr = {0};
+
+	if (dmuci_lookup_ptr(uci_ctx, &ptr, package, section, option, NULL))
+		return -1;
+	if (uci_delete(uci_ctx, &ptr) != UCI_OK)
+		return -1;
+
+	return 0;
+}
+
+/**** UCI RENAME SECTION *****/
+int dmuci_rename_section(char *package, char *section, char *value)
+{
+	struct uci_ptr ptr = {0};
+
+	if (dmuci_lookup_ptr(uci_ctx, &ptr, package, section, NULL, value))
+		return -1;
+	if (uci_rename(uci_ctx, &ptr) != UCI_OK)
+		return -1;
+
+	return 0;
+}
+
+/**** UCI LOOKUP by section pointer ****/
+
+int dmuci_lookup_ptr_by_section(struct uci_context *ctx, struct uci_ptr *ptr, struct uci_section *s, char *option, char *value)
+{
+	struct uci_element *e;
+
+	/*value*/
+	ptr->value = value;
+
+	/*package*/
+	ptr->package = s->package->e.name;
+	ptr->p = s->package;
+
+	/* section */
+	ptr->section = s->e.name;
+	ptr->s = s;
+
+	/*option*/
+	if (!option || !option[0]) {
+		ptr->target = UCI_TYPE_SECTION;
+		goto lookup;
+	}
+	ptr->target = UCI_TYPE_OPTION;
+	ptr->option = option;
+
+lookup:
+	if (uci_lookup_ptr(ctx, ptr, NULL, true) != UCI_OK || !UCI_LOOKUP_COMPLETE) {
+		return -1;
+	}
+	return 0;
+}
+
+/**** UCI GET by section pointer*****/
+int dmuci_get_value_by_section_string(struct uci_section *s, char *option, char **value)
+{
+	struct uci_element *e;
+	struct uci_option *o;
+	uci_foreach_element(&s->options, e) {
+		o = (uci_to_option(e));
+		if (!strcmp(o->e.name, option)) {
+			if (o->type == UCI_TYPE_LIST) {
+				*value = dmuci_list_to_string(&o->v.list, " ");
+			}
+			else {
+				*value = o->v.string ? dmstrdup(o->v.string) : ""; // MEM WILL BE FREED IN DMMEMCLEAN
+			}
+			return 0;
+		}
+	}
+	*value = "";
+	return -1;
+}
+
+int dmuci_get_value_by_section_list(struct uci_section *s, char *option, struct uci_list **value)
+{
+	struct uci_element *e;
+	struct uci_option *o;
+	struct uci_ptr ptr = {0};
+	struct uci_list *list;
+	char *pch, *spch, *dup;
+	*value = NULL;
+	uci_foreach_element(&s->options, e) {
+		o = (uci_to_option(e));
+		if (strcmp(o->e.name, option) == 0) {
+			switch(o->type) {
+				case UCI_TYPE_LIST:
+					*value = &o->v.list;
+					return 0;
+				case UCI_TYPE_STRING:
+					if (!o->v.string || (o->v.string)[0] == '\0')
+						return 0;
+					list = dmcalloc(1, sizeof(struct uci_list)); // MEM WILL BE FREED IN DMMEMCLEAN
+					uci_list_init(list);
+					dup = dmstrdup(o->v.string); // MEM WILL BE FREED IN DMMEMCLEAN
+					pch = strtok_r(dup, " ", &spch);
+					while (pch != NULL) {
+						e = dmcalloc(1, sizeof(struct uci_element)); // MEM WILL BE FREED IN DMMEMCLEAN
+						e->name = pch;
+						uci_list_add(list, &e->list);
+						pch = strtok_r(NULL, " ", &spch);
+					}
+					*value = list;
+					return 0;
+				default:
+					return -1;
+			}
+		}
+	}
+	return -1;
+}
+
+/**** UCI SET by section pointer ****/
+char *dmuci_set_value_by_section(struct uci_section *s, char *option, char *value)
+{
+	struct uci_ptr up = {0};
+
+	dmuci_lookup_ptr_by_section(uci_ctx, &up, s, option, value);
+	if (uci_set(uci_ctx, &up) != UCI_OK)
+		return "";
+
+	if (up.o) {
+		return dmstrdup(up.o->v.string); // MEM WILL BE FREED IN DMMEMCLEAN
+	}
+	return "";
+
+}
+
+/**** UCI DELETE by section pointer *****/
+int dmuci_delete_by_section(struct uci_section *s, char *option, char *value)
+{
+	struct uci_ptr up = {0};
+	uci_ctx->flags |= UCI_FLAG_EXPORT_NAME;
+
+	dmuci_lookup_ptr_by_section(uci_ctx, &up, s, option, value);
+
+	if (uci_delete(uci_ctx, &up) != UCI_OK)
+		return -1;
+
+	return 0;
+}
+
+int dmuci_delete_by_section_unnamed(struct uci_section *s, char *option, char *value)
+{
+	struct uci_ptr up = {0};
+
+	dmuci_lookup_ptr_by_section(uci_ctx, &up, s, option, value);
+
+	if (uci_delete(uci_ctx, &up) != UCI_OK)
+		return -1;
+
+	return 0;
+}
+
+/**** UCI ADD LIST by section pointer *****/
+int dmuci_add_list_value_by_section(struct uci_section *s, char *option, char *value)
+{
+	struct uci_ptr up = {0};
+
+	dmuci_lookup_ptr_by_section(uci_ctx, &up, s, option, value);
+
+	if (uci_add_list(uci_ctx, &up) != UCI_OK)
+		return -1;
+
+	return 0;
+}
+
+/**** UCI DEL LIST by section pointer *****/
+int dmuci_del_list_value_by_section(struct uci_section *s, char *option, char *value)
+{
+	struct uci_ptr up = {0};
+
+	dmuci_lookup_ptr_by_section(uci_ctx, &up, s, option, value);
+
+	if (uci_del_list(uci_ctx, &up) != UCI_OK)
+		return -1;
+
+	return 0;
+}
+
+/**** UCI RENAME SECTION by section pointer *****/
+int dmuci_rename_section_by_section(struct uci_section *s, char *value)
+{
+	struct uci_ptr up = {0};
+
+	dmuci_lookup_ptr_by_section(uci_ctx, &up, s, NULL, value);
+
+	if (uci_rename(uci_ctx, &up) != UCI_OK)
+		return -1;
+
+	return 0;
+}
+
+/**** UCI WALK SECTIONS *****/
+struct uci_section *dmuci_walk_section (char *package, char *stype, void *arg1, void *arg2, int cmp , int (*filter)(struct uci_section *s, void *value), struct uci_section *prev_section, int walk) {
+	struct uci_section *s = NULL;
+	struct uci_element *e, *m;
+	char *value, *dup;
+	char *pch, *spch;
+	struct uci_list *list_value, *list_section;
+	struct uci_ptr ptr = {0};
+	if (walk == GET_FIRST_SECTION) {
+		if (dmuci_lookup_ptr(uci_ctx, &ptr, package, NULL, NULL, NULL) != UCI_OK) {
+			goto end;
+		}
+		list_section = &(ptr.p)->sections;
+		e = list_to_element(list_section->next);
+	}
+	else {
+		list_section = &prev_section->package->sections;
+		e = list_to_element(prev_section->e.list.next);
+	}
+	while(&e->list != list_section) {
+		s = uci_to_section(e);
+		if (strcmp(s->type, stype) == 0) {
+			switch(cmp) {
+				case CMP_SECTION:
+					goto end;
+				case CMP_OPTION_EQUAL:
+						dmuci_get_value_by_section_string(s, (char *)arg1, &value);
+						if (strcmp(value, (char *)arg2) == 0)
+							goto end;
+					break;
+				case CMP_OPTION_CONTAINING:
+					dmuci_get_value_by_section_string(s, (char *)arg1, &value);
+					if (strstr(value, (char *)arg2)) {						
+						goto end;
+					}
+					break;
+				case CMP_OPTION_CONT_WORD: //TODO optimize this
+					dmuci_get_value_by_section_string(s, (char *)arg1, &value);
+					dup = dmstrdup(value);
+					pch = strtok_r(dup, " ", &spch);
+					while (pch != NULL) {
+						if (strcmp((char *)arg2, pch) == 0) {
+							dmfree(dup);
+							goto end;
+						}
+						pch = strtok_r(NULL, " ", &spch);
+					}
+					dmfree(dup);
+					break;
+				case CMP_LIST_CONTAINING:
+					dmuci_get_value_by_section_list(s, (char *)arg1, &list_value);
+					if (list_value != NULL) {
+						uci_foreach_element(list_value, m) {
+							if (strcmp(m->name, (char *)arg2) == 0)
+								goto end;
+						}
+					}										
+					break;
+				case CMP_FILTER_FUNC:
+					if (filter(s, arg1) == 0)
+						goto end;
+					break;
+				default:
+					break;
+			}
+		}
+		e = list_to_element(e->list.next);
+		s = NULL;
+	}
+end:
+	return s;
+}
+
+void uci_add_list_to_list(struct uci_list *addlist, struct uci_list *list){
+	struct uci_element *e, *elt;
+	struct uci_list elist;
+
+	uci_foreach_element(addlist, e) {
+		elt = dmcalloc(1, sizeof(struct uci_element));
+		elt->list= e->list;
+		elt->name= e->name;
+		elist= e->list;
+		uci_list_add(list, &elt->list);
+	}
+}
+
+void init_uci_varstate_ctx(void)
+{
+	uci_varstate_ctx = uci_alloc_context();
+}
+
+void end_uci_varstate_ctx(void)
+{
+	if (uci_varstate_ctx) uci_free_context(uci_varstate_ctx);
+	uci_varstate_ctx = NULL;
+}
diff --git a/dmuci.h b/dmuci.h
new file mode 100644
index 0000000000000000000000000000000000000000..09f547c616361288445d2850b5b92f9cfb144baa
--- /dev/null
+++ b/dmuci.h
@@ -0,0 +1,323 @@
+/*
+ *	This program is free software: you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation, either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	Copyright (C) 2015 Inteno Broadband Technology AB
+ *	  Author MOHAMED Kallel <mohamed.kallel@pivasoftware.com>
+ *	  Author Imen Bhiri <imen.bhiri@pivasoftware.com>
+ *	  Author Feten Besbes <feten.besbes@pivasoftware.com>
+ *
+ */
+
+#ifndef __DMUCI_H
+#define __DMUCI_H
+#include "uci_config.h"
+#include <stdbool.h>
+#include <setjmp.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <uci.h>
+#include <libubox/list.h>
+
+#define DB_CONFIG		"/lib/db/config"
+#define VARSTATE_CONFIG "/var/state"
+#define ICWMPD_CONFIG "/etc/icwmpd"
+#define ICWMPD_PATH "icwmpd"
+#define ICWMPD_SAVEDIR "/tmp/.icwmpd"
+
+extern struct uci_context *uci_ctx;
+extern struct uci_context *uci_varstate_ctx;
+
+enum dm_uci_cmp {
+	CMP_SECTION,
+	CMP_OPTION_EQUAL,
+	CMP_OPTION_REGEX,
+	CMP_OPTION_CONTAINING,
+	CMP_OPTION_CONT_WORD,
+	CMP_LIST_CONTAINING,
+	CMP_FILTER_FUNC
+};
+enum dm_uci_walk {
+	GET_FIRST_SECTION,
+	GET_NEXT_SECTION
+};
+
+struct package_change {
+	struct list_head list;
+	char *package;
+};
+
+#define uci_path_foreach_sections(path, package, stype, section) \
+	for (section = dmuci_walk_section_##path(package, stype, NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION); \
+		section != NULL; \
+		section = dmuci_walk_section_##path(package, stype, NULL, NULL, CMP_SECTION, NULL, section, GET_NEXT_SECTION))
+
+#define uci_path_foreach_sections_safe(path, package, stype, _tmp, section) \
+	for (section = dmuci_walk_section_##path(package, stype, NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION), \
+		_tmp = (section) ? dmuci_walk_section_##path(package, stype, NULL, NULL, CMP_SECTION, NULL, section, GET_NEXT_SECTION) : NULL;	\
+		section != NULL; \
+		section = _tmp, _tmp = (section) ? dmuci_walk_section_##path(package, stype, NULL, NULL, CMP_SECTION, NULL, section, GET_NEXT_SECTION) : NULL)
+
+#define uci_path_foreach_option_eq(path, package, stype, option, val, section) \
+	for (section = dmuci_walk_section_##path(package, stype, option, val, CMP_OPTION_EQUAL, NULL, NULL, GET_FIRST_SECTION); \
+		section != NULL; \
+		section = dmuci_walk_section_##path(package, stype, option, val, CMP_OPTION_EQUAL, NULL, section, GET_NEXT_SECTION))
+
+#define uci_path_foreach_option_eq_safe(path, package, stype, option, val, _tmp, section) \
+	for (section = dmuci_walk_section_##path(package, stype, option, val, CMP_OPTION_EQUAL, NULL, NULL, GET_FIRST_SECTION), \
+	    _tmp = (section) ? dmuci_walk_section_##path(package, stype, option, val, CMP_OPTION_EQUAL, NULL, section, GET_NEXT_SECTION) : NULL;	\
+		section != NULL; \
+		section = _tmp, _tmp = (section) ?  dmuci_walk_section_##path(package, stype, option, val, CMP_OPTION_EQUAL, NULL, section, GET_NEXT_SECTION) : NULL)
+
+#define uci_path_foreach_option_cont(path, package, stype, option, val, section) \
+	for (section = dmuci_walk_section_##path(package, stype, option, val, CMP_OPTION_CONTAINING, NULL, NULL, GET_FIRST_SECTION); \
+		section != NULL; \
+		section = dmuci_walk_section_##path(package, stype, option, val, CMP_OPTION_CONTAINING, NULL, section, GET_NEXT_SECTION))
+
+#define uci_foreach_sections(package, stype, section) \
+	for (section = dmuci_walk_section(package, stype, NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION); \
+		section != NULL; \
+		section = dmuci_walk_section(package, stype, NULL, NULL, CMP_SECTION, NULL, section, GET_NEXT_SECTION))
+
+#define uci_foreach_option_eq(package, stype, option, val, section) \
+	for (section = dmuci_walk_section(package, stype, option, val, CMP_OPTION_EQUAL, NULL, NULL, GET_FIRST_SECTION); \
+		section != NULL; \
+		section = dmuci_walk_section(package, stype, option, val, CMP_OPTION_EQUAL, NULL, section, GET_NEXT_SECTION))
+
+#define uci_foreach_option_cont(package, stype, option, val, section) \
+	for (section = dmuci_walk_section(package, stype, option, val, CMP_OPTION_CONTAINING, NULL, NULL, GET_FIRST_SECTION); \
+		section != NULL; \
+		section = dmuci_walk_section(package, stype, option, val, CMP_OPTION_CONTAINING, NULL, section, GET_NEXT_SECTION))
+
+#define uci_foreach_option_cont_word(package, stype, option, val, section) \
+	for (section = dmuci_walk_section(package, stype, option, val, CMP_OPTION_CONT_WORD, NULL, NULL, GET_FIRST_SECTION); \
+		section != NULL; \
+		section = dmuci_walk_section(package, stype, option, val, CMP_OPTION_CONT_WORD, NULL, section, GET_NEXT_SECTION))
+
+#define uci_foreach_list_cont(package, stype, option, val, section) \
+	for (section = dmuci_walk_section(package, stype, option, val, CMP_LIST_CONTAINING, NULL, NULL, GET_FIRST_SECTION); \
+		section != NULL; \
+		section = dmuci_walk_section(package, stype, option, val, CMP_LIST_CONTAINING, NULL, section, GET_NEXT_SECTION))
+
+#define uci_foreach_filter_func(package, stype, arg, func, section) \
+	for (section = dmuci_walk_section(package, stype, arg, NULL, CMP_FILTER_FUNC, func, NULL, GET_FIRST_SECTION); \
+		section != NULL; \
+		section = dmuci_walk_section(package, stype, arg, NULL, CMP_FILTER_FUNC, func, section, GET_NEXT_SECTION))
+
+#define uci_foreach_sections_state(package, stype, section) \
+	for (section = dmuci_walk_state_section(package, stype, NULL, NULL, CMP_SECTION, NULL, NULL, GET_FIRST_SECTION); \
+		section != NULL; \
+		section = dmuci_walk_state_section(package, stype, NULL, NULL, CMP_SECTION, NULL, section, GET_NEXT_SECTION))
+
+#define section_name(s) (s)->e.name
+
+static inline void uci_list_insert(struct uci_list *list, struct uci_list *ptr)
+{
+	list->next->prev = ptr;
+	ptr->prev = list;
+	ptr->next = list->next;
+	list->next = ptr;
+}
+
+static inline void uci_list_add(struct uci_list *head, struct uci_list *ptr)
+{
+	uci_list_insert(head->prev, ptr);
+}
+
+static inline void uci_list_init(struct uci_list *ptr)
+{
+	ptr->prev = ptr;
+	ptr->next = ptr;
+}
+char *dmuci_list_to_string(struct uci_list *list, char *delimitor);
+void add_list_package_change(struct list_head *clist, char *package);
+void free_all_list_package_change(struct list_head *clist);
+int dmuci_lookup_ptr(struct uci_context *ctx, struct uci_ptr *ptr, char *package, char *section, char *option, char *value);
+int dmuci_get_section_type(char *package, char *section,char **value);
+int dmuci_get_option_value_string(char *package, char *section, char *option, char **value);
+int dmuci_get_option_value_list(char *package, char *section, char *option, struct uci_list **value);
+struct uci_option *dmuci_get_option_ptr(char *cfg_path, char *package, char *section, char *option);
+int db_get_value_string(char *package, char *section, char *option, char **value);
+int db_get_value_list(char *package, char *section, char *option, struct uci_list **value);
+int dmuci_get_varstate_string(char *package, char *section, char *option, char **value);
+int dmuci_get_varstate_list(char *package, char *section, char *option, struct uci_list **value);
+int dmuci_commit_package(char *package);
+int dmuci_commit(void);
+int dmuci_revert_package(char *package);
+int dmuci_revert(void);
+int dmuci_change_packages(struct list_head *clist);
+char *dmuci_set_value(char *package, char *section, char *option, char *value);
+int dmuci_add_list_value(char *package, char *section, char *option, char *value);
+int dmuci_del_list_value(char *package, char *section, char *option, char *value);
+int dmuci_add_section(char *package, char *stype, struct uci_section **s, char **value);
+int dmuci_add_section_and_rename(char *package, char *stype, struct uci_section **s, char **value);
+int dmuci_delete(char *package, char *section, char *option, char *value);
+int dmuci_lookup_ptr_by_section(struct uci_context *ctx, struct uci_ptr *ptr, struct uci_section *s, char *option, char *value);
+int dmuci_get_value_by_section_string(struct uci_section *s, char *option, char **value);
+int dmuci_get_value_by_section_list(struct uci_section *s, char *option, struct uci_list **value);
+char *dmuci_set_value_by_section(struct uci_section *s, char *option, char *value);
+int dmuci_delete_by_section(struct uci_section *s, char *option, char *value);
+int dmuci_delete_by_section_unnamed(struct uci_section *s, char *option, char *value);
+int dmuci_add_list_value_by_section(struct uci_section *s, char *option, char *value);
+int dmuci_del_list_value_by_section(struct uci_section *s, char *option, char *value);
+struct uci_section *dmuci_walk_section(char *package, char *stype, void *arg1, void *arg2, int cmp , int (*filter)(struct uci_section *s, void *value), struct uci_section *prev_section, int walk);
+struct uci_section *dmuci_walk_state_section(char *package, char *stype, void *arg1, void *arg2, int cmp , int (*filter)(struct uci_section *s, void *value), struct uci_section *prev_section, int walk);
+struct uci_section *dmuci_walk_section_icwmpd(char *package, char *stype, void *arg1, void *arg2, int cmp , int (*filter)(struct uci_section *s, void *value), struct uci_section *prev_section, int walk);
+char *dmuci_set_value_by_section_icwmpd(struct uci_section *s, char *option, char *value);
+
+int dmuci_add_section_icwmpd(char *package, char *stype, struct uci_section **s, char **value);
+int dmuci_add_state_section(char *package, char *stype, struct uci_section **s, char **value);
+char *dmuci_set_varstate_value(char *package, char *section, char *option, char *value);
+char *dmuci_set_value_icwmpd(char *package, char *section, char *option, char *value);
+int dmuci_delete_by_section_icwmpd(struct uci_section *s, char *option, char *value);
+int dmuci_rename_section_by_section(struct uci_section *s, char *value);
+int dmuci_exit_icwmpd(void);
+int dmuci_init_icwmpd(void);
+void init_uci_varstate_ctx(void);
+void end_uci_varstate_ctx(void);
+void uci_add_list_to_list(struct uci_list *addlist, struct uci_list *list);
+#define NEW_UCI_PATH(UCI_PATH, CPATH, DPATH)		\
+struct uci_context *uci_ctx_##UCI_PATH;			\
+const char *uci_savedir_##UCI_PATH = DPATH; \
+const char *uci_confdir_##UCI_PATH = CPATH; \
+int dmuci_get_section_type_##UCI_PATH(char *package, char *section,char **value)	\
+{\
+	struct uci_context *save_uci_ctx;	\
+	save_uci_ctx = uci_ctx;			\
+	uci_ctx = uci_ctx_##UCI_PATH;	\
+	dmuci_get_section_type(package, section, value);	\
+	uci_ctx = save_uci_ctx;			\
+}\
+int dmuci_init_##UCI_PATH(void)		\
+{\
+	uci_ctx_##UCI_PATH = uci_alloc_context();	\
+	if (!uci_ctx_##UCI_PATH) {					\
+		return -1;								\
+	}											\
+	uci_add_delta_path(uci_ctx_##UCI_PATH, uci_ctx_##UCI_PATH->savedir);	\
+	uci_set_savedir(uci_ctx_##UCI_PATH, uci_savedir_##UCI_PATH);					\
+	uci_set_confdir(uci_ctx_##UCI_PATH, uci_confdir_##UCI_PATH);					\
+	return 0;	\
+}\
+int dmuci_exit_##UCI_PATH(void)		\
+{\
+	if (uci_ctx_##UCI_PATH) uci_free_context(uci_ctx_##UCI_PATH);\
+	uci_ctx_##UCI_PATH = NULL; \
+	return 0;	\
+}\
+int dmuci_get_option_value_string_##UCI_PATH(char *package, char *section, char *option, char **value)	\
+{\
+	struct uci_context *save_uci_ctx;	\
+	save_uci_ctx = uci_ctx;			\
+	uci_ctx = uci_ctx_##UCI_PATH;	\
+	dmuci_get_option_value_string(package, section, option, value); \
+	uci_ctx = save_uci_ctx;			\
+}\
+int dmuci_get_option_value_list_##UCI_PATH(char *package, char *section, char *option, struct uci_list **value) \
+{\
+	struct uci_context *save_uci_ctx;	\
+	save_uci_ctx = uci_ctx;			\
+	uci_ctx = uci_ctx_##UCI_PATH;	\
+	dmuci_get_option_value_list(package, section, option, value); \
+	uci_ctx = save_uci_ctx;			\
+}\
+char *dmuci_set_value_##UCI_PATH(char *package, char *section, char *option, char *value) \
+{\
+	struct uci_context *save_uci_ctx;	\
+	save_uci_ctx = uci_ctx;			\
+	uci_ctx = uci_ctx_##UCI_PATH;	\
+	dmuci_set_value(package, section, option, value); \
+	uci_ctx = save_uci_ctx;			\
+}\
+int dmuci_add_list_value_##UCI_PATH(char *package, char *section, char *option, char *value) \
+{\
+	struct uci_context *save_uci_ctx;	\
+	save_uci_ctx = uci_ctx;			\
+	uci_ctx = uci_ctx_##UCI_PATH;	\
+	dmuci_add_list_value(package, section, option, value); \
+	uci_ctx = save_uci_ctx;			\
+}\
+int dmuci_del_list_value_##UCI_PATH(char *package, char *section, char *option, char *value) \
+{\
+	struct uci_context *save_uci_ctx;	\
+	save_uci_ctx = uci_ctx;			\
+	uci_ctx = uci_ctx_##UCI_PATH;	\
+	dmuci_del_list_value(package, section, option, value); \
+	uci_ctx = save_uci_ctx;			\
+}\
+int dmuci_add_section_##UCI_PATH(char *package, char *stype, struct uci_section **s, char **value)\
+{\
+	struct uci_context *save_uci_ctx;	\
+	save_uci_ctx = uci_ctx;			\
+	uci_ctx = uci_ctx_##UCI_PATH;	\
+	dmuci_add_section(package, stype, s, value); \
+	uci_ctx = save_uci_ctx;			\
+}\
+int dmuci_delete_##UCI_PATH(char *package, char *section, char *option, char *value) \
+{\
+	struct uci_context *save_uci_ctx;	\
+	save_uci_ctx = uci_ctx;			\
+	uci_ctx = uci_ctx_##UCI_PATH;	\
+	dmuci_delete(package, section, option, value); \
+	uci_ctx = save_uci_ctx;			\
+}\
+char *dmuci_set_value_by_section_##UCI_PATH(struct uci_section *s, char *option, char *value)\
+{\
+	struct uci_context *save_uci_ctx;	\
+	save_uci_ctx = uci_ctx;			\
+	uci_ctx = uci_ctx_##UCI_PATH;	\
+	dmuci_set_value_by_section(s, option, value); \
+	uci_ctx = save_uci_ctx;			\
+}\
+int dmuci_delete_by_section_##UCI_PATH(struct uci_section *s, char *option, char *value)\
+{\
+	struct uci_context *save_uci_ctx;	\
+	save_uci_ctx = uci_ctx;			\
+	uci_ctx = uci_ctx_##UCI_PATH;	\
+	dmuci_delete_by_section(s, option, value); \
+	uci_ctx = save_uci_ctx;			\
+}\
+int dmuci_delete_by_section_unnamed_##UCI_PATH(struct uci_section *s, char *option, char *value)\
+{\
+	struct uci_context *save_uci_ctx;	\
+	save_uci_ctx = uci_ctx;			\
+	uci_ctx = uci_ctx_##UCI_PATH;	\
+	dmuci_delete_by_section_unnamed(s, option, value); \
+	uci_ctx = save_uci_ctx;			\
+}\
+struct uci_section *dmuci_walk_section_##UCI_PATH(char *package, char *stype, void *arg1, void *arg2, int cmp , int (*filter)(struct uci_section *s, void *value), struct uci_section *prev_section, int walk)\
+{\
+	struct uci_context *save_uci_ctx;	\
+	save_uci_ctx = uci_ctx;			\
+	uci_ctx = uci_ctx_##UCI_PATH;	\
+	dmuci_walk_section(package, stype, arg1, arg2, cmp ,filter, prev_section, walk); \
+	uci_ctx = save_uci_ctx;			\
+}\
+int dmuci_commit_package_##UCI_PATH(char *package) \
+{\
+	struct uci_context *save_uci_ctx;	\
+		save_uci_ctx = uci_ctx;			\
+		uci_ctx = uci_ctx_##UCI_PATH;	\
+		dmuci_commit_package(package); \
+		uci_ctx = save_uci_ctx;			\
+}\
+
+#define DMUCI_GET_SECTION_TYPE(UCI_PATH, package, section, value) dmuci_get_section_type_##UCI_PATH(package, section, value)
+#define DMUCI_GET_OPTION_VALUE_STRING(UCI_PATH, package, section, option, value) dmuci_get_option_value_string_##UCI_PATH(package, section, option, value)
+#define DMUCI_GET_OPTION_VALUE_LIST(UCI_PATH, package, section, option, value) dmuci_get_option_value_list_##UCI_PATH(package, section, option, value)
+#define DMUCI_SET_VALUE(UCI_PATH, package, section, option, value) dmuci_set_value_##UCI_PATH(package, section, option, value)
+#define DMUCI_ADD_LIST_VALUE(UCI_PATH, package, section, option, value) dmuci_add_list_value_##UCI_PATH(package, section, option, value)
+#define DMUCI_DEL_LIST_VALUE(UCI_PATH, package, section, option, value) dmuci_del_list_value_##UCI_PATH(package, section, option, value)
+#define DMUCI_ADD_SECTION(UCI_PATH, package, stype, s, value) dmuci_add_section_##UCI_PATH(package, stype, s, value)
+#define DMUCI_DEL_SECTION(UCI_PATH, package, section, option, value) dmuci_delete_##UCI_PATH(package, section, option, value)
+#define DMUCI_SET_VALUE_BY_SECTION(UCI_PATH, s, option, value) dmuci_set_value_by_section_##UCI_PATH(s, option, value)
+#define DMUCI_DELETE_BY_SECTION(UCI_PATH, s, option, value) dmuci_delete_by_section_##UCI_PATH(s, option, value)
+#define DMUCI_WALK_SECTION(UCI_PATH, package, stype, arg1, arg2, cmp , filter, value), struct uci_section *prev_section, int walk)\) dmuci_walk_section_##UCI_PATH(package, stype, arg1, arg2, cmp , filter, value)
+
+#define DMUCI_COMMIT_PACKAGE(UCI_PATH, package) dmuci_commit_package_##UCI_PATH(package)
+#define DMUCI_INIT(UCI_PATH) dmuci_init_##UCI_PATH()
+#define DMUCI_EXIT(UCI_PATH) dmuci_exit_##UCI_PATH()
+#endif
+
diff --git a/json/convertor_json_to_c.py b/json/convertor_json_to_c.py
new file mode 100755
index 0000000000000000000000000000000000000000..052b622f47c9bf68ffcff1a262a1960dc8f04344
--- /dev/null
+++ b/json/convertor_json_to_c.py
@@ -0,0 +1,779 @@
+#!/usr/bin/python
+
+#      This program is free software: you can redistribute it and/or modify
+#      it under the terms of the GNU General Public License as published by
+#      the Free Software Foundation, either version 2 of the License, or
+#      (at your option) any later version.
+#
+#      Copyright (C) 2019 iopsys Software Solutions AB
+#		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+
+import os
+import sys
+import time
+import json
+from collections import OrderedDict
+
+arrtype = {
+"string": "DMT_STRING",
+"unsignedInt": "DMT_UNINT",
+"unsignedLong": "DMT_UNLONG",
+"int": "DMT_INT",
+"long": "DMT_LONG",
+"boolean": "DMT_BOOL",
+"dateTime": "DMT_TIME",
+"hexBinary": "DMT_HEXBIN",
+"base64": "DMT_BASE64",
+}
+
+def removefile( filename ):
+	try:
+		os.remove(filename)
+	except OSError:
+		pass
+
+def securemkdir( folder ):
+	try:
+		os.mkdir(folder)
+	except:
+		pass
+
+def getlastname( name ):
+	lastname = name
+	lastname = lastname.replace(".{i}", "")
+	namelist = lastname.split('.')
+	lastname = namelist[-1]
+	if lastname == "":
+		lastname = namelist[-2]
+	return lastname;
+
+def getname( objname ):
+	global model_root_name
+	OBJSname = objname
+	if (objname.count('.') > 1 and (objname.count('.') != 2 or objname.count('{i}') != 1) ):
+		OBJSname = objname.replace(dmroot, "", 1)
+	OBJSname = OBJSname.replace("{i}", "")
+	OBJSname = OBJSname.replace(".", "")
+	if (objname.count('.') == 1):
+		model_root_name = OBJSname
+		OBJSname = "Root" + OBJSname
+		return OBJSname
+	if (objname.count('.') == 2 and objname.count('{i}') == 1):
+		model_root_name = OBJSname
+		OBJSname = "Services" + OBJSname
+		return OBJSname
+	return OBJSname;
+
+def getoptionparam( value, option ):
+	val = "false"
+	if isinstance(value,dict):
+		for k,v in value.items():
+			if k == option:
+				return v
+	return val
+
+def getargsparam( value ):
+	val1 = "false"
+	val2 = "false"
+	if isinstance(value,dict):
+		for k,v in value.items():
+			return k, v
+	return val1, val2
+
+def getparamtype( value ):
+	ptype = None
+	paramtype = getoptionparam(value, "type")
+	ptype = arrtype.get(paramtype, None)
+	if ptype == None:
+		ptype = "__NA__"
+	return ptype
+
+def objhaschild( value ):
+	if isinstance(value,dict):
+		for k,v in value.items():
+			if isinstance(v,dict):
+				for k1,v1 in v.items():
+					if k1 == "type" and v1 == "object":
+						return 1
+	return 0
+
+def objhasparam( value ):
+	if isinstance(value,dict):
+		for k,v in value.items():
+			if isinstance(v,dict):
+				for k1,v1 in v.items():
+					if k1 == "type" and v1 != "object":
+						return 1
+	return 0
+
+def get_mapping_param( mappingobj ):
+	type = getoptionparam(mappingobj, "type")
+	if type == "uci":
+		uciobj = getoptionparam(mappingobj, "uci")
+		file = getoptionparam(uciobj, "file")
+		sectionobj = getoptionparam(uciobj, "section")
+		sectiontype = getoptionparam(sectionobj, "type")
+		sectionname = getoptionparam(sectionobj, "name")
+		sectionindex = getoptionparam(sectionobj, "index")
+		optionobj = getoptionparam(uciobj, "option")
+		optionname = getoptionparam(optionobj, "name")
+		return type, file, sectiontype, sectionname, sectionindex, optionname
+	elif type == "ubus":
+		ubusobj = getoptionparam(mappingobj, "ubus")
+		object = getoptionparam(ubusobj, "object")
+		method = getoptionparam(ubusobj, "method")
+		argsobj = getoptionparam(ubusobj, "args")
+		arg1, arg2 = getargsparam(argsobj)
+		key = getoptionparam(ubusobj, "key")
+		return type, object, method, arg1, arg2, key
+	else:
+		cliobj = getoptionparam(mappingobj, "cli")
+		command = getoptionparam(cliobj, "command")
+		argsobj = getoptionparam(cliobj, "args")
+		i = 0
+		value = ""
+		list_length = len(argsobj)
+		while i < list_length:
+			if value == "":
+				value = "\"" + argsobj[i] + "\", "
+			elif i == list_length-1:
+				value = value + "\"" + argsobj[i] + "\""
+			else:
+				value = value + "\"" + argsobj[i] + "\", "
+			i += 1
+		return type, command, list_length, value, "", ""
+
+def get_mapping_obj( mappingobj ):
+	type = getoptionparam(mappingobj, "type")
+	uciobj = getoptionparam(mappingobj, "uci")
+	file = getoptionparam(uciobj, "file")
+	sectionobj = getoptionparam(uciobj, "section")
+	sectiontype = getoptionparam(sectionobj, "type")
+	dmmapfile = getoptionparam(uciobj, "dmmapfile")
+	return type, file, sectiontype, dmmapfile
+
+def printheaderObjCommon( objname ):
+	fp = open('./.objparamarray.c', 'a')
+	print >> fp, "/* *** %s *** */" % objname
+	fp.close()
+
+def cprintheaderOBJS( objname ):
+	fp = open('./.objparamarray.c', 'a')
+	print >> fp,  "DMOBJ %s[] = {" % ("t" + getname(objname) + "Obj")
+	print >> fp,  "/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/"
+	fp.close()
+
+def hprintheaderOBJS( objname ):
+	fp = open('./.objparamarray.h', 'a')
+	print >> fp,  "extern DMOBJ %s[];" % ("t" + getname(objname) + "Obj")
+	fp.close()
+
+def cprinttopfile (fp, filename):
+	print >> fp, "/*"
+	print >> fp, "*      This program is free software: you can redistribute it and/or modify"
+	print >> fp, "*      it under the terms of the GNU General Public License as published by"
+	print >> fp, "*      the Free Software Foundation, either version 2 of the License, or"
+	print >> fp, "*      (at your option) any later version."
+	print >> fp, "*"
+	print >> fp, "*      Copyright (C) 2019 iopsys Software Solutions AB"
+	print >> fp, "*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>"
+	print >> fp, "*/"
+	print >> fp, ""
+	print >> fp, "#include \"dmcwmp.h\""
+	print >> fp, "#include \"dmcommon.h\""
+	print >> fp, "#include \"dmuci.h\""
+	print >> fp, "#include \"dmubus.h\""
+	print >> fp, "#include \"dmjson.h\""
+	print >> fp, "#include \"dmentry.h\""
+	print >> fp, "#include \"%s.h\"" % filename.lower()
+	print >> fp, ""
+
+def hprinttopfile (fp, filename):
+	print >> fp, "/*"
+	print >> fp, "*      This program is free software: you can redistribute it and/or modify"
+	print >> fp, "*      it under the terms of the GNU General Public License as published by"
+	print >> fp, "*      the Free Software Foundation, either version 2 of the License, or"
+	print >> fp, "*      (at your option) any later version."
+	print >> fp, "*"
+	print >> fp, "*      Copyright (C) 2019 iopsys Software Solutions AB"
+	print >> fp, "*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>"
+	print >> fp, "*/"
+	print >> fp, ""
+	print >> fp, "#ifndef __%s_H" % filename.upper()
+	print >> fp, "#define __%s_H" % filename.upper()
+	print >> fp, ""
+
+def hprintfootfile (fp, filename):
+	print >> fp, ""
+	print >> fp, "#endif //__%s_H" % filename.upper()
+	print >> fp, ""
+
+def cprintAddDelObj( faddobj, fdelobj, name, mappingobj, dmobject ):
+	fp = open('./.objadddel.c', 'a')
+	print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char **instance)" % faddobj
+	print >> fp, "{"
+	if mappingobj != "false":
+		type, file, sectiontype, dmmapfile = get_mapping_obj(mappingobj)
+		if type == "uci":
+			print >> fp, "	char *inst, *value, *v;"
+			print >> fp, "	struct uci_section *dmmap = NULL, *s = NULL;"
+			print >> fp, ""
+			print >> fp, "	check_create_dmmap_package(\"%s\");" % dmmapfile
+			print >> fp, "	inst = get_last_instance_icwmpd(\"%s\", \"%s\", \"%s\");" % (dmmapfile, sectiontype, name+"instance")
+			print >> fp, "	dmuci_add_section_and_rename(\"%s\", \"%s\", &s, &value);" % (file, sectiontype)
+			print >> fp, "	//dmuci_set_value_by_section(s, \"option\", \"value\");"
+			print >> fp, ""
+			print >> fp, "	dmuci_add_section_icwmpd(\"%s\", \"%s\", &dmmap, &v);" % (dmmapfile, sectiontype)
+			print >> fp, "	dmuci_set_value_by_section(dmmap, \"section_name\", section_name(s));"
+			print >> fp, "	*instance = update_instance_icwmpd(dmmap, inst, \"%s\");" % (name+"instance")
+	else:
+		print >> fp, "	//TODO"
+	print >> fp, "	return 0;"
+	print >> fp, "}"
+	print >> fp, ""
+	print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)" % fdelobj
+	print >> fp, "{"
+	if mappingobj != "false":
+		if type == "uci":
+			print >> fp, "	struct uci_section *s = NULL, *ss = NULL, *dmmap_section= NULL;"
+			print >> fp, "	int found = 0;"
+			print >> fp, ""
+	print >> fp, "	switch (del_action) {"
+	if mappingobj != "false":
+		if type == "uci":
+			print >> fp, "		case DEL_INST:"
+			print >> fp, "			get_dmmap_section_of_config_section(\"%s\", \"%s\", section_name((struct uci_section *)data), &dmmap_section);" % (dmmapfile, sectiontype)
+			print >> fp, "			if(dmmap_section != NULL)"
+			print >> fp, "				dmuci_delete_by_section(dmmap_section, NULL, NULL);"
+			print >> fp, "			dmuci_delete_by_section((struct uci_section *)data, NULL, NULL);"
+			print >> fp, "			break;"
+			print >> fp, "		case DEL_ALL:"
+			print >> fp, "			uci_foreach_sections(\"%s\", \"%s\", s) {" % (file, sectiontype)
+			print >> fp, "				if (found != 0){"
+			print >> fp, "					get_dmmap_section_of_config_section(\"%s\", \"%s\", section_name(ss), &dmmap_section);" % (dmmapfile, sectiontype)
+			print >> fp, "					if(dmmap_section != NULL)"
+			print >> fp, "						dmuci_delete_by_section(dmmap_section, NULL, NULL);"
+			print >> fp, "					dmuci_delete_by_section(ss, NULL, NULL);"
+			print >> fp, "				}"
+			print >> fp, "				ss = s;"
+			print >> fp, "				found++;"
+			print >> fp, "			}"
+			print >> fp, "			if (ss != NULL) {"
+			print >> fp, "				get_dmmap_section_of_config_section(\"%s\", \"%s\", section_name(ss), &dmmap_section);" % (dmmapfile, sectiontype)
+			print >> fp, "				if(dmmap_section != NULL)"
+			print >> fp, "					dmuci_delete_by_section(dmmap_section, NULL, NULL);"
+			print >> fp, "				dmuci_delete_by_section(ss, NULL, NULL);"
+			print >> fp, "			}"
+			print >> fp, "			break;"
+	else:
+		print >> fp, "		case DEL_INST:"
+		print >> fp, "			//TODO"
+		print >> fp, "			break;"
+		print >> fp, "		case DEL_ALL:"
+		print >> fp, "			//TODO"
+		print >> fp, "			break;"
+	print >> fp, "	}"
+	print >> fp, "	return 0;"
+	print >> fp, "}"
+	print >> fp, ""
+	fp.close()
+
+def hprintAddDelObj( faddobj, fdelobj ):
+	fp = open('./.objadddel.h', 'a')
+	print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char **instance);" % faddobj
+	print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);" % fdelobj
+	fp.close()
+
+def cprintBrowseObj( fbrowse, name, mappingobj, dmobject ):
+	fp = open('./.objbrowse.c', 'a')
+	if mappingobj != "false":
+		type, file, sectiontype, dmmapfile = get_mapping_obj(mappingobj)
+		print >> fp, "/*#%s!%s:%s/%s/%s*/" % (dmobject, type.upper(), file, sectiontype, dmmapfile)
+	print >> fp, "int %s(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)" % fbrowse
+	print >> fp, "{"
+	if mappingobj != "false":
+		if type == "uci" :
+			print >> fp, "	char *inst = NULL, *inst_last = NULL;"
+			print >> fp, "	struct dmmap_dup *p;"
+			print >> fp, "	LIST_HEAD(dup_list);"
+			print >> fp, ""
+			print >> fp, "	synchronize_specific_config_sections_with_dmmap(\"%s\", \"%s\", \"%s\", &dup_list);" % (file, sectiontype, dmmapfile)
+			print >> fp, "	list_for_each_entry(p, &dup_list, list) {"
+			print >> fp, "		inst =  handle_update_instance(1, dmctx, &inst_last, update_instance_alias, 3, p->dmmap_section, \"%s\", \"%s\");" % (name+"instance", name+"alias")
+			print >> fp, "		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, inst) == DM_STOP)"
+			print >> fp, "			break;"
+			print >> fp, "	}"
+			print >> fp, "	free_dmmap_config_dup_list(&dup_list);"
+	else:
+		print >> fp, "	//TODO"
+	print >> fp, "	return 0;"
+	print >> fp, "}"
+	print >> fp, ""
+	fp.close()
+
+def hprintBrowseObj( fbrowse ):
+	fp = open('./.objbrowse.h', 'a')
+	print >> fp, "int %s(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);" % fbrowse
+	fp.close()
+
+def cprintGetSetValue(getvalue, setvalue, mappingparam, instance, typeparam, parentname, dmparam):
+	fp = open('./.getstevalue.c', 'a')
+	if mappingparam != "false":
+		count = len(mappingparam)
+		i = 0
+		header = ""
+		tmpgetvalue = ""
+		tmpsetvalue = ""
+		set_value = ""
+		for element in mappingparam:
+			type, res1, res2, res3, res4, res5 =get_mapping_param(element)
+			get_value = ""
+			i += 1
+			if type == "uci":
+				if res3 != "false":
+					header = "%s:%s/%s,%s/%s" % (type.upper(), res1, res2, res3, res5)
+				else:
+					header = "%s:%s/%s,%s/%s" % (type.upper(), res1, res2, res4, res5)
+				########################## GET VALUE ###############################################
+				if "NumberOfEntries" in dmparam:
+					get_value += "	struct uci_section *s = NULL;\n"
+					get_value += "	int cnt = 0;\n"
+					get_value += "\n"
+					get_value += "	uci_foreach_sections(\"%s\", \"%s\", s) {\n" % (res1, res2)
+					get_value += "		cnt++;\n"
+					get_value += "	}\n"
+					get_value += "	dmasprintf(value, \"%d\", cnt);"
+				elif instance == "TRUE":
+					get_value += "	dmuci_get_value_by_section_string((struct uci_section *)data, \"%s\", value);" % res5
+				else:
+					get_value += "	dmuci_get_option_value_string(\"%s\", \"%s\", \"%s\", value);" % (res1, res3, res5)
+
+
+				########################## SET VALUE ###############################################
+				if typeparam == "boolean":
+					set_value += "	bool b;\n"
+				set_value += "	switch (action)	{\n"
+				set_value += "		case VALUECHECK:\n"
+				if typeparam == "boolean":
+					set_value += "			if (string_to_bool(value, &b))\n"
+					set_value += "				return FAULT_9007;\n"
+				set_value += "			break;\n"
+				set_value += "		case VALUESET:\n"
+				if typeparam == "boolean":
+					set_value += "			string_to_bool(value, &b);\n"
+					if instance == "TRUE":
+						set_value += "			dmuci_set_value_by_section((struct uci_section *)data, \"%s\", b ? \"1\" : \"0\");" % res5
+					else:
+						set_value += "			dmuci_set_value(\"%s\", \"%s\", \"%s\", b ? \"1\" : \"0\");" % (res1, res3, res5)
+				elif instance == "TRUE":
+					set_value += "			dmuci_set_value_by_section((struct uci_section *)data, \"%s\", value);" % res5
+				else:
+					set_value += "			dmuci_set_value(\"%s\", \"%s\", \"%s\", value);" % (res1, res3, res5)
+			elif type == "ubus":
+				if res3!= "false" and res4 != "false":
+					header = "%s:%s/%s/%s,%s/%s" % (type.upper(), res1, res2, res3, res4, res5)
+				else:
+					header = "%s:%s/%s//%s" % (type.upper(), res1, res2, res5)
+				########################## GET VALUE ###############################################
+				get_value += "	json_object *res;\n"
+				if res3 == "false" and res4 == "false":
+					get_value += "	dmubus_call(\"%s\", \"%s\", UBUS_ARGS{}, 0, &res);\n" % (res1, res2)
+				else:
+					if i == 2 and res4 == "prev_value":
+						get_value += "	dmubus_call(\"%s\", \"%s\", UBUS_ARGS{{\"%s\", *value, String}}, 1, &res);\n" % (res1, res2, res3)
+
+					elif i == 2 and res4 == "@Name":
+						get_value += "	if (*value[0] == '\\0')\n"
+						get_value += "	{\n"
+						get_value += "	dmubus_call(\"%s\", \"%s\", UBUS_ARGS{{\"%s\", section_name((struct uci_section *)data), String}}, 1, &res);\n" % (res1, res2, res3)
+					elif res4 == "@Name":
+						get_value += "	dmubus_call(\"%s\", \"%s\", UBUS_ARGS{{\"%s\", section_name((struct uci_section *)data), String}}, 1, &res);\n" % (res1, res2, res3)
+					else:
+						get_value += "	dmubus_call(\"%s\", \"%s\", UBUS_ARGS{{\"%s\", \"%s\", String}}, 1, &res);\n" % (res1, res2, res3, res4)
+
+				get_value += "	DM_ASSERT(res, *value = \"\");\n"
+				option = res5.split(".")
+				if "." in res5:
+					if option[0] == "@Name":
+						get_value += "	*value = dmjson_get_value(res, 2, section_name((struct uci_section *)data), \"%s\");" % (option[1])
+					else:
+						get_value += "	*value = dmjson_get_value(res, 2, \"%s\", \"%s\");" % (option[0], option[1])
+				else:
+					get_value += "	*value = dmjson_get_value(res, 1, \"%s\");" % option[0]
+				if i == 2 and res4 == "@Name":
+					get_value += "\n	}"
+				########################## SET VALUE ###############################################
+					set_value += "	switch (action)	{\n"
+					set_value += "		case VALUECHECK:\n"
+					set_value += "			break;\n"
+					set_value += "		case VALUESET:\n"
+					set_value += "			//TODO"
+			elif type == "cli":
+					get_value += "	dmcmd(\"%s\", %s, %s);" % (res1, res2, res3)
+
+			if count == 2 and i == 1:
+				tmpheader = header
+				tmpgetvalue = get_value
+				tmpsetvalue = set_value
+			elif count == 2 and i == 2:
+				print >> fp, "/*#%s!%s&%s*/" % (parentname+dmparam, tmpheader, header)
+				print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)" % getvalue
+				print >> fp, "{"
+				print >> fp, "%s" % tmpgetvalue
+				print >> fp, "%s" % get_value
+				print >> fp, "	return 0;"
+				print >> fp, "}"
+				print >> fp, ""
+				if setvalue != "NULL":
+					print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)" % setvalue
+					print >> fp, "{"
+					print >> fp, "%s" % tmpsetvalue
+					print >> fp, "			break;"
+					print >> fp, "	}"
+					print >> fp, "	return 0;"
+					print >> fp, "}"
+					print >> fp, ""
+			else:
+				print >> fp, "/*#%s!%s*/" % (parentname+dmparam, header)
+				print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)" % getvalue
+				print >> fp, "{"
+				print >> fp, "%s" % get_value
+				print >> fp, "	return 0;"
+				print >> fp, "}"
+				print >> fp, ""
+				if setvalue != "NULL":
+					print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)" % setvalue
+					print >> fp, "{"
+					print >> fp, "%s" % set_value
+					print >> fp, "			break;"
+					print >> fp, "	}"
+					print >> fp, "	return 0;"
+					print >> fp, "}"
+					print >> fp, ""
+	
+	else:
+		print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)" % getvalue
+		print >> fp, "{"
+		print >> fp, "	//TODO"
+		print >> fp, "	return 0;"
+		print >> fp, "}"
+		print >> fp, ""
+		if setvalue != "NULL":
+			print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)" % setvalue
+			print >> fp, "{"
+			print >> fp, "	switch (action)	{"
+			print >> fp, "		case VALUECHECK:"
+			print >> fp, "			break;"
+			print >> fp, "		case VALUESET:"
+			print >> fp, "			//TODO"
+			print >> fp, "			break;"
+			print >> fp, "	}"
+			print >> fp, "	return 0;"
+			print >> fp, "}"
+			print >> fp, ""
+	fp.close()
+
+def hprintGetSetValue(getvalue, setvalue):
+	fp = open('./.getstevalue.h', 'a')
+	print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);" % getvalue
+	if setvalue != "NULL":
+		print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);" % setvalue
+	fp.close()
+
+
+def cprintheaderPARAMS( objname ):
+	fp = open('./.objparamarray.c', 'a')
+	print >> fp,  "DMLEAF %s[] = {" % ("t" + getname(objname) + "Params")
+	print >> fp,  "/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/"
+	fp.close()
+
+def hprintheaderPARAMS( objname ):
+	fp = open('./.objparamarray.h', 'a')
+	print >> fp,  "extern DMLEAF %s[];" % ("t" + getname(objname) + "Params")
+	fp.close()
+
+def printPARAMline( parentname, dmparam, value ):
+	commonname = getname(parentname) + "_" + dmparam
+	ptype = getparamtype(value)
+	getvalue = "get_" + commonname
+	mappingparam = getoptionparam(value, "mapping")
+	typeparam = getoptionparam(value, "type")
+	accessparam = getoptionparam(value, "write")
+	bbfdmparam = getoptionparam(value, "bbfdm")
+	if (accessparam == "false"):
+		access = "&DMREAD"
+		setvalue = "NULL"
+	else:
+		access = "&DMWRITE"
+		setvalue = "set_" + commonname
+	if parentname.endswith(".{i}."):
+		instance = "TRUE"
+	else:
+		instance = "FALSE"
+	if bbfdmparam == "cwmp":
+		bbfdm = "BBFDM_CWMP"
+	elif bbfdmparam == "usp":
+		bbfdm = "BBFDM_USP"
+	else:
+		bbfdm = "BBFDM_BOTH"
+
+	cprintGetSetValue(getvalue, setvalue, mappingparam, instance, typeparam, parentname, dmparam)
+	hprintGetSetValue(getvalue, setvalue)
+
+	fp = open('./.objparamarray.c', 'a')
+	print >> fp,  "{\"%s\", %s, %s, %s, %s, NULL, NULL, %s}," % (dmparam, access, ptype, getvalue, setvalue, bbfdm)
+	fp.close()
+
+def printtailArray( ):
+	fp = open('./.objparamarray.c', 'a')
+	print >> fp,  "{0}"
+	print >> fp,  "};"
+	print >> fp,  ""
+	fp.close()
+
+def printOBJline( dmobject, value ):
+	commonname = getname(dmobject)
+	hasobj = objhaschild(value)
+	hasparam = objhasparam(value)
+	accessobj = getoptionparam(value, "access")
+	mappingobj = getoptionparam(value, "mapping")
+	bbfdmobj = getoptionparam(value, "bbfdm")
+
+	if accessobj == "false":
+		access = "&DMREAD"
+		faddobj = "NULL"
+		fdelobj = "NULL"
+	else:
+		access = "&DMWRITE"
+		faddobj = "addObj" + commonname
+		fdelobj = "delObj" + commonname
+		cprintAddDelObj(faddobj, fdelobj, (getlastname(dmobject)).lower(), mappingobj, dmobject)
+		hprintAddDelObj(faddobj, fdelobj)
+	if dmobject.endswith(".{i}."):
+		fbrowse = "browse" + commonname + "Inst"
+		cprintBrowseObj(fbrowse, (getlastname(dmobject)).lower(), mappingobj, dmobject)
+		hprintBrowseObj(fbrowse)
+	else:
+		fbrowse = "NULL"
+	if hasobj:
+		objchildarray = "t" + commonname + "Obj"
+	else:
+		objchildarray = "NULL"
+	if hasparam:
+		paramarray = "t" + commonname + "Params"
+	else:
+		paramarray = "NULL"
+	if bbfdmobj == "cwmp":
+		bbfdm = "BBFDM_CWMP"
+	elif bbfdmobj == "usp":
+		bbfdm = "BBFDM_USP"
+	else:
+		bbfdm = "BBFDM_BOTH"
+
+	fp = open('./.objparamarray.c', 'a')
+	print >> fp,  "{\"%s\", %s, %s, %s, NULL, %s, NULL, NULL, %s, %s, NULL, %s}," % (getlastname(dmobject), access, faddobj, fdelobj, fbrowse, objchildarray, paramarray, bbfdm)
+	fp.close()
+
+def printusage():
+	print "Usage: " + sys.argv[0] + " <json data model>"
+	print "Examples:"
+	print "  - " + sys.argv[0] + " tr181.json"
+	print "    ==> Generate the C code of all data model in tr181/ folder"
+	print "  - " + sys.argv[0] + " tr104.json"
+	print "    ==> Generate the C code of all data model in tr104/ folder"
+
+def object_parse_childs( dmobject , value, nextlevel ):
+	hasobj = objhaschild(value)
+	hasparam = objhasparam(value)
+
+	if hasobj or hasparam:
+		printheaderObjCommon(dmobject)
+
+	if hasobj:
+		cprintheaderOBJS(dmobject)
+		hprintheaderOBJS(dmobject)
+
+		if isinstance(value,dict):
+			for k,v in value.items():
+				if isinstance(v,dict):
+					for k1,v1 in v.items():
+						if k1 == "type" and v1 == "object":
+							printOBJline(k, v)
+							break
+		printtailArray()
+
+	if hasparam:
+		cprintheaderPARAMS(dmobject)
+		hprintheaderPARAMS(dmobject)
+		if isinstance(value,dict):
+			for k,v in value.items():
+				if k == "mapping":
+					continue
+				if isinstance(v,dict):
+					for k1,v1 in v.items():
+						if k1 == "type" and v1 != "object":
+							printPARAMline(dmobject, k, v)
+							break
+		printtailArray()
+
+	if hasobj and nextlevel == 0:
+		if isinstance(value,dict):
+			for k,v in value.items():
+				if isinstance(v,dict):
+					for k1,v1 in v.items():
+						if k1 == "type" and v1 == "object":
+							object_parse_childs(k , v, 0)
+
+def generatecfromobj(pobj, pvalue, pdir, nextlevel):
+	securemkdir(pdir)
+	removetmpfiles()
+	object_parse_childs(pobj, pvalue, nextlevel)
+	
+	dmfpc = open(pdir + "/" +  getname(pobj).lower() + ".c", "w")
+	dmfph = open(pdir + "/" +  getname(pobj).lower() + ".h", "w")
+	cprinttopfile(dmfpc, getname(pobj).lower())
+	hprinttopfile(dmfph, getname(pobj).lower())
+	try:
+		tmpf = open("./.rootinclude.c", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfpc.write(tmpd)
+		print >> dmfpc,  ""
+	except:
+		pass
+	try:
+		tmpf = open("./.objparamarray.c", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfpc.write(tmpd)
+	except:
+		pass
+	try:
+		tmpf = open("./.objparamarray.h", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfph.write(tmpd)
+		print >> dmfph,  ""
+	except:
+		pass
+	try:
+		exists = os.path.isfile("./.objbrowse.c")
+		if exists:
+			print >> dmfpc,  "/*************************************************************"
+			print >> dmfpc,  " * ENTRY METHOD"
+			print >> dmfpc,  "/*************************************************************/"
+		tmpf = open("./.objbrowse.c", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfpc.write(tmpd)
+	except:
+		pass
+	try:
+		tmpf = open("./.objbrowse.h", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfph.write(tmpd)
+		print >> dmfph,  ""
+	except:
+		pass
+	try:
+		exists = os.path.isfile("./.objadddel.c")
+		if exists:
+			print >> dmfpc,  "/*************************************************************"
+			print >> dmfpc,  " * ADD & DEL OBJ"
+			print >> dmfpc,  "/*************************************************************/"
+		tmpf = open("./.objadddel.c", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfpc.write(tmpd)
+	except:
+		pass
+	try:
+		tmpf = open("./.objadddel.h", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfph.write(tmpd)
+		print >> dmfph,  ""
+	except:
+		pass
+	try:
+		exists = os.path.isfile("./.getstevalue.c")
+		if exists:
+			print >> dmfpc,  "/*************************************************************"
+			print >> dmfpc,  " * GET & SET PARAM"
+			print >> dmfpc,  "/*************************************************************/"
+		tmpf = open("./.getstevalue.c", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfpc.write(tmpd)
+	except:
+		pass
+	try:
+		tmpf = open("./.getstevalue.h", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfph.write(tmpd)
+	except:
+		pass
+
+	hprintfootfile (dmfph, getname(pobj).lower())
+	removetmpfiles()
+	
+
+def removetmpfiles():
+	removefile("./.objparamarray.c")
+	removefile("./.objparamarray.h")
+	removefile("./.objadddel.c")
+	removefile("./.objadddel.h")
+	removefile("./.objbrowse.c")
+	removefile("./.objbrowse.h")
+	removefile("./.getstevalue.c")
+	removefile("./.getstevalue.h")
+	removefile("./.rootinclude.c")
+
+### main ###
+if len(sys.argv) < 2:
+	printusage()
+	exit(1)
+	
+if (sys.argv[1]).lower() == "-h" or (sys.argv[1]).lower() == "--help":
+	printusage()
+	exit(1)
+
+model_root_name = "Root"
+json_file = sys.argv[1]
+
+with open(json_file) as file:
+	data = json.loads(file.read(), object_pairs_hook=OrderedDict)
+
+if "tr181" in sys.argv[1]:
+	gendir = "tr181"
+elif "tr104" in sys.argv[1]:
+	gendir = "tr104"
+elif "tr106" in sys.argv[1]:
+	gendir = "tr106"
+else:
+	gendir = "source_" + time.strftime("%Y-%m-%d_%H-%M-%S")
+
+for i,(key,value) in enumerate(data.items()):
+	objstart = key
+	device = key.split(".")
+	dmroot = device[0]
+
+	if dmroot == None:
+		print "Wrong JSON Data model format!"
+		exit(1)
+
+	generatecfromobj(objstart, value, gendir, 1)
+	if isinstance(value,dict):
+		for k,v in value.items():
+			if isinstance(v,dict):
+				for k1,v1 in v.items():
+					if k1 == "type" and v1 == "object":
+						generatecfromobj(k, v, gendir, 0)
+
+if (os.path.isdir(gendir)):
+	print "Source code generated under \"./%s\" folder" % gendir
+else:
+	print "No source code generated!"
+
diff --git a/json/generate_excel.py b/json/generate_excel.py
new file mode 100755
index 0000000000000000000000000000000000000000..24df60a6b0b470481463149778ef6cfe6262b6fc
--- /dev/null
+++ b/json/generate_excel.py
@@ -0,0 +1,208 @@
+#!/usr/bin/python
+
+#      This program is free software: you can redistribute it and/or modify
+#      it under the terms of the GNU General Public License as published by
+#      the Free Software Foundation, either version 2 of the License, or
+#      (at your option) any later version.
+#
+#      Copyright (C) 2019 iopsys Software Solutions AB
+#		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+
+import os, sys, time, json, xlwt
+from xlwt import Workbook 
+from collections import OrderedDict
+
+def removefile( filename ):
+	try:
+		os.remove(filename)
+	except OSError:
+		pass
+
+def objhaschild( value ):
+	if isinstance(value,dict):
+		for k,v in value.items():
+			if isinstance(v,dict):
+				for k1,v1 in v.items():
+					if k1 == "type" and v1 == "object":
+						return 1
+	return 0
+
+def objhasparam( value ):
+	if isinstance(value,dict):
+		for k,v in value.items():
+			if isinstance(v,dict):
+				for k1,v1 in v.items():
+					if k1 == "type" and v1 != "object":
+						return 1
+	return 0
+
+def check_obj(dmobject):
+	obj = dmobject.split(".")
+	if dmobject.count('.') == 2:
+		cmd = 'awk \'/DMOBJ tRoot_181_Obj/,/^{0}$/\' ../dmtree/tr181/device.c'
+		res = os.popen(cmd).read()
+		string = "\n{\"%s\"," % obj[1]
+	else:
+		array_name = ""
+		if "Device.IP.Diagnostics." == dmobject:
+			file = "../dmtree/tr181/ip.c"
+		elif "Device.IP.Diagnostics." in dmobject:
+			file = "../dmtree/tr143/diagnostics.c"
+		else:
+			file = "../dmtree/tr181/%s.c" % obj[1].lower()
+		if(os.path.isfile(file)):
+			dmobject = dmobject.replace(".{i}.", ".")
+			count = dmobject.count('.')
+			obj1 = dmobject.split(".")
+			for i in range(count-2):
+				array_name += obj1[i+1]
+			cmd = 'awk \'/DMOBJ t%sObj/,/^{0}$/\' %s' % (array_name, file)
+			res = os.popen(cmd).read()
+			string = "\n{\"%s\"," % obj1[count - 1]
+		else:
+			return "false"
+
+	if string in res:
+		return "true"
+	else:
+		return "false"
+
+def check_param(param, res):
+	string = "\n{\"%s\"," % param
+	if string in res:
+		return "true"
+	else:
+		return "false"
+
+def load_param(dmobject):
+	if dmobject.count('.') == 1:
+		cmd = 'awk \'/DMLEAF tRoot_181_Params/,/^{0}$/\' ../dmtree/tr181/device.c'
+		res = os.popen(cmd).read()
+	else:
+		array_name = ""
+		obj = dmobject.split(".")
+		if "Device.IP.Diagnostics." in dmobject:
+			file = "../dmtree/tr143/diagnostics.c"
+		else:
+			file = "../dmtree/tr181/%s.c" % obj[1].lower()
+		if(os.path.isfile(file)):
+			dmobject = dmobject.replace(".{i}.", ".")
+			count = dmobject.count('.')
+			obj1 = dmobject.split(".")
+			for i in range(count-1):
+				array_name += obj1[i+1]
+			cmd = 'awk \'/DMLEAF t%sParams/,/^{0}$/\' %s' % (array_name, file)
+			res = os.popen(cmd).read()
+		else:
+			res = ""
+
+	if res == "":
+		return "", 0
+	else:
+		return res, 1
+
+def printOBJPARAM(obj, supported):
+	fp = open('./.tmp', 'a')
+	print >> fp,  "%s::%s" % (obj, supported)
+	fp.close()
+
+def printusage():
+	print "Usage: " + sys.argv[0] + " <json data model>"
+	print "Examples:"
+	print "  - " + sys.argv[0] + " tr181.json"
+	print "    ==> Generate excel file in tr181.xls"
+
+def object_parse_childs( dmobject , value ):
+	hasobj = objhaschild(value)
+	hasparam = objhasparam(value)
+
+	if dmobject.count('.') == 1:
+		printOBJPARAM(dmobject, "true")
+	else:
+		supported = check_obj(dmobject)
+		printOBJPARAM(dmobject, supported)		
+
+	if hasparam:
+		res, load = load_param(dmobject)
+		if isinstance(value,dict):
+			for k,v in value.items():
+				if k == "mapping":
+					continue
+				if isinstance(v,dict):
+					for k1,v1 in v.items():
+						if k1 == "type" and v1 != "object":
+							if load == "0":
+								printOBJPARAM(dmobject + k, "false")
+							else:
+								supported = check_param(k, res)
+								printOBJPARAM(dmobject + k, supported)
+							break
+
+	if hasobj:
+		if isinstance(value,dict):
+			for k,v in value.items():
+				if isinstance(v,dict):
+					for k1,v1 in v.items():
+						if k1 == "type" and v1 == "object":
+							object_parse_childs(k , v)
+
+def generatecfromobj(pobj, pvalue):
+	removefile("./.tmp")
+	removefile("./tr181.xls")
+	object_parse_childs(pobj, pvalue)
+
+	wb = Workbook()
+	sheet = wb.add_sheet('CWMP-USP')
+	style0 = xlwt.easyxf('pattern: pattern solid, fore_colour yellow;''font: bold 1, color blue;''alignment: horizontal center;')
+	style1 = xlwt.easyxf('pattern: pattern solid, fore_colour red;''font: bold 1, color black;''alignment: horizontal center;')
+	style2 = xlwt.easyxf('pattern: pattern solid, fore_colour green;''font: bold 1, color black;''alignment: horizontal center;')
+	sheet.write(0, 0, 'OBJ/PARAM', style0)
+	sheet.write(0, 1, 'Status', style0)
+	i = 0
+	file = open("./.tmp", "r")
+	for line in file:
+		param = line.split("::")
+		i += 1
+		sheet.write(i, 0, param[0])
+		if param[1] == "false\n":
+			sheet.write(i, 1, "Not Supported", style1)
+		else:
+			sheet.write(i, 1, "Supported", style2)
+
+	sheet.col(0).width = 1300*20
+	sheet.col(1).width = 175*20
+	wb.save('tr181.xls') 
+	removefile("./.tmp")
+
+### main ###
+if len(sys.argv) < 2:
+	printusage()
+	exit(1)
+	
+if (sys.argv[1]).lower() == "-h" or (sys.argv[1]).lower() == "--help":
+	printusage()
+	exit(1)
+
+model_root_name = "Root"
+json_file = sys.argv[1]
+
+with open(json_file) as file:
+	data = json.loads(file.read(), object_pairs_hook=OrderedDict)
+
+for i,(key,value) in enumerate(data.items()):
+	objstart = key
+	device = key.split(".")
+	dmroot = device[0]
+
+	if dmroot == None:
+		print "Wrong JSON Data model format!"
+		exit(1)
+
+	generatecfromobj(objstart, value)
+
+
+if (os.path.isfile("tr181.xls")):
+	print "tr181.xls excel file generated"
+else:
+	print "No Excel file generated!"
+
diff --git a/json/tr181.json b/json/tr181.json
new file mode 100644
index 0000000000000000000000000000000000000000..660be7958eda23ee364556ce8777bf8176f644bd
--- /dev/null
+++ b/json/tr181.json
@@ -0,0 +1,54368 @@
+{
+	"Device.": {
+		"type": "object", 
+		"protocols": [
+			"cwmp", 
+			"usp"
+		], 
+		"access": false, 
+		"array": false, 
+		"RootDataModelVersion": {
+			"type": "string", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"read": true, 
+			"write": false
+		}, 
+		"InterfaceStackNumberOfEntries": {
+			"type": "unsignedInt", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"read": true, 
+			"write": false
+		}, 
+		"ProxiedDeviceNumberOfEntries": {
+			"type": "unsignedInt", 
+			"protocols": [
+				"usp"
+			], 
+			"read": true, 
+			"write": false
+		}, 
+		"Device.Services.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false
+		}, 
+		"Device.DeviceInfo.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"DeviceCategory": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Manufacturer": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "cpe"
+							}, 
+							"option": {
+								"name": "manufacturer"
+							}
+						}
+					}
+				]
+			}, 
+			"ManufacturerOUI": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "cpe"
+							}, 
+							"option": {
+								"name": "override_oui"
+							}
+						}
+					}
+				]
+			}, 
+			"SupportedDataModelNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ModelName": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ModelNumber": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Description": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ProductClass": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "cpe"
+							}, 
+							"option": {
+								"name": "override_productclass"
+							}
+						}
+					}
+				]
+			}, 
+			"SerialNumber": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"HardwareVersion": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"SoftwareVersion": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ActiveFirmwareImage": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"BootFirmwareImage": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"AdditionalHardwareVersion": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"AdditionalSoftwareVersion": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ProvisioningCode": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "cpe"
+							}, 
+							"option": {
+								"name": "provisioning_code"
+							}
+						}
+					}
+				]
+			}, 
+			"UpTime": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"unit": "seconds", 
+				"read": true, 
+				"write": false
+			}, 
+			"FirstUseDate": {
+				"type": "dateTime", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"FirmwareImageNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"VendorConfigFileNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ProcessorNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"VendorLogFileNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"LocationNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"DeviceImageNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"CID": {
+				"type": "string", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"PEN": {
+				"type": "string", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"FriendlyName": {
+				"type": "string", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"Device.DeviceInfo.VendorConfigFile.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Version": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Date": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Description": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"UseForBackupRestore": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.DeviceInfo.MemoryStatus.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Total": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "kilobytes", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "router.system", 
+								"method": "info", 
+								"args": {}, 
+								"key": "memoryKB.total"
+							}
+						}
+					]
+				}, 
+				"Free": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "kilobytes", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "router.system", 
+								"method": "info", 
+								"args": {}, 
+								"key": "memoryKB.free"
+							}
+						}
+					]
+				}
+			}, 
+			"Device.DeviceInfo.ProcessStatus.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"CPUUsage": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"max": "100"
+					}, 
+					"unit": "percent", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "router.system", 
+								"method": "info", 
+								"args": {}, 
+								"key": "system.cpu_per"
+							}
+						}
+					]
+				}, 
+				"ProcessNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.DeviceInfo.ProcessStatus.Process.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"PID": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Command": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Size": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "kilobytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"Priority": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "99"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"CPUTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"State": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Running", 
+							"Sleeping", 
+							"Stopped", 
+							"Idle", 
+							"Uninterruptible", 
+							"Zombie"
+						]
+					}
+				}
+			}, 
+			"Device.DeviceInfo.TemperatureStatus.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"TemperatureSensorNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.DeviceInfo.TemperatureStatus.TemperatureSensor.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error"
+						]
+					}, 
+					"Reset": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ResetTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Value": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-274"
+						}, 
+						"unit": "degrees celsius", 
+						"read": true, 
+						"write": false
+					}, 
+					"LastUpdate": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MinValue": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-274"
+						}, 
+						"unit": "degrees celsius", 
+						"read": true, 
+						"write": false
+					}, 
+					"MinTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MaxValue": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-274"
+						}, 
+						"unit": "degrees celsius", 
+						"read": true, 
+						"write": false
+					}, 
+					"MaxTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LowAlarmValue": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-274"
+						}, 
+						"unit": "degrees celsius", 
+						"read": true, 
+						"write": true
+					}, 
+					"LowAlarmTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HighAlarmValue": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-274"
+						}, 
+						"unit": "degrees celsius", 
+						"read": true, 
+						"write": true
+					}, 
+					"PollingInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"HighAlarmTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.DeviceInfo.NetworkProperties.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"MaxTCPWindowSize": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "bytes", 
+					"read": true, 
+					"write": false
+				}, 
+				"TCPImplementation": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Tahoe", 
+						"Reno", 
+						"New Reno", 
+						"Vegas"
+					]
+				}
+			}, 
+			"Device.DeviceInfo.Processor.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Architecture": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"arm", 
+						"i386", 
+						"m68010", 
+						"m68k", 
+						"mipseb", 
+						"mipsel", 
+						"powerpc", 
+						"sh3eb", 
+						"sh3el", 
+						"x86_64"
+					]
+				}
+			}, 
+			"Device.DeviceInfo.VendorLogFile.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MaximumSize": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "bytes", 
+					"read": true, 
+					"write": false
+				}, 
+				"Persistent": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.DeviceInfo.Location.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Source": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"GPS", 
+						"AGPS", 
+						"Manual", 
+						"External"
+					]
+				}, 
+				"AcquiredTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ExternalSource": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ExternalProtocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"", 
+						"CWMP", 
+						"OMA-DM", 
+						"SNMP", 
+						"UPnP", 
+						"HELD", 
+						"DHCPv4", 
+						"DHCPv6", 
+						"LLDP-MED", 
+						"MLP", 
+						"Other"
+					]
+				}, 
+				"DataObject": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}, 
+			"Device.DeviceInfo.DeviceImageFile.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Location": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Front", 
+						"Back", 
+						"Left", 
+						"Right", 
+						"Top", 
+						"Bottom"
+					]
+				}, 
+				"Image": {
+					"type": "base64", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.DeviceInfo.FirmwareImage.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Version": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Available": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"NoImage", 
+						"Downloading", 
+						"Validating", 
+						"Available", 
+						"DownloadFailed", 
+						"ValidationFailed", 
+						"InstallationFailed", 
+						"ActivationFailed"
+					]
+				}, 
+				"BootFailureLog": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.DeviceInfo.SupportedDataModel.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"URL": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"UUID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"URN": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Features": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.DeviceInfo.ProxierInfo.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp"
+				], 
+				"access": false, 
+				"array": false, 
+				"ManufacturerOUI": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ProductClass": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SerialNumber": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ProxyProtocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Z-Wave", 
+						"ZigBee", 
+						"UPnP-DM", 
+						"ETSI-M2M"
+					]
+				}
+			}
+		}, 
+		"Device.ManagementServer.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp"
+			], 
+			"access": false, 
+			"array": false, 
+			"EnableCWMP": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"URL": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "acs"
+							}, 
+							"option": {
+								"name": "url"
+							}
+						}
+					}
+				]
+			}, 
+			"Username": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "acs"
+							}, 
+							"option": {
+								"name": "userid"
+							}
+						}
+					}
+				]
+			}, 
+			"Password": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "acs"
+							}, 
+							"option": {
+								"name": "passwd"
+							}
+						}
+					}
+				]
+			}, 
+			"ScheduleReboot": {
+				"type": "dateTime", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"DelayReboot": {
+				"type": "int", 
+				"protocols": [
+					"cwmp"
+				], 
+				"range": {
+					"min": "-1"
+				}, 
+				"unit": "seconds", 
+				"read": true, 
+				"write": true
+			}, 
+			"PeriodicInformEnable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "acs"
+							}, 
+							"option": {
+								"name": "periodic_inform_enable"
+							}
+						}
+					}
+				]
+			}, 
+			"PeriodicInformInterval": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp"
+				], 
+				"range": {
+					"min": "1"
+				}, 
+				"unit": "seconds", 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "acs"
+							}, 
+							"option": {
+								"name": "periodic_inform_interval"
+							}
+						}
+					}
+				]
+			}, 
+			"PeriodicInformTime": {
+				"type": "dateTime", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "acs"
+							}, 
+							"option": {
+								"name": "periodic_inform_time"
+							}
+						}
+					}
+				]
+			}, 
+			"ParameterKey": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "acs"
+							}, 
+							"option": {
+								"name": "ParameterKey"
+							}
+						}
+					}
+				]
+			}, 
+			"ConnectionRequestURL": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "cpe"
+							}, 
+							"option": {
+								"name": "port"
+							}
+						}
+					}
+				]
+			}, 
+			"ConnectionRequestUsername": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "cpe"
+							}, 
+							"option": {
+								"name": "userid"
+							}
+						}
+					}
+				]
+			}, 
+			"ConnectionRequestPassword": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "cpe"
+							}, 
+							"option": {
+								"name": "passwd"
+							}
+						}
+					}
+				]
+			}, 
+			"UpgradesManaged": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"KickURL": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"DownloadProgressURL": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"DefaultActiveNotificationThrottle": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp"
+				], 
+				"unit": "seconds", 
+				"read": true, 
+				"write": true
+			}, 
+			"CWMPRetryMinimumWaitInterval": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp"
+				], 
+				"range": {
+					"min": "1", 
+					"max": "65535"
+				}, 
+				"unit": "seconds", 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "acs"
+							}, 
+							"option": {
+								"name": "retry_min_wait_interval"
+							}
+						}
+					}
+				]
+			}, 
+			"CWMPRetryIntervalMultiplier": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp"
+				], 
+				"range": {
+					"min": "1000", 
+					"max": "65535"
+				}, 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "acs"
+							}, 
+							"option": {
+								"name": "retry_interval_multiplier"
+							}
+						}
+					}
+				]
+			}, 
+			"HTTPConnectionRequestEnable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"UDPConnectionRequestAddress": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp_stun", 
+							"section": {
+								"type": "stun", 
+								"name": "stun"
+							}, 
+							"option": {
+								"name": "crudp_address"
+							}
+						}
+					}
+				]
+			}, 
+			"STUNEnable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"STUNServerAddress": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp_stun", 
+							"section": {
+								"type": "stun", 
+								"name": "stun"
+							}, 
+							"option": {
+								"name": "server_address"
+							}
+						}
+					}
+				]
+			}, 
+			"STUNServerPort": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp"
+				], 
+				"range": {
+					"min": "0", 
+					"max": "65535"
+				}, 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp_stun", 
+							"section": {
+								"type": "stun", 
+								"name": "stun"
+							}, 
+							"option": {
+								"name": "server_port"
+							}
+						}
+					}
+				]
+			}, 
+			"STUNUsername": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp_stun", 
+							"section": {
+								"type": "stun", 
+								"name": "stun"
+							}, 
+							"option": {
+								"name": "username"
+							}
+						}
+					}
+				]
+			}, 
+			"STUNPassword": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp_stun", 
+							"section": {
+								"type": "stun", 
+								"name": "stun"
+							}, 
+							"option": {
+								"name": "password"
+							}
+						}
+					}
+				]
+			}, 
+			"STUNMaximumKeepAlivePeriod": {
+				"type": "int", 
+				"protocols": [
+					"cwmp"
+				], 
+				"range": {
+					"min": "-1"
+				}, 
+				"unit": "seconds", 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp_stun", 
+							"section": {
+								"type": "stun", 
+								"name": "stun"
+							}, 
+							"option": {
+								"name": "max_keepalive"
+							}
+						}
+					}
+				]
+			}, 
+			"STUNMinimumKeepAlivePeriod": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp"
+				], 
+				"unit": "seconds", 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp_stun", 
+							"section": {
+								"type": "stun", 
+								"name": "stun"
+							}, 
+							"option": {
+								"name": "min_keepalive"
+							}
+						}
+					}
+				]
+			}, 
+			"NATDetected": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp_stun", 
+							"section": {
+								"type": "stun", 
+								"name": "stun"
+							}, 
+							"option": {
+								"name": "nat_detected"
+							}
+						}
+					}
+				]
+			}, 
+			"AliasBasedAddressing": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "cpe"
+							}, 
+							"option": {
+								"name": "amd_version"
+							}
+						}
+					}
+				]
+			}, 
+			"InstanceMode": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"values": [
+					"InstanceNumber", 
+					"InstanceAlias"
+				], 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "cpe"
+							}, 
+							"option": {
+								"name": "instance_mode"
+							}
+						}
+					}
+				]
+			}, 
+			"AutoCreateInstances": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"ManageableDeviceNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ManageableDeviceNotificationLimit": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"EmbeddedDeviceNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"VirtualDeviceNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"SupportedConnReqMethods": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"HTTP", 
+					"STUN", 
+					"XMPP"
+				]
+			}, 
+			"ConnReqXMPPConnection": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"ConnReqAllowedJabberIDs": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp_xmpp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "xmpp"
+							}, 
+							"option": {
+								"name": "allowed_jid"
+							}
+						}
+					}
+				]
+			}, 
+			"ConnReqJabberID": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"HTTPCompressionSupported": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"GZIP", 
+					"Compress", 
+					"Deflate"
+				]
+			}, 
+			"HTTPCompression": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "acs"
+							}, 
+							"option": {
+								"name": "compression"
+							}
+						}
+					}
+				]
+			}, 
+			"LightweightNotificationProtocolsSupported": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"UDP"
+				]
+			}, 
+			"LightweightNotificationProtocolsUsed": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "lwn"
+							}, 
+							"option": {
+								"name": "enable"
+							}
+						}
+					}
+				]
+			}, 
+			"LightweightNotificationTriggerInterval": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp"
+				], 
+				"range": {
+					"min": "0"
+				}, 
+				"unit": "seconds", 
+				"read": true, 
+				"write": true
+			}, 
+			"LightweightNotificationTriggerTime": {
+				"type": "dateTime", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"UDPLightweightNotificationHost": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "lwn"
+							}, 
+							"option": {
+								"name": "hostname"
+							}
+						}
+					}
+				]
+			}, 
+			"UDPLightweightNotificationPort": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp", 
+							"section": {
+								"type": "cwmp", 
+								"name": "lwn"
+							}, 
+							"option": {
+								"name": "port"
+							}
+						}
+					}
+				]
+			}, 
+			"InstanceWildcardsSupported": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"InformParameterNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.ManagementServer.ManageableDevice.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ManufacturerOUI": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SerialNumber": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ProductClass": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Host": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.ManagementServer.AutonomousTransferCompletePolicy.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TransferTypeFilter": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Upload", 
+						"Download", 
+						"Both"
+					]
+				}, 
+				"ResultTypeFilter": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Success", 
+						"Failure", 
+						"Both"
+					]
+				}, 
+				"FileTypeFilter": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}, 
+			"Device.ManagementServer.DownloadAvailability.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Device.ManagementServer.DownloadAvailability.Announcement.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error"
+						]
+					}, 
+					"GroupNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.ManagementServer.DownloadAvailability.Announcement.Group.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": true, 
+						"array": true, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Enable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Status": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Disabled", 
+								"Enabled", 
+								"Error"
+							]
+						}, 
+						"URL": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}
+				}, 
+				"Device.ManagementServer.DownloadAvailability.Query.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error"
+						]
+					}, 
+					"URL": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}
+			}, 
+			"Device.ManagementServer.DUStateChangeComplPolicy.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"OperationTypeFilter": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Install", 
+						"Update", 
+						"Uninstall"
+					]
+				}, 
+				"ResultTypeFilter": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Success", 
+						"Failure", 
+						"Both"
+					]
+				}, 
+				"FaultCodeFilter": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"9001", 
+						"9003", 
+						"9012", 
+						"9013", 
+						"9015", 
+						"9016", 
+						"9017", 
+						"9018", 
+						"9022", 
+						"9023", 
+						"9024", 
+						"9025", 
+						"9026", 
+						"9027", 
+						"9028", 
+						"9029", 
+						"9030", 
+						"9031", 
+						"9032"
+					]
+				}
+			}, 
+			"Device.ManagementServer.EmbeddedDevice.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp"
+				], 
+				"access": false, 
+				"array": true, 
+				"ControllerID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ProxiedDeviceID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Reference": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SupportedDataModel": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Host": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ProxyProtocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Z-Wave", 
+						"ZigBee", 
+						"UPnP-DM", 
+						"ETSI-M2M"
+					]
+				}, 
+				"ProxyProtocolReference": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DiscoveryProtocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Z-Wave", 
+						"ZigBee", 
+						"UPnP", 
+						"ETSI-M2M"
+					]
+				}, 
+				"DiscoveryProtocolReference": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"CommandProcessed": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Pending", 
+						"Retrying", 
+						"Success", 
+						"Error"
+					]
+				}, 
+				"CommandProcessingErrMsg": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastSyncTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.ManagementServer.VirtualDevice.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp"
+				], 
+				"access": false, 
+				"array": true, 
+				"ManufacturerOUI": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ProductClass": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SerialNumber": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Host": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ProxyProtocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Z-Wave", 
+						"ZigBee", 
+						"UPnP-DM", 
+						"ETSI-M2M"
+					]
+				}, 
+				"ProxyProtocolReference": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DiscoveryProtocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Z-Wave", 
+						"ZigBee", 
+						"UPnP", 
+						"ETSI-M2M"
+					]
+				}, 
+				"DiscoveryProtocolReference": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.ManagementServer.StandbyPolicy.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp"
+				], 
+				"access": false, 
+				"array": false, 
+				"CRUnawarenessMaxDuration": {
+					"type": "int", 
+					"protocols": [
+						"cwmp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"MaxMissedPeriodic": {
+					"type": "int", 
+					"protocols": [
+						"cwmp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"NotifyMissedScheduled": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"NetworkAwarenessCapable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SelfTimerCapable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"CRAwarenessRequested": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PeriodicAwarenessRequested": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ScheduledAwarenessRequested": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}, 
+			"Device.ManagementServer.InformParameter.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ParameterName": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"EventList": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}, 
+			"Device.ManagementServer.HeartbeatPolicy.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ReportingInterval": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp"
+					], 
+					"range": {
+						"min": "30"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"InitiationTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}
+		}, 
+		"Device.SoftwareModules.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"ExecEnvNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"DeploymentUnitNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ExecutionUnitNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.SoftwareModules.ExecEnv.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Error", 
+						"Disabled"
+					]
+				}, 
+				"Reset": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Type": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"InitialRunLevel": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"RequestedRunLevel": {
+					"type": "int", 
+					"protocols": [
+						"cwmp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"CurrentRunLevel": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"InitialExecutionUnitRunLevel": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Vendor": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Version": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ParentExecEnv": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AllocatedDiskSpace": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"unit": "kilobytes", 
+					"read": true, 
+					"write": false
+				}, 
+				"AvailableDiskSpace": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"unit": "kilobytes", 
+					"read": true, 
+					"write": false
+				}, 
+				"AllocatedMemory": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"unit": "kilobytes", 
+					"read": true, 
+					"write": false
+				}, 
+				"AvailableMemory": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"unit": "kilobytes", 
+					"read": true, 
+					"write": false
+				}, 
+				"ActiveExecutionUnits": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ProcessorRefList": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.SoftwareModules.DeploymentUnit.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"UUID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DUID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Installing", 
+						"Installed", 
+						"Updating", 
+						"Uninstalling", 
+						"Uninstalled"
+					]
+				}, 
+				"Resolved": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"URL": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Description": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Vendor": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Version": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"VendorLogList": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"VendorConfigList": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ExecutionUnitList": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ExecutionEnvRef": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.SoftwareModules.ExecutionUnit.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"EUID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ExecEnvLabel": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Idle", 
+						"Starting", 
+						"Active", 
+						"Stopping"
+					]
+				}, 
+				"RequestedState": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Idle", 
+						"Active"
+					]
+				}, 
+				"ExecutionFaultCode": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"NoFault", 
+						"FailureOnStart", 
+						"FailureOnAutoStart", 
+						"FailureOnStop", 
+						"FailureWhileActive", 
+						"DependencyFailure", 
+						"UnStartable"
+					]
+				}, 
+				"ExecutionFaultMessage": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AutoStart": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"RunLevel": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Vendor": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Version": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Description": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DiskSpaceInUse": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"unit": "kilobytes", 
+					"read": true, 
+					"write": false
+				}, 
+				"MemoryInUse": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"unit": "kilobytes", 
+					"read": true, 
+					"write": false
+				}, 
+				"References": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AssociatedProcessList": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"VendorLogList": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"VendorConfigList": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SupportedDataModelList": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ExecutionEnvRef": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.SoftwareModules.ExecutionUnit.{i}.Extensions.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false
+				}
+			}
+		}, 
+		"Device.ETSIM2M.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp"
+			], 
+			"access": false, 
+			"array": false, 
+			"SCLNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.ETSIM2M.SCL.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AnnouncedToSCLList": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SAFPolicySetNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AreaNwkInstanceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AreaNwkDeviceInfoInstanceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.ETSIM2M.SCL.{i}.Discovery.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"MaxNumberOfDiscovRecords": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"MaxSizeOfDiscovAnswer": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.ETSIM2M.SCL.{i}.Reregistration.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"RegTargetNSCLList": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"RegSearchStrings": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"RegAccessRightID": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"RegExpirationDuration": {
+						"type": "int", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"Reregistration": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Device.ETSIM2M.SCL.{i}.Reregistration.ActionStatus.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": false, 
+						"Progress": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "100"
+							}, 
+							"unit": "percent", 
+							"read": true, 
+							"write": false
+						}, 
+						"FinalStatus": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"SUCCESS", 
+								"FAILURE"
+							]
+						}
+					}
+				}, 
+				"Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"PolicyScope": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ANPPolicyNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.ANPPolicy.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": true, 
+						"array": true, 
+						"Enable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"ANName": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"BlockPeriodNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RequestCategoryNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.ANPPolicy.{i}.BlockPeriod.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp"
+							], 
+							"access": true, 
+							"array": true, 
+							"Enable": {
+								"type": "boolean", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"Alias": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"FailedAttempts": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"BlockDuration": {
+								"type": "int", 
+								"protocols": [
+									"cwmp"
+								], 
+								"unit": "seconds", 
+								"read": true, 
+								"write": true
+							}
+						}, 
+						"Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.ANPPolicy.{i}.RequestCategory.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp"
+							], 
+							"access": true, 
+							"array": true, 
+							"Enable": {
+								"type": "boolean", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"Alias": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"RCAT": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"ScheduleNumberOfEntries": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.ANPPolicy.{i}.RequestCategory.{i}.Schedule.{i}.": {
+								"type": "object", 
+								"protocols": [
+									"cwmp"
+								], 
+								"access": true, 
+								"array": true, 
+								"Enable": {
+									"type": "boolean", 
+									"protocols": [
+										"cwmp"
+									], 
+									"read": true, 
+									"write": true
+								}, 
+								"Alias": {
+									"type": "string", 
+									"protocols": [
+										"cwmp"
+									], 
+									"read": true, 
+									"write": true
+								}, 
+								"Schedules": {
+									"type": "string", 
+									"protocols": [
+										"cwmp"
+									], 
+									"read": true, 
+									"write": true
+								}, 
+								"AbsTimeSpanNumberOfEntries": {
+									"type": "unsignedInt", 
+									"protocols": [
+										"cwmp"
+									], 
+									"read": true, 
+									"write": false
+								}, 
+								"Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.ANPPolicy.{i}.RequestCategory.{i}.Schedule.{i}.AbsTimeSpan.{i}.": {
+									"type": "object", 
+									"protocols": [
+										"cwmp"
+									], 
+									"access": true, 
+									"array": true, 
+									"Enable": {
+										"type": "boolean", 
+										"protocols": [
+											"cwmp"
+										], 
+										"read": true, 
+										"write": true
+									}, 
+									"Alias": {
+										"type": "string", 
+										"protocols": [
+											"cwmp"
+										], 
+										"read": true, 
+										"write": true
+									}, 
+									"StartTime": {
+										"type": "dateTime", 
+										"protocols": [
+											"cwmp"
+										], 
+										"read": true, 
+										"write": true
+									}, 
+									"EndTime": {
+										"type": "dateTime", 
+										"protocols": [
+											"cwmp"
+										], 
+										"read": true, 
+										"write": true
+									}
+								}
+							}
+						}
+					}, 
+					"Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.M2MSPPolicy.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": false, 
+						"DefaultRCATValue": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"RequestCategoryNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.M2MSPPolicy.RequestCategory.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp"
+							], 
+							"access": true, 
+							"array": true, 
+							"Enable": {
+								"type": "boolean", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"Alias": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"RCAT": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"TolerableDelay": {
+								"type": "int", 
+								"protocols": [
+									"cwmp"
+								], 
+								"range": {
+									"min": "-1"
+								}, 
+								"unit": "seconds", 
+								"read": true, 
+								"write": true
+							}, 
+							"Thresh": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"Mem": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"RankedANList": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": true
+							}
+						}
+					}
+				}, 
+				"Device.ETSIM2M.SCL.{i}.AreaNwkInstance.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": true, 
+					"ID": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"AreaNwkType": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ListOfDevices": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PropertyNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.ETSIM2M.SCL.{i}.AreaNwkInstance.{i}.Property.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": true, 
+						"Name": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Value": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}, 
+				"Device.ETSIM2M.SCL.{i}.AreaNwkDeviceInfoInstance.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": true, 
+					"AreaNwkInstance": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Host": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ListOfDeviceNeighbors": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ListOfDeviceApplications": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SleepInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"SleepDuration": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"ASLEEP", 
+							"AWAKE"
+						]
+					}, 
+					"Active": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PropertyNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.ETSIM2M.SCL.{i}.AreaNwkDeviceInfoInstance.{i}.Property.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": true, 
+						"Name": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Value": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}
+			}
+		}, 
+		"Device.GatewayInfo.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp"
+			], 
+			"access": false, 
+			"array": false, 
+			"ManufacturerOUI": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ProductClass": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"SerialNumber": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false
+			}
+		}, 
+		"Device.Time.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Enable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"Status": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"Disabled", 
+					"Unsynchronized", 
+					"Synchronized", 
+					"Error_FailedToSynchronize", 
+					"Error"
+				]
+			}, 
+			"NTPServer1": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"NTPServer2": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"NTPServer3": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"NTPServer4": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"NTPServer5": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"CurrentLocalTime": {
+				"type": "dateTime", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"LocalTimeZone": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "system", 
+							"section": {
+								"type": "system", 
+								"name": "@system[0]"
+							}, 
+							"option": {
+								"name": "timezone"
+							}
+						}
+					}
+				]
+			}
+		}, 
+		"Device.UserInterface.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Enable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"PasswordRequired": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"PasswordUserSelectable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"PasswordReset": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"UpgradeAvailable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"WarrantyDate": {
+				"type": "dateTime", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"ISPName": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"ISPHelpDesk": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"ISPHomePage": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"ISPHelpPage": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"ISPLogo": {
+				"type": "base64", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"ISPLogoSize": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"range": {
+					"min": "0", 
+					"max": "4095"
+				}, 
+				"read": true, 
+				"write": true
+			}, 
+			"ISPMailServer": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"ISPNewsServer": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"TextColor": {
+				"type": "hexBinary", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"BackgroundColor": {
+				"type": "hexBinary", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"ButtonColor": {
+				"type": "hexBinary", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"ButtonTextColor": {
+				"type": "hexBinary", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"AutoUpdateServer": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"UserUpdateServer": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"AvailableLanguages": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"CurrentLanguage": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"Device.UserInterface.RemoteAccess.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Port": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"SupportedProtocols": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"HTTP", 
+						"HTTPS"
+					]
+				}, 
+				"Protocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}, 
+			"Device.UserInterface.LocalDisplay.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Movable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Resizable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PosX": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "pixels", 
+					"read": true, 
+					"write": true
+				}, 
+				"PosY": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "pixels", 
+					"read": true, 
+					"write": true
+				}, 
+				"Width": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "pixels", 
+					"read": true, 
+					"write": true
+				}, 
+				"Height": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "pixels", 
+					"read": true, 
+					"write": true
+				}, 
+				"DisplayWidth": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "pixels", 
+					"read": true, 
+					"write": false
+				}, 
+				"DisplayHeight": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "pixels", 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.UserInterface.Messages.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Title": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SubTitle": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Text": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IconType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"None", 
+						"Greeting", 
+						"Information", 
+						"Warning", 
+						"Important", 
+						"Urgent", 
+						"Advertisement"
+					]
+				}, 
+				"MessageColor": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"BackgroundColor": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TitleColor": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SubTitleColor": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"RequestedNumberOfRepetitions": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ExecutedNumberOfRepetitions": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}
+		}, 
+		"Device.InterfaceStack.{i}.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": true, 
+			"Alias": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"HigherLayer": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"LowerLayer": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"HigherAlias": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"LowerAlias": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}
+		}, 
+		"Device.DSL.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"LineNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ChannelNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"BondingGroupNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.DSL.Line.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "status"
+							}
+						}
+					]
+				}, 
+				"EnableDataGathering": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "status"
+							}
+						}
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Upstream": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "upstream"
+							}
+						}
+					]
+				}, 
+				"FirmwareVersion": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "firmware_version"
+							}
+						}
+					]
+				}, 
+				"LinkStatus": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Initializing", 
+						"EstablishingLink", 
+						"NoSignal", 
+						"Disabled", 
+						"Error"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "link_status"
+							}
+						}
+					]
+				}, 
+				"StandardsSupported": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"G.992.1_Annex_A", 
+						"G.992.1_Annex_B", 
+						"G.992.1_Annex_C", 
+						"T1.413", 
+						"T1.413i2", 
+						"ETSI_101_388", 
+						"G.992.2", 
+						"G.992.3_Annex_A", 
+						"G.992.3_Annex_B", 
+						"G.992.3_Annex_C", 
+						"G.992.3_Annex_I", 
+						"G.992.3_Annex_J", 
+						"G.992.3_Annex_L", 
+						"G.992.3_Annex_M", 
+						"G.992.4", 
+						"G.992.5_Annex_A", 
+						"G.992.5_Annex_B", 
+						"G.992.5_Annex_C", 
+						"G.992.5_Annex_I", 
+						"G.992.5_Annex_J", 
+						"G.992.5_Annex_M", 
+						"G.993.1", 
+						"G.993.1_Annex_A", 
+						"G.993.2_Annex_A", 
+						"G.993.2_Annex_B", 
+						"G.993.2_Annex_C"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "standards_supported"
+							}
+						}
+					]
+				}, 
+				"XTSE": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "xtse"
+							}
+						}
+					]
+				}, 
+				"StandardUsed": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "standard_used"
+							}
+						}
+					]
+				}, 
+				"XTSUsed": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "xtse_used"
+							}
+						}
+					]
+				}, 
+				"LineEncoding": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"DMT", 
+						"CAP", 
+						"2B1Q", 
+						"43BT", 
+						"PAM", 
+						"QAM"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "line_encoding"
+							}
+						}
+					]
+				}, 
+				"AllowedProfiles": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"8a", 
+						"8b", 
+						"8c", 
+						"8d", 
+						"12a", 
+						"12b", 
+						"17a", 
+						"17b", 
+						"30a", 
+						"35b"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "allowed_profiles"
+							}
+						}
+					]
+				}, 
+				"CurrentProfile": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "current_profile"
+							}
+						}
+					]
+				}, 
+				"PowerManagementState": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"L0", 
+						"L1", 
+						"L2", 
+						"L3", 
+						"L4"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "power_management_state"
+							}
+						}
+					]
+				}, 
+				"SuccessFailureCause": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "6"
+					}, 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "success_failure_cause"
+							}
+						}
+					]
+				}, 
+				"UPBOKLER": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "1280"
+					}, 
+					"unit": "0.1 dB", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "upbokler_pb"
+							}
+						}
+					]
+				}, 
+				"UPBOKLEPb": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "1280"
+					}, 
+					"unit": "0.1 dB", 
+					"read": true, 
+					"write": false
+				}, 
+				"UPBOKLERPb": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "1280"
+					}, 
+					"unit": "0.1 dB", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "upbokler_pb"
+							}
+						}
+					]
+				}, 
+				"RXTHRSHds": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-640", 
+						"max": "0"
+					}, 
+					"unit": "0.1 dB", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "rxthrsh_ds"
+							}
+						}
+					]
+				}, 
+				"ACTRAMODEds": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1", 
+						"max": "4"
+					}, 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "act_ra_mode.ds"
+							}
+						}
+					]
+				}, 
+				"ACTRAMODEus": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1", 
+						"max": "4"
+					}, 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "act_ra_mode.us"
+							}
+						}
+					]
+				}, 
+				"ACTINPROCds": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ACTINPROCus": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SNRMROCds": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1 dB", 
+					"read": true, 
+					"write": false
+				}, 
+				"SNRMROCus": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1 dB", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "snr_mroc_us"
+							}
+						}
+					]
+				}, 
+				"LastStateTransmittedDownstream": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "last_state_transmitted.ds"
+							}
+						}
+					]
+				}, 
+				"LastStateTransmittedUpstream": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "last_state_transmitted.us"
+							}
+						}
+					]
+				}, 
+				"UPBOKLE": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "1280"
+					}, 
+					"unit": "0.1dB", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "upbokler_pb"
+							}
+						}
+					]
+				}, 
+				"MREFPSDds": {
+					"type": "base64", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MREFPSDus": {
+					"type": "base64", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LIMITMASK": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"US0MASK": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "us0_mask"
+							}
+						}
+					]
+				}, 
+				"TRELLISds": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "trellis.ds"
+							}
+						}
+					]
+				}, 
+				"TRELLISus": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "trellis.us"
+							}
+						}
+					]
+				}, 
+				"ACTSNRMODEds": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "act_snr_mode.ds"
+							}
+						}
+					]
+				}, 
+				"ACTSNRMODEus": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "act_snr_mode.us"
+							}
+						}
+					]
+				}, 
+				"VirtualNoisePSDds": {
+					"type": "base64", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"VirtualNoisePSDus": {
+					"type": "base64", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ACTUALCE": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LineNumber": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "line_number"
+							}
+						}
+					]
+				}, 
+				"UpstreamMaxBitRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Kbps", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "max_bit_rate.us"
+							}
+						}
+					]
+				}, 
+				"DownstreamMaxBitRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Kbps", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "max_bit_rate.ds"
+							}
+						}
+					]
+				}, 
+				"UpstreamNoiseMargin": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1dB", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "noise_margin.us"
+							}
+						}
+					]
+				}, 
+				"DownstreamNoiseMargin": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1dB", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "noise_margin.ds"
+							}
+						}
+					]
+				}, 
+				"SNRMpbus": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "snr_mpb_us"
+							}
+						}
+					]
+				}, 
+				"SNRMpbds": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "snr_mpb_ds"
+							}
+						}
+					]
+				}, 
+				"INMIATOds": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "3", 
+						"max": "511"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"INMIATSds": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "7"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"INMCCds": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "64"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"INMINPEQMODEds": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "3"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"UpstreamAttenuation": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1dB", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "attenuation.us"
+							}
+						}
+					]
+				}, 
+				"DownstreamAttenuation": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1dB", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "attenuation.ds"
+							}
+						}
+					]
+				}, 
+				"UpstreamPower": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1dBmV", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "power.us"
+							}
+						}
+					]
+				}, 
+				"DownstreamPower": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1dBmV", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "power.ds"
+							}
+						}
+					]
+				}, 
+				"XTURVendor": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "xtur_vendor"
+							}
+						}
+					]
+				}, 
+				"XTURCountry": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "xtur_country"
+							}
+						}
+					]
+				}, 
+				"XTURANSIStd": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "xtur_ansi_std"
+							}
+						}
+					]
+				}, 
+				"XTURANSIRev": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "xtur_ansi_rev"
+							}
+						}
+					]
+				}, 
+				"XTUCVendor": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "xtuc_vendor"
+							}
+						}
+					]
+				}, 
+				"XTUCCountry": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "xtuc_country"
+							}
+						}
+					]
+				}, 
+				"XTUCANSIStd": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "xtuc_ansi_std"
+							}
+						}
+					]
+				}, 
+				"XTUCANSIRev": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.line.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "xtuc_ansi_rev"
+							}
+						}
+					]
+				}, 
+				"Device.DSL.Line.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TotalStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "dsl.line.0", 
+									"method": "stats", 
+									"args": {}, 
+									"key": "total_start"
+								}
+							}
+						]
+					}, 
+					"ShowtimeStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "dsl.line.0", 
+									"method": "stats", 
+									"args": {}, 
+									"key": "showtime_start"
+								}
+							}
+						]
+					}, 
+					"LastShowtimeStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "dsl.line.0", 
+									"method": "stats", 
+									"args": {}, 
+									"key": "last_showtime_start"
+								}
+							}
+						]
+					}, 
+					"CurrentDayStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "dsl.line.0", 
+									"method": "stats", 
+									"args": {}, 
+									"key": "current_day_start"
+								}
+							}
+						]
+					}, 
+					"QuarterHourStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "dsl.line.0", 
+									"method": "stats", 
+									"args": {}, 
+									"key": "quarter_hour_start"
+								}
+							}
+						]
+					}, 
+					"Device.DSL.Line.{i}.Stats.Total.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"ErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.line.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "total.errored_secs"
+									}
+								}
+							]
+						}, 
+						"SeverelyErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.line.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "total.severely_errored_secs"
+									}
+								}
+							]
+						}
+					}, 
+					"Device.DSL.Line.{i}.Stats.Showtime.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"ErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.line.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "showtime.severely_errored_secs"
+									}
+								}
+							]
+						}, 
+						"SeverelyErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.line.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "showtime.severely_errored_secs"
+									}
+								}
+							]
+						}
+					}, 
+					"Device.DSL.Line.{i}.Stats.LastShowtime.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"ErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.line.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "lastshowtime.errored_secs"
+									}
+								}
+							]
+						}, 
+						"SeverelyErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.line.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "lastshowtime.severely_errored_secs"
+									}
+								}
+							]
+						}
+					}, 
+					"Device.DSL.Line.{i}.Stats.CurrentDay.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"ErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.line.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "currentday.errored_secs"
+									}
+								}
+							]
+						}, 
+						"SeverelyErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.line.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "currentday.severely_errored_secs"
+									}
+								}
+							]
+						}
+					}, 
+					"Device.DSL.Line.{i}.Stats.QuarterHour.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"ErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.line.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "quarterhour.severely_errored_secs"
+									}
+								}
+							]
+						}, 
+						"SeverelyErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.line.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "quarterhour.severely_errored_secs"
+									}
+								}
+							]
+						}
+					}
+				}, 
+				"Device.DSL.Line.{i}.TestParams.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"HLOGGds": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLOGGus": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLOGpsds": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLOGpsus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLOGMTds": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLOGMTus": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"QLNGds": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"QLNGus": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"QLNpsds": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"QLNpsus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"QLNMTds": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"QLNMTus": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRGds": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRGus": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRpsds": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRpsus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRMTds": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRMTus": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LATNds": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LATNus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SATNds": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SATNus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.DSL.Line.{i}.DataGathering.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"LoggingDepthR": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "records", 
+						"read": true, 
+						"write": false
+					}, 
+					"ActLoggingDepthReportingR": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "records", 
+						"read": true, 
+						"write": false
+					}, 
+					"EventTraceBufferR": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.DSL.Channel.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "status"
+							}
+						}
+					]
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "status"
+							}
+						}
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LinkEncapsulationSupported": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"G.992.3_Annex_K_ATM", 
+						"G.992.3_Annex_K_PTM", 
+						"G.993.2_Annex_K_ATM", 
+						"G.993.2_Annex_K_PTM", 
+						"G.994.1"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "link_encapsulation_supported"
+							}
+						}
+					]
+				}, 
+				"LinkEncapsulationUsed": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"G.992.3_Annex_K_ATM", 
+						"G.992.3_Annex_K_PTM", 
+						"G.993.2_Annex_K_ATM", 
+						"G.993.2_Annex_K_PTM"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "link_encapsulation_used"
+							}
+						}
+					]
+				}, 
+				"LPATH": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"max": "3"
+					}, 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "lpath"
+							}
+						}
+					]
+				}, 
+				"INTLVDEPTH": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "intlvdepth"
+							}
+						}
+					]
+				}, 
+				"INTLVBLOCK": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "intlvblock"
+							}
+						}
+					]
+				}, 
+				"ActualInterleavingDelay": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "milliseconds", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "actual_interleaving_delay"
+							}
+						}
+					]
+				}, 
+				"ACTINP": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "actinp"
+							}
+						}
+					]
+				}, 
+				"INPREPORT": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "inpreport"
+							}
+						}
+					]
+				}, 
+				"NFEC": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "octets", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "nfec"
+							}
+						}
+					]
+				}, 
+				"RFEC": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "rfec"
+							}
+						}
+					]
+				}, 
+				"LSYMB": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "lsymb"
+							}
+						}
+					]
+				}, 
+				"UpstreamCurrRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Kbps", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "curr_rate.us"
+							}
+						}
+					]
+				}, 
+				"DownstreamCurrRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Kbps", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "curr_rate.ds"
+							}
+						}
+					]
+				}, 
+				"ACTNDR": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Kbps", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "actndr.ds"
+							}
+						}
+					]
+				}, 
+				"ACTINPREIN": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "255"
+					}, 
+					"unit": "0.1 DMT symbols", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "dsl.channel.0", 
+								"method": "status", 
+								"args": {}, 
+								"key": "actinprein.ds"
+							}
+						}
+					]
+				}, 
+				"Device.DSL.Channel.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TotalStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "dsl.channel.0", 
+									"method": "stats", 
+									"args": {}, 
+									"key": "total_start"
+								}
+							}
+						]
+					}, 
+					"ShowtimeStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "dsl.channel.0", 
+									"method": "stats", 
+									"args": {}, 
+									"key": "showtime_start"
+								}
+							}
+						]
+					}, 
+					"LastShowtimeStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "dsl.channel.0", 
+									"method": "stats", 
+									"args": {}, 
+									"key": "last_showtime_start"
+								}
+							}
+						]
+					}, 
+					"CurrentDayStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "dsl.channel.0", 
+									"method": "stats", 
+									"args": {}, 
+									"key": "current_day_start"
+								}
+							}
+						]
+					}, 
+					"QuarterHourStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "dsl.channel.0", 
+									"method": "stats", 
+									"args": {}, 
+									"key": "quarter_hour_start"
+								}
+							}
+						]
+					}, 
+					"Device.DSL.Channel.{i}.Stats.Total.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"XTURFECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "total.xtur_fec_errors"
+									}
+								}
+							]
+						}, 
+						"XTUCFECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "total.xtur_fec_errors"
+									}
+								}
+							]
+						}, 
+						"XTURHECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "total.xtur_fec_errors"
+									}
+								}
+							]
+						}, 
+						"XTUCHECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "total.xtur_fec_errors"
+									}
+								}
+							]
+						}, 
+						"XTURCRCErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "total.xtur_fec_errors"
+									}
+								}
+							]
+						}, 
+						"XTUCCRCErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "total.xtur_fec_errors"
+									}
+								}
+							]
+						}
+					}, 
+					"Device.DSL.Channel.{i}.Stats.Showtime.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"XTURFECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "showtime.xtur_fec_errors"
+									}
+								}
+							]
+						}, 
+						"XTUCFECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "showtime.xtuc_fec_errors"
+									}
+								}
+							]
+						}, 
+						"XTURHECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "showtime.xtur_hec_errors"
+									}
+								}
+							]
+						}, 
+						"XTUCHECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "showtime.xtuc_hec_errors"
+									}
+								}
+							]
+						}, 
+						"XTURCRCErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "showtime.xtur_crc_errors"
+									}
+								}
+							]
+						}, 
+						"XTUCCRCErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "showtime.xtuc_crc_errors"
+									}
+								}
+							]
+						}
+					}, 
+					"Device.DSL.Channel.{i}.Stats.LastShowtime.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"XTURFECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "lastshowtime.xtur_fec_errors"
+									}
+								}
+							]
+						}, 
+						"XTUCFECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "lastshowtime.xtuc_fec_errors"
+									}
+								}
+							]
+						}, 
+						"XTURHECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "lastshowtime.xtur_hec_errors"
+									}
+								}
+							]
+						}, 
+						"XTUCHECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "lastshowtime.xtuc_hec_errors"
+									}
+								}
+							]
+						}, 
+						"XTURCRCErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "lastshowtime.xtur_crc_errors"
+									}
+								}
+							]
+						}, 
+						"XTUCCRCErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "lastshowtime.xtuc_crc_errors"
+									}
+								}
+							]
+						}
+					}, 
+					"Device.DSL.Channel.{i}.Stats.CurrentDay.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"XTURFECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "currentday.xtur_fec_errors"
+									}
+								}
+							]
+						}, 
+						"XTUCFECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "currentday.xtuc_fec_errors"
+									}
+								}
+							]
+						}, 
+						"XTURHECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "currentday.xtur_hec_errors"
+									}
+								}
+							]
+						}, 
+						"XTUCHECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "currentday.xtuc_hec_errors"
+									}
+								}
+							]
+						}, 
+						"XTURCRCErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "currentday.xtur_crc_errors"
+									}
+								}
+							]
+						}, 
+						"XTUCCRCErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "currentday.xtuc_crc_errors"
+									}
+								}
+							]
+						}
+					}, 
+					"Device.DSL.Channel.{i}.Stats.QuarterHour.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"XTURFECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "quarterhour.xtur_fec_errors"
+									}
+								}
+							]
+						}, 
+						"XTUCFECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "quarterhour.xtuc_fec_errors"
+									}
+								}
+							]
+						}, 
+						"XTURHECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "quarterhour.xtur_hec_errors"
+									}
+								}
+							]
+						}, 
+						"XTUCHECErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "quarterhour.xtuc_hec_errors"
+									}
+								}
+							]
+						}, 
+						"XTURCRCErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "quarterhour.xtur_crc_errors"
+									}
+								}
+							]
+						}, 
+						"XTUCCRCErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "dsl.channel.0", 
+										"method": "stats", 
+										"args": {}, 
+										"key": "quarterhour.xtuc_crc_errors"
+									}
+								}
+							]
+						}
+					}
+				}
+			}, 
+			"Device.DSL.BondingGroup.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"GroupStatus": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"NoPeer", 
+						"PeerPowerLoss", 
+						"PeerBondSchemeMismatch", 
+						"LowRate"
+					]
+				}, 
+				"GroupID": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"BondSchemesSupported": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"ATM", 
+						"Ethernet", 
+						"TDIM"
+					]
+				}, 
+				"BondScheme": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"GroupCapacity": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1", 
+						"max": "32"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"RunningTime": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"TargetUpRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "bits per second", 
+					"read": true, 
+					"write": false
+				}, 
+				"TargetDownRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "bits per second", 
+					"read": true, 
+					"write": false
+				}, 
+				"ThreshLowUpRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "bits per second", 
+					"read": true, 
+					"write": false
+				}, 
+				"ThreshLowDownRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "bits per second", 
+					"read": true, 
+					"write": false
+				}, 
+				"UpstreamDifferentialDelayTolerance": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "milliseconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"DownstreamDifferentialDelayTolerance": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "milliseconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"BondedChannelNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1", 
+						"max": "32"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.DSL.BondingGroup.{i}.BondedChannel.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Channel": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.DSL.BondingGroup.{i}.BondedChannel.{i}.Ethernet.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"Device.DSL.BondingGroup.{i}.BondedChannel.{i}.Ethernet.Stats.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": false, 
+							"UnderflowErrorsSent": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"CRCErrorsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"AlignmentErrorsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"ShortPacketsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"LongPacketsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"OverflowErrorsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PauseFramesReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"FramesDropped": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}
+					}
+				}, 
+				"Device.DSL.BondingGroup.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TotalStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"CurrentDayStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"QuarterHourStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.DSL.BondingGroup.{i}.Stats.Total.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"FailureReasons": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"LowRate", 
+								"ExcessiveDelay", 
+								"InsufficientBuffers", 
+								"Other"
+							]
+						}, 
+						"UpstreamRate": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bits per second", 
+							"read": true, 
+							"write": false
+						}, 
+						"DownstreamRate": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bits per second", 
+							"read": true, 
+							"write": false
+						}, 
+						"UpstreamPacketLoss": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"DownstreamPacketLoss": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"UpstreamDifferentialDelay": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "milliseconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"DownstreamDifferentialDelay": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "milliseconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"FailureCount": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ErroredSeconds": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "seconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"SeverelyErroredSeconds": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "seconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"UnavailableSeconds": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "seconds", 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.DSL.BondingGroup.{i}.Stats.CurrentDay.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"FailureReasons": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"LowRate", 
+								"ExcessiveDelay", 
+								"InsufficientBuffers", 
+								"Other"
+							]
+						}, 
+						"UpstreamRate": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bits per second", 
+							"read": true, 
+							"write": false
+						}, 
+						"DownstreamRate": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bits per second", 
+							"read": true, 
+							"write": false
+						}, 
+						"UpstreamPacketLoss": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"DownstreamPacketLoss": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"UpstreamDifferentialDelay": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "milliseconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"DownstreamDifferentialDelay": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "milliseconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"FailureCount": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ErroredSeconds": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "seconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"SeverelyErroredSeconds": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "seconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"UnavailableSeconds": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "seconds", 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.DSL.BondingGroup.{i}.Stats.QuarterHour.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"FailureReasons": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"LowRate", 
+								"ExcessiveDelay", 
+								"InsufficientBuffers", 
+								"Other"
+							]
+						}, 
+						"UpstreamRate": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bits per second", 
+							"read": true, 
+							"write": false
+						}, 
+						"DownstreamRate": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bits per second", 
+							"read": true, 
+							"write": false
+						}, 
+						"UpstreamPacketLoss": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"DownstreamPacketLoss": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"UpstreamDifferentialDelay": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "milliseconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"DownstreamDifferentialDelay": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "milliseconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"FailureCount": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ErroredSeconds": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "seconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"SeverelyErroredSeconds": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "seconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"UnavailableSeconds": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "seconds", 
+							"read": true, 
+							"write": false
+						}
+					}
+				}, 
+				"Device.DSL.BondingGroup.{i}.Ethernet.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Device.DSL.BondingGroup.{i}.Ethernet.Stats.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"PAFErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PAFSmallFragments": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PAFLargeFragments": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PAFBadFragments": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PAFLostFragments": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PAFLateFragments": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PAFLostStarts": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PAFLostEnds": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PAFOverflows": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PauseFramesSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"CRCErrorsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"AlignmentErrorsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ShortPacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LongPacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"OverflowErrorsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"FramesDropped": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}
+			}, 
+			"Device.DSL.Diagnostics.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Device.DSL.Diagnostics.ADSLLineTest.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DiagnosticsState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ACTPSDds": {
+						"type": "int", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ACTPSDus": {
+						"type": "int", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ACTATPds": {
+						"type": "int", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ACTATPus": {
+						"type": "int", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLINSCds": {
+						"type": "int", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLINSCus": {
+						"type": "int", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLINGds": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLINGus": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLOGGds": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLOGGus": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLOGpsds": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLOGpsus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLOGMTds": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLOGMTus": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LATNpbds": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LATNpbus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SATNds": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SATNus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLINpsds": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HLINpsus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"QLNGds": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"QLNGus": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"QLNpsds": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"QLNpsus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"QLNMTds": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"QLNMTus": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRGds": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRGus": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRpsds": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRpsus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRMTds": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRMTus": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BITSpsds": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BITSpsus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.FAST.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"LineNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.FAST.Line.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Upstream": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"FirmwareVersion": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LinkStatus": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Initializing", 
+						"EstablishingLink", 
+						"NoSignal", 
+						"Disabled", 
+						"Error"
+					]
+				}, 
+				"AllowedProfiles": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"106a", 
+						"212a"
+					]
+				}, 
+				"CurrentProfile": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PowerManagementState": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"L0", 
+						"L2.1", 
+						"L2.2", 
+						"L3"
+					]
+				}, 
+				"SuccessFailureCause": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "5"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"UPBOKLER": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "1280"
+					}, 
+					"unit": "0.1 dB", 
+					"read": true, 
+					"write": false
+				}, 
+				"LastTransmittedDownstreamSignal": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "21"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"LastTransmittedUpstreamSignal": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "21"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"UPBOKLE": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "1280"
+					}, 
+					"unit": "0.1dB", 
+					"read": true, 
+					"write": false
+				}, 
+				"LineNumber": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"UpstreamMaxBitRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Kbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"DownstreamMaxBitRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Kbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"UpstreamNoiseMargin": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1dB", 
+					"read": true, 
+					"write": false
+				}, 
+				"DownstreamNoiseMargin": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1dB", 
+					"read": true, 
+					"write": false
+				}, 
+				"UpstreamAttenuation": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1dB", 
+					"read": true, 
+					"write": false
+				}, 
+				"DownstreamAttenuation": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1dB", 
+					"read": true, 
+					"write": false
+				}, 
+				"UpstreamPower": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1dBmV", 
+					"read": true, 
+					"write": false
+				}, 
+				"DownstreamPower": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1dBmV", 
+					"read": true, 
+					"write": false
+				}, 
+				"SNRMRMCds": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1dB", 
+					"read": true, 
+					"write": false
+				}, 
+				"SNRMRMCus": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1dB", 
+					"read": true, 
+					"write": false
+				}, 
+				"BITSRMCpsds": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"BITSRMCpsus": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"FEXTCANCELds": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"FEXTCANCELus": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ETRds": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Kbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"ETRus": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Kbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"ATTETRds": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Kbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"ATTETRus": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Kbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"MINEFTR": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Kbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.FAST.Line.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TotalStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"ShowtimeStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"LastShowtimeStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"CurrentDayStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"QuarterHourStart": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.FAST.Line.{i}.Stats.Total.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"ErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SeverelyErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LOSS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LORS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"UAS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RTXUC": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RTXTX": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessBSW": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessSRA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessFRA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessRPA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessTIGA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.FAST.Line.{i}.Stats.Showtime.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"ErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SeverelyErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LOSS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LORS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"UAS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RTXUC": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RTXTX": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessBSW": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessSRA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessFRA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessRPA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessTIGA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.FAST.Line.{i}.Stats.LastShowtime.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"ErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SeverelyErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LOSS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LORS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"UAS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RTXUC": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RTXTX": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessBSW": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessSRA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessFRA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessRPA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessTIGA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.FAST.Line.{i}.Stats.CurrentDay.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"ErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SeverelyErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LOSS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LORS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"UAS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RTXUC": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RTXTX": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessBSW": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessSRA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessFRA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessRPA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessTIGA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.FAST.Line.{i}.Stats.QuarterHour.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"ErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SeverelyErroredSecs": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LOSS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LORS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"UAS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RTXUC": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RTXTX": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessBSW": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessSRA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessFRA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessRPA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SuccessTIGA": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}, 
+				"Device.FAST.Line.{i}.TestParams.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"SNRGds": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRGus": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRpsds": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRpsus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRMTds": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRMTus": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ACTINP": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"NFEC": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"RFEC": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UpstreamCurrRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "Kbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"DownstreamCurrRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "Kbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"ACTINPREIN": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.Optical.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"InterfaceNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.Optical.Interface.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Upstream": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"OpticalSignalLevel": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-65536", 
+						"max": "65534"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerOpticalThreshold": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-127000", 
+						"max": "0"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"UpperOpticalThreshold": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-127000", 
+						"max": "0"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"TransmitOpticalLevel": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-127000", 
+						"max": "0"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerTransmitPowerThreshold": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-63500", 
+						"max": "63500"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"UpperTransmitPowerThreshold": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-63500", 
+						"max": "63500"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.Optical.Interface.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.Cellular.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"RoamingEnabled": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"RoamingStatus": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"Home", 
+					"Roaming"
+				]
+			}, 
+			"InterfaceNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"AccessPointNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.Cellular.Interface.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Upstream": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IMEI": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SupportedAccessTechnologies": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"GPRS", 
+						"EDGE", 
+						"UMTS", 
+						"UMTSHSPA", 
+						"CDMA2000OneX", 
+						"CDMA2000HRPD", 
+						"LTE"
+					]
+				}, 
+				"PreferredAccessTechnology": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"CurrentAccessTechnology": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AvailableNetworks": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NetworkRequested": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"NetworkInUse": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"RSSI": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "dBm", 
+					"read": true, 
+					"write": false
+				}, 
+				"UpstreamMaxBitRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Kbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"DownstreamMaxBitRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Kbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.Cellular.Interface.{i}.USIM.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"None", 
+							"Available", 
+							"Valid", 
+							"Blocked", 
+							"Error"
+						]
+					}, 
+					"IMSI": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ICCID": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MSISDN": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PINCheck": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"OnNetworkAccess", 
+							"Reboot", 
+							"Off"
+						]
+					}, 
+					"PIN": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.Cellular.Interface.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.Cellular.AccessPoint.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"APN": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Username": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Password": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Proxy": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ProxyPort": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}
+		}, 
+		"Device.ATM.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"LinkNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.ATM.Link.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "dsl", 
+						"section": {
+							"type": "atm-device"
+						}, 
+						"dmmapfile": "dmmap_dsl"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "dsl", 
+								"section": {
+									"type": "atm-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "name"
+								}
+							}
+						}
+					]
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"LinkType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"EoA", 
+						"IPoA", 
+						"PPPoA", 
+						"CIP", 
+						"Unconfigured"
+					], 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "dsl", 
+								"section": {
+									"type": "atm-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "link_type"
+								}
+							}
+						}
+					]
+				}, 
+				"AutoConfig": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DestinationAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "dsl", 
+								"section": {
+									"type": "atm-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "vpi"
+								}
+							}
+						}
+					]
+				}, 
+				"Encapsulation": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"LLC", 
+						"VCMUX"
+					], 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "dsl", 
+								"section": {
+									"type": "atm-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "encapsulation"
+								}
+							}
+						}
+					]
+				}, 
+				"FCSPreserved": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"VCSearchList": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AAL": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"AAL1", 
+						"AAL2", 
+						"AAL3", 
+						"AAL4", 
+						"AAL5"
+					]
+				}, 
+				"Device.ATM.Link.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_bytes"
+								}
+							}
+						]
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_bytes"
+								}
+							}
+						]
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_packets"
+								}
+							}
+						]
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_packets"
+								}
+							}
+						]
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TransmittedBlocks": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ReceivedBlocks": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"CRCErrors": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HECErrors": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.ATM.Link.{i}.QoS.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"QoSClass": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"UBR", 
+							"CBR", 
+							"GFR", 
+							"VBR-nrt", 
+							"VBR-rt", 
+							"UBR+", 
+							"ABR"
+						]
+					}, 
+					"PeakCellRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "cells per second", 
+						"read": true, 
+						"write": true
+					}, 
+					"MaximumBurstSize": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "cells", 
+						"read": true, 
+						"write": true
+					}, 
+					"SustainableCellRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "cells per second", 
+						"read": true, 
+						"write": true
+					}
+				}
+			}, 
+			"Device.ATM.Diagnostics.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Device.ATM.Diagnostics.F5Loopback.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DiagnosticsState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"NumberOfRepetitions": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Timeout": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"SuccessCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"FailureCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"AverageResponseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"MinimumResponseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"MaximumResponseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.PTM.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"LinkNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.PTM.Link.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "dsl", 
+						"section": {
+							"type": "ptm-device"
+						}, 
+						"dmmapfile": "dmmap_dsl"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "dsl", 
+								"section": {
+									"type": "ptm-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "name"
+								}
+							}
+						}
+					]
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"MACAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.PTM.Link.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_bytes"
+								}
+							}
+						]
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_bytes"
+								}
+							}
+						]
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_packets"
+								}
+							}
+						]
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_packets"
+								}
+							}
+						]
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.Ethernet.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"InterfaceNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "ports", 
+							"section": {
+								"type": "ethport"
+							}
+						}
+					}
+				]
+			}, 
+			"LinkNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"VLANTerminationNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "network", 
+							"section": {
+								"type": "device"
+							}
+						}
+					}
+				]
+			}, 
+			"RMONStatsNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"LAGNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.Ethernet.Interface.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "ports", 
+						"section": {
+							"type": "ethport"
+						}, 
+						"dmmapfile": "dmmap_ports"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.device", 
+								"method": "status", 
+								"args": {
+									"name": "@Name"
+								}, 
+								"key": "carrier"
+							}
+						}
+					]
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.device", 
+								"method": "status", 
+								"args": {
+									"name": "@Name"
+								}, 
+								"key": "carrier"
+							}
+						}
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "ports", 
+								"section": {
+									"type": "ethport", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "name"
+								}
+							}
+						}
+					]
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.interface", 
+								"method": "status", 
+								"args": {
+									"interface": "@Name"
+								}, 
+								"key": "uptime"
+							}
+						}
+					]
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Upstream": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MACAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.device", 
+								"method": "status", 
+								"args": {
+									"name": "@Name"
+								}, 
+								"key": "macaddr"
+							}
+						}
+					]
+				}, 
+				"MaxBitRate": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "ports", 
+								"section": {
+									"type": "ethport", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "speed"
+								}
+							}
+						}
+					]
+				}, 
+				"CurrentBitRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.device", 
+								"method": "status", 
+								"args": {
+									"name": "@Name"
+								}, 
+								"key": "speed"
+							}
+						}
+					]
+				}, 
+				"DuplexMode": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Half", 
+						"Full", 
+						"Auto"
+					], 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "ports", 
+								"section": {
+									"type": "status"
+								}
+							}
+						}
+					]
+				}, 
+				"EEECapability": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"EEEEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Device.Ethernet.Interface.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_bytes"
+								}
+							}
+						]
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_bytes"
+								}
+							}
+						]
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_packets"
+								}
+							}
+						]
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_packets"
+								}
+							}
+						]
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_errors"
+								}
+							}
+						]
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_errors"
+								}
+							}
+						]
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_dropped"
+								}
+							}
+						]
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_dropped"
+								}
+							}
+						]
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_over_errors"
+								}
+							}
+						]
+					}
+				}
+			}, 
+			"Device.Ethernet.Link.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"MACAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PriorityTagging": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Device.Ethernet.Link.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.Ethernet.VLANTermination.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "network", 
+						"section": {
+							"type": "device"
+						}, 
+						"dmmapfile": "dmmap_network"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.interface", 
+								"method": "status", 
+								"args": {
+									"interface": "@Name"
+								}, 
+								"key": "uptime"
+							}
+						}
+					]
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"VLANID": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1", 
+						"max": "4094"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"TPID": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "type"
+								}
+							}
+						}
+					]
+				}, 
+				"Device.Ethernet.VLANTermination.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_bytes"
+								}
+							}
+						]
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_bytes"
+								}
+							}
+						]
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_packets"
+								}
+							}
+						]
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_packets"
+								}
+							}
+						]
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_errors"
+								}
+							}
+						]
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_errors"
+								}
+							}
+						]
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_dropped"
+								}
+							}
+						]
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_dropped"
+								}
+							}
+						]
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_over_errors"
+								}
+							}
+						]
+					}
+				}
+			}, 
+			"Device.Ethernet.RMONStats.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"VLANID": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "4094"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Queue": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AllQueues": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DropEvents": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Bytes": {
+					"type": "unsignedLong", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "bytes", 
+					"read": true, 
+					"write": false
+				}, 
+				"Packets": {
+					"type": "unsignedLong", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"BroadcastPackets": {
+					"type": "unsignedLong", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"MulticastPackets": {
+					"type": "unsignedLong", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"CRCErroredPackets": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"UndersizePackets": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"OversizePackets": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"Packets64Bytes": {
+					"type": "unsignedLong", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"Packets65to127Bytes": {
+					"type": "unsignedLong", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"Packets128to255Bytes": {
+					"type": "unsignedLong", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"Packets256to511Bytes": {
+					"type": "unsignedLong", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"Packets512to1023Bytes": {
+					"type": "unsignedLong", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"Packets1024to1518Bytes": {
+					"type": "unsignedLong", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.Ethernet.LAG.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"MACAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Device.Ethernet.LAG.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.USB.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"InterfaceNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"PortNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.USB.Interface.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Upstream": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MACAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxBitRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"Port": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.USB.Interface.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.USB.Port.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Standard": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Type": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Host", 
+						"Hub", 
+						"Device"
+					]
+				}, 
+				"Receptacle": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Standard-A", 
+						"Standard-B", 
+						"Powered-B", 
+						"Micro-AB", 
+						"Micro-B"
+					]
+				}, 
+				"Rate": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Low", 
+						"Full", 
+						"High", 
+						"Super"
+					]
+				}, 
+				"Power": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Self", 
+						"Bus", 
+						"Unknown"
+					]
+				}
+			}, 
+			"Device.USB.USBHosts.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"HostNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.USB.USBHosts.Host.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Type": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"OHCI", 
+							"EHCI", 
+							"UHCI", 
+							"xHCI"
+						]
+					}, 
+					"Reset": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"PowerManagementEnable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"USBVersion": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DeviceNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.USB.USBHosts.Host.{i}.Device.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"DeviceNumber": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"USBVersion": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"DeviceClass": {
+							"type": "hexBinary", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"DeviceSubClass": {
+							"type": "hexBinary", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"DeviceVersion": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"DeviceProtocol": {
+							"type": "hexBinary", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ProductID": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"VendorID": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"Manufacturer": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ProductClass": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SerialNumber": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Port": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"USBPort": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Rate": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Low", 
+								"Full", 
+								"High", 
+								"Super"
+							]
+						}, 
+						"Parent": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"MaxChildren": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"IsSuspended": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"IsSelfPowered": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ConfigurationNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"ConfigurationNumber": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"InterfaceNumberOfEntries": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}.Interface.{i}.": {
+								"type": "object", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"access": false, 
+								"array": true, 
+								"InterfaceNumber": {
+									"type": "unsignedInt", 
+									"protocols": [
+										"cwmp", 
+										"usp"
+									], 
+									"range": {
+										"max": "255"
+									}, 
+									"read": true, 
+									"write": false
+								}, 
+								"InterfaceClass": {
+									"type": "hexBinary", 
+									"protocols": [
+										"cwmp", 
+										"usp"
+									], 
+									"read": true, 
+									"write": false
+								}, 
+								"InterfaceSubClass": {
+									"type": "hexBinary", 
+									"protocols": [
+										"cwmp", 
+										"usp"
+									], 
+									"read": true, 
+									"write": false
+								}, 
+								"InterfaceProtocol": {
+									"type": "hexBinary", 
+									"protocols": [
+										"cwmp", 
+										"usp"
+									], 
+									"read": true, 
+									"write": false
+								}
+							}
+						}
+					}
+				}
+			}
+		}, 
+		"Device.HPNA.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"InterfaceNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.HPNA.Interface.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Upstream": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MACAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"FirmwareVersion": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NodeID": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IsMaster": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Synced": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"TotalSyncTime": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxBitRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"NetworkUtilization": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "1000"
+					}, 
+					"unit": "0.1%", 
+					"read": true, 
+					"write": false
+				}, 
+				"PossibleConnectionTypes": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Phone", 
+						"Coax"
+					]
+				}, 
+				"ConnectionType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PossibleSpectralModes": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"A", 
+						"B", 
+						"C", 
+						"D"
+					]
+				}, 
+				"SpectralMode": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"MTU": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "bytes", 
+					"read": true, 
+					"write": true
+				}, 
+				"NoiseMargin": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "0.1dB", 
+					"read": true, 
+					"write": true
+				}, 
+				"DefaultNonLARQPER": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"LARQEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"MinMulticastRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": true
+				}, 
+				"NegMulticastRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"MasterSelectionMode": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Automatic", 
+						"ForceEndpoint", 
+						"ForceMaster"
+					]
+				}, 
+				"AssociatedDeviceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.HPNA.Interface.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.HPNA.Interface.{i}.QoS.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"FlowSpecNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.HPNA.Interface.{i}.QoS.FlowSpec.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": true, 
+						"array": true, 
+						"Enable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Status": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Disabled", 
+								"Enabled", 
+								"Error_Misconfigured", 
+								"Error"
+							]
+						}, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"TrafficClasses": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"FlowType": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true, 
+							"values": [
+								"CBR", 
+								"VBR", 
+								"VBR-NRT", 
+								"BE"
+							]
+						}, 
+						"Priority": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "7"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"Latency": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "999"
+							}, 
+							"unit": "milliseconds", 
+							"read": true, 
+							"write": true
+						}, 
+						"Jitter": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "999"
+							}, 
+							"unit": "milliseconds", 
+							"read": true, 
+							"write": true
+						}, 
+						"PacketSize": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"MinRate": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"AvgRate": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"MaxRate": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"PER": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Timeout": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "milliseconds", 
+							"read": true, 
+							"write": true
+						}
+					}
+				}, 
+				"Device.HPNA.Interface.{i}.AssociatedDevice.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"MACAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"NodeID": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"IsMaster": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Synced": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TotalSyncTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"MaxBitRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "Mbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"PHYDiagnosticsEnable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Active": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.HPNA.Diagnostics.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Device.HPNA.Diagnostics.PHYThroughput.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DiagnosticsState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"NumPacketsInBurst": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"BurstInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"TestPacketPayloadLength": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "1480"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"PayloadEncoding": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"PayloadDataGen": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"PayloadType": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Pattern", 
+							"IncrementByte"
+						]
+					}, 
+					"PriorityLevel": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "7"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"ResultNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.HPNA.Diagnostics.PHYThroughput.Result.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": true, 
+						"SrcMACAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"DestMACAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PHYRate": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "Mbps", 
+							"read": true, 
+							"write": false
+						}, 
+						"BaudRate": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "Kbaud", 
+							"read": true, 
+							"write": false
+						}, 
+						"SNR": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "0.1dB", 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Attenuation": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "0.1dB", 
+							"read": true, 
+							"write": false
+						}
+					}
+				}, 
+				"Device.HPNA.Diagnostics.PerformanceMonitoring.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DiagnosticsState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SampleInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"Device.HPNA.Diagnostics.PerformanceMonitoring.Nodes.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": false, 
+						"CurrentStart": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"CurrentEnd": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"NodeNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.HPNA.Diagnostics.PerformanceMonitoring.Nodes.Node.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp"
+							], 
+							"access": false, 
+							"array": true, 
+							"MACAddress": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"BytesSent": {
+								"type": "unsignedLong", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"BytesReceived": {
+								"type": "unsignedLong", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketsSent": {
+								"type": "unsignedLong", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketsReceived": {
+								"type": "unsignedLong", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"BroadcastPacketsSent": {
+								"type": "unsignedLong", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"BroadcastPacketsReceived": {
+								"type": "unsignedLong", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"MulticastPacketsSent": {
+								"type": "unsignedLong", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"MulticastPacketsReceived": {
+								"type": "unsignedLong", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketsCrcErrored": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketsCrcErroredHost": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketsShortErrored": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketsShortErroredHost": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"RxPacketsDropped": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"TxPacketsDropped": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"ControlRequestLocal": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"ControlReplyLocal": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"ControlRequestRemote": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"ControlReplyRemote": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketsSentWire": {
+								"type": "unsignedLong", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"BroadcastPacketsSentWire": {
+								"type": "unsignedLong", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"MulticastPacketsSentWire": {
+								"type": "unsignedLong", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketsInternalControl": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"BroadcastPacketsInternalControl": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketsReceivedQueued": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketsReceivedForwardUnknown": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"NodeUtilization": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"range": {
+									"min": "0", 
+									"max": "1000"
+								}, 
+								"unit": "0.1%", 
+								"read": true, 
+								"write": false
+							}
+						}
+					}, 
+					"Device.HPNA.Diagnostics.PerformanceMonitoring.Channels.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": false, 
+						"TimeStamp": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ChannelNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.HPNA.Diagnostics.PerformanceMonitoring.Channels.Channel.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp"
+							], 
+							"access": false, 
+							"array": true, 
+							"HostSrcMACAddress": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"HostDestMACAddress": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"HPNASrcMACAddress": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"HPNADestMACAddress": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PHYRate": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"unit": "Mbps", 
+								"read": true, 
+								"write": false
+							}, 
+							"BaudRate": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"unit": "Kbaud", 
+								"read": true, 
+								"write": false
+							}, 
+							"SNR": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"unit": "0.1dB", 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketsSent": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"LARQPacketsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"FlowSpec": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}
+					}
+				}
+			}
+		}, 
+		"Device.MoCA.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"InterfaceNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.MoCA.Interface.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Upstream": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MACAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"FirmwareVersion": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxBitRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxIngressBW": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxEgressBW": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"HighestVersion": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"CurrentVersion": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NetworkCoordinator": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NodeID": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxNodes": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PreferredNC": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"BackupNC": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PrivacyEnabledSetting": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PrivacyEnabled": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"FreqCapabilityMask": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"FreqCurrentMaskSetting": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"FreqCurrentMask": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"CurrentOperFreq": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastOperFreq": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"KeyPassphrase": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TxPowerLimit": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PowerCntlPhyTarget": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"BeaconPowerLimit": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "dB", 
+					"read": true, 
+					"write": true
+				}, 
+				"NetworkTabooMask": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NodeTabooMask": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"TxBcastRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"TxBcastPowerReduction": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "dB", 
+					"read": true, 
+					"write": false
+				}, 
+				"QAM256Capable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PacketAggregationCapability": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "10"
+					}, 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"AssociatedDeviceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.MoCA.Interface.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.MoCA.Interface.{i}.QoS.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"EgressNumFlows": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"IngressNumFlows": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"FlowStatsNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.MoCA.Interface.{i}.QoS.FlowStats.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"FlowID": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketDA": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"MaxRate": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "Kbps", 
+							"read": true, 
+							"write": false
+						}, 
+						"MaxBurstSize": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LeaseTime": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "seconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"LeaseTimeLeft": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "seconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"FlowPackets": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}, 
+				"Device.MoCA.Interface.{i}.AssociatedDevice.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"MACAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"NodeID": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PreferredNC": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"HighestVersion": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PHYTxRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "Mbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"PHYRxRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "Mbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"TxPowerControlReduction": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "dB", 
+						"read": true, 
+						"write": false
+					}, 
+					"RxPowerLevel": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "dBm", 
+						"read": true, 
+						"write": false
+					}, 
+					"TxBcastRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "Mbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"RxBcastPowerLevel": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "dBm", 
+						"read": true, 
+						"write": false
+					}, 
+					"TxPackets": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"RxPackets": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"RxErroredAndMissedPackets": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"QAM256Capable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketAggregationCapability": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "10"
+						}, 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"RxSNR": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "dBm", 
+						"read": true, 
+						"write": false
+					}, 
+					"Active": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.Ghn.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"InterfaceNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.Ghn.Interface.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Upstream": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MACAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"FirmwareVersion": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ConnectionType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Powerline", 
+						"Phone", 
+						"Coax"
+					]
+				}, 
+				"MaxTransmitRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"TargetDomainNames": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DomainName": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DomainNameIdentifier": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DomainId": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DeviceId": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxBitRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"NodeTypeDMCapable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DMRequested": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IsDM": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NodeTypeSCCapable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SCRequested": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IsSC": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"StandardVersions": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxBandPlan": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MediumType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"PowerLineBaseband", 
+						"PhoneLineBaseband", 
+						"CoaxBaseband", 
+						"CoaxRF", 
+						"PlasticOpticalFiber"
+					]
+				}, 
+				"TAIFG": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "1.28 microseconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"NotchedAmateurRadioBands": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PHYThroughputDiagnosticsEnable": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PerformanceMonitoringDiagnosticsEnable": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SMMaskedBandNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NodeTypeDMConfig": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"NodeTypeDMStatus": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NodeTypeSCStatus": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AssociatedDeviceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PSM": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Device.Ghn.Interface.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MgmtBytesSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MgmtBytesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MgmtPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MgmtPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BlocksSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BlocksReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BlocksResent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BlocksErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.Ghn.Interface.{i}.AssociatedDevice.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"MACAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DeviceId": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TxPhyRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "Mbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"RxPhyRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "Mbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"Active": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.Ghn.Interface.{i}.DMInfo.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DomainName": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DomainNameIdentifier": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DomainId": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MACCycleDuration": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "0"
+						}, 
+						"unit": "0.5 msec", 
+						"read": true, 
+						"write": true
+					}, 
+					"SCDeviceId": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SCMACAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ReregistrationTimePeriod": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "5", 
+							"max": "63"
+						}, 
+						"unit": "2 seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"TopologyPeriodicInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "255"
+						}, 
+						"unit": "0.1 sec", 
+						"read": true, 
+						"write": true
+					}, 
+					"MinSupportedBandplan": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"MaxSupportedBandplan": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.Ghn.Interface.{i}.SCInfo.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"ModesSupported": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"NN", 
+							"NMK"
+						]
+					}, 
+					"ModeEnabled": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"MICSize": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"4-byte MIC", 
+							"8-byte MIC", 
+							"16-byte MIC"
+						]
+					}, 
+					"Location": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.Ghn.Interface.{i}.SMMaskedBand.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"BandNumber": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"StartSubCarrier": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"StopSubCarrier": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}
+			}, 
+			"Device.Ghn.Diagnostics.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Device.Ghn.Diagnostics.PHYThroughput.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DiagnosticsState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DiagnoseMACAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"PHYThroughputResultNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.Ghn.Diagnostics.PHYThroughput.Result.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": true, 
+						"DestinationMACAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LinkState": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Direct", 
+								"NonDirect"
+							]
+						}, 
+						"TxPhyRate": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "Mbps", 
+							"read": true, 
+							"write": false
+						}, 
+						"RxPhyRate": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "Mbps", 
+							"read": true, 
+							"write": false
+						}
+					}
+				}, 
+				"Device.Ghn.Diagnostics.PerformanceMonitoring.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DiagnosticsState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DiagnoseMACAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SampleInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"SNRGroupLength": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Device.Ghn.Diagnostics.PerformanceMonitoring.Nodes.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": false, 
+						"CurrentStart": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"CurrentEnd": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"NodeNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.Ghn.Diagnostics.PerformanceMonitoring.Nodes.Node.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp"
+							], 
+							"access": false, 
+							"array": true, 
+							"DestinationMACAddress": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"BytesSent": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"BytesReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketsSent": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"ErrorsSent": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"ErrorsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"UnicastPacketsSent": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"UnicastPacketsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"DiscardPacketsSent": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"DiscardPacketsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"MulticastPacketsSent": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"MulticastPacketsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"BroadcastPacketsSent": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"BroadcastPacketsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"UnknownProtoPacketsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"MgmtBytesSent": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"MgmtBytesReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"MgmtPacketsSent": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"MgmtPacketsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"BlocksSent": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"BlocksReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"BlocksResent": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"BlocksErrorsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}
+					}, 
+					"Device.Ghn.Diagnostics.PerformanceMonitoring.Channels.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": false, 
+						"TimeStamp": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ChannelNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.Ghn.Diagnostics.PerformanceMonitoring.Channels.Channel.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp"
+							], 
+							"access": false, 
+							"array": true, 
+							"DestinationMACAddress": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"SNR": {
+								"type": "string", 
+								"protocols": [
+									"cwmp"
+								], 
+								"unit": "0.1 dB", 
+								"read": true, 
+								"write": false
+							}
+						}
+					}
+				}
+			}
+		}, 
+		"Device.HomePlug.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"InterfaceNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.HomePlug.Interface.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Upstream": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MACAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LogicalNetwork": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Version": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"FirmwareVersion": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ForceCCo": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"NetworkPassword": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"OtherNetworksPresent": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxBitRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"AssociatedDeviceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.HomePlug.Interface.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MPDUTxAck": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MPDUTxCol": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MPDUTxFailed": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MPDURxAck": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MPDURxFailed": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.HomePlug.Interface.{i}.AssociatedDevice.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"MACAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TxPhyRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "Mbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"RxPhyRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "Mbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"SNRPerTone": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "0.1dB", 
+						"read": true, 
+						"write": false
+					}, 
+					"AvgAttenuation": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "0.1dB", 
+						"read": true, 
+						"write": false
+					}, 
+					"EndStationMACs": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Active": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.UPA.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"InterfaceNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.UPA.Interface.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Upstream": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MACAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"FirmwareVersion": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxBitRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"NodeType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"AP", 
+						"EP"
+					]
+				}, 
+				"LogicalNetwork": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"EncryptionMethod": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"None", 
+						"DES", 
+						"3DES", 
+						"AES128", 
+						"AES256"
+					]
+				}, 
+				"EncryptionKey": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PowerBackoffEnabled": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PowerBackoffMechanismActive": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"EstApplicationThroughput": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": false
+				}, 
+				"ActiveNotchEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ActiveNotchNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AssociatedDeviceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"BridgeForNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.UPA.Interface.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.UPA.Interface.{i}.AssociatedDevice.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"MACAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Port": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"LogicalNetwork": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PhyTxThroughput": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "Mbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"PhyRxThroughput": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "Mbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"RealPhyRxThroughput": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "Mbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"EstimatedPLR": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "100"
+						}, 
+						"unit": "percent", 
+						"read": true, 
+						"write": false
+					}, 
+					"MeanEstimatedAtt": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "dB", 
+						"read": true, 
+						"write": false
+					}, 
+					"SmartRouteIntermediatePLCMAC": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DirectRoute": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Active": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.UPA.Interface.{i}.ActiveNotch.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"StartFreq": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "kHz", 
+						"read": true, 
+						"write": true
+					}, 
+					"StopFreq": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "kHz", 
+						"read": true, 
+						"write": true
+					}, 
+					"Depth": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "dB", 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.UPA.Interface.{i}.BridgeFor.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"MACAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Port": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.UPA.Diagnostics.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Device.UPA.Diagnostics.InterfaceMeasurement.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DiagnosticsState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Type": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"SNR", 
+							"CFR"
+						]
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Port": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Measurements": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "0.1dB", 
+						"read": true, 
+						"write": false
+					}, 
+					"RxGain": {
+						"type": "int", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "dB", 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.WiFi.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"RadioNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "wireless", 
+							"section": {
+								"type": "wifi-device"
+							}
+						}
+					}
+				]
+			}, 
+			"SSIDNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "wireless", 
+							"section": {
+								"type": "wifi-iface"
+							}
+						}
+					}
+				]
+			}, 
+			"AccessPointNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "wireless", 
+							"section": {
+								"type": "wifi-iface"
+							}
+						}
+					}
+				]
+			}, 
+			"EndPointNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "wireless", 
+							"section": {
+								"type": "wifi-iface"
+							}
+						}
+					}
+				]
+			}, 
+			"ResetCounter": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Reset": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"Device.WiFi.Radio.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "wireless", 
+						"section": {
+							"type": "wifi-device"
+						}, 
+						"dmmapfile": "dmmap_wireless"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "disabled"
+								}
+							}
+						}
+					]
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					], 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "disabled"
+								}
+							}
+						}
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Upstream": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxBitRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "Mbps", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "router.wireless", 
+								"method": "radios", 
+								"args": {}, 
+								"key": "@Name.rate"
+							}
+						}
+					]
+				}, 
+				"SupportedFrequencyBands": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"2.4GHz", 
+						"5GHz"
+					]
+				}, 
+				"OperatingFrequencyBand": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "router.wireless", 
+								"method": "status", 
+								"args": {
+									"vif": "@Name"
+								}, 
+								"key": "frequency"
+							}
+						}
+					]
+				}, 
+				"SupportedStandards": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"a", 
+						"b", 
+						"g", 
+						"n", 
+						"ac"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "router.wireless", 
+								"method": "radios", 
+								"args": {}, 
+								"key": "hwmodes"
+							}
+						}
+					]
+				}, 
+				"OperatingStandards": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "router.wireless", 
+								"method": "radios", 
+								"args": {}, 
+								"key": "opmode"
+							}
+						}
+					]
+				}, 
+				"PossibleChannels": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "router.wireless", 
+								"method": "radios", 
+								"args": {}, 
+								"key": "@Name.channels"
+							}
+						}
+					]
+				}, 
+				"ChannelsInUse": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "channel"
+								}
+							}
+						}
+					]
+				}, 
+				"Channel": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1", 
+						"max": "255"
+					}, 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "channel"
+								}
+							}
+						}
+					]
+				}, 
+				"AutoChannelSupported": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AutoChannelEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "channel"
+								}
+							}
+						}
+					]
+				}, 
+				"AutoChannelRefreshPeriod": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "scantimer"
+								}
+							}
+						}
+					]
+				}, 
+				"ChannelLastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"ChannelLastSelectionReason": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Manual", 
+						"Auto_Startup", 
+						"Auto_User", 
+						"Auto_Refresh", 
+						"Auto_Dynamic", 
+						"Auto_DFS", 
+						"Unknown"
+					]
+				}, 
+				"MaxSupportedSSIDs": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxSupportedAssociations": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "maxassoc"
+								}
+							}
+						}
+					]
+				}, 
+				"FirmwareVersion": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SupportedOperatingChannelBandwidths": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"20MHz", 
+						"40MHz", 
+						"80MHz", 
+						"160MHz", 
+						"Auto"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "router.wireless", 
+								"method": "radios", 
+								"args": {}, 
+								"key": "@Name.bandwidth"
+							}
+						}
+					]
+				}, 
+				"OperatingChannelBandwidth": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "bandwidth"
+								}
+							}
+						}, 
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "router.wireless", 
+								"method": "status", 
+								"args": {
+									"vif": "@Name"
+								}, 
+								"key": "bandwidth"
+							}
+						}
+					]
+				}, 
+				"CurrentOperatingChannelBandwidth": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"20MHz", 
+						"40MHz", 
+						"80MHz", 
+						"160MHz"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "router.wireless", 
+								"method": "radios", 
+								"args": {}, 
+								"key": "@Name.bandwidth"
+							}
+						}
+					]
+				}, 
+				"ExtensionChannel": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"AboveControlChannel", 
+						"BelowControlChannel", 
+						"Auto"
+					]
+				}, 
+				"GuardInterval": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"400nsec", 
+						"800nsec", 
+						"Auto"
+					]
+				}, 
+				"MCS": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "15"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"TransmitPowerSupported": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "100"
+					}, 
+					"unit": "percentage", 
+					"read": true, 
+					"write": false
+				}, 
+				"TransmitPower": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "100"
+					}, 
+					"unit": "percentage", 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "txpower"
+								}
+							}
+						}
+					]
+				}, 
+				"IEEE80211hSupported": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IEEE80211hEnabled": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "doth"
+								}
+							}
+						}
+					]
+				}, 
+				"RegulatoryDomain": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "country"
+								}
+							}
+						}
+					]
+				}, 
+				"RetryLimit": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "7"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"CCARequest": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"CCAReport": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"RPIHistogramRequest": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"RPIHistogramReport": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"FragmentationThreshold": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "octets", 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "frag"
+								}
+							}
+						}
+					]
+				}, 
+				"RTSThreshold": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "octets", 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "rts"
+								}
+							}
+						}
+					]
+				}, 
+				"LongRetryLimit": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"BeaconPeriod": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "milliseconds", 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "beacon_int"
+								}
+							}
+						}
+					]
+				}, 
+				"DTIMPeriod": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "dtim_period"
+								}
+							}
+						}
+					]
+				}, 
+				"PacketAggregationEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PreambleType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"short", 
+						"long", 
+						"auto"
+					], 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "short_preamble"
+								}
+							}
+						}
+					]
+				}, 
+				"BasicDataTransmitRates": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"OperationalDataTransmitRates": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SupportedDataTransmitRates": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.WiFi.Radio.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_bytes"
+								}
+							}
+						]
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_bytes"
+								}
+							}
+						]
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_packets"
+								}
+							}
+						]
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_packets"
+								}
+							}
+						]
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_errors"
+								}
+							}
+						]
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_errors"
+								}
+							}
+						]
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_dropped"
+								}
+							}
+						]
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_dropped"
+								}
+							}
+						]
+					}, 
+					"PLCPErrorCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"FCSErrorCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"InvalidMACCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsOtherReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Noise": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "dBm", 
+						"read": true, 
+						"write": false
+					}, 
+					"TotalChannelChangeCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ManualChannelChangeCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"AutoStartupChannelChangeCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"AutoUserChannelChangeCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"AutoRefreshChannelChangeCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"AutoDynamicChannelChangeCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"AutoDFSChannelChangeCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.WiFi.NeighboringWiFiDiagnostic.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp"
+				], 
+				"access": false, 
+				"array": false, 
+				"DiagnosticsState": {
+					"type": "string", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ResultNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.WiFi.NeighboringWiFiDiagnostic.Result.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": true, 
+					"Radio": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SSID": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BSSID": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Mode": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"AdHoc", 
+							"Infrastructure"
+						]
+					}, 
+					"Channel": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "255"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"SignalStrength": {
+						"type": "int", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "-200", 
+							"max": "0"
+						}, 
+						"unit": "dBm", 
+						"read": true, 
+						"write": false
+					}, 
+					"SecurityModeEnabled": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"None", 
+							"WEP", 
+							"WPA", 
+							"WPA2", 
+							"WPA-WPA2", 
+							"WPA-Enterprise", 
+							"WPA2-Enterprise", 
+							"WPA-WPA2-Enterprise"
+						]
+					}, 
+					"EncryptionMode": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"TKIP", 
+							"AES"
+						]
+					}, 
+					"OperatingFrequencyBand": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"2.4GHz", 
+							"5GHz"
+						]
+					}, 
+					"SupportedStandards": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"a", 
+							"b", 
+							"g", 
+							"n", 
+							"ac"
+						]
+					}, 
+					"OperatingStandards": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"OperatingChannelBandwidth": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"20MHz", 
+							"40MHz", 
+							"80MHz", 
+							"160MHz", 
+							"Auto"
+						]
+					}, 
+					"BeaconPeriod": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "ms", 
+						"read": true, 
+						"write": false
+					}, 
+					"Noise": {
+						"type": "int", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "-200", 
+							"max": "0"
+						}, 
+						"unit": "dBm", 
+						"read": true, 
+						"write": false
+					}, 
+					"BasicDataTransferRates": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SupportedDataTransferRates": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DTIMPeriod": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "ms", 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.WiFi.SSID.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "wireless", 
+						"section": {
+							"type": "wifi-iface"
+						}, 
+						"dmmapfile": "dmmap_wireless"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-iface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "disabled"
+								}
+							}
+						}
+					]
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					], 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-iface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "disabled"
+								}
+							}
+						}
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"BSSID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "router.wireless", 
+								"method": "status", 
+								"args": {
+									"vif": "@Name"
+								}, 
+								"key": "bssid"
+							}
+						}
+					]
+				}, 
+				"MACAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "router.device", 
+								"method": "status", 
+								"args": {
+									"name": "@Name"
+								}, 
+								"key": "macaddr"
+							}
+						}
+					]
+				}, 
+				"SSID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-iface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "ssid"
+								}
+							}
+						}
+					]
+				}, 
+				"Upstream": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.WiFi.SSID.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_bytes"
+								}
+							}
+						]
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_bytes"
+								}
+							}
+						]
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_packets"
+								}
+							}
+						]
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_packets"
+								}
+							}
+						]
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_errors"
+								}
+							}
+						]
+					}, 
+					"RetransCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"FailedRetransCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"RetryCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MultipleRetryCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ACKFailureCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"AggregatedPacketCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_errors"
+								}
+							}
+						]
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_dropped"
+								}
+							}
+						]
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_dropped"
+								}
+							}
+						]
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.WiFi.AccessPoint.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "wireless", 
+						"section": {
+							"type": "wifi-iface"
+						}, 
+						"dmmapfile": "dmmap_wireless"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SSIDReference": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SSIDAdvertisementEnabled": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"RetryLimit": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "7"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"WMMCapability": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"UAPSDCapability": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"WMMEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-device", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "wmm"
+								}
+							}
+						}
+					]
+				}, 
+				"UAPSDEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-iface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "wmm_apsd"
+								}
+							}
+						}
+					]
+				}, 
+				"AssociatedDeviceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxAssociatedDevices": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-iface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "maxassoc"
+								}
+							}
+						}
+					]
+				}, 
+				"IsolationEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-iface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "isolate"
+								}
+							}
+						}
+					]
+				}, 
+				"MACAddressControlEnabled": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-iface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "macfilter"
+								}
+							}
+						}
+					]
+				}, 
+				"AllowedMACAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"MaxAllowedAssociations": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-iface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "maxassoc"
+								}
+							}
+						}
+					]
+				}, 
+				"Device.WiFi.AccessPoint.{i}.Security.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"ModesSupported": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"None", 
+							"WEP-64", 
+							"WEP-128", 
+							"WPA-Personal", 
+							"WPA2-Personal", 
+							"WPA-WPA2-Personal", 
+							"WPA-Enterprise", 
+							"WPA2-Enterprise", 
+							"WPA-WPA2-Enterprise"
+						]
+					}, 
+					"ModeEnabled": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"WEPKey": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"PreSharedKey": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"KeyPassphrase": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"RekeyingInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "wireless", 
+									"section": {
+										"type": "wifi-iface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "gtk_rekey"
+									}
+								}
+							}
+						]
+					}, 
+					"RadiusServerIPAddr": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "wireless", 
+									"section": {
+										"type": "wifi-iface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "radius_server"
+									}
+								}
+							}
+						]
+					}, 
+					"SecondaryRadiusServerIPAddr ": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"RadiusServerPort": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "wireless", 
+									"section": {
+										"type": "wifi-iface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "radius_port"
+									}
+								}
+							}
+						]
+					}, 
+					"SecondaryRadiusServerPort": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"RadiusSecret": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SecondaryRadiusSecret": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"MFPConfig": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Disabled", 
+							"Optional", 
+							"Required"
+						], 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "wireless", 
+									"section": {
+										"type": "wifi-iface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "ieee80211w"
+									}
+								}
+							}
+						]
+					}, 
+					"Reset": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.WiFi.AccessPoint.{i}.WPS.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "wireless", 
+									"section": {
+										"type": "wifi-iface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "wps"
+									}
+								}
+							}
+						]
+					}, 
+					"ConfigMethodsSupported": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"USBFlashDrive", 
+							"Ethernet", 
+							"Label", 
+							"Display", 
+							"ExternalNFCToken", 
+							"IntegratedNFCToken", 
+							"NFCInterface", 
+							"PushButton", 
+							"PIN", 
+							"PhysicalPushButton", 
+							"PhysicalDisplay", 
+							"VirtualPushButton", 
+							"VirtualDisplay"
+						]
+					}, 
+					"ConfigMethodsEnabled": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Error", 
+							"Unconfigured", 
+							"Configured", 
+							"SetupLocked"
+						], 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "wireless", 
+									"section": {
+										"type": "wifi-iface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "wps"
+									}
+								}
+							}
+						]
+					}, 
+					"Version": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PIN": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "wireless", 
+									"section": {
+										"type": "wifi-iface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "wps_pin"
+									}
+								}
+							}
+						]
+					}
+				}, 
+				"Device.WiFi.AccessPoint.{i}.AssociatedDevice.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"MACAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"OperatingStandard": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"a", 
+							"b", 
+							"g", 
+							"n", 
+							"ac"
+						]
+					}, 
+					"AuthenticationState": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LastDataDownlinkRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1000"
+						}, 
+						"unit": "kbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"LastDataUplinkRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1000"
+						}, 
+						"unit": "kbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"AssociationTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SignalStrength": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-200", 
+							"max": "0"
+						}, 
+						"unit": "dBm", 
+						"read": true, 
+						"write": false
+					}, 
+					"Noise": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-200", 
+							"max": "0"
+						}, 
+						"unit": "dBm", 
+						"read": true, 
+						"write": false
+					}, 
+					"Retransmissions": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "100"
+						}, 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"Active": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.WiFi.AccessPoint.{i}.AssociatedDevice.{i}.Stats.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"BytesSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"BytesReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ErrorsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RetransCount": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"FailedRetransCount": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RetryCount": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"MultipleRetryCount": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}, 
+				"Device.WiFi.AccessPoint.{i}.AC.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"AccessCategory": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"BE", 
+							"BK", 
+							"VI", 
+							"VO"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"AIFSN": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "2", 
+							"max": "15"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"ECWMin": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "15"
+						}, 
+						"unit": "microseconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"ECWMax": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "15"
+						}, 
+						"unit": "microseconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"TxOpMax": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "255"
+						}, 
+						"unit": "32 microseconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"AckPolicy": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"OutQLenHistogramIntervals": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"OutQLenHistogramSampleInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"Device.WiFi.AccessPoint.{i}.AC.{i}.Stats.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"BytesSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"BytesReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"ErrorsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"ErrorsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"DiscardPacketsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"DiscardPacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"RetransCount": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"OutQLenHistogram": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}, 
+				"Device.WiFi.AccessPoint.{i}.Accounting.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ServerIPAddr": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "wireless", 
+									"section": {
+										"type": "wifi-iface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "acct_server"
+									}
+								}
+							}
+						]
+					}, 
+					"SecondaryServerIPAddr": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ServerPort": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "wireless", 
+									"section": {
+										"type": "wifi-iface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "acct_port"
+									}
+								}
+							}
+						]
+					}, 
+					"SecondaryServerPort": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Secret": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "wireless", 
+									"section": {
+										"type": "wifi-iface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "acct_secret"
+									}
+								}
+							}
+						]
+					}, 
+					"SecondarySecret": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"InterimInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "0"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}
+				}
+			}, 
+			"Device.WiFi.EndPoint.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "wireless", 
+						"section": {
+							"type": "wifi-iface"
+						}, 
+						"dmmapfile": "dmmap_wireless"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-iface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "disabled"
+								}
+							}
+						}
+					]
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					], 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "wireless", 
+								"section": {
+									"type": "wifi-iface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "disabled"
+								}
+							}
+						}
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ProfileReference": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SSIDReference": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ProfileNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.WiFi.EndPoint.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"LastDataDownlinkRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1000", 
+							"max": "600000"
+						}, 
+						"unit": "kbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"LastDataUplinkRate": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1000", 
+							"max": "600000"
+						}, 
+						"unit": "kbps", 
+						"read": true, 
+						"write": false
+					}, 
+					"SignalStrength": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-200", 
+							"max": "0"
+						}, 
+						"unit": "dBm", 
+						"read": true, 
+						"write": false
+					}, 
+					"Retransmissions": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "100"
+						}, 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.WiFi.EndPoint.{i}.Security.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"ModesSupported": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"None", 
+							"WEP-64", 
+							"WEP-128", 
+							"WPA-Personal", 
+							"WPA2-Personal", 
+							"WPA-WPA2-Personal", 
+							"WPA-Enterprise", 
+							"WPA2-Enterprise", 
+							"WPA-WPA2-Enterprise"
+						]
+					}
+				}, 
+				"Device.WiFi.EndPoint.{i}.Profile.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Active", 
+							"Available", 
+							"Error", 
+							"Disabled"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SSID": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "wireless", 
+									"section": {
+										"type": "wifi-iface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "ssid"
+									}
+								}
+							}
+						]
+					}, 
+					"Location": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Priority": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "255"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Device.WiFi.EndPoint.{i}.Profile.{i}.Security.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"ModeEnabled": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"WEPKey": {
+							"type": "hexBinary", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"PreSharedKey": {
+							"type": "hexBinary", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"KeyPassphrase": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"MFPConfig": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true, 
+							"values": [
+								"Disabled", 
+								"Optional", 
+								"Required"
+							], 
+							"mapping": [
+								{
+									"type": "uci", 
+									"uci": {
+										"file": "wireless", 
+										"section": {
+											"type": "wifi-iface", 
+											"index": "@i-1"
+										}, 
+										"option": {
+											"name": "ieee80211w"
+										}
+									}
+								}
+							]
+						}
+					}
+				}, 
+				"Device.WiFi.EndPoint.{i}.WPS.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "wireless", 
+									"section": {
+										"type": "wifi-iface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "wps"
+									}
+								}
+							}
+						]
+					}, 
+					"ConfigMethodsSupported": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"USBFlashDrive", 
+							"Ethernet", 
+							"Label", 
+							"Display", 
+							"ExternalNFCToken", 
+							"IntegratedNFCToken", 
+							"NFCInterface", 
+							"PushButton", 
+							"PIN", 
+							"PhysicalPushButton", 
+							"PhysicalDisplay", 
+							"VirtualPushButton", 
+							"VirtualDisplay"
+						]
+					}, 
+					"ConfigMethodsEnabled": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Error", 
+							"Unconfigured", 
+							"Configured"
+						], 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "wireless", 
+									"section": {
+										"type": "wifi-iface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "wps"
+									}
+								}
+							}
+						]
+					}, 
+					"Version": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PIN": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "4", 
+							"max": "4"
+						}, 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "wireless", 
+									"section": {
+										"type": "wifi-iface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "wps_pin"
+									}
+								}
+							}
+						]
+					}
+				}, 
+				"Device.WiFi.EndPoint.{i}.AC.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"AccessCategory": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"BE", 
+							"BK", 
+							"VI", 
+							"VO"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"AIFSN": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "2", 
+							"max": "15"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"ECWMin": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "15"
+						}, 
+						"unit": "microseconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"ECWMax": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "15"
+						}, 
+						"unit": "microseconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"TxOpMax": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "255"
+						}, 
+						"unit": "32 microseconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"AckPolicy": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"OutQLenHistogramIntervals": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"OutQLenHistogramSampleInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"Device.WiFi.EndPoint.{i}.AC.{i}.Stats.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"BytesSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"BytesReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"ErrorsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"ErrorsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"DiscardPacketsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"DiscardPacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"RetransCount": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"OutQLenHistogram": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}
+			}
+		}, 
+		"Device.ZigBee.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"InterfaceNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ZDONumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.ZigBee.Interface.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IEEEAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NetworkAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ZDOReference": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AssociatedDeviceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.ZigBee.Interface.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "ZigBee packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "ZigBee packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "ZigBee packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "ZigBee packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "ZigBee packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "ZigBee packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "ZigBee packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "ZigBee packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "ZigBee packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "ZigBee packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "ZigBee packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "ZigBee packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "ZigBee packets", 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.ZigBee.Interface.{i}.AssociatedDevice.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"IEEEAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"NetworkAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Active": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ZDOReference": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.ZigBee.ZDO.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IEEEAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NetworkAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"BindingTableNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"GroupNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ApplicationEndpointNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.ZigBee.ZDO.{i}.NodeDescriptor.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"LogicalType": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"ZC", 
+							"ZR", 
+							"ZED"
+						]
+					}, 
+					"ComplexDescriptorSupported": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UserDescriptorSupported": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"FrequencyBand": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"868-868.6", 
+							"902-928", 
+							"2400-2483.5"
+						]
+					}, 
+					"MACCapability": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"AlternatePANCoordinator", 
+							"FFD", 
+							"MainsPowerSource", 
+							"OnWhenIdle", 
+							"SecureCommunication"
+						]
+					}, 
+					"ManufactureCode": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"MaximumBufferSize": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "128"
+						}, 
+						"unit": "octets", 
+						"read": true, 
+						"write": false
+					}, 
+					"MaximumIncomingTransferSize": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "32768"
+						}, 
+						"unit": "octets", 
+						"read": true, 
+						"write": false
+					}, 
+					"MaximumOutgoingTransferSize": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "32768"
+						}, 
+						"unit": "octets", 
+						"read": true, 
+						"write": false
+					}, 
+					"ServerMask": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"PrimaryTrustCenter", 
+							"PrimaryBindingTableCache", 
+							"BackupBindingTableCache", 
+							"PrimaryDiscoveryCache", 
+							"BackupDiscoveryCache", 
+							"NetworkManager"
+						]
+					}, 
+					"DescriptorCapability": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"ExtendedActiveEndpointListAvailable", 
+							"ExtendedSimpleDescriptorListAvailable"
+						]
+					}
+				}, 
+				"Device.ZigBee.ZDO.{i}.PowerDescriptor.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"CurrentPowerMode": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Synchronized", 
+							"Periodic", 
+							"Manual"
+						]
+					}, 
+					"AvailablePowerSource": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Constant", 
+							"Rechargeable", 
+							"Disposable"
+						]
+					}, 
+					"CurrentPowerSource": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Constant", 
+							"Rechargeable", 
+							"Disposable"
+						]
+					}, 
+					"CurrentPowerSourceLevel": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Critical", 
+							"33", 
+							"66", 
+							"100"
+						]
+					}
+				}, 
+				"Device.ZigBee.ZDO.{i}.UserDescriptor.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DescriptorAvailable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Description": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.ZigBee.ZDO.{i}.ComplexDescriptor.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DescriptorAvailable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Language": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"CharacterSet": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ManufacturerName": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ModelName": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SerialNumber": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DeviceURL": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Icon": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"IconURL": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.ZigBee.ZDO.{i}.Security.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"TrustCenterAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SecurityLevel": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"None", 
+							"MIC-32", 
+							"MIC-64", 
+							"MIC-128", 
+							"ENC", 
+							"ENC-MIC-32", 
+							"ENC-MIC-64", 
+							"ENC-MIC-128"
+						]
+					}, 
+					"TimeOutPeriod": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "65535"
+						}, 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.ZigBee.ZDO.{i}.Network.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"NeighborNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.ZigBee.ZDO.{i}.Network.Neighbor.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"Neighbor": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LQI": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"Relationship": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Parent", 
+								"Child", 
+								"PrevChild", 
+								"Sibling", 
+								"None"
+							]
+						}, 
+						"PermitJoin": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Accepting", 
+								"NotAccepting", 
+								"Unknown"
+							]
+						}, 
+						"Depth": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}, 
+				"Device.ZigBee.ZDO.{i}.NodeManager.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"RoutingTableNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.ZigBee.ZDO.{i}.NodeManager.RoutingTable.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"DestinationAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"NextHopAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Status": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Active", 
+								"DiscoveryUnderway", 
+								"DiscoveryFailed", 
+								"Inactive", 
+								"ValidationUnderway"
+							]
+						}, 
+						"MemoryConstrained": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ManyToOne": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RouteRecordRequired": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}, 
+				"Device.ZigBee.ZDO.{i}.Binding.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SourceEndpoint": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "240"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"SourceAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ClusterId": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"DestinationAddressMode": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Group", 
+							"Endpoint"
+						]
+					}, 
+					"DestinationEndpoint": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "240"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"IEEEDestinationAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"GroupDestinationAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.ZigBee.ZDO.{i}.Group.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"GroupId": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"EndpointList": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.ZigBee.ZDO.{i}.ApplicationEndpoint.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"EndpointId": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "240"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Device.ZigBee.ZDO.{i}.ApplicationEndpoint.{i}.SimpleDescriptor.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"ProfileId": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"DeviceId": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"DeviceVersion": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"max": "15"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"InputClusterList": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"OutputClusterList": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}
+					}
+				}
+			}, 
+			"Device.ZigBee.Discovery.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"AreaNetworkNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.ZigBee.Discovery.AreaNetwork.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"LastUpdate": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Indeterminate", 
+							"InProgress", 
+							"Success", 
+							"Error", 
+							"Error_Timeout"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Coordinator": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ZDOReference": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ZDOList": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.Bridging.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"MaxBridgeEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"MaxDBridgeEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"MaxQBridgeEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"MaxVLANEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"MaxProviderBridgeEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ProviderBridgeNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"MaxFilterEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"BridgeNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "network", 
+							"section": {
+								"type": "interface"
+							}
+						}
+					}
+				]
+			}, 
+			"FilterNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.Bridging.Bridge.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "network", 
+						"section": {
+							"type": "interface"
+						}, 
+						"dmmapfile": "dmmap_network"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.interface", 
+								"method": "status", 
+								"args": {
+									"interface": "@Name"
+								}, 
+								"key": "up"
+							}
+						}
+					]
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.interface", 
+								"method": "status", 
+								"args": {
+									"interface": "@Name"
+								}, 
+								"key": "up"
+							}
+						}
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Standard": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"802.1D-2004", 
+						"802.1Q-2005", 
+						"802.1Q-2011"
+					]
+				}, 
+				"PortNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"VLANNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"VLANPortNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.Bridging.Bridge.{i}.Port.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "speed"
+								}
+							}
+						]
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Up", 
+							"Down", 
+							"Unknown", 
+							"Dormant", 
+							"NotPresent", 
+							"LowerLayerDown", 
+							"Error"
+						], 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "speed"
+								}
+							}
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LastChange": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.interface", 
+									"method": "status", 
+									"args": {
+										"interface": "@Name"
+									}, 
+									"key": "uptime"
+								}
+							}
+						]
+					}, 
+					"LowerLayers": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ManagementPort": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Type": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"ProviderNetworkPort", 
+							"CustomerNetworkPort", 
+							"CustomerEdgePort", 
+							"CustomerVLANPort", 
+							"VLANUnawarePort"
+						]
+					}, 
+					"DefaultUserPriority": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "7"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"PriorityRegeneration": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "7"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"PortState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Blocking", 
+							"Listening", 
+							"Learning", 
+							"Forwarding", 
+							"Broken"
+						]
+					}, 
+					"PVID": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "4094"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"TPID": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"AcceptableFrameTypes": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"AdmitAll", 
+							"AdmitOnlyVLANTagged", 
+							"AdmitOnlyPrioUntagged"
+						]
+					}, 
+					"IngressFiltering": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ServiceAccessPrioritySelection": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ServiceAccessPriorityTranslation": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "7"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"PriorityTagging": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Device.Bridging.Bridge.{i}.Port.{i}.Stats.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"BytesSent": {
+							"type": "unsignedLong", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "network.device", 
+										"method": "status", 
+										"args": {
+											"name": "@Name"
+										}, 
+										"key": "statistics.tx_bytes"
+									}
+								}
+							]
+						}, 
+						"BytesReceived": {
+							"type": "unsignedLong", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsSent": {
+							"type": "unsignedLong", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "network.device", 
+										"method": "status", 
+										"args": {
+											"name": "@Name"
+										}, 
+										"key": "statistics.tx_packets"
+									}
+								}
+							]
+						}, 
+						"PacketsReceived": {
+							"type": "unsignedLong", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "network.device", 
+										"method": "status", 
+										"args": {
+											"name": "@Name"
+										}, 
+										"key": "statistics.rx_packets"
+									}
+								}
+							]
+						}, 
+						"ErrorsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "network.device", 
+										"method": "status", 
+										"args": {
+											"name": "@Name"
+										}, 
+										"key": "statistics.tx_errors"
+									}
+								}
+							]
+						}, 
+						"ErrorsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "network.device", 
+										"method": "status", 
+										"args": {
+											"name": "@Name"
+										}, 
+										"key": "statistics.rx_errors"
+									}
+								}
+							]
+						}, 
+						"UnicastPacketsSent": {
+							"type": "unsignedLong", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"UnicastPacketsReceived": {
+							"type": "unsignedLong", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"DiscardPacketsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "network.device", 
+										"method": "status", 
+										"args": {
+											"name": "@Name"
+										}, 
+										"key": "statistics.tx_dropped"
+									}
+								}
+							]
+						}, 
+						"DiscardPacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "network.device", 
+										"method": "status", 
+										"args": {
+											"name": "@Name"
+										}, 
+										"key": "statistics.rx_dropped"
+									}
+								}
+							]
+						}, 
+						"MulticastPacketsSent": {
+							"type": "unsignedLong", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"MulticastPacketsReceived": {
+							"type": "unsignedLong", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"BroadcastPacketsSent": {
+							"type": "unsignedLong", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"BroadcastPacketsReceived": {
+							"type": "unsignedLong", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"UnknownProtoPacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"mapping": [
+								{
+									"type": "ubus", 
+									"ubus": {
+										"object": "network.device", 
+										"method": "status", 
+										"args": {
+											"name": "@Name"
+										}, 
+										"key": "statistics.rx_over_errors"
+									}
+								}
+							]
+						}
+					}, 
+					"Device.Bridging.Bridge.{i}.Port.{i}.PriorityCodePoint.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"PCPSelection": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "1", 
+								"max": "4"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"UseDEI": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"RequireDropEncoding": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"PCPEncoding": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"PCPDecoding": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}
+				}, 
+				"Device.Bridging.Bridge.{i}.VLAN.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"VLANID": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "4094"
+						}, 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.Bridging.Bridge.{i}.VLANPort.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"VLAN": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Port": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Untagged": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}
+			}, 
+			"Device.Bridging.Filter.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Bridge": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Order": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DHCPType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"DHCPv4", 
+						"DHCPv6"
+					]
+				}, 
+				"VLANIDFilter": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "4094"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"EthertypeFilterList": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"EthertypeFilterExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceMACAddressFilterList": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceMACAddressFilterExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestMACAddressFilterList": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestMACAddressFilterExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceMACFromVendorClassIDFilter": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceMACFromVendorClassIDFilterv6": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceMACFromVendorClassIDFilterExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceMACFromVendorClassIDMode": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Exact", 
+						"Prefix", 
+						"Suffix", 
+						"Substring"
+					]
+				}, 
+				"DestMACFromVendorClassIDFilter": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestMACFromVendorClassIDFilterv6": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestMACFromVendorClassIDFilterExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestMACFromVendorClassIDMode": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Exact", 
+						"Prefix", 
+						"Suffix", 
+						"Substring"
+					]
+				}, 
+				"SourceMACFromClientIDFilter": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceMACFromClientIDFilterExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestMACFromClientIDFilter": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestMACFromClientIDFilterExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceMACFromUserClassIDFilter": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceMACFromUserClassIDFilterExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestMACFromUserClassIDFilter": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestMACFromUserClassIDFilterExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestIP": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestMask": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestIPExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceIP": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceMask": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceIPExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Protocol": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "255"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"ProtocolExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestPort": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"DestPortRangeMax": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"DestPortExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourcePort": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"SourcePortRangeMax": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"SourcePortExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}, 
+			"Device.Bridging.ProviderBridge.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Type": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"S-VLAN", 
+						"PE"
+					]
+				}, 
+				"SVLANcomponent": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"CVLANcomponents": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}
+		}, 
+		"Device.PPP.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"InterfaceNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"SupportedNCPs": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"ATCP", 
+					"IPCP", 
+					"IPXCP", 
+					"NBFCP", 
+					"IPv6CP"
+				]
+			}, 
+			"Device.PPP.Interface.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "network", 
+						"section": {
+							"type": "interface"
+						}, 
+						"dmmapfile": "dmmap_network"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.interface", 
+								"method": "status", 
+								"args": {
+									"interface": "@Name"
+								}, 
+								"key": "up"
+							}
+						}
+					]
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.interface", 
+								"method": "status", 
+								"args": {
+									"interface": "@Name"
+								}, 
+								"key": "up"
+							}
+						}
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Reset": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ConnectionStatus": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Unconfigured", 
+						"Connecting", 
+						"Authenticating", 
+						"Connected", 
+						"PendingDisconnect", 
+						"Disconnecting", 
+						"Disconnected"
+					]
+				}, 
+				"LastConnectionError": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"ERROR_NONE", 
+						"ERROR_ISP_TIME_OUT", 
+						"ERROR_COMMAND_ABORTED", 
+						"ERROR_NOT_ENABLED_FOR_INTERNET", 
+						"ERROR_BAD_PHONE_NUMBER", 
+						"ERROR_USER_DISCONNECT", 
+						"ERROR_ISP_DISCONNECT", 
+						"ERROR_IDLE_DISCONNECT", 
+						"ERROR_FORCED_DISCONNECT", 
+						"ERROR_SERVER_OUT_OF_RESOURCES", 
+						"ERROR_RESTRICTED_LOGON_HOURS", 
+						"ERROR_ACCOUNT_DISABLED", 
+						"ERROR_ACCOUNT_EXPIRED", 
+						"ERROR_PASSWORD_EXPIRED", 
+						"ERROR_AUTHENTICATION_FAILURE", 
+						"ERROR_NO_DIALTONE", 
+						"ERROR_NO_CARRIER", 
+						"ERROR_NO_ANSWER", 
+						"ERROR_LINE_BUSY", 
+						"ERROR_UNSUPPORTED_BITSPERSECOND", 
+						"ERROR_TOO_MANY_LINE_ERRORS", 
+						"ERROR_IP_CONFIGURATION", 
+						"ERROR_UNKNOWN"
+					]
+				}, 
+				"AutoDisconnectTime": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"IdleDisconnectTime": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"WarnDisconnectDelay": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"Username": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "interface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "username"
+								}
+							}
+						}
+					]
+				}, 
+				"Password": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "interface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "password"
+								}
+							}
+						}
+					]
+				}, 
+				"EncryptionProtocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"None", 
+						"MPPE"
+					]
+				}, 
+				"CompressionProtocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"None", 
+						"Van Jacobson", 
+						"STAC LZS"
+					]
+				}, 
+				"AuthenticationProtocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"PAP", 
+						"CHAP", 
+						"MS-CHAP"
+					]
+				}, 
+				"MaxMRUSize": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "64", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"CurrentMRUSize": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "64", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"ConnectionTrigger": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"OnDemand", 
+						"AlwaysOn", 
+						"Manual"
+					]
+				}, 
+				"LCPEcho": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LCPEchoRetry": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPCPEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IPv6CPEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Device.PPP.Interface.{i}.PPPoE.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"SessionID": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"ACName": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ServiceName": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.PPP.Interface.{i}.IPCP.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"LocalIPAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"RemoteIPAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DNSServers": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PassthroughEnable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"PassthroughDHCPPool": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.PPP.Interface.{i}.IPv6CP.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"LocalInterfaceIdentifier": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"RemoteInterfaceIdentifier": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.PPP.Interface.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_bytes"
+								}
+							}
+						]
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_bytes"
+								}
+							}
+						]
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.tx_packets"
+								}
+							}
+						]
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "ubus", 
+								"ubus": {
+									"object": "network.device", 
+									"method": "status", 
+									"args": {
+										"name": "@Name"
+									}, 
+									"key": "statistics.rx_packets"
+								}
+							}
+						]
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.PPP.Interface.{i}.PPPoA.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false
+				}
+			}
+		}, 
+		"Device.IP.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"IPv4Capable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"IPv4Enable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"IPv4Status": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"Disabled", 
+					"Enabled", 
+					"Error"
+				]
+			}, 
+			"IPv6Capable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"IPv6Enable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"IPv6Status": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"Disabled", 
+					"Enabled", 
+					"Error"
+				]
+			}, 
+			"ULAPrefix": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"InterfaceNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ActivePortNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.IP.Interface.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "network", 
+						"section": {
+							"type": "interface"
+						}, 
+						"dmmapfile": "dmmap_network"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "interface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "disabled"
+								}
+							}
+						}
+					]
+				}, 
+				"IPv4Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IPv6Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "interface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "ipv6"
+								}
+							}
+						}
+					]
+				}, 
+				"ULAEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					], 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "interface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "disabled"
+								}
+							}
+						}
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.interface", 
+								"method": "status", 
+								"args": {
+									"interface": "@Name"
+								}, 
+								"key": "uptime"
+							}
+						}
+					]
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Router": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Reset": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"MaxMTUSize": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "64", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.interface", 
+								"method": "status", 
+								"args": {
+									"interface": "@Name"
+								}, 
+								"key": "mtu"
+							}
+						}
+					]
+				}, 
+				"Type": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Normal", 
+						"Loopback", 
+						"Tunnel", 
+						"Tunneled"
+					]
+				}, 
+				"Loopback": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IPv4AddressNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPv6AddressNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPv6PrefixNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AutoIPEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TWAMPReflectorNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.IP.Interface.{i}.IPv4Address.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error_Misconfigured", 
+							"Error"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"IPAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "ipaddr"
+									}
+								}
+							}
+						]
+					}, 
+					"SubnetMask": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "netmask"
+									}
+								}
+							}
+						]
+					}, 
+					"AddressingType": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"DHCP", 
+							"IKEv2", 
+							"AutoIP", 
+							"IPCP", 
+							"Static"
+						], 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "proto"
+									}
+								}
+							}
+						]
+					}
+				}, 
+				"Device.IP.Interface.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnicastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MulticastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsSent": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BroadcastPacketsReceived": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnknownProtoPacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.IP.Interface.{i}.TWAMPReflector.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Active", 
+							"Error"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Port": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"MaximumTTL": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "255"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"IPAllowedList": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"PortAllowedList": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.IP.Interface.{i}.IPv6Address.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error_Misconfigured", 
+							"Error"
+						]
+					}, 
+					"IPAddressStatus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Preferred", 
+							"Deprecated", 
+							"Invalid", 
+							"Inaccessible", 
+							"Unknown", 
+							"Tentative", 
+							"Duplicate", 
+							"Optimistic"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"IPAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "ip6addr"
+									}
+								}
+							}
+						]
+					}, 
+					"Origin": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"AutoConfigured", 
+							"DHCPv6", 
+							"IKEv2", 
+							"MAP", 
+							"WellKnown", 
+							"Static"
+						]
+					}, 
+					"Prefix": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"PreferredLifetime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "adv_preferred_lifetime"
+									}
+								}
+							}
+						]
+					}, 
+					"ValidLifetime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "adv_valid_lifetime"
+									}
+								}
+							}
+						]
+					}, 
+					"Anycast": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.IP.Interface.{i}.IPv6Prefix.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error"
+						]
+					}, 
+					"PrefixStatus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Preferred", 
+							"Deprecated", 
+							"Invalid", 
+							"Inaccessible", 
+							"Unknown"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Prefix": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "ip6prefix"
+									}
+								}
+							}
+						]
+					}, 
+					"Origin": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"AutoConfigured", 
+							"PrefixDelegation", 
+							"RouterAdvertisement", 
+							"WellKnown", 
+							"Static", 
+							"Child"
+						]
+					}, 
+					"StaticType": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Static", 
+							"Inapplicable", 
+							"PrefixDelegation", 
+							"Child"
+						]
+					}, 
+					"ParentPrefix": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ChildPrefixBits": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"OnLink": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Autonomous": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"PreferredLifetime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ValidLifetime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}
+			}, 
+			"Device.IP.ActivePort.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"LocalIPAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LocalPort": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"RemoteIPAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"RemotePort": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"LISTEN", 
+						"ESTABLISHED"
+					]
+				}
+			}, 
+			"Device.IP.Diagnostics.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"IPv4PingSupported": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPv6PingSupported": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPv4TraceRouteSupported": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPv6TraceRouteSupported": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPv4DownloadDiagnosticsSupported": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPv6DownloadDiagnosticsSupported": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPv4UploadDiagnosticsSupported": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPv6UploadDiagnosticsSupported": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPv4UDPEchoDiagnosticsSupported": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPv6UDPEchoDiagnosticsSupported": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPv4ServerSelectionDiagnosticsSupported": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPv6ServerSelectionDiagnosticsSupported": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DownloadTransports": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"HTTP", 
+						"FTP"
+					]
+				}, 
+				"DownloadDiagnosticMaxConnections": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"DownloadDiagnosticsMaxIncrementalResult": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"UploadTransports": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"HTTP", 
+						"FTP"
+					]
+				}, 
+				"UploadDiagnosticsMaxConnections": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"UploadDiagnosticsMaxIncrementalResult": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"UDPEchoDiagnosticsMaxResults": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.IP.Diagnostics.IPPing.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DiagnosticsState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ProtocolVersion": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Any", 
+							"IPv4", 
+							"IPv6"
+						]
+					}, 
+					"Host": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"NumberOfRepetitions": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Timeout": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"DataBlockSize": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"DSCP": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "63"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"IPAddressUsed": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SuccessCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"FailureCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"AverageResponseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"MinimumResponseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"MaximumResponseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"AverageResponseTimeDetailed": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "microseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"MinimumResponseTimeDetailed": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "microseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"MaximumResponseTimeDetailed": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "microseconds", 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.IP.Diagnostics.TraceRoute.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DiagnosticsState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ProtocolVersion": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Any", 
+							"IPv4", 
+							"IPv6"
+						]
+					}, 
+					"Host": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"NumberOfTries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "3"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Timeout": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"DataBlockSize": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"DSCP": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "63"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"MaxHopCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "64"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"IPAddressUsed": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ResponseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"RouteHopsNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.IP.Diagnostics.TraceRoute.RouteHops.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": true, 
+						"Host": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"HostAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ErrorCode": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RTTimes": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "milliseconds", 
+							"read": true, 
+							"write": false
+						}
+					}
+				}, 
+				"Device.IP.Diagnostics.DownloadDiagnostics.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DiagnosticsState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"None", 
+							"Requested", 
+							"Completed", 
+							"Error_CannotResolveHostName", 
+							"Error_NoRouteToHost", 
+							"Error_InitConnectionFailed", 
+							"Error_NoResponse", 
+							"Error_TransferFailed", 
+							"Error_PasswordRequestFailed", 
+							"Error_LoginFailed", 
+							"Error_NoTransferMode", 
+							"Error_NoPASV", 
+							"Error_IncorrectSize", 
+							"Error_Timeout", 
+							"Error_Internal", 
+							"Error_Other"
+						]
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DownloadURL": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DownloadTransports": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"HTTP", 
+							"FTP"
+						]
+					}, 
+					"DownloadDiagnosticMaxConnections": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"DownloadDiagnosticsMaxIncrementalResult": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"DSCP": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "63"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"EthernetPriority": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "7"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"TimeBasedTestDuration": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "999"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"TimeBasedTestMeasurementInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "999"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"TimeBasedTestMeasurementOffset": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "255"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"ProtocolVersion": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Any", 
+							"IPv4", 
+							"IPv6"
+						]
+					}, 
+					"NumberOfConnections": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"IPAddressUsed": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ROMTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BOMTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"EOMTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TestBytesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"TotalBytesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"TotalBytesSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"TestBytesReceivedUnderFullLoading": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"TotalBytesReceivedUnderFullLoading": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"TotalBytesSentUnderFullLoading": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"PeriodOfFullLoading": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "microseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"TCPOpenRequestTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TCPOpenResponseTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PerConnectionResultNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"EnablePerConnectionResults": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"IncrementalResultNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.IP.Diagnostics.DownloadDiagnostics.PerConnectionResult.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": true, 
+						"ROMTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"BOMTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"EOMTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"TestBytesReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"TotalBytesReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"TotalBytesSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"TCPOpenRequestTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"TCPOpenResponseTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.IP.Diagnostics.DownloadDiagnostics.IncrementalResult.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": true, 
+						"TestBytesReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"TotalBytesReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"TotalBytesSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"StartTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"EndTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}, 
+				"Device.IP.Diagnostics.UploadDiagnostics.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DiagnosticsState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"None", 
+							"Requested", 
+							"Completed", 
+							"Error_CannotResolveHostName", 
+							"Error_NoRouteToHost", 
+							"Error_InitConnectionFailed", 
+							"Error_NoResponse", 
+							"Error_PasswordRequestFailed", 
+							"Error_LoginFailed", 
+							"Error_NoTransferMode", 
+							"Error_NoPASV", 
+							"Error_NoCWD", 
+							"Error_NoSTOR", 
+							"Error_NoTransferComplete", 
+							"Error_Timeout", 
+							"Error_Internal", 
+							"Error_Other"
+						]
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"UploadURL": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"UploadTransports": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"HTTP", 
+							"FTP"
+						]
+					}, 
+					"UploadDiagnosticsMaxConnections": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"UploadDiagnosticsMaxIncrementalResult": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"DSCP": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "63"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"EthernetPriority": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "7"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"TestFileLength": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"TimeBasedTestDuration": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "999"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"TimeBasedTestMeasurementInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "999"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"TimeBasedTestMeasurementOffset": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "255"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"ProtocolVersion": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Any", 
+							"IPv4", 
+							"IPv6"
+						]
+					}, 
+					"NumberOfConnections": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"IPAddressUsed": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ROMTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BOMTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"EOMTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TestBytesSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"TotalBytesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"TotalBytesSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"TestBytesSentUnderFullLoading": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"TotalBytesReceivedUnderFullLoading": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"TotalBytesSentUnderFullLoading": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"PeriodOfFullLoading": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "microseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"TCPOpenRequestTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TCPOpenResponseTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PerConnectionResultNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"EnablePerConnectionResults": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"IncrementalResultNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.IP.Diagnostics.UploadDiagnostics.PerConnectionResult.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": true, 
+						"ROMTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"BOMTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"EOMTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"TestBytesSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"TotalBytesReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"TotalBytesSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"TCPOpenRequestTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"TCPOpenResponseTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.IP.Diagnostics.UploadDiagnostics.IncrementalResult.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": true, 
+						"TestBytesSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"TotalBytesReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"TotalBytesSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"StartTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"EndTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}, 
+				"Device.IP.Diagnostics.UDPEchoConfig.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SourceIPAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"UDPPort": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"EchoPlusEnabled": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"EchoPlusSupported": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsResponded": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesResponded": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TimeFirstPacketReceived": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TimeLastPacketReceived": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.IP.Diagnostics.UDPEchoDiagnostics.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DiagnosticsState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"None", 
+							"Requested", 
+							"Completed", 
+							"Error_CannotResolveHostName", 
+							"Error_Internal", 
+							"Error_Other"
+						]
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Host": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Port": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"NumberOfRepetitions": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Timeout": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"DataBlockSize": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "65535"
+						}, 
+						"unit": "bytes", 
+						"read": true, 
+						"write": true
+					}, 
+					"DSCP": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "63"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"InterTransmissionTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "65535"
+						}, 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"ProtocolVersion": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Any", 
+							"IPv4", 
+							"IPv6"
+						]
+					}, 
+					"IPAddressUsed": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SuccessCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"FailureCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"AverageResponseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "microseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"MinimumResponseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "microseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"MaximumResponseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "microseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"EnableIndividualPacketResults": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"IndividualPacketResultNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UDPEchoDiagnosticsMaxResults": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.IP.Diagnostics.UDPEchoDiagnostics.IndividualPacketResult.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": true, 
+						"PacketSuccess": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketSendTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketReceiveTime": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"TestGenSN": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"TestRespSN": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"TestRespRcvTimeStamp": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "microseconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"TestRespReplyTimeStamp": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "microseconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"TestRespReplyFailureCount": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}, 
+				"Device.IP.Diagnostics.ServerSelectionDiagnostics.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DiagnosticsState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"None", 
+							"Requested", 
+							"Completed", 
+							"Error_CannotResolveHostName", 
+							"Error_Internal", 
+							"Error_Other"
+						]
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ProtocolVersion": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Any", 
+							"IPv4", 
+							"IPv6"
+						]
+					}, 
+					"Protocol": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"ICMP", 
+							"UDP Echo"
+						]
+					}, 
+					"HostList": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"NumberOfRepetitions": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Timeout": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"FastestHost": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MinimumResponseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "microseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"AverageResponseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "microseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"MaximumResponseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "microseconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"IPAddressUsed": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.LLDP.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Device.LLDP.Discovery.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"DeviceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.LLDP.Discovery.Device.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ChassisIDSubtype": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "255"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"ChassisID": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Host": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PortNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.LLDP.Discovery.Device.{i}.Port.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"PortIDSubtype": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"PortID": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"TTL": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"max": "65535"
+							}, 
+							"unit": "seconds", 
+							"read": true, 
+							"write": false
+						}, 
+						"PortDescription": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"MACAddressList": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LastUpdate": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.LLDP.Discovery.Device.{i}.Port.{i}.LinkInformation.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": false, 
+							"InterfaceType": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"MACForwardingTable": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}
+					}, 
+					"Device.LLDP.Discovery.Device.{i}.DeviceInformation.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"DeviceCategory": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ManufacturerOUI": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ModelName": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ModelNumber": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"VendorSpecificNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.LLDP.Discovery.Device.{i}.DeviceInformation.VendorSpecific.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"OrganizationCode": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"InformationType": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"range": {
+									"max": "255"
+								}, 
+								"read": true, 
+								"write": false
+							}, 
+							"Information": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}
+					}
+				}
+			}
+		}, 
+		"Device.IPsec.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Enable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"Status": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"Disabled", 
+					"Enabled", 
+					"Error"
+				]
+			}, 
+			"AHSupported": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"IKEv2SupportedEncryptionAlgorithms": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"DES", 
+					"3DES", 
+					"RC5", 
+					"IDEA", 
+					"CAST", 
+					"BLOWFISH", 
+					"3IDEA", 
+					"AES-CBC", 
+					"AES-CTR", 
+					"AES-CCM-8", 
+					"AES-CCM-12", 
+					"AES-CCM-16", 
+					"AES-GCM-8", 
+					"AES-GCM-12", 
+					"AES-GCM-16", 
+					"CAMELLIA-CBC"
+				]
+			}, 
+			"ESPSupportedEncryptionAlgorithms": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"NULL", 
+					"DES-IV64", 
+					"DES", 
+					"3DES", 
+					"RC5", 
+					"IDEA", 
+					"CAST", 
+					"BLOWFISH", 
+					"3IDEA", 
+					"DES-IV32", 
+					"AES-CBC", 
+					"AES-CTR", 
+					"AES-CCM-8", 
+					"AES-CCM-12", 
+					"AES-CCM-16", 
+					"AES-GCM-8", 
+					"AES-GCM-12", 
+					"AES-GCM-16", 
+					"NULL-AUTH-AES-GMAC", 
+					"CAMELLIA-CBC", 
+					"CAMELLIA-CTR", 
+					"CAMELLIA-CCM-8", 
+					"CAMELLIA-CCM-12", 
+					"CAMELLIA-CCM-16"
+				]
+			}, 
+			"IKEv2SupportedPseudoRandomFunctions": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"HMAC-MD5", 
+					"HMAC-SHA1", 
+					"HMAC-TIGER", 
+					"AES-128-XCBC", 
+					"HMAC-SHA2-256", 
+					"HMAC-SHA2-384", 
+					"HMAC-SHA2-512", 
+					"AES-128-CMAC"
+				]
+			}, 
+			"SupportedIntegrityAlgorithms": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"NONE", 
+					"HMAC-MD5-96", 
+					"HMAC-SHA1-96", 
+					"DES-MAC", 
+					"KPDK-MD5", 
+					"AES-XCBC-96", 
+					"HMAC-MD5-128", 
+					"HMAC-SHA1-160", 
+					"AES-CMAC-96", 
+					"AES-128-GMAC", 
+					"AES-192-GMAC", 
+					"AES-256-GMAC", 
+					"HMAC-SHA2-256-128", 
+					"HMAC-SHA2-256-192", 
+					"HMAC-SHA2-256-256"
+				]
+			}, 
+			"SupportedDiffieHellmanGroupTransforms": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"NONE", 
+					"MODP-768", 
+					"MODP-1024", 
+					"MODP-1536", 
+					"MODP-2048", 
+					"MODP-3072", 
+					"MODP-4096", 
+					"MODP-6144", 
+					"MODP-8192", 
+					"ECP-256", 
+					"ECP-384", 
+					"ECP-521", 
+					"MODP-1024-PRIME-160", 
+					"MODP-2048-PRIME-224", 
+					"MODP-2048-PRIME-256", 
+					"ECP-192", 
+					"ECP-224"
+				]
+			}, 
+			"MaxFilterEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"MaxProfileEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"FilterNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ProfileNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"TunnelNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"IKEv2SANumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.IPsec.Stats.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"NegotiationFailures": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"BytesSent": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "bytes", 
+					"read": true, 
+					"write": false
+				}, 
+				"BytesReceived": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "bytes", 
+					"read": true, 
+					"write": false
+				}, 
+				"PacketsSent": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"PacketsReceived": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"ErrorsSent": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"UnknownSPIErrors": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"DecryptionErrors": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"IntegrityErrors": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"ReplayErrors": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"PolicyErrors": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}, 
+				"OtherReceiveErrors": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "packets", 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.IPsec.Filter.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Order": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AllInterfaces": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestIP": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestMask": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestIPExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceIP": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceMask": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceIPExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Protocol": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "255"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"ProtocolExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestPort": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"DestPortRangeMax": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"DestPortExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourcePort": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"SourcePortRangeMax": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"SourcePortExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ProcessingChoice": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Discard", 
+						"Bypass", 
+						"Protect"
+					]
+				}, 
+				"Profile": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}, 
+			"Device.IPsec.Profile.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"MaxChildSAs": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"RemoteEndpoints": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ForwardingPolicy": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Protocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"AH", 
+						"ESP"
+					]
+				}, 
+				"IKEv2AuthenticationMethod": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IKEv2AllowedEncryptionAlgorithms": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ESPAllowedEncryptionAlgorithms": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IKEv2AllowedPseudoRandomFunctions": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IKEv2AllowedIntegrityAlgorithms": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AHAllowedIntegrityAlgorithms": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ESPAllowedIntegrityAlgorithms": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IKEv2AllowedDiffieHellmanGroupTransforms": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IKEv2DeadPeerDetectionTimeout": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"IKEv2NATTKeepaliveTimeout": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"AntiReplayWindowSize": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DoNotFragment": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Set", 
+						"Clear", 
+						"Copy"
+					]
+				}, 
+				"DSCPMarkPolicy": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-2", 
+						"max": "63"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"IKEv2SATrafficLimit": {
+					"type": "unsignedLong", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "bytes", 
+					"read": true, 
+					"write": true
+				}, 
+				"IKEv2SATimeLimit": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"IKEv2SAExpiryAction": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Renegotiate", 
+						"Delete"
+					]
+				}, 
+				"ChildSATrafficLimit": {
+					"type": "unsignedLong", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "bytes", 
+					"read": true, 
+					"write": true
+				}, 
+				"ChildSATimeLimit": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"ChildSAExpiryAction": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Renegotiate", 
+						"Delete"
+					]
+				}, 
+				"SentCPAttrNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.IPsec.Profile.{i}.SentCPAttr.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Type": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "32767"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Value": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}
+			}, 
+			"Device.IPsec.Tunnel.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TunnelInterface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"TunneledInterface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Filters": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.IPsec.Tunnel.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DecryptionErrors": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"IntegrityErrors": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"ReplayErrors": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"PolicyErrors": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"OtherReceiveErrors": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.IPsec.IKEv2SA.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Tunnel": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LocalAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"RemoteAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"EncryptionAlgorithm": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"EncryptionKeyLength": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "bits", 
+					"read": true, 
+					"write": false
+				}, 
+				"PseudoRandomFunction": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IntegrityAlgorithm": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DiffieHellmanGroupTransform": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"CreationTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NATDetected": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"None", 
+						"Local", 
+						"Remote", 
+						"Unsupported"
+					]
+				}, 
+				"ReceivedCPAttrNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ChildSANumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.IPsec.IKEv2SA.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"DecryptionErrors": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"IntegrityErrors": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"OtherReceiveErrors": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.IPsec.IKEv2SA.{i}.ReceivedCPAttr.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Type": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "32767"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"Value": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.IPsec.IKEv2SA.{i}.ChildSA.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Up", 
+							"Down", 
+							"Unknown", 
+							"Dormant", 
+							"Error"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"InboundSPI": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"OutboundSPI": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"CreationTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.IPsec.IKEv2SA.{i}.ChildSA.{i}.Stats.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"BytesSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"BytesReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"ErrorsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"DecryptionErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"IntegrityErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"ReplayErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"PolicyErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"OtherReceiveErrors": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}
+					}
+				}
+			}
+		}, 
+		"Device.GRE.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"TunnelNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"FilterNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.GRE.Tunnel.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"RemoteEndpoints": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"KeepAlivePolicy": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"ICMP", 
+						"None"
+					]
+				}, 
+				"KeepAliveTimeout": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"KeepAliveThreshold": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DeliveryHeaderProtocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"IPv4", 
+						"IPv6"
+					]
+				}, 
+				"DefaultDSCPMark": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ConnectedRemoteEndpoint": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"InterfaceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.GRE.Tunnel.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"KeepAliveSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "messages", 
+						"read": true, 
+						"write": false
+					}, 
+					"KeepAliveReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "messages", 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.GRE.Tunnel.{i}.Interface.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Up", 
+							"Down", 
+							"Unknown", 
+							"Dormant", 
+							"NotPresent", 
+							"LowerLayerDown", 
+							"Error"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LastChange": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"LowerLayers": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ProtocolIdOverride": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"UseChecksum": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"KeyIdentifierGenerationPolicy": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Disabled", 
+							"Provisioned", 
+							"CPE_Generated"
+						]
+					}, 
+					"KeyIdentifier": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"UseSequenceNumber": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Device.GRE.Tunnel.{i}.Interface.{i}.Stats.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"BytesSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"BytesReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"ErrorsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"ErrorsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"DiscardChecksumReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"DiscardSequenceNumberReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}
+					}
+				}
+			}, 
+			"Device.GRE.Filter.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Order": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AllInterfaces": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"VLANIDCheck": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"VLANIDExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DSCPMarkPolicy": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-2", 
+						"max": "63"
+					}, 
+					"read": true, 
+					"write": true
+				}
+			}
+		}, 
+		"Device.L2TPv3.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"TunnelNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"FilterNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.L2TPv3.Tunnel.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"RemoteEndpoints": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"KeepAlivePolicy": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"ICMP", 
+						"None"
+					]
+				}, 
+				"KeepAliveTimeout": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"KeepAliveThreshold": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DeliveryHeaderProtocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"IPv4", 
+						"IPv6"
+					]
+				}, 
+				"DefaultDSCPMark": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TunnelEncapsulation": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"IP", 
+						"UDP"
+					]
+				}, 
+				"ConnectedRemoteEndpoint": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"InterfaceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.L2TPv3.Tunnel.{i}.UDP.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"SourcePort": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"RemotePort": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"EnableChecksum": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.L2TPv3.Tunnel.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"KeepAliveSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "messages", 
+						"read": true, 
+						"write": false
+					}, 
+					"KeepAliveReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "messages", 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.L2TPv3.Tunnel.{i}.Interface.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Up", 
+							"Down", 
+							"Unknown", 
+							"Dormant", 
+							"NotPresent", 
+							"LowerLayerDown", 
+							"Error"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LastChange": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"LowerLayers": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SessionID": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1", 
+							"max": "-1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"CookiePolicy": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Disabled", 
+							"Configured", 
+							"Generated"
+						]
+					}, 
+					"Cookie": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Device.L2TPv3.Tunnel.{i}.Interface.{i}.Stats.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"BytesSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"BytesReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"ErrorsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"ErrorsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"DiscardChecksumReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"DiscardSequenceNumberReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}
+					}
+				}
+			}, 
+			"Device.L2TPv3.Filter.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Order": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AllInterfaces": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"VLANIDCheck": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"VLANIDExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DSCPMarkPolicy": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-2", 
+						"max": "63"
+					}, 
+					"read": true, 
+					"write": true
+				}
+			}
+		}, 
+		"Device.VXLAN.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"TunnelNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"FilterNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.VXLAN.Tunnel.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"RemoteEndpoints": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"KeepAlivePolicy": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"ICMP", 
+						"None"
+					]
+				}, 
+				"KeepAliveTimeout": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"KeepAliveThreshold": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DeliveryHeaderProtocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"IPv4", 
+						"IPv6"
+					]
+				}, 
+				"DefaultDSCPMark": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ConnectedRemoteEndpoint": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"InterfaceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SourcePort": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"RemotePort": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Device.VXLAN.Tunnel.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"KeepAliveSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "messages", 
+						"read": true, 
+						"write": false
+					}, 
+					"KeepAliveReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "messages", 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "packets", 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.VXLAN.Tunnel.{i}.Interface.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Up", 
+							"Down", 
+							"Unknown", 
+							"Dormant", 
+							"NotPresent", 
+							"LowerLayerDown", 
+							"Error"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LastChange": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"LowerLayers": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"VNI": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1", 
+							"max": "-1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Device.VXLAN.Tunnel.{i}.Interface.{i}.Stats.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"BytesSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"BytesReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"ErrorsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"ErrorsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"DiscardChecksumReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}, 
+						"DiscardSequenceNumberReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "packets", 
+							"read": true, 
+							"write": false
+						}
+					}
+				}
+			}, 
+			"Device.VXLAN.Filter.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Order": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AllInterfaces": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"VLANIDCheck": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"VLANIDExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DSCPMarkPolicy": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-2", 
+						"max": "63"
+					}, 
+					"read": true, 
+					"write": true
+				}
+			}
+		}, 
+		"Device.MAP.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Enable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"DomainNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.MAP.Domain.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TransportMode": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Encapsulation", 
+						"Translation"
+					]
+				}, 
+				"WANInterface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IPv6Prefix": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"BRIPv6Prefix": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DSCPMarkPolicy": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-2", 
+						"max": "63"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"PSIDOffset": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "15"
+					}, 
+					"unit": "bits", 
+					"read": true, 
+					"write": true
+				}, 
+				"PSIDLength": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "16"
+					}, 
+					"unit": "bits", 
+					"read": true, 
+					"write": true
+				}, 
+				"PSID": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"IncludeSystemPorts": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"RuleNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.MAP.Domain.{i}.Rule.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Origin": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"DHCPv6", 
+							"Static"
+						]
+					}, 
+					"IPv6Prefix": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"IPv4Prefix": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"EABitsLength": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "48"
+						}, 
+						"unit": "bits", 
+						"read": true, 
+						"write": true
+					}, 
+					"IsFMR": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"PSIDOffset": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "15"
+						}, 
+						"unit": "bits", 
+						"read": true, 
+						"write": true
+					}, 
+					"PSIDLength": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "16"
+						}, 
+						"unit": "bits", 
+						"read": true, 
+						"write": true
+					}, 
+					"PSID": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.MAP.Domain.{i}.Interface.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Up", 
+							"Down", 
+							"Unknown", 
+							"Dormant", 
+							"NotPresent", 
+							"LowerLayerDown", 
+							"Error"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LastChange": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"LowerLayers": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Device.MAP.Domain.{i}.Interface.Stats.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"BytesSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"BytesReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"PacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ErrorsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ErrorsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"UnicastPacketsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"UnicastPacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"DiscardPacketsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"DiscardPacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"MulticastPacketsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"MulticastPacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"BroadcastPacketsSent": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"BroadcastPacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"UnknownProtoPacketsReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}
+			}
+		}, 
+		"Device.CaptivePortal.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Enable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"Status": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"Disabled", 
+					"Enabled", 
+					"Error_URLEmpty", 
+					"Error"
+				]
+			}, 
+			"AllowedList": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"URL": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}
+		}, 
+		"Device.Routing.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"RouterNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.Routing.Router.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IPv4ForwardingNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "route"
+								}
+							}
+						}
+					]
+				}, 
+				"IPv6ForwardingNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "route6"
+								}
+							}
+						}
+					]
+				}, 
+				"Device.Routing.Router.{i}.IPv4Forwarding.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"mapping": {
+						"type": "uci", 
+						"uci": {
+							"file": "network", 
+							"section": {
+								"type": "route"
+							}, 
+							"dmmapfile": "dmmap_route_forwarding"
+						}
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error_Misconfigured", 
+							"Error"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"StaticRoute": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DestIPAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "route", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "target"
+									}
+								}
+							}
+						]
+					}, 
+					"DestSubnetMask": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "route", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "netmask"
+									}
+								}
+							}
+						]
+					}, 
+					"ForwardingPolicy": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"GatewayIPAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "route", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "gateway"
+									}
+								}
+							}
+						]
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Origin": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"DHCPv4", 
+							"OSPF", 
+							"IPCP", 
+							"RIP", 
+							"Static"
+						]
+					}, 
+					"ForwardingMetric": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1"
+						}, 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "route", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "metric"
+									}
+								}
+							}
+						]
+					}
+				}, 
+				"Device.Routing.Router.{i}.IPv6Forwarding.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"mapping": {
+						"type": "uci", 
+						"uci": {
+							"file": "network", 
+							"section": {
+								"type": "route6"
+							}, 
+							"dmmapfile": "dmmap_route_forwarding"
+						}
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error_Misconfigured", 
+							"Error"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DestIPPrefix": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "route", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "target"
+									}
+								}
+							}
+						]
+					}, 
+					"ForwardingPolicy": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"NextHop": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "route", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "gateway"
+									}
+								}
+							}
+						]
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Origin": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"DHCPv6", 
+							"OSPF", 
+							"RA", 
+							"RIPng", 
+							"Static"
+						]
+					}, 
+					"ForwardingMetric": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1"
+						}, 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "route", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "metric"
+									}
+								}
+							}
+						]
+					}, 
+					"ExpirationTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.Routing.RIP.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SupportedModes": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Send", 
+						"Receive", 
+						"Both"
+					]
+				}, 
+				"InterfaceSettingNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.Routing.RIP.InterfaceSetting.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error_Misconfigured", 
+							"Error"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"AcceptRA": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SendRA": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}
+			}, 
+			"Device.Routing.RouteInformation.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"InterfaceSettingNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.Routing.RouteInformation.InterfaceSetting.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"ForwardingEntryCreated", 
+							"NoForwardingEntry", 
+							"Error"
+						]
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SourceRouter": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PreferredRouteFlag": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"High", 
+							"Medium", 
+							"Low"
+						]
+					}, 
+					"Prefix": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"RouteLifetime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.NeighborDiscovery.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Enable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"InterfaceSettingNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.NeighborDiscovery.InterfaceSetting.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"RetransTimer": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "milliseconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"RtrSolicitationInterval": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "milliseconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"MaxRtrSolicitations": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"NUDEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"RSEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}
+		}, 
+		"Device.RouterAdvertisement.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Enable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"InterfaceSettingNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.RouterAdvertisement.InterfaceSetting.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ManualPrefixes": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Prefixes": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxRtrAdvInterval": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "4", 
+						"max": "1800"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"MinRtrAdvInterval": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "3", 
+						"max": "1350"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"AdvDefaultLifetime": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"max": "65535"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"AdvManagedFlag": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AdvOtherConfigFlag": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AdvMobileAgentFlag": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AdvPreferredRouterFlag": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"High", 
+						"Medium", 
+						"Low"
+					]
+				}, 
+				"AdvNDProxyFlag": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AdvLinkMTU": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AdvReachableTime": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"max": "3600000"
+					}, 
+					"unit": "milliseconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"AdvRetransTimer": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "milliseconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"AdvCurHopLimit": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"max": "255"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"OptionNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.RouterAdvertisement.InterfaceSetting.{i}.Option.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Tag": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Value": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}
+			}
+		}, 
+		"Device.IPv6rd.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Enable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"InterfaceSettingNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.IPv6rd.InterfaceSetting.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"BorderRelayIPv4Addresses": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AllTrafficToBorderRelay": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SPIPv6Prefix": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IPv4MaskLength": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "32"
+					}, 
+					"unit": "bits", 
+					"read": true, 
+					"write": true
+				}, 
+				"AddressSource": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TunnelInterface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"TunneledInterface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}
+		}, 
+		"Device.DSLite.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Enable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"InterfaceSettingNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.DSLite.InterfaceSetting.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"EndpointAssignmentPrecedence": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"DHCPv6", 
+						"Static"
+					]
+				}, 
+				"EndpointAddressTypePrecedence": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"FQDN", 
+						"IPv6Address"
+					]
+				}, 
+				"EndpointAddressInUse": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"EndpointName": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"EndpointAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Origin": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"DHCPv6", 
+						"Static"
+					]
+				}, 
+				"TunnelInterface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"TunneledInterface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}
+		}, 
+		"Device.QoS.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"MaxClassificationEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ClassificationNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "qos", 
+							"section": {
+								"type": "classify"
+							}
+						}
+					}
+				]
+			}, 
+			"MaxAppEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"AppNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"MaxFlowEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"FlowNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"MaxPolicerEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"PolicerNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"MaxQueueEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"QueueNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "qos", 
+							"section": {
+								"type": "class"
+							}
+						}
+					}
+				]
+			}, 
+			"QueueStatsNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"MaxShaperEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ShaperNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"DefaultForwardingPolicy": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"DefaultTrafficClass": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"DefaultPolicer": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"DefaultQueue": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"DefaultDSCPMark": {
+				"type": "int", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"range": {
+					"min": "-2"
+				}, 
+				"read": true, 
+				"write": true
+			}, 
+			"DefaultEthernetPriorityMark": {
+				"type": "int", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"range": {
+					"min": "-2"
+				}, 
+				"read": true, 
+				"write": true
+			}, 
+			"DefaultInnerEthernetPriorityMark": {
+				"type": "int", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"range": {
+					"min": "-2"
+				}, 
+				"read": true, 
+				"write": true
+			}, 
+			"AvailableAppList": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.QoS.Classification.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "qos", 
+						"section": {
+							"type": "classify"
+						}, 
+						"dmmapfile": "dmmap_qos"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Order": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DHCPType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"DHCPv4", 
+						"DHCPv6"
+					]
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AllInterfaces": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestIP": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "qos", 
+								"section": {
+									"type": "classify", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "dsthost"
+								}
+							}
+						}
+					]
+				}, 
+				"DestMask": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestIPExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceIP": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "qos", 
+								"section": {
+									"type": "classify", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "srchost"
+								}
+							}
+						}
+					]
+				}, 
+				"SourceMask": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceIPExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Protocol": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "255"
+					}, 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "qos", 
+								"section": {
+									"type": "classify", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "proto"
+								}
+							}
+						}
+					]
+				}, 
+				"ProtocolExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestPort": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "qos", 
+								"section": {
+									"type": "classify", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "dstports"
+								}
+							}
+						}
+					]
+				}, 
+				"DestPortRangeMax": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "qos", 
+								"section": {
+									"type": "classify", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "portrange"
+								}
+							}
+						}
+					]
+				}, 
+				"DestPortExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourcePort": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "qos", 
+								"section": {
+									"type": "classify", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "srcports"
+								}
+							}
+						}
+					]
+				}, 
+				"SourcePortRangeMax": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"SourcePortExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceMACAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceMACMask": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceMACExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestMACAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestMACMask": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestMACExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Ethertype": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"EthertypeExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SSAP": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"SSAPExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DSAP": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"DSAPExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"LLCControl": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"LLCControlExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SNAPOUI": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"SNAPOUIExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceVendorClassID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceVendorClassIDv6": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceVendorClassIDExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceVendorClassIDMode": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Exact", 
+						"Prefix", 
+						"Suffix", 
+						"Substring"
+					]
+				}, 
+				"DestVendorClassID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestVendorClassIDv6": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestVendorClassIDExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestVendorClassIDMode": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Exact", 
+						"Prefix", 
+						"Suffix", 
+						"Substring"
+					]
+				}, 
+				"SourceClientID": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceClientIDExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestClientID": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestClientIDExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceUserClassID": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceUserClassIDExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestUserClassID": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestUserClassIDExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceVendorSpecificInfo": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceVendorSpecificInfoExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceVendorSpecificInfoEnterprise": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SourceVendorSpecificInfoSubOption": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "255"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"DestVendorSpecificInfo": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestVendorSpecificInfoExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestVendorSpecificInfoEnterprise": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DestVendorSpecificInfoSubOption": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "255"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"TCPACK": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TCPACKExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IPLengthMin": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IPLengthMax": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IPLengthExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DSCPCheck": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1", 
+						"max": "63"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"DSCPExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DSCPMark": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-2"
+					}, 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "qos", 
+								"section": {
+									"type": "classify", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "dscp"
+								}
+							}
+						}
+					]
+				}, 
+				"EthernetPriorityCheck": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"EthernetPriorityExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"EthernetPriorityMark": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-2"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"InnerEthernetPriorityCheck": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"InnerEthernetPriorityExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"InnerEthernetPriorityMark": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-2"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"EthernetDEICheck": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"EthernetDEIExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"VLANIDCheck": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"VLANIDExclude": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"OutOfBandInfo": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"ForwardingPolicy": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TrafficClass": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Policer": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"App": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}, 
+			"Device.QoS.App.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ProtocolIdentifier": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DefaultForwardingPolicy": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DefaultTrafficClass": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DefaultPolicer": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DefaultDSCPMark": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-2"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"DefaultEthernetPriorityMark": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-2"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"DefaultInnerEthernetPriorityMark": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-2"
+					}, 
+					"read": true, 
+					"write": true
+				}
+			}, 
+			"Device.QoS.Flow.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Type": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TypeParameters": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"App": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ForwardingPolicy": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TrafficClass": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Policer": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DSCPMark": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-2"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"EthernetPriorityMark": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-2"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"InnerEthernetPriorityMark": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-2"
+					}, 
+					"read": true, 
+					"write": true
+				}
+			}, 
+			"Device.QoS.Policer.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"CommittedRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "bits per second", 
+					"read": true, 
+					"write": true
+				}, 
+				"CommittedBurstSize": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ExcessBurstSize": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PeakRate": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "bits per second", 
+					"read": true, 
+					"write": true
+				}, 
+				"PeakBurstSize": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"MeterType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PossibleMeterTypes": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"SimpleTokenBucket", 
+						"SingleRateThreeColor", 
+						"TwoRateThreeColor"
+					]
+				}, 
+				"ConformingAction": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PartialConformingAction": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"NonConformingAction": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TotalCountedPackets": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"TotalCountedBytes": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ConformingCountedPackets": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ConformingCountedBytes": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PartiallyConformingCountedPackets": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PartiallyConformingCountedBytes": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NonConformingCountedPackets": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NonConformingCountedBytes": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.QoS.Queue.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "qos", 
+						"section": {
+							"type": "class"
+						}, 
+						"dmmapfile": "dmmap_qos"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TrafficClasses": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AllInterfaces": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"HardwareAssisted": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"BufferLength": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "qos", 
+								"section": {
+									"type": "class", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "maxsize"
+								}
+							}
+						}
+					]
+				}, 
+				"Weight": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Precedence": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"REDThreshold": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"max": "100"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"REDPercentage": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"max": "100"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"DropAlgorithm": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"RED", 
+						"DT", 
+						"WRED", 
+						"BLUE"
+					]
+				}, 
+				"SchedulerAlgorithm": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"WFQ", 
+						"WRR", 
+						"SP"
+					]
+				}, 
+				"ShapingRate": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "qos", 
+								"section": {
+									"type": "class", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "limitrate"
+								}
+							}
+						}
+					]
+				}, 
+				"ShapingBurstSize": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}, 
+			"Device.QoS.QueueStats.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Queue": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"OutputPackets": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"OutputBytes": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DroppedPackets": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DroppedBytes": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"QueueOccupancyPackets": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"QueueOccupancyPercentage": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "100"
+					}, 
+					"unit": "percent", 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.QoS.Shaper.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ShapingRate": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"ShapingBurstSize": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}
+		}, 
+		"Device.LANConfigSecurity.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"ConfigPassword": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}
+		}, 
+		"Device.Hosts.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"HostNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.Hosts.Host.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PhysAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AddressSource": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"DHCP", 
+						"Static", 
+						"AutoIP", 
+						"None"
+					]
+				}, 
+				"DHCPClient": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LeaseTimeRemaining": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"AssociatedDevice": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Layer1Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Layer3Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"VendorClassID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ClientID": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"UserClassID": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"HostName": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Active": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ActiveLastChange": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPv4AddressNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPv6AddressNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.Hosts.Host.{i}.IPv4Address.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"IPAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.Hosts.Host.{i}.IPv6Address.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"IPAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.Hosts.Host.{i}.WANStats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BytesSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"BytesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PacketsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ErrorsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"RetransCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscardPacketsSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.DNS.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"SupportedRecordTypes": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"A", 
+					"AAAA", 
+					"SRV", 
+					"PTR"
+				]
+			}, 
+			"Device.DNS.Client.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"ServerNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.DNS.Client.Server.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DNSServer": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Type": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"DHCP", 
+							"DHCPv4", 
+							"DHCPv6", 
+							"RouterAdvertisement", 
+							"IPCP", 
+							"Static"
+						]
+					}
+				}
+			}, 
+			"Device.DNS.Relay.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"ForwardNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.DNS.Relay.Forwarding.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DNSServer": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Type": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"DHCP", 
+							"DHCPv4", 
+							"DHCPv6", 
+							"RouterAdvertisement", 
+							"IPCP", 
+							"Static"
+						]
+					}
+				}
+			}, 
+			"Device.DNS.Diagnostics.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Device.DNS.Diagnostics.NSLookupDiagnostics.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp"
+					], 
+					"access": false, 
+					"array": false, 
+					"DiagnosticsState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"None", 
+							"Requested", 
+							"Complete", 
+							"Error_DNSServerNotResolved", 
+							"Error_Internal", 
+							"Error_Other"
+						]
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"HostName": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DNSServer": {
+						"type": "string", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Timeout": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"NumberOfRepetitions": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SuccessCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ResultNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.DNS.Diagnostics.NSLookupDiagnostics.Result.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp"
+						], 
+						"access": false, 
+						"array": true, 
+						"Status": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Success", 
+								"Error_DNSServerNotAvailable", 
+								"Error_HostNameNotResolved", 
+								"Error_Timeout", 
+								"Error_Other"
+							]
+						}, 
+						"AnswerType": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"None", 
+								"Authoritative", 
+								"NonAuthoritative"
+							]
+						}, 
+						"HostNameReturned": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"IPAddresses": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"DNSServerIP": {
+							"type": "string", 
+							"protocols": [
+								"cwmp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ResponseTime": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp"
+							], 
+							"unit": "milliseconds", 
+							"read": true, 
+							"write": false
+						}
+					}
+				}
+			}, 
+			"Device.DNS.SD.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ServiceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AdvertisedInterfaces": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Device.DNS.SD.Service.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"InstanceName": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ApplicationProtocol": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TransportProtocol": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"TCP", 
+							"UDP"
+						]
+					}, 
+					"Domain": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Port": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"Target": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"LeaseActive", 
+							"GoodbyeReceived", 
+							"LeaseExpired"
+						]
+					}, 
+					"LastUpdate": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Host": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TimeToLive": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "2147483647"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"Priority": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"Weight": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"TextRecordNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.DNS.SD.Service.{i}.TextRecord.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"Key": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Value": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}
+			}
+		}, 
+		"Device.NAT.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"InterfaceSettingNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "firewall", 
+							"section": {
+								"type": "zone"
+							}
+						}
+					}
+				]
+			}, 
+			"PortMappingNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "firewall", 
+							"section": {
+								"type": "redirect"
+							}
+						}
+					}
+				]
+			}, 
+			"Device.NAT.InterfaceSetting.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "firewall", 
+						"section": {
+							"type": "zone"
+						}, 
+						"dmmapfile": "dmmap_firewall"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "firewall", 
+								"section": {
+									"type": "zone", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "masq"
+								}
+							}
+						}
+					]
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Enabled_NATForcedDisabled", 
+						"Enabled_PortMappingDisabled", 
+						"Error_Misconfigured", 
+						"Error"
+					], 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "firewall", 
+								"section": {
+									"type": "zone", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "masq"
+								}
+							}
+						}
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}, 
+			"Device.NAT.PortMapping.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "firewall", 
+						"section": {
+							"type": "redirect"
+						}, 
+						"dmmapfile": "dmmap_firewall"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "firewall", 
+								"section": {
+									"type": "redirect", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "enabled"
+								}
+							}
+						}
+					]
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					], 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "firewall", 
+								"section": {
+									"type": "redirect", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "enabled"
+								}
+							}
+						}
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AllInterfaces": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"LeaseDuration": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"RemoteHost": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "firewall", 
+								"section": {
+									"type": "redirect", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "src_dip"
+								}
+							}
+						}
+					]
+				}, 
+				"ExternalPort": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "firewall", 
+								"section": {
+									"type": "redirect", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "src_dport"
+								}
+							}
+						}
+					]
+				}, 
+				"ExternalPortEndRange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "firewall", 
+								"section": {
+									"type": "redirect", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "src_dport"
+								}
+							}
+						}
+					]
+				}, 
+				"InternalPort": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "firewall", 
+								"section": {
+									"type": "redirect", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "dest_port"
+								}
+							}
+						}
+					]
+				}, 
+				"Protocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"TCP", 
+						"UDP"
+					], 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "firewall", 
+								"section": {
+									"type": "redirect", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "proto"
+								}
+							}
+						}
+					]
+				}, 
+				"InternalClient": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "firewall", 
+								"section": {
+									"type": "redirect", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "dest_ip"
+								}
+							}
+						}
+					]
+				}, 
+				"Description": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "firewall", 
+								"section": {
+									"type": "redirect", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "name"
+								}
+							}
+						}
+					]
+				}
+			}
+		}, 
+		"Device.PCP.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"SupportedVersions": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"range": {
+					"min": "0", 
+					"max": "65535"
+				}, 
+				"read": true, 
+				"write": false
+			}, 
+			"PreferredVersion": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"range": {
+					"min": "0", 
+					"max": "65535"
+				}, 
+				"read": true, 
+				"write": true
+			}, 
+			"OptionList": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"range": {
+					"min": "0", 
+					"max": "254"
+				}, 
+				"read": true, 
+				"write": false
+			}, 
+			"ClientNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.PCP.Client.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"WANInterface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"MAPEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PEEREnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ANNOUNCEEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"THIRDPARTYEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"THIRDPARTYStatus": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"FILTEREnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ServerNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.PCP.Client.{i}.PCPProxy.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"HighestVersion": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error"
+						]
+					}
+				}, 
+				"Device.PCP.Client.{i}.UPnPIWF.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error"
+						]
+					}
+				}, 
+				"Device.PCP.Client.{i}.Server.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Connecting", 
+							"Error_Timeout", 
+							"Error_HostNameNotResolved", 
+							"Error_NetworkFailure", 
+							"Error_NotAuthorized", 
+							"Error_Unsupported", 
+							"Error"
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Origin": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"DHCPv4", 
+							"DHCPv6", 
+							"Static"
+						]
+					}, 
+					"ServerNameOrAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ServerAddressInUse": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"AdditionalServerAddresses": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ExternalIPAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"CurrentVersion": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"MaximumFilters": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"PortQuota": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"PreferredLifetime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"Capabilities": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"NAT44", 
+							"StatelessNAT64", 
+							"StatefulNAT64", 
+							"A+PPortRangeRouter", 
+							"SupportsPORTSETOption", 
+							"IPv4Firewall", 
+							"IPv6Firewall", 
+							"NPTv6", 
+							"DSCPReMarkingFunction", 
+							"FLOWDATAAwareFunction", 
+							"ILNPTranslator"
+						]
+					}, 
+					"InboundMappingNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"OutboundMappingNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.PCP.Client.{i}.Server.{i}.InboundMapping.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": true, 
+						"array": true, 
+						"Enable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Status": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Disabled", 
+								"Enabled", 
+								"Error_PCPErrorCodeReceived", 
+								"Error"
+							]
+						}, 
+						"ErrorCode": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "1", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Origin": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Internal", 
+								"UPnP_IWF", 
+								"PCP_Proxy", 
+								"Static"
+							]
+						}, 
+						"Lifetime": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "seconds", 
+							"read": true, 
+							"write": true
+						}, 
+						"SuggestedExternalIPAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"SuggestedExternalPort": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"SuggestedExternalPortEndRange": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"InternalPort": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "1", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"ProtocolNumber": {
+							"type": "int", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "-1", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"ThirdPartyAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Description": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"AssignedExternalIPAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"AssignedExternalPort": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"AssignedExternalPortEndRange": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"FilterNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.PCP.Client.{i}.Server.{i}.InboundMapping.{i}.Filter.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": true, 
+							"array": true, 
+							"Alias": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"RemoteHostIPAddress": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"PrefixLength": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"range": {
+									"min": "1", 
+									"max": "128"
+								}, 
+								"read": true, 
+								"write": true
+							}, 
+							"RemotePort": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"range": {
+									"min": "0", 
+									"max": "65535"
+								}, 
+								"read": true, 
+								"write": true
+							}, 
+							"RemotePortEndRange": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"range": {
+									"min": "0", 
+									"max": "65535"
+								}, 
+								"read": true, 
+								"write": false
+							}
+						}
+					}, 
+					"Device.PCP.Client.{i}.Server.{i}.OutboundMapping.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": true, 
+						"array": true, 
+						"Enable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Status": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Disabled", 
+								"Enabled", 
+								"Error_PCPErrorCodeReceived", 
+								"Error"
+							]
+						}, 
+						"ErrorCode": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "1", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Origin": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Internal", 
+								"UPnP_IWF", 
+								"PCP_Proxy", 
+								"Static"
+							]
+						}, 
+						"Lifetime": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "seconds", 
+							"read": true, 
+							"write": true
+						}, 
+						"SuggestedExternalIPAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"SuggestedExternalPort": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"RemoteHostIPAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"InternalPort": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "1", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"RemotePort": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "1", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"ProtocolNumber": {
+							"type": "int", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "-1", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"ThirdPartyAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Description": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"AssignedExternalIPAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"AssignedExternalPort": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": false
+						}
+					}
+				}
+			}
+		}, 
+		"Device.DHCPv4.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"ClientNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.DHCPv4.Client.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "network", 
+						"section": {
+							"type": "interface"
+						}, 
+						"dmmapfile": "dmmap_dhcp_client"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "interface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "disabled"
+								}
+							}
+						}
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					], 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "interface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "disabled"
+								}
+							}
+						}
+					]
+				}, 
+				"DHCPStatus": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Init", 
+						"Selecting", 
+						"Requesting", 
+						"Rebinding", 
+						"Bound", 
+						"Renewing"
+					], 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.interface", 
+								"method": "status", 
+								"args": {
+									"interface": "@Name"
+								}, 
+								"key": "ipv4-address[@i-1].address"
+							}
+						}
+					]
+				}, 
+				"Renew": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"IPAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SubnetMask": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"IPRouters": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.interface", 
+								"method": "status", 
+								"args": {
+									"interface": "@Name"
+								}, 
+								"key": "route[@i-1].target"
+							}
+						}
+					]
+				}, 
+				"DNSServers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.interface", 
+								"method": "status", 
+								"args": {
+									"interface": "@Name"
+								}, 
+								"key": "dns-server"
+							}
+						}
+					]
+				}, 
+				"LeaseTimeRemaining": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.interface", 
+								"method": "status", 
+								"args": {
+									"interface": "@Name"
+								}, 
+								"key": "data.leasetime"
+							}
+						}
+					]
+				}, 
+				"DHCPServer": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PassthroughEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PassthroughDHCPPool": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SentOptionNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "interface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "sendopts"
+								}
+							}
+						}
+					]
+				}, 
+				"ReqOptionNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "interface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "reqopts"
+								}
+							}
+						}
+					]
+				}, 
+				"Device.DHCPv4.Client.{i}.SentOption.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Tag": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "254"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Value": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.DHCPv4.Client.{i}.ReqOption.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Order": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Tag": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "254"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Value": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.DHCPv4.Server.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PoolNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.DHCPv4.Server.Pool.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"mapping": {
+						"type": "uci", 
+						"uci": {
+							"file": "dhcp", 
+							"section": {
+								"type": "dhcp"
+							}, 
+							"dmmapfile": "dmmap_dhcp"
+						}
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "dhcp", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "ignore"
+									}
+								}
+							}
+						]
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error_Misconfigured", 
+							"Error"
+						], 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "dhcp", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "ignore"
+									}
+								}
+							}
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Order": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"VendorClassID": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"VendorClassIDExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"VendorClassIDMode": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Exact", 
+							"Prefix", 
+							"Suffix", 
+							"Substring"
+						]
+					}, 
+					"ClientID": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ClientIDExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"UserClassID": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"UserClassIDExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Chaddr": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ChaddrMask": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ChaddrExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"MinAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "dhcp", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "start"
+									}
+								}
+							}
+						]
+					}, 
+					"MaxAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "dhcp", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "limit"
+									}
+								}
+							}
+						]
+					}, 
+					"ReservedAddresses": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SubnetMask": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "dhcp", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "netmask"
+									}
+								}
+							}
+						]
+					}, 
+					"DNSServers": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "cli", 
+								"cli": {
+									"command": "network.interface", 
+									"args": "status"
+								}
+							}
+						]
+					}, 
+					"DomainName": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"IPRouters": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"LeaseTime": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "dhcp", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "leasetime"
+									}
+								}
+							}
+						]
+					}, 
+					"StaticAddressNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "dhcp", 
+									"section": {
+										"type": "host"
+									}
+								}
+							}
+						]
+					}, 
+					"OptionNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ClientNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.DHCPv4.Server.Pool.{i}.StaticAddress.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": true, 
+						"array": true, 
+						"mapping": {
+							"type": "uci", 
+							"uci": {
+								"file": "dhcp", 
+								"section": {
+									"type": "host"
+								}, 
+								"dmmapfile": "dmmap_dhcp"
+							}
+						}, 
+						"Enable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Chaddr": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true, 
+							"mapping": [
+								{
+									"type": "uci", 
+									"uci": {
+										"file": "dhcp", 
+										"section": {
+											"type": "host", 
+											"index": "@i-1"
+										}, 
+										"option": {
+											"name": "mac"
+										}
+									}
+								}
+							]
+						}, 
+						"Yiaddr": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true, 
+							"mapping": [
+								{
+									"type": "uci", 
+									"uci": {
+										"file": "dhcp", 
+										"section": {
+											"type": "host", 
+											"index": "@i-1"
+										}, 
+										"option": {
+											"name": "ip"
+										}
+									}
+								}
+							]
+						}
+					}, 
+					"Device.DHCPv4.Server.Pool.{i}.Option.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": true, 
+						"array": true, 
+						"Enable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Tag": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "1", 
+								"max": "254"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"Value": {
+							"type": "hexBinary", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}, 
+					"Device.DHCPv4.Server.Pool.{i}.Client.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Chaddr": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Active": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"IPv4AddressNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"OptionNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.DHCPv4.Server.Pool.{i}.Client.{i}.IPv4Address.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"IPAddress": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"LeaseTimeRemaining": {
+								"type": "dateTime", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}, 
+						"Device.DHCPv4.Server.Pool.{i}.Client.{i}.Option.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"Tag": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"range": {
+									"min": "0", 
+									"max": "255"
+								}, 
+								"read": true, 
+								"write": false
+							}, 
+							"Value": {
+								"type": "hexBinary", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}
+					}
+				}
+			}, 
+			"Device.DHCPv4.Relay.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"ForwardingNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.DHCPv4.Relay.Forwarding.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"mapping": {
+						"type": "uci", 
+						"uci": {
+							"file": "network", 
+							"section": {
+								"type": "interface"
+							}, 
+							"dmmapfile": "dmmap_dhcp_relay"
+						}
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "disabled"
+									}
+								}
+							}
+						]
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error_Misconfigured", 
+							"Error"
+						], 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "disabled"
+									}
+								}
+							}
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Order": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"VendorClassID": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "vendorclass"
+									}
+								}
+							}
+						]
+					}, 
+					"VendorClassIDExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"VendorClassIDMode": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Exact", 
+							"Prefix", 
+							"Suffix", 
+							"Substring"
+						]
+					}, 
+					"ClientID": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ClientIDExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"UserClassID": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "userclass"
+									}
+								}
+							}
+						]
+					}, 
+					"UserClassIDExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Chaddr": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "mac"
+									}
+								}
+							}
+						]
+					}, 
+					"ChaddrMask": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "network", 
+									"section": {
+										"type": "interface", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "mac"
+									}
+								}
+							}
+						]
+					}, 
+					"ChaddrExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"LocallyServed": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DHCPServerIPAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}
+			}
+		}, 
+		"Device.DHCPv6.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"ClientNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.DHCPv6.Client.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "network", 
+						"section": {
+							"type": "interface"
+						}, 
+						"dmmapfile": "dmmap_dhcpv6"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "interface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "disabled"
+								}
+							}
+						}
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					], 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "interface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "disabled"
+								}
+							}
+						}
+					]
+				}, 
+				"DUID": {
+					"type": "hexBinary", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "ubus", 
+							"ubus": {
+								"object": "network.interface", 
+								"method": "status", 
+								"args": {
+									"interface": "@Name"
+								}, 
+								"key": "data.passthru"
+							}
+						}
+					]
+				}, 
+				"RequestAddresses": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "interface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "reqaddress"
+								}
+							}
+						}
+					]
+				}, 
+				"RequestPrefixes": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "interface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "reqprefix"
+								}
+							}
+						}
+					]
+				}, 
+				"RapidCommit": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Renew": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SuggestedT1": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"SuggestedT2": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"SupportedOptions": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"RequestedOptions": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "network", 
+								"section": {
+									"type": "interface", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "reqopts"
+								}
+							}
+						}
+					]
+				}, 
+				"ServerNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SentOptionNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ReceivedOptionNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.DHCPv6.Client.{i}.Server.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"SourceAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DUID": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"InformationRefreshTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.DHCPv6.Client.{i}.SentOption.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Tag": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Value": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.DHCPv6.Client.{i}.ReceivedOption.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"Tag": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"Value": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Server": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.DHCPv6.Server.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PoolNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.DHCPv6.Server.Pool.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"mapping": {
+						"type": "uci", 
+						"uci": {
+							"file": "dhcp", 
+							"section": {
+								"type": "dhcp"
+							}, 
+							"dmmapfile": "dmmap_dhcpv6"
+						}
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "dhcp", 
+									"section": {
+										"type": "dhcp", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "ignore"
+									}
+								}
+							}
+						]
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error_Misconfigured", 
+							"Error"
+						], 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "dhcp", 
+									"section": {
+										"type": "dhcp", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "ignore"
+									}
+								}
+							}
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Order": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DUID": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DUIDExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"VendorClassID": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "dhcp", 
+									"section": {
+										"type": "dhcp", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "vendorclass"
+									}
+								}
+							}
+						]
+					}, 
+					"VendorClassIDExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"UserClassID": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "dhcp", 
+									"section": {
+										"type": "dhcp", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "userclass"
+									}
+								}
+							}
+						]
+					}, 
+					"UserClassIDExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SourceAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SourceAddressMask": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SourceAddressExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"IANAEnable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"IANAManualPrefixes": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"IANAPrefixes": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"IAPDEnable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"IAPDManualPrefixes": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"IAPDPrefixes": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"IAPDAddLength": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "64"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"ClientNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"OptionNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.DHCPv6.Server.Pool.{i}.Client.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"SourceAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Active": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"IPv6AddressNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"IPv6PrefixNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"OptionNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.DHCPv6.Server.Pool.{i}.Client.{i}.IPv6Address.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"IPAddress": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PreferredLifetime": {
+								"type": "dateTime", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"ValidLifetime": {
+								"type": "dateTime", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}, 
+						"Device.DHCPv6.Server.Pool.{i}.Client.{i}.IPv6Prefix.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"Prefix": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PreferredLifetime": {
+								"type": "dateTime", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"ValidLifetime": {
+								"type": "dateTime", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}, 
+						"Device.DHCPv6.Server.Pool.{i}.Client.{i}.Option.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"Tag": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"range": {
+									"min": "0", 
+									"max": "65535"
+								}, 
+								"read": true, 
+								"write": false
+							}, 
+							"Value": {
+								"type": "hexBinary", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}
+					}, 
+					"Device.DHCPv6.Server.Pool.{i}.Option.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": true, 
+						"array": true, 
+						"Enable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Tag": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"Value": {
+							"type": "hexBinary", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"PassthroughClient": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}
+				}
+			}
+		}, 
+		"Device.IEEE8021x.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"SupplicantNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.IEEE8021x.Supplicant.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PAEState": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disconnected", 
+						"Logoff", 
+						"Connecting", 
+						"Authenticating", 
+						"Authenticated", 
+						"Held", 
+						"Restart", 
+						"ForceAuth", 
+						"ForceUnauth"
+					]
+				}, 
+				"EAPIdentity": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"MaxStart": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1", 
+						"max": "10"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"StartPeriod": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"HeldPeriod": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"AuthPeriod": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"AuthenticationCapabilities": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"EAP-TLS", 
+						"EAP-MD5"
+					]
+				}, 
+				"StartFailurePolicy": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"FailAuthentication", 
+						"AssumeAuthentication"
+					]
+				}, 
+				"AuthenticationSuccessPolicy": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"NoAction", 
+						"RenewConnection"
+					]
+				}, 
+				"Reset": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Disconnect": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Device.IEEE8021x.Supplicant.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"ReceivedFrames": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TransmittedFrames": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TransmittedStartFrames": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TransmittedLogoffFrames": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TransmittedResponseIdFrames": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TransmittedResponseFrames": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ReceivedRequestIdFrames": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ReceivedRequestFrames": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ReceivedInvalidFrames": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ReceivedLengthErrorFrames": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LastFrameVersion": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LastFrameSourceMACAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.IEEE8021x.Supplicant.{i}.EAPMD5.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SharedSecret": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.IEEE8021x.Supplicant.{i}.EAPTLS.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"MutualAuthenticationEnable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}
+			}
+		}, 
+		"Device.Users.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"UserNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "users", 
+							"section": {
+								"type": "user"
+							}
+						}
+					}
+				]
+			}, 
+			"Device.Users.User.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "users", 
+						"section": {
+							"type": "user"
+						}, 
+						"dmmapfile": "dmmap_users"
+					}
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "users", 
+								"section": {
+									"type": "user", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "enabled"
+								}
+							}
+						}
+					]
+				}, 
+				"RemoteAccessCapable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "users", 
+								"section": {
+									"type": "user", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "remote_access"
+								}
+							}
+						}
+					]
+				}, 
+				"Username": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Password": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "users", 
+								"section": {
+									"type": "user", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "password"
+								}
+							}
+						}
+					]
+				}, 
+				"Language": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "users", 
+								"section": {
+									"type": "user", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "language"
+								}
+							}
+						}
+					]
+				}
+			}
+		}, 
+		"Device.SmartCardReaders.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"SmartCardReaderNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.SmartCardReaders.SmartCardReader.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error"
+					]
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Reset": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ResetTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DecryptionFailedCounter": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DecryptionFailedNoKeyCounter": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.SmartCardReaders.SmartCardReader.{i}.SmartCard.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"None", 
+							"Running", 
+							"Error"
+						]
+					}, 
+					"Type": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"CA", 
+							"DRM", 
+							"UICC"
+						]
+					}, 
+					"Application": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"SIM", 
+							"USIM", 
+							"ISIM"
+						]
+					}, 
+					"SerialNumber": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ATR": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.UPnP.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Device.UPnP.Device.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "upnpd", 
+								"section": {
+									"type": "upnpd", 
+									"name": "config"
+								}, 
+								"option": {
+									"name": "enabled"
+								}
+							}
+						}
+					]
+				}, 
+				"UPnPMediaServer": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"UPnPMediaRenderer": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"UPnPWLANAccessPoint": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"UPnPQoSDevice ": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"UPnPQoSPolicyHolder": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"UPnPIGD": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"UPnPDMBasicMgmt": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"UPnPDMConfigurationMgmt": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"UPnPDMSoftwareMgmt": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Device.UPnP.Device.Capabilities.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"UPnPArchitecture": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UPnPArchitectureMinorVer": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UPnPMediaServer": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UPnPMediaRenderer": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UPnPWLANAccessPoint": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UPnPBasicDevice": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UPnPQoSDevice": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UPnPQoSPolicyHolder": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UPnPIGD": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UPnPDMBasicMgmt": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UPnPDMConfigurationMgmt": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UPnPDMSoftwareMgmt": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.UPnP.Discovery.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"RootDeviceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DeviceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ServiceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.UPnP.Discovery.RootDevice.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"LeaseActive", 
+							"LeaseExpired", 
+							"ByebyeReceived"
+						]
+					}, 
+					"UUID": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"USN": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LeaseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"Location": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Server": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Host": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LastUpdate": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.UPnP.Discovery.Device.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"LeaseActive", 
+							"LeaseExpired", 
+							"ByebyeReceived"
+						]
+					}, 
+					"UUID": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"USN": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LeaseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"Location": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Server": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Host": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LastUpdate": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.UPnP.Discovery.Service.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"LeaseActive", 
+							"LeaseExpired", 
+							"ByebyeReceived"
+						]
+					}, 
+					"USN": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LeaseTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"Location": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Server": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Host": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LastUpdate": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ParentDevice": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.UPnP.Description.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"DeviceDescriptionNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DeviceInstanceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ServiceInstanceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.UPnP.Description.DeviceDescription.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"URLBase": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SpecVersion": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Host": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.UPnP.Description.DeviceInstance.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"UDN": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ParentDevice": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DiscoveryDevice": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DeviceType": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"FriendlyName": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"DeviceCategory": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Manufacturer": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ManufacturerOUI": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ManufacturerURL": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ModelDescription": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ModelName": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ModelNumber": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ModelURL": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SerialNumber": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UPC": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PresentationURL": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.UPnP.Description.ServiceInstance.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"ParentDevice": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ServiceId": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ServiceDiscovery": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ServiceType": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SCPDURL": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ControlURL": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"EventSubURL": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.DLNA.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Device.DLNA.Capabilities.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"HNDDeviceClass": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"DeviceCapability": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"HIDDeviceClass": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ImageClassProfileID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AudioClassProfileID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AVClassProfileID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MediaCollectionProfileID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PrinterClassProfileID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}
+		}, 
+		"Device.SelfTestDiagnostics.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp"
+			], 
+			"access": false, 
+			"array": false, 
+			"DiagnosticsState": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": true, 
+				"values": [
+					"None", 
+					"Requested", 
+					"Complete", 
+					"Error_Internal", 
+					"Error_Other"
+				]
+			}, 
+			"Results": {
+				"type": "string", 
+				"protocols": [
+					"cwmp"
+				], 
+				"read": true, 
+				"write": false
+			}
+		}, 
+		"Device.Firewall.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Enable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"Config": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true, 
+				"values": [
+					"High", 
+					"Low", 
+					"Off", 
+					"Advanced"
+				]
+			}, 
+			"AdvancedLevel": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"Type": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"Stateless", 
+					"Stateful"
+				]
+			}, 
+			"Version": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"LastChange": {
+				"type": "dateTime", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"LevelNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ChainNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.Firewall.Level.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Description": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Order": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Chain": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PortMappingEnabled": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DefaultPolicy": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"Drop", 
+						"Accept", 
+						"Reject"
+					]
+				}, 
+				"DefaultLogPolicy": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}, 
+			"Device.Firewall.Chain.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Creator": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Defaults", 
+						"PortMapping", 
+						"WANIPv6FirewallControl", 
+						"ACS", 
+						"UserInterface", 
+						"Other"
+					]
+				}, 
+				"RuleNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "firewall", 
+								"section": {
+									"type": "rule"
+								}
+							}
+						}
+					]
+				}, 
+				"Device.Firewall.Chain.{i}.Rule.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"mapping": {
+						"type": "uci", 
+						"uci": {
+							"file": "firewall", 
+							"section": {
+								"type": "rule"
+							}, 
+							"dmmapfile": "dmmap_firewall"
+						}
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "firewall", 
+									"section": {
+										"type": "rule", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "enabled"
+									}
+								}
+							}
+						]
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Enabled", 
+							"Error_Misconfigured", 
+							"Error"
+						], 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "firewall", 
+									"section": {
+										"type": "rule", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "enabled"
+									}
+								}
+							}
+						]
+					}, 
+					"Order": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Description": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Target": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Drop", 
+							"Accept", 
+							"Reject", 
+							"Return", 
+							"TargetChain"
+						], 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "firewall", 
+									"section": {
+										"type": "rule", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "target"
+									}
+								}
+							}
+						]
+					}, 
+					"TargetChain": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Log": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"CreationDate": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ExpiryDate": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SourceInterface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SourceInterfaceExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SourceAllInterfaces": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DestInterface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DestInterfaceExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DestAllInterfaces": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"IPVersion": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1", 
+							"max": "15"
+						}, 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "firewall", 
+									"section": {
+										"type": "rule", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "family"
+									}
+								}
+							}
+						]
+					}, 
+					"DestIP": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DestMask": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "firewall", 
+									"section": {
+										"type": "rule", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "dest_ip"
+									}
+								}
+							}
+						]
+					}, 
+					"DestIPExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SourceIP": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SourceMask": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "firewall", 
+									"section": {
+										"type": "rule", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "src_ip"
+									}
+								}
+							}
+						]
+					}, 
+					"SourceIPExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Protocol": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1", 
+							"max": "255"
+						}, 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "firewall", 
+									"section": {
+										"type": "rule", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "proto"
+									}
+								}
+							}
+						]
+					}, 
+					"ProtocolExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DestPort": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "firewall", 
+									"section": {
+										"type": "rule", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "dest_port"
+									}
+								}
+							}
+						]
+					}, 
+					"DestPortRangeMax": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "firewall", 
+									"section": {
+										"type": "rule", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "dest_port"
+									}
+								}
+							}
+						]
+					}, 
+					"DestPortExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SourcePort": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "firewall", 
+									"section": {
+										"type": "rule", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "src_port"
+									}
+								}
+							}
+						]
+					}, 
+					"SourcePortRangeMax": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "firewall", 
+									"section": {
+										"type": "rule", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "src_port"
+									}
+								}
+							}
+						]
+					}, 
+					"SourcePortExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DSCP": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1", 
+							"max": "63"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"DSCPExclude": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}
+			}
+		}, 
+		"Device.PeriodicStatistics.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"MinSampleInterval": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"unit": "seconds", 
+				"read": true, 
+				"write": false
+			}, 
+			"MaxReportSamples": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"SampleSetNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.PeriodicStatistics.SampleSet.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Trigger"
+					]
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SampleInterval": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"ReportSamples": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"TimeReference": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"FetchSamples": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ForceSample": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ReportStartTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ReportEndTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SampleSeconds": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"ParameterNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Reference": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SampleMode": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Current", 
+							"Change"
+						]
+					}, 
+					"CalculationMode": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Latest", 
+							"Minimum", 
+							"Maximum", 
+							"Average"
+						]
+					}, 
+					"LowThreshold": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"HighThreshold": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SampleSeconds": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"SuspectData": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "1"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"Values": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Failures": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.FaultMgmt.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"SupportedAlarmNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"MaxCurrentAlarmEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"CurrentAlarmNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"HistoryEventNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ExpeditedEventNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"QueuedEventNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.FaultMgmt.SupportedAlarm.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"EventType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ProbableCause": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SpecificProblem": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PerceivedSeverity": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"", 
+						"*", 
+						"Cleared", 
+						"Critical", 
+						"Major", 
+						"Minor", 
+						"Warning", 
+						"Indeterminate"
+					]
+				}, 
+				"ReportingMechanism": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"0 Expedited", 
+						"1 Queued", 
+						"2 Logged", 
+						"3 Disabled"
+					]
+				}
+			}, 
+			"Device.FaultMgmt.CurrentAlarm.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"AlarmIdentifier": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AlarmRaisedTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AlarmChangedTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ManagedObjectInstance": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"EventType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ProbableCause": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SpecificProblem": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PerceivedSeverity": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Critical", 
+						"Major", 
+						"Minor", 
+						"Warning", 
+						"Indeterminate"
+					]
+				}, 
+				"AdditionalText": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AdditionalInformation": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.FaultMgmt.HistoryEvent.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"EventTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AlarmIdentifier": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NotificationType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"NewAlarm", 
+						"ChangedAlarm", 
+						"ClearedAlarm"
+					]
+				}, 
+				"ManagedObjectInstance": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"EventType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ProbableCause": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SpecificProblem": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PerceivedSeverity": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Cleared", 
+						"Critical", 
+						"Major", 
+						"Minor", 
+						"Warning", 
+						"Indeterminate"
+					]
+				}, 
+				"AdditionalText": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AdditionalInformation": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.FaultMgmt.ExpeditedEvent.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"EventTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AlarmIdentifier": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NotificationType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"NewAlarm", 
+						"ChangedAlarm", 
+						"ClearedAlarm"
+					]
+				}, 
+				"ManagedObjectInstance": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"EventType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ProbableCause": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SpecificProblem": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PerceivedSeverity": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Cleared", 
+						"Critical", 
+						"Major", 
+						"Minor", 
+						"Warning", 
+						"Indeterminate"
+					]
+				}, 
+				"AdditionalText": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AdditionalInformation": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.FaultMgmt.QueuedEvent.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"EventTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AlarmIdentifier": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NotificationType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"NewAlarm", 
+						"ChangedAlarm", 
+						"ClearedAlarm"
+					]
+				}, 
+				"ManagedObjectInstance": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"EventType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ProbableCause": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SpecificProblem": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"PerceivedSeverity": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Cleared", 
+						"Critical", 
+						"Major", 
+						"Minor", 
+						"Warning", 
+						"Indeterminate"
+					]
+				}, 
+				"AdditionalText": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AdditionalInformation": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}
+		}, 
+		"Device.Security.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"CertificateNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.Security.Certificate.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"LastModif": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SerialNumber": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Issuer": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NotBefore": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NotAfter": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Subject": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SubjectAlt": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"SignatureAlgorithm": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}
+		}, 
+		"Device.FAP.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Device.FAP.GPS.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"ScanOnBoot": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ScanPeriodically": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PeriodicInterval": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"PeriodicTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ContinuousGPS": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ScanTimeout": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"ScanStatus": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Indeterminate", 
+						"InProgress", 
+						"Success", 
+						"Error", 
+						"Error_TIMEOUT"
+					]
+				}, 
+				"ErrorDetails": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastScanTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastSuccessfulScanTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LockedLatitude": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-90000000", 
+						"max": "90000000"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"LockedLongitude": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-180000000", 
+						"max": "180000000"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"NumberOfSatellites": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"GPSReset": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Device.FAP.GPS.ContinuousGPSStatus.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"CurrentFix": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"GotFix": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TimingGood": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Latitude": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-90000000", 
+							"max": "90000000"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"Longitude": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-180000000", 
+							"max": "180000000"
+						}, 
+						"read": true, 
+						"write": false
+					}, 
+					"Elevation": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-5000000", 
+							"max": "25000000"
+						}, 
+						"unit": "millimeters", 
+						"read": true, 
+						"write": false
+					}, 
+					"LastFixTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LastFixDuration": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"FirstFixTimeout": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"SatellitesTracked": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SatelliteTrackingInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "60", 
+							"max": "3600"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"ReceiverStatus": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LocationType": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Real", 
+							"Reference"
+						]
+					}, 
+					"LockTimeOutDuration": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "120", 
+							"max": "86400"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.FAP.GPS.AGPSServerConfig.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ServerURL": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ServerPort": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Username": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Password": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ReferenceLatitude": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-90000000", 
+							"max": "90000000"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"ReferenceLongitude": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-180000000", 
+							"max": "180000000"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"ServerInUse": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.FAP.PerfMgmt.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"ConfigNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.FAP.PerfMgmt.Config.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"URL": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Username": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Password": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"PeriodicUploadInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"PeriodicUploadTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}
+			}, 
+			"Device.FAP.ApplicationPlatform.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"Version": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Reset", 
+						"Initializing"
+					]
+				}, 
+				"MaxNumberOfApplications": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"CurrentNumberofApplications": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.FAP.ApplicationPlatform.Capabilities.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"PresenceApplicationSupport": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"FemtoAwarenessAPISupport": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SMSAPISupport": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SubscribeToNotificationsOfSMSSentToApplicationSupport": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"QuerySMSDeliveryStatusSupport": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MMSAPISupport": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"QueryMMSDeliveryStatusSupport": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SubscribeToNotificationsOfMMSSentToApplicationSupport": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TerminalLocationAPISupport": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"AuthenticationMethodsSupported": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Basic", 
+							"Digest", 
+							"DigitalSignature"
+						]
+					}, 
+					"AccessLevelsSupported": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Guest", 
+							"Standard", 
+							"Restricted", 
+							"Administrator", 
+							"Debug"
+						]
+					}, 
+					"SendSMSTargetAddressType": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"TelUri", 
+							"AnonymousReference", 
+							"All"
+						]
+					}, 
+					"SendMMSTargetAddressType": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"TelUri", 
+							"AnonymousReference", 
+							"All"
+						]
+					}
+				}, 
+				"Device.FAP.ApplicationPlatform.Control.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"AuthenticationMethod": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"TunnelInst": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Device.FAP.ApplicationPlatform.Control.FemtoAwareness.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"APIEnable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"QueueEnable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Queueing ": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true, 
+							"values": [
+								"FiFo", 
+								"Priority"
+							]
+						}, 
+						"MaxAPIUsersNumber": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"FemtozoneID": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"NotificationsUserIdentifierMSISDN": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"SubscribeToNotificationsResponseCallbackData": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"QueryFemtocellResponseTimezone": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}, 
+					"Device.FAP.ApplicationPlatform.Control.SMS.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"APIEnable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"QueueEnable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Queueing ": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true, 
+							"values": [
+								"FiFo", 
+								"Priority"
+							]
+						}, 
+						"MaxAPIUsersNumber": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"MinSendSMSTimeInterval": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "3599"
+							}, 
+							"unit": "seconds", 
+							"read": true, 
+							"write": true
+						}, 
+						"EnableQuerySMSDeliveryStatus": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"EnableSubscribeToNotificationsOfMessageSentToApplication": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}, 
+					"Device.FAP.ApplicationPlatform.Control.MMS.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"APIEnable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"QueueEnable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Queueing ": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true, 
+							"values": [
+								"FiFo", 
+								"Priority"
+							]
+						}, 
+						"MaxAPIUsersNumber": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"MinSendMMSTimeInterval": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "3599"
+							}, 
+							"unit": "seconds", 
+							"read": true, 
+							"write": true
+						}, 
+						"EnableQueryMMSDeliveryStatus": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"EnableSubscribeToNotificationsOfMessageSentToApplication": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}, 
+					"Device.FAP.ApplicationPlatform.Control.TerminalLocation.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"APIEnable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"QueueEnable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Queueing ": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true, 
+							"values": [
+								"FiFo", 
+								"Priority"
+							]
+						}, 
+						"MaxAPIUsersNumber": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"QueryMobileLocationResponseAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true, 
+							"values": [
+								"TelUri", 
+								"AnonymousReference"
+							]
+						}, 
+						"QueryMobileLocationResponseLongitudeLatitude": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"QueryMobileLocationResponseAltitude": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"QueryMobileLocationResponseTimestamp": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "86399"
+							}, 
+							"unit": "seconds", 
+							"read": true, 
+							"write": true
+						}
+					}
+				}, 
+				"Device.FAP.ApplicationPlatform.Monitoring.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"MonitoringInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"AuthenticationRequestsReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"AuthenticationRequestsRejected": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.FAP.ApplicationPlatform.Monitoring.FemtoAwareness.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"APIAvailable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"APIUsers": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"QueueState": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Disabled", 
+								"Ready", 
+								"Flushed"
+							]
+						}, 
+						"QueueNum": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"QueueReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"QueueDiscarded": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.FAP.ApplicationPlatform.Monitoring.SMS.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"APIAvailable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"APIUsers": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"QueueState": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Disabled", 
+								"Ready", 
+								"Flushed"
+							]
+						}, 
+						"QueueNum": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"QueueReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"QueueDiscarded": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.FAP.ApplicationPlatform.Monitoring.MMS.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"APIAvailable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"APIUsers": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"QueueState": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Disabled", 
+								"Ready", 
+								"Flushed"
+							]
+						}, 
+						"QueueNum": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"QueueReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"QueueDiscarded": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.FAP.ApplicationPlatform.Monitoring.TerminalLocation.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"APIAvailable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"APIUsers": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"QueueState": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Disabled", 
+								"Ready", 
+								"Flushed"
+							]
+						}, 
+						"QueueNum": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "255"
+							}, 
+							"read": true, 
+							"write": false
+						}, 
+						"QueueReceived": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"QueueDiscarded": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}
+			}
+		}, 
+		"Device.BulkData.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Enable": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"Status": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"Enabled", 
+					"Disabled", 
+					"Error"
+				]
+			}, 
+			"MinReportingInterval": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"unit": "seconds", 
+				"read": true, 
+				"write": false
+			}, 
+			"Protocols": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"Streaming", 
+					"File", 
+					"HTTP"
+				]
+			}, 
+			"EncodingTypes": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"XML", 
+					"XDR", 
+					"CSV", 
+					"JSON"
+				]
+			}, 
+			"ParameterWildCardSupported": {
+				"type": "boolean", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"MaxNumberOfProfiles": {
+				"type": "int", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"range": {
+					"min": "-1"
+				}, 
+				"read": true, 
+				"write": false
+			}, 
+			"MaxNumberOfParameterReferences": {
+				"type": "int", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"range": {
+					"min": "-1"
+				}, 
+				"read": true, 
+				"write": false
+			}, 
+			"ProfileNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.BulkData.Profile.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"NumberOfRetainedFailedReports": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Protocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"EncodingType": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ReportingInterval": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"TimeReference": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"StreamingHost": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"StreamingPort": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"StreamingSessionID": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "48", 
+						"max": "57"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"FileTransferURL": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"FileTransferUsername": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"FileTransferPassword": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ControlFileFormat": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ParameterNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Controller": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.BulkData.Profile.{i}.Parameter.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Reference": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.BulkData.Profile.{i}.CSVEncoding.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"FieldSeparator": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"RowSeparator": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"EscapeCharacter": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ReportFormat": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"ParameterPerRow", 
+							"ParameterPerColumn"
+						]
+					}, 
+					"RowTimestamp": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Unix-Epoch", 
+							"ISO-8601", 
+							"None"
+						]
+					}
+				}, 
+				"Device.BulkData.Profile.{i}.JSONEncoding.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"ReportFormat": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"ObjectHierarchy", 
+							"NameValuePair"
+						]
+					}, 
+					"ReportTimestamp": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Unix-Epoch", 
+							"ISO-8601", 
+							"None"
+						]
+					}
+				}, 
+				"Device.BulkData.Profile.{i}.HTTP.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"URL": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Username": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Password": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"CompressionsSupported": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"GZIP", 
+							"Compress", 
+							"Deflate"
+						]
+					}, 
+					"Compression": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"MethodsSupported": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"POST", 
+							"PUT"
+						]
+					}, 
+					"Method": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"UseDateHeader": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"RetryEnable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"RetryMinimumWaitInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"RetryIntervalMultiplier": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1000", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"RequestURIParameterNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PersistAcrossReboot": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Device.BulkData.Profile.{i}.HTTP.RequestURIParameter.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": true, 
+						"array": true, 
+						"Name": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Reference": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}
+				}
+			}
+		}, 
+		"Device.XMPP.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"ConnectionNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"mapping": [
+					{
+						"type": "uci", 
+						"uci": {
+							"file": "cwmp_xmpp", 
+							"section": {
+								"type": "xmpp_connection"
+							}
+						}
+					}
+				]
+			}, 
+			"SupportedServerConnectAlgorithms": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"DNS-SRV", 
+					"DNS", 
+					"ServerTable", 
+					"WebSocket"
+				]
+			}, 
+			"Device.XMPP.Connection.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"mapping": {
+					"type": "uci", 
+					"uci": {
+						"file": "cwmp_xmpp", 
+						"section": {
+							"type": "xmpp_connection"
+						}, 
+						"dmmapfile": "dmmap_cwmp_xmpp"
+					}
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "cwmp_xmpp", 
+								"section": {
+									"type": "xmpp_connection", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "enable"
+								}
+							}
+						}
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "cwmp_xmpp", 
+								"section": {
+									"type": "xmpp_connection", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "connection_alias"
+								}
+							}
+						}
+					]
+				}, 
+				"Username": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "cwmp_xmpp", 
+								"section": {
+									"type": "xmpp_connection", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "username"
+								}
+							}
+						}
+					]
+				}, 
+				"Password": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "cwmp_xmpp", 
+								"section": {
+									"type": "xmpp_connection", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "password"
+								}
+							}
+						}
+					]
+				}, 
+				"Domain": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "cwmp_xmpp", 
+								"section": {
+									"type": "xmpp_connection", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "domain"
+								}
+							}
+						}
+					]
+				}, 
+				"Resource": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"JabberID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Enabled", 
+						"Disabled", 
+						"Unknown", 
+						"Dormant", 
+						"Connecting", 
+						"ServerNotPresent", 
+						"Error_Misconfigured", 
+						"Error_AuthenticationFailure", 
+						"Error"
+					], 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "cwmp_xmpp", 
+								"section": {
+									"type": "xmpp_connection", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "enable"
+								}
+							}
+						}
+					]
+				}, 
+				"LastChangeDate": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ServerConnectAlgorithm": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "cwmp_xmpp", 
+								"section": {
+									"type": "xmpp_connection", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "serveralgorithm"
+								}
+							}
+						}
+					]
+				}, 
+				"KeepAliveInterval": {
+					"type": "long", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "cwmp_xmpp", 
+								"section": {
+									"type": "xmpp_connection", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "interval"
+								}
+							}
+						}
+					]
+				}, 
+				"ServerConnectAttempts": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "cwmp_xmpp", 
+								"section": {
+									"type": "xmpp_connection", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "attempt"
+								}
+							}
+						}
+					]
+				}, 
+				"ServerRetryInitialInterval": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1", 
+						"max": "65535"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "cwmp_xmpp", 
+								"section": {
+									"type": "xmpp_connection", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "initial_retry_interval"
+								}
+							}
+						}
+					]
+				}, 
+				"ServerRetryIntervalMultiplier": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1000", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "cwmp_xmpp", 
+								"section": {
+									"type": "xmpp_connection", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "retry_interval_multiplier"
+								}
+							}
+						}
+					]
+				}, 
+				"ServerRetryMaxInterval": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "cwmp_xmpp", 
+								"section": {
+									"type": "xmpp_connection", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "retry_max_interval"
+								}
+							}
+						}
+					]
+				}, 
+				"UseTLS": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"mapping": [
+						{
+							"type": "uci", 
+							"uci": {
+								"file": "cwmp_xmpp", 
+								"section": {
+									"type": "xmpp_connection", 
+									"index": "@i-1"
+								}, 
+								"option": {
+									"name": "usetls"
+								}
+							}
+						}
+					]
+				}, 
+				"TLSEstablished": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ServerNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.XMPP.Connection.{i}.Server.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "cwmp_xmpp", 
+									"section": {
+										"type": "xmpp_connection", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "enable"
+									}
+								}
+							}
+						]
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "cwmp_xmpp", 
+									"section": {
+										"type": "xmpp_connection", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "connection_server_alias"
+									}
+								}
+							}
+						]
+					}, 
+					"Priority": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Weight": {
+						"type": "long", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-1", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"ServerAddress": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "cwmp_xmpp", 
+									"section": {
+										"type": "xmpp_connection", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "server_address"
+									}
+								}
+							}
+						]
+					}, 
+					"Port": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true, 
+						"mapping": [
+							{
+								"type": "uci", 
+								"uci": {
+									"file": "cwmp_xmpp", 
+									"section": {
+										"type": "xmpp_connection", 
+										"index": "@i-1"
+									}, 
+									"option": {
+										"name": "port"
+									}
+								}
+							}
+						]
+					}
+				}, 
+				"Device.XMPP.Connection.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"ReceivedMessages": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TransmittedMessages": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ReceivedErrorMessages": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TransmittedErrorMessages": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.IEEE1905.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"Version": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"1905.1", 
+					"1905.1a"
+				]
+			}, 
+			"Device.IEEE1905.AL.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"IEEE1905Id": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Up", 
+						"Down", 
+						"Unknown", 
+						"Dormant", 
+						"NotPresent", 
+						"LowerLayerDown", 
+						"Error"
+					]
+				}, 
+				"LastChange": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": false
+				}, 
+				"LowerLayers": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"RegistrarFreqBand": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"802.11 2.4 GHz", 
+						"802.11 5 GHz", 
+						"802.11 60 GHz"
+					]
+				}, 
+				"InterfaceNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.IEEE1905.AL.Interface.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"InterfaceId": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Up", 
+							"Down", 
+							"Unknown", 
+							"Dormant", 
+							"NotPresent", 
+							"LowerLayerDown", 
+							"Error"
+						]
+					}, 
+					"LastChange": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": false
+					}, 
+					"LowerLayers": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"InterfaceStackReference": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MediaType": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"IEEE 802.3u", 
+							"IEEE 802.3ab", 
+							"IEEE 802.11b", 
+							"IEEE 802.11g", 
+							"IEEE 802.11a", 
+							"IEEE 802.11n 2.4", 
+							"IEEE 802.11n 5.0", 
+							"IEEE 802.11ac", 
+							"IEEE 802.11ad", 
+							"IEEE 802.11af", 
+							"IEEE 1901 Wavelet", 
+							"IEEE 1901 FFT", 
+							"MoCAv1.1", 
+							"Generic PHY"
+						]
+					}, 
+					"GenericPhyOUI": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"GenericPhyVariant": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"GenericPhyURL": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SetIntfPowerStateEnabled": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"PowerState": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"On", 
+							"Power_Save", 
+							"Off", 
+							"Unsupported"
+						]
+					}, 
+					"VendorPropertiesNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LinkNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.IEEE1905.AL.Interface.{i}.VendorProperties.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"OUI": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Information": {
+							"type": "hexBinary", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.IEEE1905.AL.Interface.{i}.Link.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"InterfaceId": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"IEEE1905Id": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"MediaType": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"IEEE 802.3u", 
+								"IEEE 802.3ab", 
+								"IEEE 802.11b", 
+								"IEEE 802.11g", 
+								"IEEE 802.11a", 
+								"IEEE 802.11n 2.4", 
+								"IEEE 802.11n 5.0", 
+								"IEEE 802.11ac", 
+								"IEEE 802.11ad", 
+								"IEEE 802.11af", 
+								"IEEE 1901 Wavelet", 
+								"IEEE 1901 FFT", 
+								"MoCAv1.1", 
+								"Generic PHY"
+							]
+						}, 
+						"GenericPhyOUI": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"GenericPhyVariant": {
+							"type": "hexBinary", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"GenericPhyURL": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.IEEE1905.AL.Interface.{i}.Link.{i}.Metric.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": false, 
+							"IEEE802dot1Bridge": {
+								"type": "boolean", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketErrors": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"unit": "Packets", 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketErrorsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"unit": "Packets", 
+								"read": true, 
+								"write": false
+							}, 
+							"TransmittedPackets": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"unit": "Packets", 
+								"read": true, 
+								"write": false
+							}, 
+							"PacketsReceived": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"unit": "Packets", 
+								"read": true, 
+								"write": false
+							}, 
+							"MACThroughputCapacity": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"unit": "Mb/s", 
+								"read": true, 
+								"write": false
+							}, 
+							"LinkAvailability": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"range": {
+									"min": "0", 
+									"max": "100"
+								}, 
+								"unit": "percent", 
+								"read": true, 
+								"write": false
+							}, 
+							"PHYRate": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"unit": "Mb/s", 
+								"read": true, 
+								"write": false
+							}, 
+							"RSSI": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"range": {
+									"min": "0", 
+									"max": "255"
+								}, 
+								"unit": "dB", 
+								"read": true, 
+								"write": false
+							}
+						}
+					}
+				}, 
+				"Device.IEEE1905.AL.ForwardingTable.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"SetForwardingEnabled": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ForwardingRuleNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.IEEE1905.AL.ForwardingTable.ForwardingRule.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": true, 
+						"array": true, 
+						"InterfaceList": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"MACDestinationAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"MACDestinationAddressFlag": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"MACSourceAddress": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"MACSourceAddressFlag": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"EtherType": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"EtherTypeFlag": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Vid": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "4095"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"VidFlag": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"PCP": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "7"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"PCPFlag": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}
+				}, 
+				"Device.IEEE1905.AL.NetworkTopology.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Incomplete", 
+							"Available", 
+							"Error_Misconfigured"
+						]
+					}, 
+					"MaxChangeLogEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"LastChange": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"IEEE1905DeviceNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ChangeLogNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.IEEE1905.AL.NetworkTopology.ChangeLog.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"TimeStamp": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"EventType": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"NewNeighbor", 
+								"LostNeighbor"
+							]
+						}, 
+						"ReporterDeviceId": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ReporterInterfaceId": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"NeighborType": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"IEEE1905", 
+								"Non-IEEE1905"
+							]
+						}, 
+						"NeighborId": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"IEEE1905Id": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Version": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"1905.1", 
+								"1905.1a"
+							]
+						}, 
+						"RegistrarFreqBand": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"802.11 2.4 GHz", 
+								"802.11 5 GHz", 
+								"802.11 60 GHz"
+							]
+						}, 
+						"FriendlyName": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ManufacturerName": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ManufacturerModel": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ControlURL": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"VendorPropertiesNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"IPv4AddressNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"IPv6AddressNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"InterfaceNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"NonIEEE1905NeighborNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"IEEE1905NeighborNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"L2NeighborNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"BridgingTupleNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IPv4Address.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"MACAddress": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"IPv4Address": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"IPv4AddressType": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false, 
+								"values": [
+									"Unknown", 
+									"DHCP", 
+									"Static", 
+									"Auto-IP"
+								]
+							}, 
+							"DHCPServer": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}, 
+						"Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IPv6Address.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"MACAddress": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"IPv6Address": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"IPv6AddressType": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false, 
+								"values": [
+									"Unknown", 
+									"LinkLocal", 
+									"DHCP", 
+									"Static", 
+									"SLAAC"
+								]
+							}, 
+							"IPv6AddressOrigin": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}, 
+						"Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.VendorProperties.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"MessageType": {
+								"type": "hexBinary", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"OUI": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"Information": {
+								"type": "hexBinary", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}, 
+						"Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.Interface.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"InterfaceId": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"MediaType": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false, 
+								"values": [
+									"IEEE 802.3u", 
+									"IEEE 802.3ab", 
+									"IEEE 802.11b", 
+									"IEEE 802.11g", 
+									"IEEE 802.11a", 
+									"IEEE 802.11n 2.4", 
+									"IEEE 802.11n 5.0", 
+									"IEEE 802.11ac", 
+									"IEEE 802.11ad", 
+									"IEEE 802.11af", 
+									"IEEE 1901 Wavelet", 
+									"IEEE 1901 FFT", 
+									"MoCAv1.1", 
+									"Generic PHY"
+								]
+							}, 
+							"PowerState": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false, 
+								"values": [
+									"On", 
+									"Power_Save", 
+									"Off", 
+									"Unsupported"
+								]
+							}, 
+							"GenericPhyOUI": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"GenericPhyVariant": {
+								"type": "hexBinary", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"GenericPhyURL": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"NetworkMembership": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"Role": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false, 
+								"values": [
+									"AP", 
+									"non-AP/non-PCP STA", 
+									"Wi-Fi P2P Client", 
+									"Wi-Fi P2P Group Owner", 
+									"802.11adPCP"
+								]
+							}, 
+							"APChannelBand": {
+								"type": "hexBinary", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"FrequencyIndex1": {
+								"type": "hexBinary", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"FrequencyIndex2": {
+								"type": "hexBinary", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}, 
+						"Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.NonIEEE1905Neighbor.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"LocalInterface": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"NeighborInterfaceId": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}, 
+						"Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.L2Neighbor.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"LocalInterface": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"NeighborInterfaceId": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"BehindInterfaceIds": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}, 
+						"Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"LocalInterface": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"NeighborDeviceId": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"MetricNumberOfEntries": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}.Metric.{i}.": {
+								"type": "object", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"access": false, 
+								"array": true, 
+								"NeighborMACAddress": {
+									"type": "string", 
+									"protocols": [
+										"cwmp", 
+										"usp"
+									], 
+									"read": true, 
+									"write": false
+								}, 
+								"IEEE802dot1Bridge": {
+									"type": "boolean", 
+									"protocols": [
+										"cwmp", 
+										"usp"
+									], 
+									"read": true, 
+									"write": false
+								}, 
+								"PacketErrors": {
+									"type": "unsignedInt", 
+									"protocols": [
+										"cwmp", 
+										"usp"
+									], 
+									"unit": "Packets", 
+									"read": true, 
+									"write": false
+								}, 
+								"PacketErrorsReceived": {
+									"type": "unsignedInt", 
+									"protocols": [
+										"cwmp", 
+										"usp"
+									], 
+									"unit": "Packets", 
+									"read": true, 
+									"write": false
+								}, 
+								"TransmittedPackets": {
+									"type": "unsignedInt", 
+									"protocols": [
+										"cwmp", 
+										"usp"
+									], 
+									"unit": "Packets", 
+									"read": true, 
+									"write": false
+								}, 
+								"PacketsReceived": {
+									"type": "unsignedInt", 
+									"protocols": [
+										"cwmp", 
+										"usp"
+									], 
+									"unit": "Packets", 
+									"read": true, 
+									"write": false
+								}, 
+								"MACThroughputCapacity": {
+									"type": "unsignedInt", 
+									"protocols": [
+										"cwmp", 
+										"usp"
+									], 
+									"unit": "Mb/s", 
+									"read": true, 
+									"write": false
+								}, 
+								"LinkAvailability": {
+									"type": "unsignedInt", 
+									"protocols": [
+										"cwmp", 
+										"usp"
+									], 
+									"range": {
+										"min": "0", 
+										"max": "100"
+									}, 
+									"unit": "percent", 
+									"read": true, 
+									"write": false
+								}, 
+								"PHYRate": {
+									"type": "unsignedInt", 
+									"protocols": [
+										"cwmp", 
+										"usp"
+									], 
+									"unit": "Mb/s", 
+									"read": true, 
+									"write": false
+								}, 
+								"RSSI": {
+									"type": "unsignedInt", 
+									"protocols": [
+										"cwmp", 
+										"usp"
+									], 
+									"range": {
+										"min": "0", 
+										"max": "255"
+									}, 
+									"unit": "dB", 
+									"read": true, 
+									"write": false
+								}
+							}
+						}, 
+						"Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.BridgingTuple.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"InterfaceList": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}
+					}
+				}, 
+				"Device.IEEE1905.AL.Security.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"SetupMethod": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"UCPK", 
+							"PBC", 
+							"NFCNK"
+						]
+					}, 
+					"Password": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.IEEE1905.AL.NetworkingRegistrar.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Registrar2dot4": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Registrar5": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Registrar60": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.MQTT.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"ClientNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"BrokerNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.MQTT.Capabilities.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"ProtocolVersionsSupported": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"3.1", 
+						"3.1.1"
+					]
+				}, 
+				"TransportProtocolSupported": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"TCP/IP", 
+						"TLS", 
+						"WebSocket"
+					]
+				}, 
+				"MaxNumberOfClientSubscriptions": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxNumberOfBrokerBridges": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MaxNumberOfBrokerBridgeSubscriptions": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.MQTT.Client.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Connecting", 
+						"Connected", 
+						"Error_Misconfigured", 
+						"Error_BrokerUnreachable", 
+						"Error"
+					]
+				}, 
+				"ClientID": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Username": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Password": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TransportProtocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ProtocolVersion": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"CleanSession": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"MessageRetryTime": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"ConnectRetryTime": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"KeepAliveTime": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"max": "65535"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"ForceReconnect": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"BrokerAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"BrokerPort": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"WillEnable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"WillTopic": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"WillValue": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"WillQoS": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "2"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"WillRetain": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SubscriptionNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.MQTT.Client.{i}.Subscription.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Unsubscribed", 
+							"Subscribed", 
+							"Subscribing", 
+							"Unsubscribing", 
+							"Error"
+						]
+					}, 
+					"Topic": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"QoS": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "2"
+						}, 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.MQTT.Client.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"BrokerConnectionEstablished": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LastPublishMessageSent": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"LastPublishMessageReceived": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PublishSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PublishReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SubscribeSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"UnSubscribeSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MQTTMessagesSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MQTTMessagesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ConnectionErrors": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PublishErrors": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.MQTT.Broker.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"Enabled", 
+						"Error_Misconfigured", 
+						"Error"
+					]
+				}, 
+				"Port": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Username": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Password": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"BridgeNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.MQTT.Broker.{i}.Bridge.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Disabled", 
+							"Connecting", 
+							"Connected", 
+							"Enabled", 
+							"Error_Misconfigured", 
+							"Error_BrokerUnreachable", 
+							"Error"
+						]
+					}, 
+					"ClientID": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Username": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Password": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"TransportProtocol": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ProtocolVersion": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"CleanSession": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"MessageRetryTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"ConnectRetryTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"KeepAliveTime": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"max": "65535"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"ForceReconnect": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ServerSelectionAlgorithm": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Priority", 
+							"RoundRobin", 
+							"Random"
+						]
+					}, 
+					"ServerConnection": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ServerNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SubscriptionNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.MQTT.Broker.{i}.Bridge.{i}.Server.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": true, 
+						"array": true, 
+						"Enable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Priority": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"Weight": {
+							"type": "long", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "-1", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"Address": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Port": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "1", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}
+					}, 
+					"Device.MQTT.Broker.{i}.Bridge.{i}.Subscription.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": true, 
+						"array": true, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Enable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Status": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Enabled", 
+								"Disabled", 
+								"Error"
+							]
+						}, 
+						"Topic": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Direction": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true, 
+							"values": [
+								"out", 
+								"in", 
+								"both"
+							]
+						}, 
+						"QoS": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"range": {
+								"min": "0", 
+								"max": "2"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"LocalPrefix": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"RemotePrefix": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}
+				}, 
+				"Device.MQTT.Broker.{i}.Stats.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"TotalNumberOfClients": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"NumberOfActiveClients": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"NumberOfInactiveClients": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Subscriptions": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PublishSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PublishReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MQTTMessagesSent": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"MQTTMessagesReceived": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ConnectionErrors": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"PublishErrors": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.DynamicDNS.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"ClientNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ServerNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"SupportedServices": {
+				"type": "string", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.DynamicDNS.Client.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Connecting", 
+						"Authenticating", 
+						"Updated", 
+						"Error_Misconfigured", 
+						"Error", 
+						"Disabled"
+					]
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"LastError": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"NO_ERROR", 
+						"MISCONFIGURATION_ERROR", 
+						"DNS_ERROR", 
+						"CONNECTION_ERROR", 
+						"AUTHENTICATION_ERROR", 
+						"TIMEOUT_ERROR", 
+						"PROTOCOL_ERROR"
+					]
+				}, 
+				"Server": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Interface": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Username": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Password": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"HostnameNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.DynamicDNS.Client.{i}.Hostname.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Registered", 
+							"UpdateNeeded", 
+							"Updating", 
+							"Error", 
+							"Disabled"
+						]
+					}, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"LastUpdate": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}
+			}, 
+			"Device.DynamicDNS.Server.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ServiceName": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ServerAddress": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ServerPort": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "0", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"SupportedProtocols": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"HTTP", 
+						"HTTPS"
+					]
+				}, 
+				"Protocol": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"CheckInterval": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"RetryInterval": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"MaxRetries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}
+			}
+		}, 
+		"Device.LEDs.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"LEDNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.LEDs.LED.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Disabled", 
+						"InUse", 
+						"Controlled", 
+						"Error"
+					]
+				}, 
+				"Reason": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"CyclePeriodRepetitions": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"range": {
+						"min": "-1"
+					}, 
+					"read": true, 
+					"write": false
+				}, 
+				"Location": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Front", 
+						"Back", 
+						"Left", 
+						"Right", 
+						"Top", 
+						"Bottom"
+					]
+				}, 
+				"RelativeXPosition": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"RelativeYPosition": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"CycleElementNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.LEDs.LED.{i}.CycleElement.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Order": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "1"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Color": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Duration": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"FadeInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.LEDs.LED.{i}.CurrentCycleElement.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"CycleElementReference": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Color": {
+						"type": "hexBinary", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Duration": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "milliseconds", 
+						"read": true, 
+						"write": false
+					}
+				}
+			}
+		}, 
+		"Device.BASAPM.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"MeasurementEndpointNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.BASAPM.MeasurementEndpoint.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"MeasurementAgent": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"DeviceOwnership": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"ISP", 
+						"Customer"
+					]
+				}, 
+				"OperationalDomain": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"InternetDomain": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"UseMeasurementEndpointInReports": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Device.BASAPM.MeasurementEndpoint.{i}.ISPDevice.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"ReferencePoint": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"STP", 
+							"IDTP", 
+							"RNTP", 
+							"IRTP", 
+							"MTP", 
+							"IATP", 
+							"UNITP", 
+							"CEDTP"
+						]
+					}, 
+					"GeographicalLocation": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.BASAPM.MeasurementEndpoint.{i}.CustomerDevice.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"EquipmentIdentifier": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"CustomerIdentifier": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}
+			}
+		}, 
+		"Device.LMAP.": {
+			"type": "object", 
+			"protocols": [
+				"cwmp", 
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"MeasurementAgentNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ReportNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"EventNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.LMAP.MeasurementAgent.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Version": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"LastStarted": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"CapabilityTags": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Identifier": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"GroupIdentifier": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"MeasurementPoint": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"UseAgentIdentifierInReports": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"UseGroupIdentifierInReports": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"UseMeasurementPointInReports": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PublicCredential": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PrivateCredential": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"EventLog": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"TaskCapabilityNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ScheduleNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"TaskNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"CommunicationChannelNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"InstructionNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.LMAP.MeasurementAgent.{i}.TaskCapability.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Version": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"TaskCapabilityRegistryNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.LMAP.MeasurementAgent.{i}.TaskCapability.{i}.Registry.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"RegistryEntry": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Roles": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}
+				}, 
+				"Device.LMAP.MeasurementAgent.{i}.Controller.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"ControllerTimeout": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "0"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"ControlSchedules": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ControlTasks": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ControlChannels": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"State": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Enabled", 
+							"Suppressed", 
+							"Disabled", 
+							"Running"
+						]
+					}, 
+					"Start": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"End": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Duration": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"Tags": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"SuppressionTags": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ExecutionMode": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Sequential", 
+							"Parallel", 
+							"Pipelined"
+						]
+					}, 
+					"LastInvocation": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Storage": {
+						"type": "unsignedLong", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "bytes", 
+						"read": true, 
+						"write": false
+					}, 
+					"ActionNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Stats.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"Invocations": {
+							"type": "unsignedLong", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Suppressions": {
+							"type": "unsignedLong", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Overlaps": {
+							"type": "unsignedLong", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Failures": {
+							"type": "unsignedLong", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": true, 
+						"array": true, 
+						"Enable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"State": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Enabled", 
+								"Suppressed", 
+								"Disabled", 
+								"Running"
+							]
+						}, 
+						"Order": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Task": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"OutputDestination": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"SuppressionTags": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Tags": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Storage": {
+							"type": "unsignedLong", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"unit": "bytes", 
+							"read": true, 
+							"write": false
+						}, 
+						"LastInvocation": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LastSuccessfulCompletion": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LastSuccessfulStatusCode": {
+							"type": "int", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LastSuccessfulMessage": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LastFailedCompletion": {
+							"type": "dateTime", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LastFailedStatusCode": {
+							"type": "int", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"LastFailedMessage": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"OptionNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}.Stats.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": false, 
+							"Invocations": {
+								"type": "unsignedLong", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"Suppressions": {
+								"type": "unsignedLong", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"Overlaps": {
+								"type": "unsignedLong", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"Failures": {
+								"type": "unsignedLong", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}, 
+						"Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}.Option.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": true, 
+							"array": true, 
+							"Enable": {
+								"type": "boolean", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"Alias": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"Order": {
+								"type": "unsignedInt", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"Name": {
+								"type": "int", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": true
+							}, 
+							"Value": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": true
+							}
+						}
+					}
+				}, 
+				"Device.LMAP.MeasurementAgent.{i}.Task.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Tags": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"OptionNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"RegistryNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.LMAP.MeasurementAgent.{i}.Task.{i}.Registry.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": true, 
+						"array": true, 
+						"Enable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"RegistryEntry": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Roles": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}, 
+					"Device.LMAP.MeasurementAgent.{i}.Task.{i}.Option.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": true, 
+						"array": true, 
+						"Enable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Order": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Name": {
+							"type": "int", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Value": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}
+				}, 
+				"Device.LMAP.MeasurementAgent.{i}.CommunicationChannel.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"UseBulkDataProfile": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"BulkDataProfile": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Target": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"TargetPublicCredential": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Interface": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.LMAP.MeasurementAgent.{i}.Instruction.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"LastChange": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"InstructionSchedules": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"InstructionTasks": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ReportChannels": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"MeasurementSuppressionNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.LMAP.MeasurementAgent.{i}.Instruction.{i}.MeasurementSuppression.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": true, 
+						"array": true, 
+						"Enable": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Name": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"State": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false, 
+							"values": [
+								"Enabled", 
+								"Active", 
+								"Disabled"
+							]
+						}, 
+						"StopRunning": {
+							"type": "boolean", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Start": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"End": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"SuppressionMatch": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}
+				}
+			}, 
+			"Device.LMAP.Report.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"ReportDate": {
+					"type": "dateTime", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"AgentIdentifier": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"GroupIdentifier": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MeasurementPoint": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ResultNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.LMAP.Report.{i}.Result.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": true, 
+					"TaskName": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ScheduleName": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ActionName": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"EventTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"StartTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"EndTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"CycleNumber": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Status": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Tags": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"OptionNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ResultConflictNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"ResultReportTableNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.LMAP.Report.{i}.Result.{i}.Option.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"Order": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Name": {
+							"type": "int", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Value": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.LMAP.Report.{i}.Result.{i}.Conflict.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"TaskName": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ScheduleName": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ActionName": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}
+					}, 
+					"Device.LMAP.Report.{i}.Result.{i}.ReportTable.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"access": false, 
+						"array": true, 
+						"ColumnLabels": {
+							"type": "string", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"ResultReportRowNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"RegistryNumberOfEntries": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"Device.LMAP.Report.{i}.Result.{i}.ReportTable.{i}.ResultRow.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"Values": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}, 
+						"Device.LMAP.Report.{i}.Result.{i}.ReportTable.{i}.Registry.{i}.": {
+							"type": "object", 
+							"protocols": [
+								"cwmp", 
+								"usp"
+							], 
+							"access": false, 
+							"array": true, 
+							"RegistryEntry": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}, 
+							"Roles": {
+								"type": "string", 
+								"protocols": [
+									"cwmp", 
+									"usp"
+								], 
+								"read": true, 
+								"write": false
+							}
+						}
+					}
+				}
+			}, 
+			"Device.LMAP.Event.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"cwmp", 
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Name": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Type": {
+					"type": "string", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"PeriodicTiming", 
+						"CalendarTiming", 
+						"OneOffTiming", 
+						"Immediate", 
+						"Startup", 
+						"ControllerLost", 
+						"ControllerConnected"
+					]
+				}, 
+				"RandomnessSpread": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"CycleInterval": {
+					"type": "int", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"Device.LMAP.Event.{i}.PeriodicTimer.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"StartTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"EndTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Interval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.LMAP.Event.{i}.CalendarTimer.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"StartTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"EndTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ScheduleMonths": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ScheduleDaysOfMonth": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ScheduleDaysOfWeek": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ScheduleHoursOfDay": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ScheduleMinutesOfHour": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ScheduleSecondsOfMinute": {
+						"type": "string", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"EnableScheduleTimezoneOffset": {
+						"type": "boolean", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ScheduleTimezoneOffset": {
+						"type": "int", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"range": {
+							"min": "-23", 
+							"max": "23"
+						}, 
+						"unit": "hours", 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.LMAP.Event.{i}.OneOff.": {
+					"type": "object", 
+					"protocols": [
+						"cwmp", 
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"StartTime": {
+						"type": "dateTime", 
+						"protocols": [
+							"cwmp", 
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}
+			}
+		}, 
+		"Device.LocalAgent.": {
+			"type": "object", 
+			"protocols": [
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"EndpointID": {
+				"type": "string", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"SoftwareVersion": {
+				"type": "string", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"UpTime": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"usp"
+				], 
+				"unit": "seconds", 
+				"read": true, 
+				"write": false
+			}, 
+			"SupportedProtocols": {
+				"type": "string", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"CoAP", 
+					"WebSocket", 
+					"STOMP"
+				]
+			}, 
+			"SupportedFingerprintAlgorithms": {
+				"type": "string", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": false, 
+				"values": [
+					"SHA-1", 
+					"SHA-224", 
+					"SHA-256", 
+					"SHA-384", 
+					"SHA-512"
+				]
+			}, 
+			"AdvertisedDeviceSubtypes": {
+				"type": "string", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}, 
+			"MaxSubscriptionChangeAdoptionTime": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"usp"
+				], 
+				"range": {
+					"min": "5"
+				}, 
+				"unit": "seconds", 
+				"read": true, 
+				"write": true
+			}, 
+			"MTPNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"ControllerNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"SubscriptionNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"RequestNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"CertificateNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.LocalAgent.MTP.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Up", 
+						"Down", 
+						"Error"
+					]
+				}, 
+				"Protocol": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"EnableMDNS": {
+					"type": "boolean", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Device.LocalAgent.MTP.{i}.CoAP.": {
+					"type": "object", 
+					"protocols": [
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Interfaces": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Port": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"usp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Path": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"IsEncrypted": {
+						"type": "boolean", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"EnableEncryption": {
+						"type": "boolean", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.LocalAgent.MTP.{i}.STOMP.": {
+					"type": "object", 
+					"protocols": [
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Reference": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Destination": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"DestinationFromServer": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}
+				}, 
+				"Device.LocalAgent.MTP.{i}.WebSocket.": {
+					"type": "object", 
+					"protocols": [
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Interfaces": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Port": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"usp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"Path": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}
+			}, 
+			"Device.LocalAgent.Controller.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"EndpointID": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ControllerCode": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"ProvisioningCode": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"AssignedRole": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"InheritedRole": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Credential": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"PeriodicNotifInterval": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"PeriodicNotifTime": {
+					"type": "dateTime", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"USPNotifRetryMinimumWaitInterval": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"range": {
+						"min": "1", 
+						"max": "65535"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"USPNotifRetryIntervalMultiplier": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"range": {
+						"min": "1000", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"BootParameterNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"MTPNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.LocalAgent.Controller.{i}.MTP.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Protocol": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Device.LocalAgent.Controller.{i}.MTP.{i}.CoAP.": {
+						"type": "object", 
+						"protocols": [
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"Host": {
+							"type": "string", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Port": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"usp"
+							], 
+							"range": {
+								"min": "1", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"Path": {
+							"type": "string", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"EnableEncryption": {
+							"type": "boolean", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}, 
+					"Device.LocalAgent.Controller.{i}.MTP.{i}.STOMP.": {
+						"type": "object", 
+						"protocols": [
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"Reference": {
+							"type": "string", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Destination": {
+							"type": "string", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}, 
+					"Device.LocalAgent.Controller.{i}.MTP.{i}.WebSocket.": {
+						"type": "object", 
+						"protocols": [
+							"usp"
+						], 
+						"access": false, 
+						"array": false, 
+						"Host": {
+							"type": "string", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Port": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"usp"
+							], 
+							"range": {
+								"min": "1", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}, 
+						"Path": {
+							"type": "string", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"IsEncrypted": {
+							"type": "boolean", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"KeepAliveInterval": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"usp"
+							], 
+							"range": {
+								"min": "1"
+							}, 
+							"unit": "seconds", 
+							"read": true, 
+							"write": true
+						}, 
+						"CurrentRetryCount": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": false
+						}, 
+						"SessionRetryMinimumWaitInterval": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"usp"
+							], 
+							"range": {
+								"min": "1", 
+								"max": "65535"
+							}, 
+							"unit": "seconds", 
+							"read": true, 
+							"write": true
+						}, 
+						"SessionRetryIntervalMultiplier": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"usp"
+							], 
+							"range": {
+								"min": "1000", 
+								"max": "65535"
+							}, 
+							"read": true, 
+							"write": true
+						}
+					}
+				}, 
+				"Device.LocalAgent.Controller.{i}.TransferCompletePolicy.": {
+					"type": "object", 
+					"protocols": [
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"ResultTypeFilter": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Success", 
+							"Failure", 
+							"Both"
+						]
+					}
+				}, 
+				"Device.LocalAgent.Controller.{i}.BootParameter.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ParameterName": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}
+				}, 
+				"Device.LocalAgent.Controller.{i}.E2ESession.": {
+					"type": "object", 
+					"protocols": [
+						"usp"
+					], 
+					"access": false, 
+					"array": false, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Status": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": false, 
+						"values": [
+							"Up", 
+							"Negotiating", 
+							"Down"
+						]
+					}, 
+					"SessionExpiration": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"usp"
+						], 
+						"range": {
+							"min": "0"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"SessionRetryMinimumWaitInterval": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"usp"
+						], 
+						"range": {
+							"min": "1", 
+							"max": "65535"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}, 
+					"SessionRetryIntervalMultiplier": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"usp"
+						], 
+						"range": {
+							"min": "1000", 
+							"max": "65535"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"CurrentRetryCount": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"SegmentedPayloadChunkSize": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"usp"
+						], 
+						"range": {
+							"min": "0", 
+							"max": "0"
+						}, 
+						"unit": "bytes", 
+						"read": true, 
+						"write": true
+					}, 
+					"MaxRetransmitTries": {
+						"type": "int", 
+						"protocols": [
+							"usp"
+						], 
+						"range": {
+							"min": "-1", 
+							"max": "10"
+						}, 
+						"read": true, 
+						"write": true
+					}, 
+					"PayloadSecurity": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Plaintext", 
+							"TLS"
+						]
+					}
+				}
+			}, 
+			"Device.LocalAgent.Subscription.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Recipient": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ID": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"CreationDate": {
+					"type": "dateTime", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"NotifType": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true, 
+					"values": [
+						"ValueChange", 
+						"ObjectCreation", 
+						"ObjectDeletion", 
+						"OperationComplete", 
+						"Event"
+					]
+				}, 
+				"ReferenceList": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Persistent": {
+					"type": "boolean", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TimeToLive": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"NotifRetry": {
+					"type": "boolean", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"NotifExpiration": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}
+			}, 
+			"Device.LocalAgent.Request.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Originator": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Command": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"CommandKey": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Requested", 
+						"Active", 
+						"Canceling", 
+						"Canceled", 
+						"Success", 
+						"Error"
+					]
+				}
+			}, 
+			"Device.LocalAgent.Certificate.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"usp"
+				], 
+				"access": false, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"SerialNumber": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Issuer": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}, 
+			"Device.LocalAgent.ControllerTrust.": {
+				"type": "object", 
+				"protocols": [
+					"usp"
+				], 
+				"access": false, 
+				"array": false, 
+				"UntrustedRole": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"BannedRole": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TOFUAllowed": {
+					"type": "boolean", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"TOFUInactivityTimer": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"RoleNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"CredentialNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"ChallengeNumberOfEntries": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Device.LocalAgent.ControllerTrust.Role.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Name": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"PermissionNumberOfEntries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": false
+					}, 
+					"Device.LocalAgent.ControllerTrust.Role.{i}.Permission.{i}.": {
+						"type": "object", 
+						"protocols": [
+							"usp"
+						], 
+						"access": true, 
+						"array": true, 
+						"Alias": {
+							"type": "string", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Enable": {
+							"type": "boolean", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Order": {
+							"type": "unsignedInt", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Targets": {
+							"type": "string", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Param": {
+							"type": "string", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"Obj": {
+							"type": "string", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"InstantiatedObj": {
+							"type": "string", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}, 
+						"CommandEvent": {
+							"type": "string", 
+							"protocols": [
+								"usp"
+							], 
+							"read": true, 
+							"write": true
+						}
+					}
+				}, 
+				"Device.LocalAgent.ControllerTrust.Credential.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Role": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Credential": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"AllowedUses": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"MTP-only", 
+							"MTP-and-USP", 
+							"MTP-and-broker"
+						]
+					}
+				}, 
+				"Device.LocalAgent.ControllerTrust.Challenge.{i}.": {
+					"type": "object", 
+					"protocols": [
+						"usp"
+					], 
+					"access": true, 
+					"array": true, 
+					"Alias": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Description": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Role": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Enable": {
+						"type": "boolean", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"Type": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"Passphrase"
+						]
+					}, 
+					"Value": {
+						"type": "base64", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"ValueType": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"text/plain", 
+							"image/jpeg"
+						]
+					}, 
+					"Instruction": {
+						"type": "base64", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"InstructionType": {
+						"type": "string", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true, 
+						"values": [
+							"text/plain", 
+							"image/jpeg", 
+							"text/html"
+						]
+					}, 
+					"Retries": {
+						"type": "unsignedInt", 
+						"protocols": [
+							"usp"
+						], 
+						"read": true, 
+						"write": true
+					}, 
+					"LockoutPeriod": {
+						"type": "int", 
+						"protocols": [
+							"usp"
+						], 
+						"range": {
+							"min": "0"
+						}, 
+						"unit": "seconds", 
+						"read": true, 
+						"write": true
+					}
+				}
+			}
+		}, 
+		"Device.STOMP.": {
+			"type": "object", 
+			"protocols": [
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"ConnectionNumberOfEntries": {
+				"type": "unsignedInt", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"Device.STOMP.Connection.{i}.": {
+				"type": "object", 
+				"protocols": [
+					"usp"
+				], 
+				"access": true, 
+				"array": true, 
+				"Alias": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Enable": {
+					"type": "boolean", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Status": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false, 
+					"values": [
+						"Enabled", 
+						"Disabled", 
+						"Unknown", 
+						"Connecting", 
+						"ServerNotPresent", 
+						"Error_Misconfigured", 
+						"Error_AuthenticationFailure", 
+						"Error"
+					]
+				}, 
+				"LastChangeDate": {
+					"type": "dateTime", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}, 
+				"Host": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Port": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"range": {
+						"min": "1", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"Username": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"Password": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"VirtualHost": {
+					"type": "string", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"EnableHeartbeats": {
+					"type": "boolean", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": true
+				}, 
+				"OutgoingHeartbeat": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"unit": "milliseconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"IncomingHeartbeat": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"unit": "milliseconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"ServerRetryInitialInterval": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"range": {
+						"min": "1", 
+						"max": "65535"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"ServerRetryIntervalMultiplier": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"range": {
+						"min": "1000", 
+						"max": "65535"
+					}, 
+					"read": true, 
+					"write": true
+				}, 
+				"ServerRetryMaxInterval": {
+					"type": "unsignedInt", 
+					"protocols": [
+						"usp"
+					], 
+					"range": {
+						"min": "1"
+					}, 
+					"unit": "seconds", 
+					"read": true, 
+					"write": true
+				}, 
+				"IsEncrypted": {
+					"type": "boolean", 
+					"protocols": [
+						"usp"
+					], 
+					"read": true, 
+					"write": false
+				}
+			}
+		}, 
+		"Device.Standby.": {
+			"type": "object", 
+			"protocols": [
+				"usp"
+			], 
+			"access": false, 
+			"array": false, 
+			"NetworkAware": {
+				"type": "boolean", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}, 
+			"TimerAware": {
+				"type": "boolean", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": false
+			}
+		}, 
+		"Device.ProxiedDevice.{i}.": {
+			"type": "object", 
+			"protocols": [
+				"usp"
+			], 
+			"access": false, 
+			"array": true, 
+			"Alias": {
+				"type": "string", 
+				"protocols": [
+					"usp"
+				], 
+				"read": true, 
+				"write": true
+			}
+		}
+	}
+}
diff --git a/md5.c b/md5.c
new file mode 100644
index 0000000000000000000000000000000000000000..cd0a717cfec6b350267ba90c4c35d34f717c81c8
--- /dev/null
+++ b/md5.c
@@ -0,0 +1,266 @@
+/*
+ * This code implements the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest.	This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
+ *
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+ * MD5Context structure, pass it to MD5Init, call MD5Update as
+ * needed on buffers full of bytes, and then call MD5Final, which
+ * will fill a supplied 16-byte array with the digest.
+ */
+
+#include "md5.h"
+
+# if __BYTE_ORDER == __BIG_ENDIAN
+#define HIGHFIRST
+#endif
+
+#ifndef HIGHFIRST
+#define byteReverse(buf, len)	/* Nothing */
+#else
+/*
+ * Note: this code is harmless on little-endian machines.
+ */
+static void 
+byteReverse(unsigned char *buf,
+	    unsigned longs)
+{
+    uint32_t t;
+    do {
+	t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
+	    ((unsigned) buf[1] << 8 | buf[0]);
+	*(uint32_t *) buf = t;
+	buf += 4;
+    } while (--longs);
+}
+#endif
+
+
+/* The four core functions - F1 is optimized somewhat */
+
+/* #define F1(x, y, z) (x & y | ~x & z) */
+#define F1(x, y, z) (z ^ (x & (y ^ z)))
+#define F2(x, y, z) F1(z, x, y)
+#define F3(x, y, z) (x ^ y ^ z)
+#define F4(x, y, z) (y ^ (x | ~z))
+
+/* This is the central step in the MD5 algorithm. */
+#define MD5STEP(f, w, x, y, z, data, s) \
+	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
+
+/*
+ * The core of the MD5 algorithm, this alters an existing MD5 hash to
+ * reflect the addition of 16 longwords of new data.  MD5Update blocks
+ * the data and converts bytes into longwords for this routine.
+ */
+static void 
+MD5Transform(uint32_t buf[4],
+	     uint32_t in[16])
+{
+  uint32_t a, b, c, d;
+
+    a = buf[0];
+    b = buf[1];
+    c = buf[2];
+    d = buf[3];
+
+    MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
+    MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
+    MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
+    MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
+    MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
+    MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
+    MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
+    MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
+    MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
+    MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
+    MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
+    MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
+    MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
+    MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
+    MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
+    MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
+
+    MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
+    MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
+    MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
+    MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
+    MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
+    MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
+    MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
+    MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
+    MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
+    MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
+    MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
+    MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
+    MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
+    MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
+    MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
+    MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
+
+    MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
+    MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
+    MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
+    MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
+    MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
+    MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
+    MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
+    MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
+    MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
+    MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
+    MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
+    MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
+    MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
+    MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
+    MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
+    MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
+
+    MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
+    MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
+    MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
+    MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
+    MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
+    MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
+    MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
+    MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
+    MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
+    MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
+    MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
+    MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
+    MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
+    MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
+    MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
+    MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
+
+    buf[0] += a;
+    buf[1] += b;
+    buf[2] += c;
+    buf[3] += d;
+}
+
+
+/*
+ * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
+ * initialization constants.
+ */
+void
+MD5Init(struct MD5Context *ctx)
+{
+    ctx->buf[0] = 0x67452301;
+    ctx->buf[1] = 0xefcdab89;
+    ctx->buf[2] = 0x98badcfe;
+    ctx->buf[3] = 0x10325476;
+
+    ctx->bits[0] = 0;
+    ctx->bits[1] = 0;
+}
+
+/*
+ * Update context to reflect the concatenation of another buffer full
+ * of bytes.
+ */
+void
+MD5Update(struct MD5Context *ctx,
+	  const void *data,
+	  unsigned len)
+{
+    const unsigned char *buf = data;
+    uint32_t t;
+
+    /* Update bitcount */
+
+    t = ctx->bits[0];
+    if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t)
+	ctx->bits[1]++; 	/* Carry from low to high */
+    ctx->bits[1] += len >> 29;
+
+    t = (t >> 3) & 0x3f;	/* Bytes already in shsInfo->data */
+
+    /* Handle any leading odd-sized chunks */
+
+    if (t) {
+	unsigned char *p = (unsigned char *) ctx->in + t;
+
+	t = 64 - t;
+	if (len < t) {
+	    memcpy(p, buf, len);
+	    return;
+	}
+	memcpy(p, buf, t);
+	byteReverse(ctx->in, 16);
+	MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+	buf += t;
+	len -= t;
+    }
+    /* Process data in 64-byte chunks */
+
+    while (len >= 64) {
+	memcpy(ctx->in, buf, 64);
+	byteReverse(ctx->in, 16);
+	MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+	buf += 64;
+	len -= 64;
+    }
+
+    /* Handle any remaining bytes of data. */
+
+    memcpy(ctx->in, buf, len);
+}
+
+/*
+ * Final wrapup - pad to 64-byte boundary with the bit pattern 
+ * 1 0* (64-bit count of bits processed, MSB-first)
+ */
+void 
+MD5Final(unsigned char digest[16],
+	 struct MD5Context *ctx)
+{
+  unsigned count;
+  unsigned char *p;
+
+  /* Compute number of bytes mod 64 */
+  count = (ctx->bits[0] >> 3) & 0x3F;
+  
+  /* Set the first char of padding to 0x80.  This is safe since there is
+     always at least one byte free */
+  p = ctx->in + count;
+  *p++ = 0x80;
+  
+  /* Bytes of padding needed to make 64 bytes */
+  count = 64 - 1 - count;
+  
+  /* Pad out to 56 mod 64 */
+  if (count < 8) 
+    {
+      /* Two lots of padding:  Pad the first block to 64 bytes */
+      memset(p, 0, count);
+      byteReverse(ctx->in, 16);
+      MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+      
+      /* Now fill the next block with 56 bytes */
+      memset(ctx->in, 0, 56);
+    } 
+  else 
+    {
+      /* Pad block to 56 bytes */
+      memset(p, 0, count - 8);
+    }
+  byteReverse(ctx->in, 14);
+  
+  /* Append length in bits and transform */
+  ((uint32_t *) ctx->in)[14] = ctx->bits[0];
+  ((uint32_t *) ctx->in)[15] = ctx->bits[1];
+  
+  MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+  byteReverse((unsigned char *) ctx->buf, 4);
+  memcpy(digest, ctx->buf, 16);
+  memset(ctx, 0, sizeof(struct MD5Context));        /* In case it's sensitive */
+}
+
+/* end of md5.c */
diff --git a/md5.h b/md5.h
new file mode 100644
index 0000000000000000000000000000000000000000..dd68ba6de7c9f63668c2a9dd776583ece971ef2e
--- /dev/null
+++ b/md5.h
@@ -0,0 +1,52 @@
+/*
+ * This code implements the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest.	This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
+ *
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+ * MD5Context structure, pass it to MD5Init, call MD5Update as
+ * needed on buffers full of bytes, and then call MD5Final, which
+ * will fill a supplied 16-byte array with the digest.
+ */
+
+#ifndef MD5_H
+#define MD5_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+
+
+#ifdef WORDS_BIGENDIAN
+#define HIGHFIRST
+#endif
+
+#define MD5_DIGEST_SIZE 16
+
+struct MD5Context 
+{
+  uint32_t buf[4];
+  uint32_t bits[2];
+  unsigned char in[64];
+};
+
+
+void 
+MD5Init(struct MD5Context *ctx);
+
+void
+MD5Update(struct MD5Context *ctx,
+	  const void *buf,
+	  unsigned len);
+
+void MD5Final(unsigned char digest[MD5_DIGEST_SIZE],
+	      struct MD5Context *ctx);
+
+#endif /* !MD5_H */
diff --git a/scripts/functions/download_launch b/scripts/functions/download_launch
new file mode 100755
index 0000000000000000000000000000000000000000..2dffff484683144ced901698976f0736238cf666
--- /dev/null
+++ b/scripts/functions/download_launch
@@ -0,0 +1,101 @@
+#!/bin/sh
+# Copyright (C) 2019 iopsys Software Solutions AB
+# 	Author: IMEN Bhiri <imen.bhiri@pivasoftware.com>
+# 	Author: AMIN Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+
+
+UCI_CONFIG_DIR="/etc/config/"
+UCI_GET_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state get"
+UCI_SET_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state set"
+UCI_ADD_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state add"
+UCI_DELETE_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state delete"
+CAPTURE_FILE="/tmp/download_dump"
+DOWNLOAD_DIAGNOSTIC_FILE="/tmp/icwmp_download_diagnostic"
+DOWNLOAD_DIAGNOSTIC_LOG_FILE="/tmp/icwmp_download_diagnostic_log"
+CONNECTION_TIMEOUT=10
+
+download_get() {
+	local val=`$UCI_GET_VARSTATE $1`
+	echo ${val:-$2}
+}
+
+download_launch() {
+	local tx_bytes_before rx_bytes_before time1 tx_bytes_after rx_bytes_after time2 res rh ba stc periodtime
+	local url=$2
+	local interface=$3
+	[ "$1" == "cwmp" ] && [ "`$UCI_GET_VARSTATE cwmp.@downloaddiagnostic[0].DiagnosticState`" != "Requested" ] && return
+	[ "$url" = "" ] && { $UCI_SET_VARSTATE cwmp.@downloaddiagnostic[0].DiagnosticState=Error_InitConnectionFailed; return; }
+	local proto=`download_get cwmp.@downloaddiagnostic[0].ProtocolVersion Any`
+	# Disable acceleration on Broadcom devices to capture all packets with tcpdump
+	[ -e /usr/sbin/fcctl ] && { fcctl disable >/dev/null 2>&1; fcctl flush >/dev/null 2>&1; }
+	tcpdump -i $interface tcp -w ${CAPTURE_FILE} > /dev/null 2>&1 &
+	PID=$!
+	sleep 1
+	if [ ${url:0:7} = http:// -o ${url:0:6} = ftp:// ]; then
+		tx_bytes_before=`ubus call network.device status "{'name':'$interface'}" | jsonfilter -e @.statistics.tx_bytes`
+		rx_bytes_before=`ubus call network.device status "{'name':'$interface'}" | jsonfilter -e @.statistics.rx_bytes`
+		time1=`date +%s`
+		[ "$proto" = "Any" ] && res=$(wget -t 1 --timeout=${CONNECTION_TIMEOUT} -O ${DOWNLOAD_DIAGNOSTIC_FILE} -o ${DOWNLOAD_DIAGNOSTIC_LOG_FILE} $url 2>&1)
+		[ "$proto" = "IPv4" ] && res=$(wget -4 -t 1 --timeout=${CONNECTION_TIMEOUT} -O ${DOWNLOAD_DIAGNOSTIC_FILE} -o ${DOWNLOAD_DIAGNOSTIC_LOG_FILE} $url 2>&1)
+		[ "$proto" = "IPv6" ] && res=$(wget -6 -t 1 --timeout=${CONNECTION_TIMEOUT} -O ${DOWNLOAD_DIAGNOSTIC_FILE} -o ${DOWNLOAD_DIAGNOSTIC_LOG_FILE} $url 2>&1)
+		time2=`date +%s`
+		tx_bytes_after=`ubus call network.device status "{'name':'$interface'}" | jsonfilter -e @.statistics.tx_bytes`
+		rx_bytes_after=`ubus call network.device status "{'name':'$interface'}" | jsonfilter -e @.statistics.rx_bytes`
+		rh=`cat ${DOWNLOAD_DIAGNOSTIC_LOG_FILE} | grep "resolve host"`
+		[ -n "$ba" ] && { $UCI_SET_VARSTATE cwmp.@downloaddiagnostic[0].DiagnosticState=Error_CannotResolveHostName; kill $PID 2> /dev/null; return; }
+		ba=`echo "$res" | grep "bad address"`
+		[ -n "$ba" ] && { $UCI_SET_VARSTATE cwmp.@downloaddiagnostic[0].DiagnosticState=Error_InitConnectionFailed; kill $PID 2> /dev/null; return; }
+		stc=`cat ${DOWNLOAD_DIAGNOSTIC_LOG_FILE} | grep "404 Not Found"`
+		[ -n "$stc" ] && { $UCI_SET_VARSTATE cwmp.@downloaddiagnostic[0].DiagnosticState=Error_NoResponse; kill $PID 2> /dev/null; return; }
+		stc=`cat ${DOWNLOAD_DIAGNOSTIC_LOG_FILE} | grep "100%"`
+		[ -z "$stc" ] && { $UCI_SET_VARSTATE cwmp.@downloaddiagnostic[0].DiagnosticState=Error_TransferFailed; kill $PID 2> /dev/null; return; }
+	fi
+	tx_bytes=$((tx_bytes_after-tx_bytes_before))
+	rx_bytes=$((rx_bytes_after-rx_bytes_before))
+	periodtime=$(($((time2-time1))*1000000))
+	$UCI_SET_VARSTATE cwmp.@downloaddiagnostic[0].DiagnosticState=Completed
+	$UCI_SET_VARSTATE cwmp.@downloaddiagnostic[0].TotalBytesReceived=$rx_bytes
+	$UCI_SET_VARSTATE cwmp.@downloaddiagnostic[0].TotalBytesSent=$tx_bytes
+	$UCI_SET_VARSTATE cwmp.@downloaddiagnostic[0].PeriodOfFullLoading=$periodtime
+	local perconnection=`$UCI_GET_VARSTATE cwmp.@downloaddiagnostic[0].EnablePerConnection`
+	if ([ "$perconnection" == "true" ] || [ "$perconnection" == "1" ]); then
+		$UCI_ADD_VARSTATE cwmp DownloadPerConnection
+		$UCI_SET_VARSTATE cwmp.@DownloadPerConnection[0].TotalBytesReceived=$rx_bytes
+		$UCI_SET_VARSTATE cwmp.@DownloadPerConnection[0].TotalBytesSent=$tx_bytes
+	else
+		$UCI_DELETE_VARSTATE cwmp.@DownloadPerConnection[0]
+	fi
+	rm ${DOWNLOAD_DIAGNOSTIC_FILE} 2>/dev/null
+	rm ${DOWNLOAD_DIAGNOSTIC_LOG_FILE} 2>/dev/null
+	sleep 1
+	local pids=`ps | grep $PID`
+	kill $PID &>/dev/null
+	# Enable acceleration on Broadcom devices after killing the tcpdump pid 
+	[ -e /usr/sbin/fcctl ] && { fcctl enable >/dev/null 2>&1; fcctl flush >/dev/null 2>&1; }
+}
+
+download_stop_diagnostic() {
+	$UCI_DELETE_VARSTATE cwmp.@DownloadPerConnection[0]
+	local pids=`ps | grep download_launch.*run | grep -v grep | awk '{print $1}'`
+	if [ -n "$pids" ]; then
+		kill -9 $pids &>/dev/null
+		$UCI_SET_VARSTATE cwmp.@downloaddiagnostic[0].DiagnosticState=None
+	fi
+	local pids=`ps | grep download_launch.*run | grep -v grep | awk '{print $1}'`                               
+    if [ -n "$pids" ]; then
+    	kids=$(grep -l "PPid.*$pids" /proc/*/task/*/status | grep -o "[0-9]*")                    
+		for kid in $kids; do                                                  
+	    	kill -9 $kid &>/dev/null                                                   
+	    done
+	    kill -9 $pids &>/dev/null                                                               
+	    $UCI_SET_VARSTATE cwmp.@downloaddiagnostic[0].DiagnosticState=None      
+    fi 
+}
+
+if [ "$1" == "run" ] ; then
+	download_launch $2 $3 $4
+elif [ "$1" == "stop" ]; then
+	download_stop_diagnostic
+else
+	return
+fi
diff --git a/scripts/functions/ipping_launch b/scripts/functions/ipping_launch
new file mode 100755
index 0000000000000000000000000000000000000000..3b78aa0ceed99bd99491701936bb70dd1406fff0
--- /dev/null
+++ b/scripts/functions/ipping_launch
@@ -0,0 +1,118 @@
+#!/bin/sh
+# Copyright (C) 2019 iopsys Software Solutions AB
+# 	Author: MOHAMED Kallel <mohamed.kallel@pivasoftware.com>
+# 	Author: AMIN Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+
+
+UCI_CONFIG_DIR="/etc/config/"
+UCI_GET_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state get"
+UCI_SET_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state set"
+
+ipping_get() {
+	local val=`$UCI_GET_VARSTATE $1`
+	echo ${val:-$2}
+}
+
+ipping_launch() {
+	local i res ba stc times sc1 success_count failure_count min_time avg_time max_time avg_time_sum min max micros avg_time_det min_time_det max_time_det avg_time_sum_det min_det max_det
+	[ "$1" == "cwmp" ] && [ "`$UCI_GET_VARSTATE cwmp.@ippingdiagnostic[0].DiagnosticState`" != "Requested" ] && return
+	local host=`ipping_get cwmp.@ippingdiagnostic[0].Host`
+	local cnt=`ipping_get cwmp.@ippingdiagnostic[0].NumberOfRepetitions 3`
+	local dsize=`ipping_get cwmp.@ippingdiagnostic[0].DataBlockSize 64`
+	local timeout=`ipping_get cwmp.@ippingdiagnostic[0].Timeout 1000`
+	local dscp=`ipping_get cwmp.@ippingdiagnostic[0].DSCP 0`
+	local proto=`ipping_get cwmp.@ippingdiagnostic[0].ProtocolVersion Any`
+	local tos=$((dscp<<2))
+	[ "$host" = "" ] && return
+	timeout=$((timeout/1000))
+	[ "$timeout" = "0" ] && timeout="1"
+	micros=1000
+	success_count=0
+	avg_time_sum=0
+	avg_time_sum_det=0
+	min=9999999
+	min_det=999999999
+	max=0
+	max_det=0
+	i=0
+
+	while [ $i -lt $cnt ]; do
+		let i++
+		[ "$proto" = "Any" ] && res=$(fping -o -c 1 -b $dsize -t $timeout -O $tos $host 2>&1)
+		[ "$proto" = "IPv4" ] && res=$(fping -4 -o -c 1 -b $dsize -t $timeout -O $tos $host 2>&1)
+		[ "$proto" = "IPv6" ] && res=$(fping -6 -o -c 1 -b $dsize -t $timeout -O $tos $host 2>&1)
+		ba=`echo "$res" | grep "not known"`
+		[ -n "$ba" ] && { $UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].DiagnosticState=Error_CannotResolveHostName; return; }
+		stc=`echo "$res" | grep "loss"`
+		[ -z "$stc" ] && { $UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].DiagnosticState=Error_Other; return; }
+		times=`echo "$res" | grep "min/avg/max"`
+		[ -z "$times" ] && continue
+		sc1=`echo $stc |  awk -F'/' '{ print $4 }'`
+		sc1=${sc1:-0}
+		success_count=$((success_count+sc1))
+		times=`echo $times | awk -F'=' '{ print $4 }'`
+		min_time=`echo $times | awk -F'[=/ ]' '{ print $1 }'`	
+		avg_time=`echo $times | awk -F'[=/ ]' '{ print $2 }'`
+		max_time=`echo $times | awk -F'[=/ ]' '{ print $3 }'`
+		min_time=${min_time:-0}
+		avg_time=${avg_time:-0}
+		max_time=${max_time:-0}
+		min_time_det=$(echo $min_time $micros | awk '{printf "%3.0f\n",$1*$2}')
+		avg_time_det=$(echo $avg_time $micros | awk '{printf "%3.0f\n",$1*$2}')
+		max_time_det=$(echo $max_time $micros | awk '{printf "%3.0f\n",$1*$2}')
+		min_time=$(awk "BEGIN{print $min_time * 1000}")
+		avg_time=$(awk "BEGIN{print $avg_time * 1000}")
+		max_time=$(awk "BEGIN{print $max_time * 1000}")
+		[ $min_time -lt $min ] && min=$min_time
+		[ $max_time -gt $max ] && max=$max_time
+		avg_time_sum=$((avg_time_sum+avg_time))
+		[ $min_time_det -lt $min_det ] && min_det=$min_time_det
+		[ $max_time_det -gt $max_det ] && max_det=$max_time_det
+		avg_time_sum_det=$((avg_time_sum_det+avg_time_det))
+	done
+	failure_count=$((cnt-success_count))
+	[ $success_count -gt 0 ] && avg_time=$((avg_time_sum/success_count)) || avg_time=0
+	[ $success_count -gt 0 ] && avg_time_det=$((avg_time_sum_det/success_count)) || avg_time_det=0
+	avg_time=$(awk "BEGIN{print int($avg_time / 1000)}")
+	min_time=$(awk "BEGIN{print int($min / 1000)}")
+	max_time=$(awk "BEGIN{print int($max / 1000)}")
+	min_time_det=$min_det
+	max_time_det=$max_det
+	$UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].DiagnosticState=Complete
+	$UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].SuccessCount=$success_count
+	$UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].FailureCount=$failure_count
+	$UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].AverageResponseTime=$avg_time
+	$UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].MinimumResponseTime=$min_time
+	$UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].MaximumResponseTime=$max_time
+	$UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].AverageResponseTimeDetailed=$avg_time_det
+	$UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].MinimumResponseTimeDetailed=$min_time_det
+	$UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].MaximumResponseTimeDetailed=$max_time_det
+	[ "$1" == "cwmp" ] && event_dignostic
+}
+
+event_dignostic() {
+	local e=1
+	local i=0
+	while [ "$e" != 0 -a $i -lt 200 ]; do
+		ubus -t 1 call tr069 inform '{"event":"8 DIAGNOSTICS COMPLETE"}' &>/dev/null
+		e=$?
+		[ "$e" != "0" ] && sleep 1;
+		let i++
+	done
+}
+
+ipping_stop_diagnostic() {
+	local pids=`ps | grep ipping_launch | grep -v grep | awk '{print $1}'`
+	if [ -n "$pids" ]; then
+		kill -9 $pids &>/dev/null
+		$UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].DiagnosticState=None
+	fi
+}
+
+if [ "$1" == "run" ]; then
+	ipping_launch $2
+elif [ "$1" == "stop" ]; then
+	ipping_stop_diagnostic
+else
+	return
+fi
diff --git a/scripts/functions/nslookup_launch b/scripts/functions/nslookup_launch
new file mode 100644
index 0000000000000000000000000000000000000000..392e473c208c4d9e53bb7453400cb3b59a8b7a89
--- /dev/null
+++ b/scripts/functions/nslookup_launch
@@ -0,0 +1,122 @@
+#!/bin/sh
+# Copyright (C) 2019 iopsys Software Solutions AB
+# 	Author: AMIN Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+
+
+UCI_CONFIG_DIR="/etc/config/"
+UCI_GET_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state get"
+UCI_SET_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state set"
+UCI_ADD_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state add"
+UCI_DELETE_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state delete"
+UCI_SHOW_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state show"
+LOG_FILE="/tmp/nslookup.log"
+
+nslookup_get() {
+	local val=`$UCI_GET_VARSTATE $1`
+	echo ${val:-$2}
+}
+
+nslookup_launch() {
+	local i j time1 time2 timeresponse status AnswerType HostNameReturned address dns_server_ip ResponseTime success_count
+	local address=""
+	[ "$1" == "cwmp" ] && [ "`$UCI_GET_VARSTATE cwmp.@nslookupdiagnostic[0].DiagnosticState`" != "Requested" ] && return
+	local hostname=`nslookup_get cwmp.@nslookupdiagnostic[0].HostName`
+	local dnsserver=`nslookup_get cwmp.@nslookupdiagnostic[0].DNSServer`
+	local cnt=`nslookup_get cwmp.@nslookupdiagnostic[0].NumberOfRepetitions 1`
+	[ "$hostname" = "" ] && return
+	i=0
+	j=0
+	success_count=0
+	[ -e "${LOG_FILE}" ] && rm ${LOG_FILE}
+	delete_all_results
+	while [ $i -lt $cnt ]; do
+		let i++
+		time1=`date +%s`
+		if [ -z "$dnsserver" ]; then
+			nslookup $hostname >>${LOG_FILE} 2>&1
+		else
+			nslookup $hostname $dnsserver >>${LOG_FILE} 2>&1
+		fi
+		time2=`date +%s`                       
+		timeresponse=$(($(($time2-$time1))*1000))
+		echo "ResponseTime: $timeresponse" >>${LOG_FILE}
+		echo "++++++++++++++++++++++++++++++" >>${LOG_FILE}
+	done
+
+	while IFS= read line; do
+	[ -z "$line" ] && continue;
+	local server=`echo "$line" | tr -d '\t' | tr -d ' ' | grep "Server:" | awk -F':' '{print $2}'`
+
+	if [[ -n "$server" && "$server" == "0.0.0.0" ]]; then
+	        status="Error_DNSServerNotAvailable"
+	        continue
+	elif [ -n "$server" ]; then
+	        dns_server_ip=$server
+	        continue
+	fi
+
+	var=`echo "$line" | tr -d '\t' | tr -d ' ' | grep "Name:" | awk -F':' '{print $2}'`
+	[ -n "$var" ] && { HostNameReturned=$var; status="Success"; AnswerType="Authoritative"; let success_count++; continue; }
+
+	var=`echo "$line" | grep "Address " | awk -F':' '{print substr($0, index($0,$2))}' | tr -d '\t' | tr -d ' '`
+	[ -n "$var" ] && { [ -z "$address" ] && address="$var" || address="$address,$var"; continue; }
+
+	var=`echo "$line" | tr -d '\t' | tr -d ' ' | grep "ResponseTime:" | awk -F':' '{print $2}'`
+	[ -n "$var" ] && { ResponseTime=$var; continue; }
+
+	echo $line | grep 'Can' >/dev/null 2>&1 && {  continue; }
+	echo $line | grep 'connection timed out' >/dev/null 2>&1 && { AnswerType="None"; status="Error_Timeout"; continue; }
+	echo $line | grep 'Non-authoritative' >/dev/null 2>&1 && { AnswerType="NonAuthoritative"; continue; }
+
+	if echo $line | grep '++++++++++++++++++++++' >/dev/null 2>&1; then
+		$UCI_ADD_VARSTATE cwmp NSLookupResult
+		$UCI_SET_VARSTATE cwmp.@NSLookupResult[$j].Status=$status
+		$UCI_SET_VARSTATE cwmp.@NSLookupResult[$j].AnswerType=$AnswerType
+		$UCI_SET_VARSTATE cwmp.@NSLookupResult[$j].HostNameReturned=$HostNameReturned
+		$UCI_SET_VARSTATE cwmp.@NSLookupResult[$j].IPAddresses=$address
+		$UCI_SET_VARSTATE cwmp.@NSLookupResult[$j].DNSServerIP=$dns_server_ip
+		$UCI_SET_VARSTATE cwmp.@NSLookupResult[$j].ResponseTime=$ResponseTime
+		let j++
+		address=""
+	fi
+	done <${LOG_FILE}
+	rm -f ${LOG_FILE}
+	$UCI_SET_VARSTATE cwmp.@nslookupdiagnostic[0].SuccessCount=$success_count
+	[ "$1" == "cwmp" ] && $UCI_SET_VARSTATE cwmp.@nslookupdiagnostic[0].DiagnosticState=Complete
+	[ "$1" == "cwmp" ] && event_dignostic
+}
+
+delete_all_results() {
+	local j
+	for j in $($UCI_SHOW_VARSTATE cwmp | grep "cwmp.@NSLookupResult.*=NSLookupResult"); do
+		$UCI_DELETE_VARSTATE cwmp.@NSLookupResult[-1]
+	done
+}
+
+event_dignostic() {
+	local e=1
+	local i=0
+	while [ "$e" != 0 -a $i -lt 200 ]; do
+		ubus -t 1 call tr069 inform '{"event":"8 DIAGNOSTICS COMPLETE"}' &>/dev/null
+		e=$?
+		[ "$e" != "0" ] && sleep 1;
+		let i++
+	done
+}
+
+nslookup_stop_diagnostic() {
+	delete_all_results
+	local pids=`ps | grep nslookup_launch | grep -v grep | awk '{print $1}'`
+	if [ -n "$pids" ]; then
+		kill -9 $pids &>/dev/null
+		$UCI_SET_VARSTATE cwmp.@nslookupdiagnostic[0].DiagnosticState=None
+	fi
+}
+
+if [ "$1" == "run" ]; then
+	nslookup_launch $2
+elif [ "$1" == "stop" ]; then
+	nslookup_stop_diagnostic
+else
+	return
+fi
diff --git a/scripts/functions/serverselection_launch b/scripts/functions/serverselection_launch
new file mode 100644
index 0000000000000000000000000000000000000000..4a0cc2f4eadd8afbd9083cb6ae3f900443fd4daf
--- /dev/null
+++ b/scripts/functions/serverselection_launch
@@ -0,0 +1,138 @@
+#!/bin/sh
+# Copyright (C) 2019 iopsys Software Solutions AB
+# 	Author: AMIN Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+
+
+UCI_CONFIG_DIR="/etc/config/"
+UCI_GET_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state get"
+UCI_SET_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state set"
+
+serverselection_get() {
+	local val=`$UCI_GET_VARSTATE $1`
+	echo ${val:-$2}
+}
+
+serverselection_launch() {
+	local i res ba stc times sc1 success_count min_time avg_time max_time avg_time_sum min max fasthost micros
+	[ "$1" == "cwmp" ] && [ "`$UCI_GET_VARSTATE cwmp.@serverselectiondiagnostic[0].DiagnosticState`" != "Requested" ] && return
+	local hostlist=`serverselection_get cwmp.@serverselectiondiagnostic[0].HostList`
+	local cnt=`serverselection_get cwmp.@serverselectiondiagnostic[0].NumberOfRepetitions 3`
+	local timeout=`serverselection_get cwmp.@serverselectiondiagnostic[0].Timeout 1000`
+	local port=`serverselection_get cwmp.@serverselectiondiagnostic[0].port`
+	local protoversion=`serverselection_get cwmp.@serverselectiondiagnostic[0].ProtocolVersion Any`
+	local proto=`serverselection_get cwmp.@serverselectiondiagnostic[0].Protocol ICMP`
+	[ "$hostlist" = "" ] && return
+	timeout=$((timeout/1000))
+	[ "$timeout" = "0" ] && timeout="1"
+	micros=1000
+	success_count=0
+	avg_time_sum=0
+	avg_time_host=9999999
+	min=9999999
+	max=0
+	i=0
+
+	for host in $(echo $hostlist | tr "," "\n"); do
+		if [ "$proto" == "ICMP" ]; then
+			while [ $i -lt $cnt ]; do
+				let i++
+				[ "$protoversion" = "Any" ] && res=$(ping -q -c 1 -W $timeout $host 2>&1)
+				[ "$protoversion" = "IPv4" ] && res=$(ping -q -4 -c 1 -W $timeout $host 2>&1)
+				[ "$protoversion" = "IPv6" ] && res=$(ping -q -6 -c 1 -W $timeout $host 2>&1)
+				ba=`echo "$res" | grep "bad address"`
+				[ -n "$ba" ] && { $UCI_SET_VARSTATE cwmp.@serverselectiondiagnostic[0].DiagnosticState=Error_CannotResolveHostName; break; }
+				ba=`echo "$res" | grep "unknown host"`
+				[ -n "$ba" ] && { $UCI_SET_VARSTATE cwmp.@serverselectiondiagnostic[0].DiagnosticState=Error_CannotResolveHostName; break; }
+				stc=`echo "$res" | grep "received"`
+				[ -z "$stc" ] && { $UCI_SET_VARSTATE cwmp.@serverselectiondiagnostic[0].DiagnosticState=Error_Other; break; }
+				times=`echo "$res" | grep "min/avg/max"`
+				[ -z "$times" ] && break
+				sc1=`echo $stc | awk '{print $4}'`
+				sc1=${sc1:-0}
+				success_count=$((success_count+sc1))
+				times=`echo $times | awk -F'=' '{ print $2 }'`
+				min_time=`echo $times | awk -F'[=/ ]' '{ print $1 }'`	
+				avg_time=`echo $times | awk -F'[=/ ]' '{ print $2 }'`
+				max_time=`echo $times | awk -F'[=/ ]' '{ print $3 }'`
+				min_time=${min_time:-0}
+				avg_time=${avg_time:-0}
+				max_time=${max_time:-0}
+				min_time=$(echo $min_time $micros | awk '{printf "%3.0f\n",$1*$2}')
+				avg_time=$(echo $avg_time $micros | awk '{printf "%3.0f\n",$1*$2}')
+				max_time=$(echo $max_time $micros | awk '{printf "%3.0f\n",$1*$2}')
+				[ $min_time -lt $min ] && min=$min_time
+				[ $max_time -gt $max ] && max=$max_time
+				avg_time_sum=$((avg_time_sum+avg_time))
+			done
+		else
+			while [ $i -lt $cnt ]; do
+				[ "$port" = "" ] && return
+				let i++
+				[ "$protoversion" = "Any" ] && res=$(nping -c 1 --udp --dest-port $port --data-length 24 $host 2>&1)
+				[ "$protoversion" = "IPv4" ] && res=$(nping -4 -c 1 --udp --dest-port $port --data-length 24 $host 2>&1)
+				[ "$protoversion" = "IPv6" ] && res=$(nping -6 -c 1 --udp --dest-port $port --data-length 24 $host 2>&1)
+				ba=`echo "$res" | grep "RCVD"`
+				[ -z "$ba" ] && { $UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].DiagnosticState=Error_CannotResolveHostName; return; }
+				stc=`echo "$res" | grep "RCVD" | grep "unreachable"`
+				[ -n "$stc" ] && { $UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].DiagnosticState=Error_Other; return; }
+				times=`echo "$res" | grep "rtt"`
+				[ -z "$times" ] && continue
+				sc1=`echo "$res" | grep "Rcvd" | awk -F': ' '{print $3}' | awk -F'(' '{ print $1 }'`
+				sc1=${sc1:-0}
+				success_count=$((success_count+sc1))
+				max_time=`echo $times | awk -F': ' '{ print $2 }' | awk -F'ms' '{ print $1 }'`
+				min_time=`echo $times | awk -F': ' '{ print $3 }' | awk -F'ms' '{ print $1 }'`
+				avg_time=`echo $times | awk -F': ' '{ print $4 }' | awk -F'ms' '{ print $1 }'`
+				min_time=${min_time:-0}
+				avg_time=${avg_time:-0}
+				max_time=${max_time:-0}
+				min_time=$(echo $min_time $micros | awk '{printf "%3.0f\n",$1*$2}')
+				avg_time=$(echo $avg_time $micros | awk '{printf "%3.0f\n",$1*$2}')
+				max_time=$(echo $max_time $micros | awk '{printf "%3.0f\n",$1*$2}')
+				[ $min_time -lt $min ] && min=$min_time
+				[ $max_time -gt $max ] && max=$max_time
+				avg_time_sum=$((avg_time_sum+avg_time))
+			done
+		fi
+		[ $success_count -gt 0 ] && avg_time=$((avg_time_sum/success_count)) || avg_time=0
+		[[ "$avg_time" != "0" && $avg_time -lt $avg_time_host ]] && avg_time_host=$avg_time && min_time=$min && max_time=$max && fasthost=$host
+		success_count=0
+		avg_time_sum=0
+		min=9999999
+		max=0
+		i=0
+	done
+	$UCI_SET_VARSTATE cwmp.@serverselectiondiagnostic[0].DiagnosticState=Complete
+	$UCI_SET_VARSTATE cwmp.@serverselectiondiagnostic[0].FastestHost=$fasthost
+	$UCI_SET_VARSTATE cwmp.@serverselectiondiagnostic[0].AverageResponseTime=$avg_time_host
+	$UCI_SET_VARSTATE cwmp.@serverselectiondiagnostic[0].MinimumResponseTime=$min_time
+	$UCI_SET_VARSTATE cwmp.@serverselectiondiagnostic[0].MaximumResponseTime=$max_time
+	[ "$1" == "cwmp" ] && event_dignostic
+}
+
+event_dignostic() {
+	local e=1
+	local i=0
+	while [ "$e" != 0 -a $i -lt 200 ]; do
+		ubus -t 1 call tr069 inform '{"event":"8 DIAGNOSTICS COMPLETE"}' &>/dev/null
+		e=$?
+		[ "$e" != "0" ] && sleep 1;
+		let i++
+	done
+}
+
+serverselection_stop_diagnostic() {
+	local pids=`ps | grep serverselection_launch | grep -v grep | awk '{print $1}'`
+	if [ -n "$pids" ]; then
+		kill -9 $pids &>/dev/null
+		$UCI_SET_VARSTATE cwmp.@serverselectiondiagnostic[0].DiagnosticState=None
+	fi
+}
+
+if [ "$1" == "run" ]; then
+	serverselection_launch $2
+elif [ "$1" == "stop" ]; then
+	serverselection_stop_diagnostic
+else
+	return
+fi
diff --git a/scripts/functions/traceroute_launch b/scripts/functions/traceroute_launch
new file mode 100644
index 0000000000000000000000000000000000000000..8691552950268f715ff304c77efce1c497f85318
--- /dev/null
+++ b/scripts/functions/traceroute_launch
@@ -0,0 +1,88 @@
+#!/bin/sh
+# Copyright (C) 2019 iopsys Software Solutions AB
+# 	Author: AMIN Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+
+UCI_GET_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state get"
+UCI_SET_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state set"
+UCI_ADD_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state add"
+UCI_DELETE_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state delete"
+UCI_SHOW_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state show"
+
+traceroute_get() {
+	local val=`$UCI_GET_VARSTATE $1`
+	echo ${val:-$2}
+}
+
+traceroute_launch() {
+	local i res host ip time=0
+	[ "$1" == "cwmp" ] && [ "`$UCI_GET_VARSTATE cwmp.@traceroutediagnostic[0].DiagnosticState`" != "Requested" ] && return
+	local host=`traceroute_get cwmp.@traceroutediagnostic[0].Host`
+	local cnt=`traceroute_get cwmp.@traceroutediagnostic[0].NumberOfTries 3`
+	local dsize=`traceroute_get cwmp.@traceroutediagnostic[0].DataBlockSize 38`
+	local timeout=`traceroute_get cwmp.@traceroutediagnostic[0].Timeout 5000`
+	local maxhop=`traceroute_get cwmp.@traceroutediagnostic[0].MaxHops 30`
+	local proto=`traceroute_get cwmp.@traceroutediagnostic[0].ProtocolVersion Any`
+	[ "$host" = "" ] && return
+	timeout=$((timeout/1000))
+	[ "$timeout" = "0" ] && timeout = "1"
+	i=-2
+	delete_all_route_hops
+	rm -f /tmp/traceres
+	[ "$proto" = "Any" ] && traceroute -m $maxhop -w $timeout -q $cnt $host $dsize 2>&1 >/tmp/traceres
+	[ "$proto" = "IPv4" ] && traceroute -m $maxhop -w $timeout -q $cnt -4 $host $dsize 2>&1 >/tmp/traceres
+	[ "$proto" = "IPv6" ] && traceroute -m $maxhop -w $timeout -q $cnt -6 $host $dsize 2>&1 >/tmp/traceres
+	while read _ host ip time _; do
+		[ "$host" = "*" -a "$ip" = "*" ] && continue
+		let i++
+		[ "$i" = "-1" ] && continue;
+		ip=${ip#(}; ip=${ip%)}
+		time=${time%.*}
+		$UCI_ADD_VARSTATE cwmp RouteHops
+		$UCI_SET_VARSTATE cwmp.@RouteHops[$i].host=$host
+		$UCI_SET_VARSTATE cwmp.@RouteHops[$i].ip=$ip
+		$UCI_SET_VARSTATE cwmp.@RouteHops[$i].time=$time
+	done < /tmp/traceres
+	rm -f /tmp/traceres
+	let i++
+
+	[ "$1" == "cwmp" ] && $UCI_SET_VARSTATE cwmp.@traceroutediagnostic[0].DiagnosticState=Complete
+	$UCI_SET_VARSTATE cwmp.@traceroutediagnostic[0].NumberOfHops=$i
+	$UCI_SET_VARSTATE cwmp.@traceroutediagnostic[0].ResponseTime=$($UCI_GET_VARSTATE cwmp.@RouteHops[-1].time)
+	[ "$1" == "cwmp" ] && event_diagnostic
+}
+
+delete_all_route_hops() {
+	local j
+	for j in $($UCI_SHOW_VARSTATE cwmp | grep "cwmp.@RouteHops.*=RouteHops"); do
+		$UCI_DELETE_VARSTATE cwmp.@RouteHops[-1]
+	done
+}
+
+event_diagnostic() {
+	local e=1
+	local i=0
+	while [ "$e" != 0 -a $i -lt 200 ]; do
+		ubus -t 1 call tr069 inform '{"event":"8 DIAGNOSTICS COMPLETE"}'
+		e=$?
+		[ "$e" != "0" ] && sleep 1;
+		let i++
+	done
+}
+
+traceroute_stop() {
+	delete_all_route_hops
+	local pids=`ps aux | grep traceroute_launch | grep -v grep | grep -v stop | awk '{print $2}'`
+	[ -z "$pids" ] && pids=`ps | grep traceroute_launch | grep -v grep | grep -v stop | awk '{print $2}'`
+	if [ -n "$pids" ]; then
+		kill -9 $pids 2>/dev/null
+		$UCI_SET_VARSTATE cwmp.@traceroutediagnostic[0].DiagnosticState=None
+	fi
+}
+
+if [ "$1" == "run" ]; then
+	traceroute_launch $2 2>/dev/null  
+elif [ "$1" == "stop" ]; then
+	traceroute_stop 2>/dev/null
+else
+	return
+fi
diff --git a/scripts/functions/udpecho_launch b/scripts/functions/udpecho_launch
new file mode 100644
index 0000000000000000000000000000000000000000..79473e791b85445abe8bf35cab28f963f55404b8
--- /dev/null
+++ b/scripts/functions/udpecho_launch
@@ -0,0 +1,103 @@
+#!/bin/sh
+# Copyright (C) 2019 iopsys Software Solutions AB
+# 	Author: AMIN Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+
+
+UCI_CONFIG_DIR="/etc/config/"
+UCI_GET_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state get"
+UCI_SET_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state set"
+
+udpecho_get() {
+	local val=`$UCI_GET_VARSTATE $1`
+	echo ${val:-$2}
+}
+
+udpecho_launch() {
+	local i res ba stc times sc1 success_count failure_count min_time avg_time max_time avg_time_sum min max micros
+	[ "$1" == "cwmp" ] && [ "`$UCI_GET_VARSTATE cwmp.@udpechodiagnostic[0].DiagnosticState`" != "Requested" ] && return
+	local host=`udpecho_get cwmp.@udpechodiagnostic[0].Host`
+	local port=`udpecho_get cwmp.@udpechodiagnostic[0].port`
+	local cnt=`udpecho_get cwmp.@udpechodiagnostic[0].NumberOfRepetitions 1`
+	local dsize=`udpecho_get cwmp.@udpechodiagnostic[0].DataBlockSize 24`
+	local dscp=`udpecho_get cwmp.@udpechodiagnostic[0].DSCP 0`
+	local proto=`udpecho_get cwmp.@udpechodiagnostic[0].ProtocolVersion Any`
+	local inter_time=`udpecho_get cwmp.@udpechodiagnostic[0].InterTransmissionTime 1000`
+	local tos=$((dscp<<2))
+	inter_time=$((inter_time/1000))
+	[ "$inter_time" = "0" ] && inter_time="1"
+	[ "$host" = "" ] && return
+	[ "$port" = "" ] && return
+	micros=1000
+	success_count=0
+	avg_time_sum=0
+	min=9999999
+	max=0
+	i=0
+
+	while [ $i -lt $cnt ]; do
+		let i++
+		[ "$proto" = "Any" ] && res=$(nping -c 1 --tos $tos --udp --dest-port $port --data-length $dsize $host 2>&1)
+		[ "$proto" = "IPv4" ] && res=$(nping -4 -c 1 --tos $tos --udp --dest-port $port --data-length $dsize $host 2>&1)
+		[ "$proto" = "IPv6" ] && res=$(nping -6 -c 1 --tos $tos --udp --dest-port $port --data-length $dsize $host 2>&1)
+		ba=`echo "$res" | grep "RCVD"`
+		[ -z "$ba" ] && { $UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].DiagnosticState=Error_CannotResolveHostName; return; }
+		stc=`echo "$res" | grep "RCVD" | grep "unreachable"`
+		[ -n "$stc" ] && { $UCI_SET_VARSTATE cwmp.@ippingdiagnostic[0].DiagnosticState=Error_Other; return; }
+		times=`echo "$res" | grep "rtt"`
+		[ -z "$times" ] && continue
+		sc1=`echo "$res" | grep "Rcvd" | awk -F': ' '{print $3}' | awk -F'(' '{ print $1 }'`
+		sc1=${sc1:-0}
+		success_count=$((success_count+sc1))
+		max_time=`echo $times | awk -F': ' '{ print $2 }' | awk -F'ms' '{ print $1 }'`
+		min_time=`echo $times | awk -F': ' '{ print $3 }' | awk -F'ms' '{ print $1 }'`
+		avg_time=`echo $times | awk -F': ' '{ print $4 }' | awk -F'ms' '{ print $1 }'`
+		min_time=${min_time:-0}
+		avg_time=${avg_time:-0}
+		max_time=${max_time:-0}
+		min_time=$(echo $min_time $micros | awk '{printf "%3.0f\n",$1*$2}')
+		avg_time=$(echo $avg_time $micros | awk '{printf "%3.0f\n",$1*$2}')
+		max_time=$(echo $max_time $micros | awk '{printf "%3.0f\n",$1*$2}')
+		[ $min_time -lt $min ] && min=$min_time
+		[ $max_time -gt $max ] && max=$max_time
+		avg_time_sum=$((avg_time_sum+avg_time))
+		sleep $inter_time
+	done
+	failure_count=$((cnt-success_count))
+	[ $success_count -gt 0 ] && avg_time=$((avg_time_sum/success_count)) || avg_time=0
+	min_time=$min
+	max_time=$max
+	$UCI_SET_VARSTATE cwmp.@udpechodiagnostic[0].DiagnosticState=Complete
+	$UCI_SET_VARSTATE cwmp.@udpechodiagnostic[0].SuccessCount=$success_count
+	$UCI_SET_VARSTATE cwmp.@udpechodiagnostic[0].FailureCount=$failure_count
+	$UCI_SET_VARSTATE cwmp.@udpechodiagnostic[0].AverageResponseTime=$avg_time
+	$UCI_SET_VARSTATE cwmp.@udpechodiagnostic[0].MinimumResponseTime=$min_time
+	$UCI_SET_VARSTATE cwmp.@udpechodiagnostic[0].MaximumResponseTime=$max_time
+	[ "$1" == "cwmp" ] && event_dignostic
+}
+
+event_dignostic() {
+	local e=1
+	local i=0
+	while [ "$e" != 0 -a $i -lt 200 ]; do
+		ubus -t 1 call tr069 inform '{"event":"8 DIAGNOSTICS COMPLETE"}' &>/dev/null
+		e=$?
+		[ "$e" != "0" ] && sleep 1;
+		let i++
+	done
+}
+
+udpecho_stop_diagnostic() {
+	local pids=`ps | grep udpecho_launch | grep -v grep | awk '{print $1}'`
+	if [ -n "$pids" ]; then
+		kill -9 $pids &>/dev/null
+		$UCI_SET_VARSTATE cwmp.@udpechodiagnostic[0].DiagnosticState=None
+	fi
+}
+
+if [ "$1" == "run" ]; then
+	udpecho_launch $1
+elif [ "$1" == "stop" ]; then
+	udpecho_stop_diagnostic
+else
+	return
+fi
diff --git a/scripts/functions/upload_launch b/scripts/functions/upload_launch
new file mode 100644
index 0000000000000000000000000000000000000000..6d11a964a6537192345ba1fe4190b8b7d981d7c4
--- /dev/null
+++ b/scripts/functions/upload_launch
@@ -0,0 +1,124 @@
+#!/bin/sh
+# Copyright (C) 2019 iopsys Software Solutions AB
+# 	Author: IMEN Bhiri <imen.bhiri@pivasoftware.com>
+# 	Author: AMIN Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+
+
+UCI_CONFIG_DIR="/etc/config/"
+UCI_GET_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state get"
+UCI_SET_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state set"
+UCI_ADD_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state add"
+UCI_DELETE_VARSTATE="/sbin/uci -q ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} -P /var/state delete"
+CAPTURE_FILE="/tmp/upload_dump"
+UPLOAD_DIAGNOSTIC_FILE="/tmp/icwmp_upload_diagnostic"
+CONNECTION_TIMEOUT=20
+
+upload_get() {
+	local val=`$UCI_GET_VARSTATE $1`
+	echo ${val:-$2}
+}
+
+upload_launch() {
+	local tx_bytes_before rx_bytes_before time1 tx_bytes_after rx_bytes_after time2 res ba stc periodtime
+	local url=$2
+	local interface=$3
+	local size=$4
+	[ "$1" == "cwmp" ] && [ "`$UCI_GET_VARSTATE cwmp.@uploaddiagnostic[0].DiagnosticState`" != "Requested" ] && return
+	[ "$url" = "" ] && { $UCI_SET_VARSTATE cwmp.@uploaddiagnostic[0].DiagnosticState=Error_InitConnectionFailed; return; }
+	local proto=`upload_get cwmp.@uploaddiagnostic[0].ProtocolVersion Any`
+	# Disable acceleration on Broadcom devices to capture all packets with tcpdump
+	[ -e /usr/sbin/fcctl ] && { fcctl disable >/dev/null 2>&1; fcctl flush >/dev/null 2>&1; }
+	tcpdump -i $interface tcp -w ${CAPTURE_FILE} > /dev/null 2>&1 &
+	PID=$!
+	sleep 1
+	dd if=/dev/zero of=${UPLOAD_DIAGNOSTIC_FILE} bs=${size} count=1 2>/dev/null
+	if [ ${url:0:7} = http:// ]; then
+		tx_bytes_before=`ubus call network.device status "{'name':'$interface'}" | jsonfilter -e @.statistics.tx_bytes`
+		rx_bytes_before=`ubus call network.device status "{'name':'$interface'}" | jsonfilter -e @.statistics.rx_bytes`
+		time1=`date +%s`
+		[ "$proto" = "Any" ] && res=$(curl --fail --connect-timeout ${CONNECTION_TIMEOUT} -T ${UPLOAD_DIAGNOSTIC_FILE} $url 2>&1)
+		[ "$proto" = "IPv4" ] && res=$(curl -4 --fail --connect-timeout ${CONNECTION_TIMEOUT} -T ${UPLOAD_DIAGNOSTIC_FILE} $url 2>&1)
+		[ "$proto" = "IPv6" ] && res=$(curl -6 --fail --connect-timeout ${CONNECTION_TIMEOUT} -T ${UPLOAD_DIAGNOSTIC_FILE} $url 2>&1)
+		time2=`date +%s`
+		tx_bytes_after=`ubus call network.device status "{'name':'$interface'}" | jsonfilter -e @.statistics.tx_bytes`
+		rx_bytes_after=`ubus call network.device status "{'name':'$interface'}" | jsonfilter -e @.statistics.rx_bytes`
+		ba=`echo "$res" | grep "bad address"`
+		[ -n "$ba" ] && { $UCI_SET_VARSTATE cwmp.@uploaddiagnostic[0].DiagnosticState=Error_InitConnectionFailed; kill $PID &> /dev/null; return; }
+		stc=`echo "$res" | grep "404 Not Found"`
+		[ -n "$stc" ] && { $UCI_SET_VARSTATE cwmp.@uploaddiagnostic[0].DiagnosticState=Error_NoResponse; kill $PID &> /dev/null; return; }
+		stc=`echo "$res" |sed -n 3p|awk '{print $13}'`
+		[ "$stc" != "100" ] && { $UCI_SET_VARSTATE cwmp.@uploaddiagnostic[0].DiagnosticState=Error_TransferFailed; kill $PID &> /dev/null; return; }
+	elif [ ${url:0:6} = ftp:// ]; then 
+		#add user and pass if they exist
+		substr="@"
+		if [ -z "${url##*$substr*}" ] ;then
+			url=`echo $url |sed -e "s/ftp:\/\/\([^:]*\):\([^:]*\)@\(.*\)/-u \1:\2 ftp:\/\/\3/"`
+		fi
+		tx_bytes_before=`ubus call network.device status "{'name':'$interface'}" | jsonfilter -e @.statistics.tx_bytes`
+		rx_bytes_before=`ubus call network.device status "{'name':'$interface'}" | jsonfilter -e @.statistics.rx_bytes`
+		time1=`date +%s`
+		[ "$proto" = "Any" ] && res=$(curl --fail --disable-epsv --ftp-pasv --connect-timeout ${CONNECTION_TIMEOUT} -T ${UPLOAD_DIAGNOSTIC_FILE} $url 2>&1)
+		[ "$proto" = "IPv4" ] && res=$(curl -4 --fail --disable-epsv --ftp-pasv --connect-timeout ${CONNECTION_TIMEOUT} -T ${UPLOAD_DIAGNOSTIC_FILE} $url 2>&1)
+		[ "$proto" = "IPv6" ] && res=$(curl -6 --fail --disable-epsv --ftp-pasv --connect-timeout ${CONNECTION_TIMEOUT} -T ${UPLOAD_DIAGNOSTIC_FILE} $url 2>&1)
+		time2=`date +%s`
+		tx_bytes_after=`ubus call network.device status "{'name':'$interface'}" | jsonfilter -e @.statistics.tx_bytes`
+		rx_bytes_after=`ubus call network.device status "{'name':'$interface'}" | jsonfilter -e @.statistics.rx_bytes`
+		ba=`echo "$res" | grep "Couldn't resolve host"`
+		[ -n "$ba" ] && { $UCI_SET_VARSTATE cwmp.@uploaddiagnostic[0].DiagnosticState=Error_InitConnectionFailed; kill $PID 2> /dev/null; return; }
+		stc=`echo "$res" | grep "Access denied"`
+		[ -n "$stc" ] && { $UCI_SET_VARSTATE cwmp.@uploaddiagnostic[0].DiagnosticState=Error_LoginFailed; kill $PID 2> /dev/null; return; }
+		stc=`echo "$res" | grep "Failed FTP upload"`
+		[ -n "$stc" ] && { $UCI_SET_VARSTATE cwmp.@uploaddiagnostic[0].DiagnosticState=Error_NoResponse; kill $PID 2> /dev/null; return; }
+		stc=`echo "$res" |tail -n 1 |awk '{print $(NF-11)}'`
+		[ "$stc" != "100" ] && { $UCI_SET_VARSTATE cwmp.@uploaddiagnostic[0].DiagnosticState=Error_TransferFailed; kill $PID 2> /dev/null; return; }
+	fi
+	tx_bytes=$((tx_bytes_after-tx_bytes_before))
+	rx_bytes=$((rx_bytes_after-rx_bytes_before))
+	periodtime=$(($((time2-time1))*1000000))
+	$UCI_SET_VARSTATE cwmp.@uploaddiagnostic[0].DiagnosticState=Completed
+	$UCI_SET_VARSTATE cwmp.@uploaddiagnostic[0].TestBytesSent=$size
+	$UCI_SET_VARSTATE cwmp.@uploaddiagnostic[0].TotalBytesReceived=$rx_bytes
+	$UCI_SET_VARSTATE cwmp.@uploaddiagnostic[0].TotalBytesSent=$tx_bytes
+	$UCI_SET_VARSTATE cwmp.@uploaddiagnostic[0].PeriodOfFullLoading=$periodtime
+	local perconnection=`$UCI_GET_VARSTATE cwmp.@uploaddiagnostic[0].EnablePerConnection`
+	if ([ "$perconnection" == "true" ] || [ "$perconnection" == "1" ]); then
+		$UCI_ADD_VARSTATE cwmp UploadPerConnection
+		$UCI_SET_VARSTATE cwmp.@UploadPerConnection[0].TestBytesSent=$size
+		$UCI_SET_VARSTATE cwmp.@UploadPerConnection[0].TotalBytesReceived=$rx_bytes
+		$UCI_SET_VARSTATE cwmp.@UploadPerConnection[0].TotalBytesSent=$tx_bytes
+	else
+		$UCI_DELETE_VARSTATE cwmp.@UploadPerConnection[0]
+	fi
+	rm ${UPLOAD_DIAGNOSTIC_FILE} &>/dev/null
+	sleep 3 
+	local pids=`ps | grep $PID`
+	kill $PID &>/dev/null
+	# Enable acceleration on Broadcom devices after killing the tcpdump pid 
+	[ -e /usr/sbin/fcctl ] && { fcctl enable >/dev/null 2>&1; fcctl flush >/dev/null 2>&1; }	
+}
+
+upload_stop_diagnostic() {
+	$UCI_DELETE_VARSTATE cwmp.@UploadPerConnection[0]
+	local pids=`ps | grep upload_launch.*run | grep -v grep | awk '{print $1}'`
+	if [ -n "$pids" ]; then
+		kill -9 $pids &>/dev/null
+		$UCI_SET_VARSTATE cwmp.@uploaddiagnostic[0].DiagnosticState=None
+	fi
+	local pids=`ps | grep upload_launch.*run | grep -v grep | awk '{print $1}'`                               
+    if [ -n "$pids" ]; then
+    	kids=$(grep -l "PPid.*$pids" /proc/*/task/*/status | grep -o "[0-9]*")                    
+		for kid in $kids; do                                                  
+	    	kill -9 $kid &>/dev/null                                                   
+	    done
+	    kill -9 $pids &>/dev/null                                                               
+	    $UCI_SET_VARSTATE cwmp.@uploaddiagnostic[0].DiagnosticState=None      
+    fi 
+}
+
+if [ "$1" == "run" ] ; then
+	upload_launch $2 $3 $4 $5
+elif [ "$1" == "stop" ]; then
+	upload_stop_diagnostic
+else
+	return
+fi
diff --git a/tools/generate_xml.sh b/tools/generate_xml.sh
new file mode 100755
index 0000000000000000000000000000000000000000..56c59ca6db3d9b176714d6d62c8f417ab6eacdb9
--- /dev/null
+++ b/tools/generate_xml.sh
@@ -0,0 +1,413 @@
+#!/bin/sh
+
+
+# USAGE:
+# ./generate_xml.sh <data model> <scripts path> <product class> <device protocol> <model name> <software version>
+# If the input arguments are empty, then use the default values:
+	
+
+# VARIABLES ####################################################################################################
+obj_look_obj_child_list=""
+obj_look_param_child_list=""
+obj_look_father_list=""
+param_look_father_list=""
+
+
+# FUNCTIONS ####################################################################################################
+set_node_name() { 
+	echo ${1}
+}
+
+set_obj_object_child() { 
+	echo "${1},${2}"
+}
+
+set_obj_object_line() {
+	echo "object, ${1}, root, ${2}"
+}
+
+set_obj_param_child() { 
+	echo "${1},${2}"
+}
+set_obj_param_line() { 
+	echo "parameter, ${1}, root, ${2}"
+}
+
+set_obj_instance_line(){
+	echo "instance, , root, ${1}"
+}
+
+set_objs_child_instance_name(){
+	echo "${1}.${2}"
+}
+
+set_prms_child_instance_name(){
+	echo "${1}.${2}"
+}
+
+get_param_type(){
+	ptype=$1
+	case "$ptype" in
+		"DMT_STRING" )
+			echo "string"
+			;;
+		"DMT_UNINT" )
+			echo "unsignedInt"
+			;;
+		"DMT_TIME" )
+			echo "dateTime"
+			;;
+		"DMT_BOOL" )
+			echo "boolean"
+			;;
+		"DMT_LONG" )
+			echo "long"
+			;;
+		"DMT_INT" )
+			echo "int"
+			;;
+		"DMT_HEXBIN" )
+			echo "hexbin"
+			;;
+	esac
+	
+}
+
+get_leaf_obj_line_number(){
+	if [ "$1" !=  "root.c" ]; then
+		echo `grep -nE DMOBJ\|DMLEAF $1 | grep -v UPNP |cut -f1 -d: | tr "\n" " "`
+	else
+		if [ $DATA_MODEL == "tr098" ]; then
+			echo `grep -nE DMOBJ\|DMLEAF $1 |grep "098" |grep -v UPNP | cut -f1 -d: | tr "\n" " "`
+		else
+			echo `grep -nE DMOBJ\|DMLEAF $1 |grep "181" |grep -v UPNP | cut -f1 -d: | tr "\n" " "`
+		fi
+	fi
+}
+
+add_item_to_list(){
+	item="$1"
+	list="$2"
+	length=${#list}
+	if [ $length == 0 ]; then
+		list="$item"
+	else
+		list="$list $item"
+	fi
+	echo "$list"
+}
+
+remove_item_from_list(){
+	item="$1"
+	list="$2"
+	new_list=""
+	for i in $list; do
+		if [ "$i" == "$item" ]; then
+			continue
+		fi
+		new_list=`add_item_to_list "$i" "$new_list"`
+	done
+	echo "$new_list"
+}
+
+#Tree.txt Generation ####################################
+gen_dm_tree(){
+	file=$1
+	#Get line number of lines containing Object or Param
+	leaf_obj_line=`get_leaf_obj_line_number "$file"`
+	for line_number in $leaf_obj_line; do
+		#Get table name
+		table_name=`sed -n $line_number'p' $file | cut -d' ' -f2 | tr -d []`
+		str=`sed -n $line_number'p' $file | grep "DMOBJ"`
+		parameters_list=""
+		objects_list=""
+		o_found="0"
+		p_found="0"
+		
+		######## Before looking for childs Look to father
+		for obj in $obj_look_obj_child_list; do
+			childs_obj=`echo $obj | awk -F ":" '{print $2}'`
+			if [ "$childs_obj" == "$table_name" ]; then  #I found mum
+				father_name=`echo $obj | awk -F ":" '{print $1}'`
+				o_found="1"
+				break
+			fi
+		done
+		for param in $obj_look_param_child_list; do
+			childs_params=`echo $param | awk -F ":" '{print $2}'`
+			if [ "$childs_params" == "$table_name" ]; then  #I found mum
+				father_name=`echo $param | awk -F ":" '{print $1}'`
+				p_found="1"
+				break
+			fi
+		done
+	
+		######## Create Childs list
+		while IFS=, read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11; do
+			name=`echo ${f1//{} | sed 's/^"\(.*\)"$/\1/'`
+			permission=${f2// &}
+			type=${f3// }
+			multiinstance=${f6// }
+			if [ "$multiinstance" != "NULL" ]; then
+				instance="true"
+			else
+				instance="false"
+			fi
+			if [ "$name" == "(char *)&dmroot"  ]; then
+				name=${ROOT_PATH}
+			fi
+			if [ "$o_found" == "1" ]; then
+				name=`set_obj_object_child "$father_name" "$name"`
+				oname=`set_obj_object_line $instance "$name"`
+				echo "$oname," >> $TREE_TXT
+#				if [ "$instance" == "true" ]; then
+#					objinst=`set_obj_instance_line $name`
+#					echo $objinst >> $TREE_TXT
+#				fi
+				#tree=`add_item_to_list "$oname" "$tree"`
+			fi
+			if [ "$p_found" == "1" ]; then
+				name=`set_obj_param_child "$father_name" "$name"`
+				otype=`get_param_type $type`
+				pname=`set_obj_param_line "$otype" "$name"`
+				#tree=`add_item_to_list "$pname" "$tree"`
+				echo $pname >> $TREE_TXT
+			fi
+			if [ -n "$str" ]; then
+				child_objects=${f9// }
+				child_parameters=${f10// }
+				obj_name=${name}
+				#Add the actual object to the list of objects looking for their children objects ########
+				if [ "$child_objects" != "NULL" ]; then
+					new_item=${obj_name}":"${child_objects}
+					obj_look_obj_child_list=`add_item_to_list "$new_item" "$obj_look_obj_child_list"`
+				fi
+				#Add the actual object to the list of objects looking for their children parameters #######
+				if [ "$child_parameters" != "NULL" ]; then
+					new_item=${obj_name}":"${child_parameters}
+					obj_look_param_child_list=`add_item_to_list "$new_item" "$obj_look_param_child_list"`
+				fi
+			fi
+		done <<<"`sed -n $line_number',/{0}/p' $file | sed -e '/{0}/d' | sed -e '/^{/!d'`"
+		
+		######### Remove object from list of object looking there childs
+		for obj in $obj_look_obj_child_list; do
+			childs_obj=`echo $obj | awk -F ":" '{print $2}'`
+			if [ "$childs_obj" == "$table_name" ]; then  #I found mum
+				obj_look_obj_child_list=`remove_item_from_list "$obj" "$obj_look_obj_child_list"`
+				break
+			fi
+		done
+		
+		######### Remove object from list of object looking there childs
+		for param in $obj_look_param_child_list; do
+			childs_params=`echo $param | awk -F ":" '{print $2}'`
+			if [ "$childs_params" == "$table_name" ]; then  #I found mum
+				obj_look_param_child_list=`remove_item_from_list "$param" "$obj_look_param_child_list"`
+				break
+			fi
+		done
+	done
+}
+#XML Generation Functions ####################################
+xml_open_tag_object() {
+	local objn="$1"
+	local isarray="$2"
+	local level="$3"
+	local h_child="$4"
+	local sp1=0 sp2=0
+	let sp1=8+4*$level
+	let sp2=$sp1+4
+	printf "%${sp1}s"; echo "<parameter>"
+	printf "%${sp2}s"; echo "<parameterName>$objn</parameterName>"
+	printf "%${sp2}s"; echo "<parameterType>object</parameterType>"
+	printf "%${sp2}s"; echo "<array>$isarray</array>"
+	if [ -n "$h_child" -a "$h_child" != "0" ]; then
+		printf "%${sp2}s"; echo "<parameters>"
+	fi
+}
+
+xml_close_tag_object() {
+	local level="$1"
+	local h_child="$2"
+	local sp1=0 sp2=0
+	let sp1=8+4*$level
+	let sp2=$sp1+4
+	if [ -n "$h_child" -a "$h_child" != "0" ]; then
+		printf "%${sp2}s"; echo "</parameters>"
+	fi
+	printf "%${sp1}s"; echo "</parameter>"
+}
+
+xml_add_parameter() {
+	local paramn="$1"
+	local type="$2"
+	local level="$3"
+	local sp1=0 sp2=0
+	let sp1=8+4*$level
+	let sp2=$sp1+4
+
+	printf "%${sp1}s"; echo "<parameter>"
+	printf "%${sp2}s"; echo "<parameterName>$paramn</parameterName>"
+	printf "%${sp2}s"; echo "<parameterType>$type</parameterType>"
+	printf "%${sp1}s"; echo "</parameter>"
+}
+
+
+xml_write_line() {
+	local level="$1"
+	local parent="$2"
+	local path="$3"
+	local line=""
+	
+	local LINES=`grep "$path[^,]\+$\|$path[^,]\+,$" tmp.txt`
+
+	for line in $LINES; do
+		local p=`echo "$line" | cut -d, -f$((level+2))`
+		[ "$p" != "$parent" ] && continue
+		local param=`echo "$line" | cut -d, -f$((level+3))`
+		[ "$param" = "" ] && continue
+		local node=`echo "$line" | cut -d, -f1`
+		if [ "$node" = "object" ]; then
+			local isarray=`echo "$line" | cut -d, -f2`
+			let cnt_obj++
+			local has_child=`grep "$path$param,[a-zA-Z0-9_,]\+$" tmp.txt |wc -l`;
+			xml_open_tag_object "$param" "$isarray" "$level" "$has_child"
+			xml_write_line "$((level+1))" "$param" "$path$param,"
+			xml_close_tag_object "$level" "$has_child"
+		elif [ "$node" = "parameter" ]; then
+			local type=`echo "$line" | cut -d, -f2`
+			let cnt_param++
+			xml_add_parameter "$param" "$type" "$level"
+		fi
+	done
+}
+
+gen_data_model_xml_file() {
+echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+echo "<deviceType xmlns=\"urn:dslforum-org:hdm-0-0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"urn:dslforum-org:hdm-0-0 deviceType.xsd\">"
+echo "    <protocol>$DEVICE_PROTOCOL</protocol>"
+echo "    <manufacturer>Inteno</manufacturer>"
+echo "    <manufacturerOUI>002207</manufacturerOUI>"
+echo "    <productClass>$PRODUCT_CLASS</productClass>"
+echo "    <modelName>$MODEL_NAME</modelName>" 
+echo "    <softwareVersion>$SOFTWARE_VERSION</softwareVersion>"
+echo "    <dataModel>"
+echo "        <attributes>"
+echo "            <attribute>"
+echo "                <attributeName>notification</attributeName>"
+echo "                <attributeType>int</attributeType>"
+echo "                <minValue>0</minValue>"
+echo "                <maxValue>2</maxValue>"
+echo "            </attribute>"
+echo "            <attribute>"
+echo "                <attributeName>accessList</attributeName>"
+echo "                <attributeType>string</attributeType>"
+echo "                <array>true</array>"
+echo "                <attributeLength>64</attributeLength>"
+echo "            </attribute>"
+echo "            <attribute>"
+echo "                <attributeName>visibility</attributeName>"
+echo "                <attributeType>string</attributeType>"
+echo "                <array>true</array>"
+echo "                <attributeLength>64</attributeLength>"
+echo "            </attribute>"
+echo "        </attributes>"
+echo "        <parameters>"
+xml_write_line "1" "root" "root,"
+echo "        </parameters>"
+echo "    </dataModel>"
+echo "</deviceType>"
+}
+
+
+
+
+# MAIN ####################################################################################################
+# CONSTANTS ######
+CURRENT_PATH=`pwd`
+OUT_STREAM="tmp.txt"
+ROOT_FILE="root.c"
+TREE_TXT=$CURRENT_PATH"/"$OUT_STREAM
+
+DM_98="tr098"
+DM_181="tr181"
+DM_PATH=${2:-"$(pwd)/../dmtree/"}
+PRODUCT_CLASS=${3:-"DG301"}
+DEVICE_PROTOCOL=${4:-"DEVICE_PROTOCOL_DSLFTR069v1"}
+MODEL_NAME=${5:-"DG301-A"}
+SOFTWARE_VERSION=${6:-"1.2.3.4B"}
+
+SCRIPTS_PATH_COMMON=${DM_PATH}/"common/"
+cnt_obj=0
+cnt_param=0
+### GEN TR098 TREE ####
+DATA_MODEL=$DM_98
+SCRIPTS_PATH=${DM_PATH}/${DATA_MODEL}
+DIR_LIST="$SCRIPTS_PATH_COMMON $SCRIPTS_PATH"
+XML_OUT_STREAM_098="iopsys_tr098.xml"
+ROOT_PATH="InternetGatewayDevice"
+####
+
+echo "Start Generation of TR098..."
+echo "Please wait..."
+rm -rf $OUT_STREAM
+rm -rf $XML_OUT_STREAM_098
+echo "object,false,root,$ROOT_PATH," > $OUT_STREAM
+cd "$SCRIPTS_PATH_COMMON"
+gen_dm_tree $ROOT_FILE
+for dir in $DIR_LIST; do
+	cd $dir
+	files=`ls *.c |grep -v $ROOT_FILE`
+	for file in $files; do
+		gen_dm_tree "$file"
+	done
+done
+cd $CURRENT_PATH
+
+sort -k 4 $OUT_STREAM > tmp2.txt
+cat tmp2.txt | tr -d "[:blank:]" > $OUT_STREAM
+
+gen_data_model_xml_file > $XML_OUT_STREAM_098
+cnt_obj=`grep -c "object," tmp.txt`
+cnt_param=`grep -c "parameter," tmp.txt`
+echo "Number of TR098 objects is $cnt_obj"
+echo "Number of TR098 parameters is $cnt_param"
+echo "End of TR098 Generation"
+
+### GEN TR181 TREE ##################################
+cnt_obj=0
+cnt_param=0
+DATA_MODEL=$DM_181
+SCRIPTS_PATH=${DM_PATH}/${DATA_MODEL}
+DIR_LIST="$SCRIPTS_PATH_COMMON $SCRIPTS_PATH"
+XML_OUT_STREAM_181="iopsys_tr181.xml"
+ROOT_PATH="Device"
+########
+
+echo "Start Generation of TR0181..."
+echo "Please wait..."
+rm -rf $OUT_STREAM
+rm -rf $XML_OUT_STREAM_181
+echo "object,false,root,$ROOT_PATH," > $OUT_STREAM
+cd "$SCRIPTS_PATH_COMMON"
+gen_dm_tree $ROOT_FILE
+for dir in $DIR_LIST; do
+	cd $dir
+	files=`ls *.c |grep -v $ROOT_FILE`
+	for file in $files; do
+		gen_dm_tree "$file"
+	done
+done
+cd $CURRENT_PATH
+
+sort -k 4 $OUT_STREAM > tmp2.txt
+cat tmp2.txt | tr -d "[:blank:]" > $OUT_STREAM
+rm -rf tmp2.txt
+gen_data_model_xml_file > $XML_OUT_STREAM_181
+cnt_obj=`grep -c "object," tmp.txt`
+cnt_param=`grep -c "parameter," tmp.txt`
+echo "Number of TR181 objects is $cnt_obj"
+echo "Number of TR181 parameters is $cnt_param"
+echo "End of TR181 Generation"
+rm -rf tmp.txt
diff --git a/tools/generate_xml_bbf.sh b/tools/generate_xml_bbf.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3b818eeb2138d6353d55a9d1cad08849dd5bc0ac
--- /dev/null
+++ b/tools/generate_xml_bbf.sh
@@ -0,0 +1,412 @@
+#!/bin/sh
+
+# USAGE:
+# ./generate_xml.sh
+
+
+############################################ VARIABLES #########################################################
+CURRENT_PATH=`pwd`
+OUT_STREAM="tmp.txt"
+ROOT_FILE="root.c"
+TREE_TXT=$CURRENT_PATH"/"$OUT_STREAM
+DM_PATH=${2:-"$(pwd)/../dmtree/"}
+SCRIPTS_PATH_COMMON=${DM_PATH}/"common/"
+obj_look_obj_child_list=""
+obj_look_param_child_list=""
+
+############################################ FUNCTIONS #########################################################
+set_obj_object_child() { 
+	echo "${1}.${2}"
+}
+
+set_obj_object_line() {
+	echo "object, ${1}, , , , root, ${2}"
+}
+
+set_obj_param_child() { 
+	echo "${1}.${2}"
+}
+
+set_obj_param_line() {
+	echo "parameter, ${1}, ${2}, ${3}, ${4}, root, ${5}"
+}
+
+get_param_type(){
+	ptype=$1
+	case "$ptype" in
+		"DMT_STRING" )
+			echo "string"
+			;;
+		"DMT_UNINT" )
+			echo "unsignedInt"
+			;;
+		"DMT_TIME" )
+			echo "dateTime"
+			;;
+		"DMT_BOOL" )
+			echo "boolean"
+			;;
+		"DMT_LONG" )
+			echo "long"
+			;;
+		"DMT_INT" )
+			echo "int"
+			;;
+		"DMT_HEXBIN" )
+			echo "hexbin"
+			;;
+	esac
+	
+}
+
+get_leaf_obj_line_number(){
+	if [ "$1" !=  "root.c" ]; then
+		echo `grep -nE DMOBJ\|DMLEAF $1 | grep -v UPNP |cut -f1 -d: | tr "\n" " "`
+	else
+		if [ $DATA_MODEL == "tr098" ]; then
+			echo `grep -nE DMOBJ\|DMLEAF $1 |grep "098" |grep -v UPNP | cut -f1 -d: | tr "\n" " "`
+		else
+			echo `grep -nE DMOBJ\|DMLEAF $1 |grep "181" |grep -v UPNP | cut -f1 -d: | tr "\n" " "`
+		fi
+	fi
+}
+
+add_item_to_list(){
+	item="$1"
+	list="$2"
+	length=${#list}
+	if [ $length == 0 ]; then
+		list="$item"
+	else
+		list="$list $item"
+	fi
+	echo "$list"
+}
+
+remove_item_from_list(){
+	item="$1"
+	list="$2"
+	new_list=""
+	for i in $list; do
+		if [ "$i" == "$item" ]; then
+			continue
+		fi
+		new_list=`add_item_to_list "$i" "$new_list"`
+	done
+	echo "$new_list"
+}
+
+is_with_instance () {
+	local obj=$1
+	local inst=`echo $obj | rev | cut -d'.' -f 2 | rev`
+	if [ "$inst" == "i" ]; then
+		echo "1"
+	else
+		echo "0"
+	fi
+}
+
+file_filter(){
+	file=$1
+	sort -k 7 $file > tmp2.txt
+	cat tmp2.txt | tr -d "[:blank:]" > $file
+	rm -rf tmp2.txt
+	sed 's/,,,,/,/g' $file > tmp3.txt
+	mv tmp3.txt $file
+	sed 's/CUSTOM_PREFIX"/X_IOPSYS_EU_/g' $file > tmp3.txt
+	mv tmp3.txt $file
+	sed 's/"//' $file > tmp3.txt
+	mv tmp3.txt $file
+	sed 's/"././g' $file > tmp3.txt
+	mv tmp3.txt $file
+	local obl=""
+	local objects=`grep "object" $file |wc -l`
+	local object_lines=`grep "object" $file`
+	for obl in $object_lines; do
+		local objname=`echo "$obl" | cut -d, -f3`
+		local inst=`is_with_instance $objname`
+		if [ "$inst" == "1" ]; then
+			sed -ri "/$prev_obj$/d" $file
+			continue
+		fi
+		prev_obj=$obl
+	done
+	sed -ri '/^\s*$/d' $file
+	sed -ri 's/\.i\./\.\{i\}\./g' $file
+}
+
+################# Tree.txt Generation ####################
+gen_dm_tree(){
+	file=$1
+	#Get line number of lines containing Object or Param
+	leaf_obj_line=`get_leaf_obj_line_number "$file"`
+
+	for line_number in $leaf_obj_line; do
+		#Get table name
+		table_name=`sed -n $line_number'p' $file | cut -d' ' -f2 | tr -d []`
+		str=`sed -n $line_number'p' $file | grep "DMOBJ"`
+		parameters_list=""
+		objects_list=""
+		o_found="0"
+		p_found="0"
+
+		######## Before looking for childs Look to father
+		for obj in $obj_look_obj_child_list; do
+			multiinst_obj=`echo $obj | awk -F ":" '{print $2}'`
+			childs_obj=`echo $obj | awk -F ":" '{print $3}'`
+			if [ "$childs_obj" == "$table_name" ]; then  #I found mum
+				if [ "$multiinst_obj" != "NULL" ]; then
+					tmp=`echo $obj | awk -F ":" '{print $1}'`
+					father_name="${tmp}.i"
+				else
+					father_name=`echo $obj | awk -F ":" '{print $1}'`
+				fi
+				o_found="1"
+				break
+			fi
+		done
+		for param in $obj_look_param_child_list; do
+			multiinst_params=`echo $param | awk -F ":" '{print $2}'`
+			childs_params=`echo $param | awk -F ":" '{print $3}'`
+			if [ "$childs_params" == "$table_name" ]; then  #I found mum
+				if [ "$multiinst_params" != "NULL" ]; then
+					tmp=`echo $param | awk -F ":" '{print $1}'`
+					father_name="${tmp}.i"
+				else
+					father_name=`echo $param | awk -F ":" '{print $1}'`
+				fi
+				p_found="1"
+				break
+			fi
+		done
+
+		######## Create Childs list
+		while IFS=, read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11; do
+			name=`echo ${f1//{} | sed 's/^"\(.*\)"$/\1/'`
+			permission=${f2// &}
+			type=${f3// }
+			browse=${f6// }
+
+			if [ "$permission" == "DMWRITE" ]; then
+				instance="readWrite"
+			else
+				instance="readOnly"
+			fi
+
+			if [ "$name" == "(char *)&dmroot"  ]; then
+				name=${ROOT_PATH}
+			fi
+
+			if [ "$o_found" == "1" ]; then
+				name=`set_obj_object_child "$father_name" "$name"`
+				oname=`set_obj_object_line $instance "$name"`
+				if [ "$browse" != "NULL" ]; then
+					echo "$oname.{i}." >> $TREE_TXT
+				else
+					echo "$oname." >> $TREE_TXT
+				fi
+			fi
+
+			if [ "$p_found" == "1" ]; then
+				forced_inform=${f6// &}
+				active_notify=`echo ${f7//&} | tr --delete }`
+				[ "$forced_inform" == "DMFINFRM" ] && forced_inform="true" || forced_inform="false"
+				[ "$active_notify" == "DMACTIVE" ] && active_notify="Active" || active_notify=""
+				name=`set_obj_param_child "$father_name" "$name"`
+				otype=`get_param_type $type`
+				pname=`set_obj_param_line "$instance" "$otype" "$active_notify" "$forced_inform" "$name"`
+				echo $pname >> $TREE_TXT
+			fi
+
+			if [ -n "$str" ]; then
+				child_objects=${f9// }
+				child_parameters=${f10// }
+				obj_name=${name}
+				#Add the actual object to the list of objects looking for their children objects ########
+				if [ "$child_objects" != "NULL" ]; then
+					new_item=${obj_name}":"${browse}":"${child_objects}
+					obj_look_obj_child_list=`add_item_to_list "$new_item" "$obj_look_obj_child_list"`
+				fi
+				#Add the actual object to the list of objects looking for their children parameters #######
+				if [ "$child_parameters" != "NULL" ]; then
+					new_item=${obj_name}":"${browse}":"${child_parameters}
+					obj_look_param_child_list=`add_item_to_list "$new_item" "$obj_look_param_child_list"`
+				fi
+			fi
+
+		done <<<"`sed -n $line_number',/{0}/p' $file | sed -e '/{0}/d' | sed -e '/^{/!d'`"
+		
+		######### Remove object from list of object looking there childs
+		for obj in $obj_look_obj_child_list; do
+			childs_obj=`echo $obj | awk -F ":" '{print $3}'`
+			if [ "$childs_obj" == "$table_name" ]; then  #I found mum
+				obj_look_obj_child_list=`remove_item_from_list "$obj" "$obj_look_obj_child_list"`
+				break
+			fi
+		done
+		
+		######### Remove object from list of object looking there childs
+		for param in $obj_look_param_child_list; do
+			childs_params=`echo $param | awk -F ":" '{print $3}'`
+			if [ "$childs_params" == "$table_name" ]; then  #I found mum
+				obj_look_param_child_list=`remove_item_from_list "$param" "$obj_look_param_child_list"`
+				break
+			fi
+		done
+	done
+}
+
+################################# XML Generation Functions ######################################"
+xml_open_tag_object() {
+	local level="$1"
+	local objn="$2"
+	local permission="$3"
+	local sp1=0 sp2=0
+	let sp1=4+4*$level
+	let sp2=$sp1+4
+	printf "%${sp1}s"; echo "<object name=\"$objn\" access=\"$permission\" minEntries=\"0\" maxEntries=\"20\">"
+}
+
+xml_close_tag_object() {
+	local level="$1"
+	local sp1=0 sp2=0
+	let sp1=4+4*$level
+	let sp2=$sp1+4
+	printf "%${sp1}s"; echo "</object>"
+}
+
+xml_add_parameter() {
+	local level="$1"
+	local paramn="$2"
+	local type="$3"
+	local access="$4"
+	local fnf="$5"
+	local fif="$6"
+	local sp1=0 sp2=0
+	let sp1=4+4*$level
+	let sp2=$sp1+4
+	let sp3=$sp2+4
+	[ "$fnf" == "Active" ] && activenotif="activeNotify=\"forceEnabled\"" || activenotif=""
+	[ "$fif" == "true"  ] && forcedinform="forcedInform=\"true\"" || forcedinform=""
+
+	if [[ -z "$activenotif" && -z "$forcedinform" ]]; then
+		printf "%${sp1}s"; echo "<parameter name=\"$paramn\" access=\"$access\">"
+	elif [[ -z "$activenotif" && -n "$forcedinform" ]]; then
+		printf "%${sp1}s"; echo "<parameter name=\"$paramn\" access=\"$access\" $forcedinform>"
+	elif [[ -n "$activenotif" && -z "$forcedinform" ]]; then
+		printf "%${sp1}s"; echo "<parameter name=\"$paramn\" access=\"$access\" $activenotif>"
+	else
+		printf "%${sp1}s"; echo "<parameter name=\"$paramn\" access=\"$access\" $activenotif $forcedinform>"
+	fi
+	printf "%${sp2}s"; echo "<description>parameter $paramn</description>"
+	printf "%${sp2}s"; echo "<syntax>"
+	printf "%${sp3}s"; echo "<$type></$type>"
+	printf "%${sp2}s"; echo "</syntax>"
+	printf "%${sp1}s"; echo "</parameter>"
+}
+
+add_dm_xml() {
+	file=$1
+	local line=""
+	object_lines=`grep "object" $file`
+	for line in $object_lines; do
+		let cnt_obj++
+		local objname=`echo "$line" | cut -d, -f4`
+		local permission=`echo "$line" |cut -d, -f2`
+		xml_open_tag_object "1" "$objname" "$permission" 
+		local param_list=`grep "parameter.*,$objname[a-zA-Z0-9_]\+$" $file`
+		for pl in $param_list; do
+			local type=`echo "$pl" |cut -d, -f3`
+			local param=`echo "$pl" |rev |cut -d. -f1 |rev`
+			local permission=`echo "$pl" |cut -d, -f2`
+			local fnotif=`echo "$pl" |cut -d, -f4`
+			local finform=`echo "$pl" |cut -d, -f5`
+			let cnt_param++
+			xml_add_parameter "2" "$param" "$type" "$permission" "$fnotif" "$finform"
+		done
+		xml_close_tag_object "1"
+	done
+}
+
+gen_data_model_xml_file() {
+	echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+	echo "<dm:document xmlns:dm=\"urn:broadband-forum-org:cwmp:datamodel-1-6\" xmlns:dmr=\"urn:broadband-forum-org:cwmp:datamodel-report-0-1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"urn:broadband-forum-org:cwmp:datamodel-1-6 http://www.broadband-forum.org/cwmp/cwmp-datamodel-1-6.xsd urn:broadband-forum-org:cwmp:datamodel-report-0-1 http://www.broadband-forum.org/cwmp/cwmp-datamodel-report.xsd\" spec=\"urn:broadband-forum-org:$DM_VERSION\" file=\"$DM_FILE\">"
+	echo "	<model name=\"$model_name\">"
+	echo "		<object name=\"$ROOT_PATH\" access=\"readOnly\" minEntries=\"1\" maxEntries=\"1\">"
+	echo "			<description>"
+	echo "				The top-level for $DATA_MODEL"
+	echo "			</description>"
+	echo "		</object>"
+	add_dm_xml $OUT_STREAM
+	echo "	</model>"
+	echo "</dm:document>"
+}
+
+############################################### MAIN ######################################################
+cnt_obj=1
+cnt_param=0
+DATA_MODEL="tr098"
+SCRIPTS_PATH=${DM_PATH}/${DATA_MODEL}
+DIR_LIST="$SCRIPTS_PATH_COMMON $SCRIPTS_PATH"
+ROOT_PATH="InternetGatewayDevice"
+DM_HEAD="$ROOT_PATH-1.8"
+DM_FILE="tr-098-1-8-0-full.xml"
+DM_VERSION="tr-098-1-8-0-cwmp"
+model_name="$ROOT_PATH:1.4"
+XML_OUT_STREAM_BBF_098="iopsys_bbf_tr098.xml"
+############## GEN TR098 TREE ##############
+echo "Start Generation of TR098..."
+echo "Please wait..."
+rm -rf $OUT_STREAM
+rm -rf $XML_OUT_STREAM_BBF_098
+cd "$SCRIPTS_PATH_COMMON"
+gen_dm_tree $ROOT_FILE
+for dir in $DIR_LIST; do
+	cd $dir
+	files=`ls *.c |grep -v $ROOT_FILE`
+	for file in $files; do
+		gen_dm_tree "$file"
+	done
+done
+cd $CURRENT_PATH
+file_filter $OUT_STREAM
+gen_data_model_xml_file > $XML_OUT_STREAM_BBF_098
+
+echo "Number of TR098 objects is $cnt_obj"
+echo "Number of TR098 parameters is $cnt_param"
+echo "End of TR098 Generation"
+echo "=============================="
+##################################################################################################
+cnt_obj=1
+cnt_param=0
+DATA_MODEL="tr181"
+SCRIPTS_PATH=${DM_PATH}/${DATA_MODEL}
+DIR_LIST="$SCRIPTS_PATH_COMMON $SCRIPTS_PATH"
+ROOT_PATH="Device"
+DM_HEAD="$ROOT_PATH-2.12"
+DM_FILE="tr-181-2-12-0-cwmp-full.xml"
+DM_VERSION="tr-181-2-12-0-cwmp"
+model_name="$ROOT_PATH:2.12"
+XML_OUT_STREAM_BBF_181="iopsys_bbf_tr181.xml"
+############## GEN TR181 TREE ##############
+echo "Start Generation of TR181..."
+echo "Please wait..."
+rm -rf $OUT_STREAM
+rm -rf $XML_OUT_STREAM_BBF_181
+cd "$SCRIPTS_PATH_COMMON"
+gen_dm_tree $ROOT_FILE
+for dir in $DIR_LIST; do
+	cd $dir
+	files=`ls *.c |grep -v $ROOT_FILE`
+	for file in $files; do
+		gen_dm_tree "$file"
+	done
+done
+cd $CURRENT_PATH
+file_filter $OUT_STREAM
+gen_data_model_xml_file > $XML_OUT_STREAM_BBF_181
+
+echo "Number of TR181 objects is $cnt_obj"
+echo "Number of TR181 parameters is $cnt_param"
+echo "End of TR181 Generation"
+rm -rf $OUT_STREAM
diff --git a/tools/generator_c.py b/tools/generator_c.py
new file mode 100755
index 0000000000000000000000000000000000000000..49147b796a32b2987e0cb3e54eb7e275b63e84ba
--- /dev/null
+++ b/tools/generator_c.py
@@ -0,0 +1,559 @@
+#!/usr/bin/python
+
+#      This program is free software: you can redistribute it and/or modify
+#      it under the terms of the GNU General Public License as published by
+#      the Free Software Foundation, either version 2 of the License, or
+#      (at your option) any later version.
+#
+#      Copyright (C) 2019 iopsys Software Solutions AB
+#		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+
+#	Copyright (C) 2019 PIVA SOFTWARE <www.pivasoftware.com> - All Rights Reserved
+#		Author: Mohamed Kallel <mohamed.kallel@pivasoftware.com>
+
+import os
+import xml.etree.ElementTree as xml
+import sys
+import time
+
+arrtype = {
+"string": "DMT_STRING",
+"unsignedInt": "DMT_UNINT",
+"unsignedLong": "DMT_UNLONG",
+"int": "DMT_INT",
+"long": "DMT_LONG",
+"boolean": "DMT_BOOL",
+"dateTime": "DMT_TIME",
+"hexBinary": "DMT_HEXBIN",
+"base64": "DMT_BASE64",
+}
+
+def removefile( filename ):
+	try:
+		os.remove(filename)
+	except OSError:
+		pass
+
+def securemkdir( folder ):
+	try:
+		os.mkdir(folder)
+	except:
+		pass
+
+def getlastname( name ):
+	lastname = name
+	lastname = lastname.replace(".{i}", "")
+	namelist = lastname.split('.')
+	lastname = namelist[-1]
+	if lastname == "":
+		lastname = namelist[-2]
+	return lastname;
+
+
+def getname( objname ):
+	global model_root_name
+	OBJSname = objname
+	if (objname.count('.') > 1 and (objname.count('.') != 2 or objname.count('{i}') != 1) ):
+		OBJSname = objname.replace(dmroot.get('name'), "", 1)
+	OBJSname = OBJSname.replace("{i}", "")
+	OBJSname = OBJSname.replace(".", "")
+	if (objname.count('.') == 1):
+		model_root_name = OBJSname
+		OBJSname = "Root" + OBJSname
+		return OBJSname
+	if (objname.count('.') == 2 and objname.count('{i}') == 1):
+		model_root_name = OBJSname
+		OBJSname = "Services" + OBJSname
+		return OBJSname
+	if (is_service_model == 1):
+		OBJSname = model_root_name + OBJSname
+	return OBJSname;
+
+def getparamdatatyperef( datatyperef ):
+	ptype = None
+	for d in xmlroot:
+		if d.tag == "dataType" and d.get("name") == datatyperef:
+			if d.get("base") != "" and d.get("base") != None:
+				ptype = getparamdatatyperef(d.get("base"))
+			else:
+				for dd in d:
+					ptype = arrtype.get(dd.tag, None)
+					if ptype != None:
+						break
+				break
+	return ptype
+
+def getparamtype( dmparam ):
+	ptype = None
+	for s in dmparam:
+		if s.tag == "syntax":
+			for c in s:
+				if c.tag == "list":
+					ptype = "DMT_STRING"
+					break
+				ptype = arrtype.get(c.tag, None)
+				if ptype != None:
+					break
+				if c.tag == "dataType":
+					reftype = c.get("ref")
+					ptype = getparamdatatyperef(reftype)
+				if ptype != None:
+					break
+			break
+	if ptype == None:
+		ptype = "__NA__"
+	return ptype
+
+def objhaschild (parentname, level):
+	hasobj = 0
+	for c in model:
+		objname = c.get('name')
+		if c.tag == "object" and parentname in objname and (objname.count('.') - objname.count('{i}')) == level:
+			hasobj = 1
+			break;
+	return hasobj
+
+def objhasparam (dmobject):
+	hasparam = 0
+	for c in dmobject:
+		if c.tag == "parameter":
+			hasparam = 1
+			break;
+	return hasparam
+
+def cprinttopfile (fp, filename):
+	print >> fp, "/*"
+	print >> fp, "*      This program is free software: you can redistribute it and/or modify"
+	print >> fp, "*      it under the terms of the GNU General Public License as published by"
+	print >> fp, "*      the Free Software Foundation, either version 2 of the License, or"
+	print >> fp, "*      (at your option) any later version."
+	print >> fp, "*"
+	print >> fp, "*      Copyright (C) 2019 iopsys Software Solutions AB"
+	print >> fp, "*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>"
+	print >> fp, "*/"
+	print >> fp, ""
+	print >> fp, "#include \"dmcwmp.h\""
+	print >> fp, "#include \"dmcommon.h\""
+	print >> fp, "#include \"%s.h\"" % filename.lower()
+	print >> fp, ""
+
+def hprinttopfile (fp, filename):
+	print >> fp, "/*"
+	print >> fp, "*      This program is free software: you can redistribute it and/or modify"
+	print >> fp, "*      it under the terms of the GNU General Public License as published by"
+	print >> fp, "*      the Free Software Foundation, either version 2 of the License, or"
+	print >> fp, "*      (at your option) any later version."
+	print >> fp, "*"
+	print >> fp, "*      Copyright (C) 2019 iopsys Software Solutions AB"
+	print >> fp, "*		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>"
+	print >> fp, "*/"
+	print >> fp, ""
+	print >> fp, "#ifndef __%s_H" % filename.upper()
+	print >> fp, "#define __%s_H" % filename.upper()
+	print >> fp, ""
+
+def hprintfootfile (fp, filename):
+	print >> fp, ""
+	print >> fp, "#endif //__%s_H" % filename.upper()
+	print >> fp, ""
+
+def cprintAddDelObj( faddobj, fdelobj ):
+	fp = open('./.objadddel.c', 'a')
+	print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char **instance)" % faddobj
+	print >> fp, "{"
+	print >> fp, "	//TODO"
+	print >> fp, "	return 0;"
+	print >> fp, "}"
+	print >> fp, ""
+	print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)" % fdelobj
+	print >> fp, "{"
+	print >> fp, "	switch (del_action) {"
+	print >> fp, "		case DEL_INST:"
+	print >> fp, "			//TODO"
+	print >> fp, "			break;"
+	print >> fp, "		case DEL_ALL:"
+	print >> fp, "			//TODO"
+	print >> fp, "			break;"
+	print >> fp, "	}"
+	print >> fp, "	return 0;"
+	print >> fp, "}"
+	print >> fp, ""
+	fp.close()
+
+def hprintAddDelObj( faddobj, fdelobj ):
+	fp = open('./.objadddel.h', 'a')
+	print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char **instance);" % faddobj
+	print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);" % fdelobj
+	fp.close()
+
+def cprintBrowseObj( fbrowse ):
+	fp = open('./.objbrowse.c', 'a')
+	print >> fp, "int %s(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)" % fbrowse
+	print >> fp, "{"
+	print >> fp, "	//TODO"
+	print >> fp, "	return 0;"
+	print >> fp, "}"
+	print >> fp, ""
+	fp.close()
+
+def hprintBrowseObj( fbrowse ):
+	fp = open('./.objbrowse.h', 'a')
+	print >> fp, "int %s(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);" % fbrowse
+	fp.close()
+
+def cprintGetSetValue(getvalue, setvalue, ptype, dmparam):
+	fp = open('./.getstevalue.c', 'a')
+	print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)" % getvalue
+	print >> fp, "{"
+	print >> fp, "	//TODO"
+	print >> fp, "	return 0;"
+	print >> fp, "}"
+	print >> fp, ""
+	if setvalue != "NULL":
+		print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)" % setvalue
+		print >> fp, "{"
+		print >> fp, "	switch (action)	{"
+		print >> fp, "		case VALUECHECK:"
+		print >> fp, "			break;"
+		print >> fp, "		case VALUESET:"
+		print >> fp, "			//TODO"
+		print >> fp, "			break;"
+		print >> fp, "	}"
+		print >> fp, "	return 0;"
+		print >> fp, "}"
+		print >> fp, ""
+	fp.close()
+
+def hprintGetSetValue(getvalue, setvalue, ptype):
+	fp = open('./.getstevalue.h', 'a')
+	print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);" % getvalue
+	if setvalue != "NULL":
+		print >> fp, "int %s(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action);" % setvalue
+	fp.close()
+
+def printheaderObjCommon( objname ):
+	fp = open('./.objparamarray.c', 'a')
+	print >> fp, "/* *** %s *** */" % objname
+	fp.close()
+
+def cprintheaderOBJS( objname ):
+	fp = open('./.objparamarray.c', 'a')
+	print >> fp,  "DMOBJ %s[] = {" % ("t" + getname(objname) + "Obj")
+	print >> fp,  "/* OBJ, permission, addobj, delobj, checkobj, browseinstobj, forced_inform, notification, nextobj, leaf, linker, bbfdm_type*/"
+	fp.close()
+
+def hprintheaderOBJS( objname ):
+	fp = open('./.objparamarray.h', 'a')
+	print >> fp,  "extern DMOBJ %s[];" % ("t" + getname(objname) + "Obj")
+	fp.close()
+
+def printOBJline( dmobject, level ):
+	commonname = getname(dmobject.get('name'))
+	hasobj = objhaschild(dmobject.get('name'), level)
+	hasparam = objhasparam(dmobject)
+
+	if (dmobject.get('access') == "readOnly"):
+		access = "&DMREAD"
+		faddobj = "NULL"
+		fdelobj = "NULL"
+	else:
+		access = "&DMWRITE"
+		faddobj = "addObj" + commonname
+		fdelobj = "delObj" + commonname
+		cprintAddDelObj(faddobj, fdelobj)
+		hprintAddDelObj(faddobj, fdelobj)
+	if (dmobject.get('name')).endswith(".{i}."):
+		fbrowse = "browse" + commonname + "Inst"
+		cprintBrowseObj(fbrowse)
+		hprintBrowseObj(fbrowse)
+	else:
+		fbrowse = "NULL"
+	if hasobj:
+		objchildarray = "t" + commonname + "Obj"
+	else:
+		objchildarray = "NULL"
+	if hasparam:
+		paramarray = "t" + commonname + "Params"
+	else:
+		paramarray = "NULL"
+
+	fp = open('./.objparamarray.c', 'a')
+	print >> fp,  "{\"%s\", %s, %s, %s, NULL, %s, NULL, NULL, %s, %s, NULL, BBFDM_BOTH}," % (getlastname(dmobject.get('name')), access, faddobj, fdelobj, fbrowse, objchildarray, paramarray)
+	fp.close()
+
+def cprintheaderPARAMS( objname ):
+	fp = open('./.objparamarray.c', 'a')
+	print >> fp,  "DMLEAF %s[] = {" % ("t" + getname(objname) + "Params")
+	print >> fp,  "/* PARAM, permission, type, getvalue, setvalue, forced_inform, notification, bbfdm_type*/"
+	fp.close()
+
+def hprintheaderPARAMS( objname ):
+	fp = open('./.objparamarray.h', 'a')
+	print >> fp,  "extern DMLEAF %s[];" % ("t" + getname(objname) + "Params")
+	fp.close()
+
+def printPARAMline( parentname, dmparam ):
+	commonname = getname(parentname) + "_" + dmparam.get('name')
+	ptype = getparamtype(dmparam)
+	getvalue = "get_" + commonname
+	if (dmparam.get('access') == "readOnly"):
+		access = "&DMREAD"
+		setvalue = "NULL"
+	else:
+		access = "&DMWRITE"
+		setvalue = "set_" + commonname
+
+	cprintGetSetValue(getvalue, setvalue, ptype, dmparam)
+	hprintGetSetValue(getvalue, setvalue, ptype)
+
+	fp = open('./.objparamarray.c', 'a')
+	print >> fp,  "{\"%s\", %s, %s, %s, %s, NULL, NULL, BBFDM_BOTH}," % (dmparam.get('name'), access, ptype, getvalue, setvalue)
+	fp.close()
+
+def printtailArray( ):
+	fp = open('./.objparamarray.c', 'a')
+	print >> fp,  "{0}"
+	print >> fp,  "};"
+	print >> fp,  ""
+	fp.close()
+
+def printincluderoot( objname ):
+	fp = open('./.rootinclude.c', 'a')
+	print >> fp,  "#include \"dm%s.h\"" % getname(objname).lower()
+	fp.close()
+
+def printusage():
+	print "Usage: " + sys.argv[0] + " <xml data model> [Object path]...[Object path]"
+	print "Examples:"
+	print "  - " + sys.argv[0] + " tr-181-2-12-0-cwmp-full.xml Device.WiFi."
+	print "    ==> Generate the C code of the sub tree Device.WiFi. in wifi.c/.h"
+	print "  - " + sys.argv[0] + " tr-181-2-12-0-cwmp-full.xml Device.IP.Diagnostics."
+	print "    ==> Generate the C code of the sub tree Device.IP.Diagnostics. in ipdiagnostics.c/.h"
+	print "  - " + sys.argv[0] + " tr-181-2-12-0-cwmp-full.xml Device.WiFi. Device.Time."
+	print "    ==> Generate the C code of the sub tree Device.IP. and Device.WiFi. in time.c/.h and wifi.c/.h"
+	print "  - " + sys.argv[0] + " tr-181-2-12-0-cwmp-full.xml Device."
+	print "    ==> Generate the C code of all data model in rootdevice.c/.h"
+	print "Example of xml data model file: https://www.broadband-forum.org/cwmp/tr-181-2-12-0-cwmp-full.xml"
+
+def getobjectpointer( objname ):
+	obj = None
+	for c in model:
+		if c.tag == "object" and (c.get('name') == objname or c.get('name') == (objname + "{i}.") ):
+			obj = c
+			break
+	return obj
+
+def object_parse_childs( dmobject, level, nextlevel ):
+
+	hasobj = objhaschild(dmobject.get('name'), level)
+	hasparam = objhasparam(dmobject)
+
+	if hasobj or hasparam:
+		printheaderObjCommon(dmobject.get('name'))
+
+	if hasobj:
+		cprintheaderOBJS(dmobject.get('name'))
+		hprintheaderOBJS(dmobject.get('name'))
+
+		for c in model:
+			objname = c.get('name')
+			if c.tag == "object" and dmobject.get('name') in objname and (objname.count('.') - objname.count('{i}')) == level:
+				printOBJline(c, level+1)
+				if (nextlevel == 1):
+					printincluderoot(c.get('name'))
+
+		printtailArray()
+
+	if hasparam:
+		cprintheaderPARAMS(dmobject.get('name'))
+		hprintheaderPARAMS(dmobject.get('name'))
+		for c in dmobject:
+			paramname = c.get('name')
+			if c.tag == "parameter":
+				printPARAMline(dmobject.get('name'), c)
+		printtailArray()
+
+	if hasobj and nextlevel == 0:	
+		for c in model:
+			objname = c.get('name')
+			if c.tag == "object" and dmobject.get('name') in objname and (objname.count('.') - objname.count('{i}')) == level:
+				object_parse_childs(c, level+1, 0)
+	return;
+
+def generatecfromobj(pobj, pdir, nextlevel):
+	securemkdir(pdir)
+	removetmpfiles()
+	dmlevel = (pobj.get('name')).count(".") - (pobj.get('name')).count("{i}.") + 1
+	object_parse_childs(pobj, dmlevel, nextlevel)
+	
+	dmfpc = open(pdir + "/" +  (getname(pobj.get('name'))).lower() + ".c", "w")
+	dmfph = open(pdir + "/" +  (getname(pobj.get('name'))).lower() + ".h", "w")
+	cprinttopfile(dmfpc, (getname(pobj.get('name'))).lower())
+	hprinttopfile(dmfph, (getname(pobj.get('name'))).lower())
+	try:
+		tmpf = open("./.rootinclude.c", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfpc.write(tmpd)
+		print >> dmfpc,  ""
+	except:
+		pass
+	try:
+		tmpf = open("./.objparamarray.c", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfpc.write(tmpd)
+	except:
+		pass
+	try:
+		tmpf = open("./.objparamarray.h", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfph.write(tmpd)
+		print >> dmfph,  ""
+	except:
+		pass
+	try:
+		exists = os.path.isfile("./.objbrowse.c")
+		if exists:
+			print >> dmfpc,  "/*************************************************************"
+			print >> dmfpc,  " * ENTRY METHOD"
+			print >> dmfpc,  "/*************************************************************/"
+		tmpf = open("./.objbrowse.c", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfpc.write(tmpd)
+	except:
+		pass
+	try:
+		tmpf = open("./.objbrowse.h", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfph.write(tmpd)
+		print >> dmfph,  ""
+	except:
+		pass
+	try:
+		exists = os.path.isfile("./.objadddel.c")
+		if exists:
+			print >> dmfpc,  "/*************************************************************"
+			print >> dmfpc,  " * ADD & DEL OBJ"
+			print >> dmfpc,  "/*************************************************************/"
+		tmpf = open("./.objadddel.c", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfpc.write(tmpd)
+	except:
+		pass
+	try:
+		tmpf = open("./.objadddel.h", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfph.write(tmpd)
+		print >> dmfph,  ""
+	except:
+		pass
+	try:
+		exists = os.path.isfile("./.getstevalue.c")
+		if exists:
+			print >> dmfpc,  "/*************************************************************"
+			print >> dmfpc,  " * GET & SET PARAM"
+			print >> dmfpc,  "/*************************************************************/"
+		tmpf = open("./.getstevalue.c", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfpc.write(tmpd)
+	except:
+		pass
+	try:
+		tmpf = open("./.getstevalue.h", "r")
+		tmpd = tmpf.read()
+		tmpf.close()
+		dmfph.write(tmpd)
+	except:
+		pass
+
+	hprintfootfile (dmfph, (getname(pobj.get('name'))).lower())
+	removetmpfiles()
+	
+
+def removetmpfiles():
+	removefile("./.objparamarray.c")
+	removefile("./.objparamarray.h")
+	removefile("./.objadddel.c")
+	removefile("./.objadddel.h")
+	removefile("./.objbrowse.c")
+	removefile("./.objbrowse.h")
+	removefile("./.getstevalue.c")
+	removefile("./.getstevalue.h")
+	removefile("./.rootinclude.c")
+
+### main ###
+if len(sys.argv) < 2:
+	printusage()
+	exit(1)
+	
+if (sys.argv[1]).lower() == "-h" or (sys.argv[1]).lower() == "--help":
+	printusage()
+	exit(1)
+
+is_service_model = 0
+model_root_name = "Root"
+tree = xml.parse(sys.argv[1])
+
+xmlroot = tree.getroot()
+model = xmlroot
+
+for child in model:
+	if child.tag == "model":
+		model = child
+
+if model.tag != "model":
+	print "Wrong XML Data model format!"
+	exit(1)
+
+dmroot = None
+for c in model:
+	if c.tag == "object" and c.get("name").count(".") == 1:
+		dmroot = c
+		break;
+
+#If it is service data model
+if dmroot == None:
+	is_service_model = 1
+	for c in model:
+		if c.tag == "object" and c.get("name").count(".") == 2:
+			dmroot = c
+			break;
+
+if dmroot == None:
+	print "Wrong XML Data model format!"
+	exit(1)
+
+gendir = "source_" + time.strftime("%Y-%m-%d_%H-%M-%S")
+isemptytreeargs = 1
+	
+if (len(sys.argv) > 2):
+	for i in range(2, len(sys.argv)):
+		if sys.argv[i] == "":
+			continue
+		isemptytreeargs = 0
+		objstart = getobjectpointer(sys.argv[i])
+		if objstart == None:
+			print "Wrong Object Name! %s" % sys.argv[i]
+			continue
+		generatecfromobj(objstart, gendir, 0)
+
+if (len(sys.argv) <= 2) or isemptytreeargs:
+	for c in model:
+		if c.tag == "object":
+			if c.get("name").count(".") == 1 or (c.get("name").count(".") == 2 and c.get("name").count("{i}.") == 1):
+				generatecfromobj(c, gendir, 1)
+			if (c.get("name").count(".") - c.get("name").count("{i}.")) == 2:
+				generatecfromobj(c, gendir, 0)
+
+if (os.path.isdir(gendir)):
+	print "Source code generated under \"./%s\"" % gendir
+else:
+	print "No source code generated!"
+
diff --git a/tools/generator_json.py b/tools/generator_json.py
new file mode 100755
index 0000000000000000000000000000000000000000..55b5cdb17f4ecc7f8cdd7aaaeb9bbbb83db90e1d
--- /dev/null
+++ b/tools/generator_json.py
@@ -0,0 +1,360 @@
+#!/usr/bin/python
+
+#      This program is free software: you can redistribute it and/or modify
+#      it under the terms of the GNU General Public License as published by
+#      the Free Software Foundation, either version 2 of the License, or
+#      (at your option) any later version.
+#
+#      Copyright (C) 2019 iopsys Software Solutions AB
+#		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+
+#	Copyright (C) 2019 PIVA SOFTWARE <www.pivasoftware.com> - All Rights Reserved
+#		Author: Mohamed Kallel <mohamed.kallel@pivasoftware.com>
+
+import os, sys, time, re, json
+import xml.etree.ElementTree as xml
+from collections import OrderedDict
+from shutil import copyfile
+
+def removefile( filename ):
+	try:
+		os.remove(filename)
+	except OSError:
+		pass
+
+def securemkdir( folder ):
+	try:
+		os.mkdir(folder)
+	except:
+		pass
+
+def getname( objname ):
+	global model_root_name
+	OBJSname = objname
+	if (objname.count('.') > 1 and (objname.count('.') != 2 or objname.count('{i}') != 1) ):
+		OBJSname = objname.replace(dmroot.get('name'), "", 1)
+	OBJSname = OBJSname.replace("{i}", "")
+	OBJSname = OBJSname.replace(".", "")
+	if (objname.count('.') == 1):
+		model_root_name = OBJSname
+		OBJSname = "Root" + OBJSname
+		return OBJSname
+	if (objname.count('.') == 2 and objname.count('{i}') == 1):
+		model_root_name = OBJSname
+		OBJSname = "Services" + OBJSname
+		return OBJSname
+	return OBJSname;
+
+def getparamtype( dmparam ):
+	ptype = None
+	for s in dmparam:
+		if s.tag == "syntax":
+			for c in s:
+				if c.tag == "list":
+					ptype = "string"
+					break
+				if c.tag == "dataType":
+					reftype = c.get("ref")
+					if "StatsCounter" in reftype:
+						ptype = "unsignedInt"
+						break
+					ptype = "string"
+					break
+				ptype = c.tag
+				break
+			break
+	if ptype == None:
+		ptype = "__NA__"
+	return ptype
+
+def getparamrange( dmparam ):
+	min = None
+	max = None
+	for s in dmparam:
+		if s.tag == "syntax":
+			for c in s:
+				for o in c:
+					if o.tag == "range":
+						min = o.get("minInclusive")
+						max = o.get("maxInclusive")
+						break
+	if min == None:
+		min = ""
+	if max == None:
+		max = ""
+	return min, max
+
+def getparamunit( dmparam ):
+	unit = None
+	for s in dmparam:
+		if s.tag == "syntax":
+			for c in s:
+				for o in c:
+					if o.tag == "units":
+						unit = o.get("value")
+						break
+	if unit == None:
+		unit = ""
+	return unit
+
+def getparamvalues( dmparam ):
+	hasvalues = 0
+	values = ""
+	for s in dmparam:
+		if s.tag == "syntax":
+			for c in s:
+				if c.tag == "string":
+					for a in c:
+						if a.tag == "enumeration":
+							hasvalues = 1
+							for x in c.findall('enumeration'):
+								if values:
+									values = "%s, \"%s\"" % (values, x.get('value'))
+								else:
+									values = "\"%s\"" % x.get('value')
+							break
+				
+			break
+	return hasvalues, values
+
+def objhaschild (parentname, level):
+	hasobj = 0
+	for c in model:
+		objname = c.get('name')
+		if c.tag == "object" and parentname in objname and (objname.count('.') - objname.count('{i}')) == level:
+			hasobj = 1
+			break;
+	return hasobj
+
+def objhasparam (dmobject):
+	hasparam = 0
+	for c in dmobject:
+		if c.tag == "parameter":
+			hasparam = 1
+			break;
+	return hasparam
+
+def printopenobject (obj):
+	fp = open('./.json_tmp', 'a')
+	print >> fp, "\"%s\" : {" % obj.get('name')
+	fp.close()
+
+def printopenfile ():
+	fp = open('./.json_tmp', 'a')
+	print >> fp, "{"
+	fp.close()
+
+def printclosefile ():
+	fp = open('./.json_tmp', 'a')
+	print >> fp, "}"
+	fp.close()
+
+def removelastline ():
+	file = open("./.json_tmp")
+	lines = file.readlines()
+	lines = lines[:-1]
+	file.close()
+	w = open("./.json_tmp",'w')
+	w.writelines(lines)
+	w.close()
+	printclosefile ()
+
+def replace_data_in_file( data_in, data_out ):
+	file_r = open("./.json_tmp", "rt")
+	file_w = open("./.json_tmp_1", "wt")
+	text = ''.join(file_r).replace(data_in, data_out)
+	file_w.write(text)
+	file_r.close()
+	file_w.close()
+	copyfile("./.json_tmp_1", "./.json_tmp")
+	removefile("./.json_tmp_1")
+
+def updatejsontmpfile ():
+	replace_data_in_file ("}\n", "},\n")
+	replace_data_in_file ("},\n},", "}\n},")
+	replace_data_in_file ("}\n},\n},", "}\n}\n},")
+	replace_data_in_file ("}\n},\n}\n},", "}\n}\n}\n},")
+	replace_data_in_file ("}\n},\n}\n}\n},", "}\n}\n}\n}\n},")
+	replace_data_in_file ("}\n}\n}\n},\n}\n},", "}\n}\n}\n}\n}\n},")
+	replace_data_in_file ("}\n}\n}\n}\n}\n}\n},", "}\n}\n}\n}\n}\n}\n},")
+
+def removetmpfiles():
+	removefile("./.json_tmp")
+	removefile("./.json_tmp_1")
+
+def printOBJ( dmobject, hasobj, hasparam ):
+	if (dmobject.get('name')).endswith(".{i}."):
+		fbrowse = "true"
+	else:
+		fbrowse = "false"
+
+	fp = open('./.json_tmp', 'a')
+	print >> fp,  "\"type\" : \"object\","
+	if (dmobject.get('access') == "readOnly"):
+		print >> fp,  "\"access\" : \"false\","	
+	else:
+		print >> fp,  "\"access\" : \"true\","
+	if hasparam or hasobj:
+		print >> fp,  "\"array\" : \"%s\"," % fbrowse
+	else:
+		print >> fp,  "\"array\" : \"%s\"" % fbrowse
+	fp.close()
+
+def printPARAM( dmparam ):
+	ptype = getparamtype(dmparam)
+	min, max = getparamrange(dmparam)
+	unit = getparamunit(dmparam)
+	hasvalues, values = getparamvalues(dmparam)
+	if (dmparam.get('access') == "readOnly"):
+		access = "false"
+	else:
+		access = "true"
+
+	fp = open('./.json_tmp', 'a')
+	print >> fp,  "\"%s\" : {" % dmparam.get('name')
+	print >> fp,  "\"type\" : \"%s\"," % ptype
+	if min != "" and max != "":
+		print >> fp,  "\"range\" : {"
+		print >> fp,  "\"min\" : \"%s\"," % min
+		print >> fp,  "\"max\" : \"%s\"" % max
+		print >> fp,  "},"
+	elif min != "" and max == "":
+		print >> fp,  "\"range\" : {"
+		print >> fp,  "\"min\" : \"%s\"" % min
+		print >> fp,  "},"
+	elif min == "" and max != "":
+		print >> fp,  "\"range\" : {"
+		print >> fp,  "\"max\" : \"%s\"" % max
+		print >> fp,  "},"
+	if unit != "":
+		print >> fp,  "\"unit\" : \"%s\"," % unit
+	print >> fp,  "\"read\" : \"true\","
+	if hasvalues:
+		print >> fp,  "\"write\" : \"%s\"," % access
+		print >> fp,  "\"values\": [%s]" % values
+	else:
+		print >> fp,  "\"write\" : \"%s\"" % access
+	print >> fp,  "}"
+	fp.close()
+
+def printusage():
+	print "Usage: " + sys.argv[0] + " <xml data model> [Object path]...[Object path]"
+	print "Examples:"
+	print "  - " + sys.argv[0] + " tr-181-2-12-0-cwmp-full.xml Device.WiFi."
+	print "    ==> Generate the json file of the sub tree Device.WiFi. in wifi.json"
+	print "  - " + sys.argv[0] + " tr-181-2-12-0-cwmp-full.xml Device.IP.Diagnostics."
+	print "    ==> Generate the json file of the sub tree Device.IP.Diagnostics. in ipdiagnostics.json"
+	print "  - " + sys.argv[0] + " tr-181-2-12-0-cwmp-full.xml Device.WiFi. Device.Time."
+	print "    ==> Generate the json file of the sub tree Device.IP. and Device.WiFi. in time.json and wifi.json"
+	print "  - " + sys.argv[0] + " tr-181-2-12-0-cwmp-full.xml Device."
+	print "    ==> Generate the json file of all data model in rootdevice.json"
+	print "Example of xml data model file: https://www.broadband-forum.org/cwmp/tr-181-2-12-0-cwmp-full.xml"
+
+def getobjectpointer( objname ):
+	obj = None
+	for c in model:
+		if c.tag == "object" and (c.get('name') == objname or c.get('name') == (objname + "{i}.")):
+			obj = c
+			break
+	return obj
+
+def object_parse_childs( dmobject, level):
+	hasobj = objhaschild(dmobject.get('name'), level)
+	hasparam = objhasparam(dmobject)
+
+	printOBJ(dmobject, hasobj, hasparam)
+
+	if hasparam:
+		for c in dmobject:
+			paramname = c.get('name')
+			if c.tag == "parameter":
+				printPARAM(c)
+
+	if hasobj:
+		for c in model:
+			objname = c.get('name')
+			if c.tag == "object" and dmobject.get('name') in objname and (objname.count('.') - objname.count('{i}')) == level:
+				printopenobject(c)
+				object_parse_childs(c, level+1)
+				printclosefile ()
+
+	return;
+
+def generatejsonfromobj(pobj, pdir):
+	securemkdir(pdir)
+	removetmpfiles()
+	dmlevel = (pobj.get('name')).count(".") - (pobj.get('name')).count("{i}.") + 1
+	printopenfile ()
+	printopenobject(pobj)
+	object_parse_childs(pobj, dmlevel)
+	dmfp = open(pdir + "/" +  (getname(pobj.get('name'))).lower() + ".json", "a")
+	printclosefile ()
+	printclosefile ()
+	updatejsontmpfile ()
+	removelastline ()
+
+	with open("./.json_tmp", "r") as f:
+		obj = json.load(f, object_pairs_hook=OrderedDict)
+		dump = json.dumps(obj, indent=4)
+		tabs = re.sub('\n +', lambda match: '\n' + '\t' * (len(match.group().strip('\n')) / 4), dump)
+
+	try:
+		print >> dmfp, "%s" % tabs
+		dmfp.close()
+	except:
+		pass
+
+	removetmpfiles()
+
+### main ###
+if len(sys.argv) < 3:
+	printusage()
+	exit(1)
+	
+if (sys.argv[1]).lower() == "-h" or (sys.argv[1]).lower() == "--help":
+	printusage()
+	exit(1)
+
+model_root_name = "Root"
+tree = xml.parse(sys.argv[1])
+
+xmlroot = tree.getroot()
+model = xmlroot
+
+for child in model:
+	if child.tag == "model":
+		model = child
+
+if model.tag != "model":
+	print "Wrong XML Data model format!"
+	exit(1)
+
+dmroot = None
+for c in model:
+	if c.tag == "object" and c.get("name").count(".") == 1:
+		dmroot = c
+		break;
+
+if dmroot == None:
+	print "Wrong XML Data model format!"
+	exit(1)
+
+gendir = "source_" + time.strftime("%Y-%m-%d_%H-%M-%S")
+isemptytreeargs = 1
+	
+if (len(sys.argv) > 2):
+	for i in range(2, len(sys.argv)):
+		if sys.argv[i] == "":
+			continue
+		isemptytreeargs = 0
+		objstart = getobjectpointer(sys.argv[i])
+		if objstart == None:
+			print "Wrong Object Name! %s" % sys.argv[i]
+			continue
+		generatejsonfromobj(objstart, gendir)
+
+if (os.path.isdir(gendir)):
+	print "Json file generated under \"./%s\"" % gendir
+else:
+	print "No json file generated!"
+
diff --git a/tools/generator_json_with_backend.py b/tools/generator_json_with_backend.py
new file mode 100755
index 0000000000000000000000000000000000000000..31fa2f20969e4758e0843fe26e04134e4c259237
--- /dev/null
+++ b/tools/generator_json_with_backend.py
@@ -0,0 +1,659 @@
+#!/usr/bin/python
+
+#      This program is free software: you can redistribute it and/or modify
+#      it under the terms of the GNU General Public License as published by
+#      the Free Software Foundation, either version 2 of the License, or
+#      (at your option) any later version.
+#
+#      Copyright (C) 2019 iopsys Software Solutions AB
+#		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+
+
+import os, sys, time, re, json
+import xml.etree.ElementTree as xml
+from collections import OrderedDict
+from shutil import copyfile
+
+def removefile( filename ):
+	try:
+		os.remove(filename)
+	except OSError:
+		pass
+
+def securemkdir( folder ):
+	try:
+		os.mkdir(folder)
+	except:
+		pass
+
+def getname( objname ):
+	global model_root_name
+	OBJSname = objname
+	if (objname.count('.') > 1 and (objname.count('.') != 2 or objname.count('{i}') != 1) ):
+		OBJSname = objname.replace(dmroot1.get('name'), "", 1)
+	OBJSname = OBJSname.replace("{i}", "")
+	OBJSname = OBJSname.replace(".", "")
+	if (objname.count('.') == 1):
+		model_root_name = OBJSname
+		OBJSname = "Root" + OBJSname
+		return OBJSname
+	if (objname.count('.') == 2 and objname.count('{i}') == 1):
+		model_root_name = OBJSname
+		OBJSname = "Services" + OBJSname
+		return OBJSname
+	return OBJSname;
+
+def getparamtype( dmparam ):
+	ptype = None
+	for s in dmparam:
+		if s.tag == "syntax":
+			for c in s:
+				if c.tag == "list":
+					ptype = "string"
+					break
+				if c.tag == "dataType":
+					reftype = c.get("ref")
+					if "StatsCounter" in reftype:
+						ptype = "unsignedInt"
+						break
+					ptype = "string"
+					break
+				ptype = c.tag
+				break
+			break
+	if ptype == None:
+		ptype = "__NA__"
+	return ptype
+
+def getparamrange( dmparam ):
+	min = None
+	max = None
+	for s in dmparam:
+		if s.tag == "syntax":
+			for c in s:
+				for o in c:
+					if o.tag == "range":
+						min = o.get("minInclusive")
+						max = o.get("maxInclusive")
+						break
+	if min == None:
+		min = ""
+	if max == None:
+		max = ""
+	return min, max
+
+def getparamunit( dmparam ):
+	unit = None
+	for s in dmparam:
+		if s.tag == "syntax":
+			for c in s:
+				for o in c:
+					if o.tag == "units":
+						unit = o.get("value")
+						break
+	if unit == None:
+		unit = ""
+	return unit
+
+def getparamvalues( dmparam ):
+	hasvalues = 0
+	values = ""
+	for s in dmparam:
+		if s.tag == "syntax":
+			for c in s:
+				if c.tag == "string":
+					for a in c:
+						if a.tag == "enumeration":
+							hasvalues = 1
+							for x in c.findall('enumeration'):
+								if values:
+									values = "%s, \"%s\"" % (values, x.get('value'))
+								else:
+									values = "\"%s\"" % x.get('value')
+							break
+				
+			break
+	return hasvalues, values
+
+listmapping = []
+def generatelistfromfile(dmobject):
+	obj = dmobject.get('name').split(".")
+	if "tr-104" in sys.argv[1]:
+		pathfilename = "../dmtree/tr104/voice_services.c"
+	else:
+		pathfilename = "../dmtree/tr181/" + obj[1].lower() + ".c"
+	exists = os.path.isfile(pathfilename)
+	if exists:
+		filec = open(pathfilename, "r")
+		for linec in filec:
+			if "/*#" in linec:
+				listmapping.append(linec)
+	else:
+	    pass
+
+def getparammapping(dmobject, dmparam):
+	hasmapping = 0
+	mapping = ""
+	if "tr-104" in sys.argv[1]:
+		param = "Device.Services." + dmobject.get('name') + dmparam.get('name')
+	else:
+		param = dmobject.get('name') + dmparam.get('name')
+	for value in listmapping:
+		if param in value:
+			hasmapping = 1
+			comment = value.split("!")
+			mapping = comment[1]
+			mapping = mapping.replace("*/\n", "")
+			break
+
+	return hasmapping, mapping
+
+def getobjmapping(dmobject):
+	hasmapping = 0
+	mapping = ""
+	if "tr-104" in sys.argv[1]:
+		obj = "Device.Services." + dmobject.get('name')
+	else:
+		obj = dmobject.get('name')
+	for value in listmapping:
+		comment = value.split("!")
+		mapping = comment[0]
+		mapping = mapping.replace("/*#", "")
+		if obj == mapping:
+			hasmapping = 1
+			mapping = comment[1]
+			mapping = mapping.replace("*/\n", "")
+			break
+
+	return hasmapping, mapping
+
+def objhaschild (parentname, level, check_obj):
+	hasobj = 0
+	if check_obj == 0:
+		model = model2
+	else:
+		model = model1
+	for c in model:
+		objname = c.get('name')
+		if c.tag == "object" and parentname in objname and (objname.count('.') - objname.count('{i}')) == level:
+			hasobj = 1
+			break;
+	return hasobj
+
+def objhasparam (dmobject):
+	hasparam = 0
+	for c in dmobject:
+		if c.tag == "parameter":
+			hasparam = 1
+			break;
+	return hasparam
+
+def printopenobject (obj):
+	fp = open('./.json_tmp', 'a')
+	if "tr-104" in sys.argv[1]:
+		print >> fp, "\"Device.Services.%s\" : {" % obj.get('name')
+	else:
+		print >> fp, "\"%s\" : {" % obj.get('name')
+	fp.close()
+
+def printopenfile ():
+	fp = open('./.json_tmp', 'a')
+	print >> fp, "{"
+	fp.close()
+
+def printclosefile ():
+	fp = open('./.json_tmp', 'a')
+	print >> fp, "}"
+	fp.close()
+
+def printOBJMaPPING (mapping):
+	fp = open('./.json_tmp', 'a')
+	comment = mapping.split(":")
+	config = comment[1].split("/")
+	if comment[0] == "UCI":
+		type = "uci"
+	elif comment[0] == "UBUS":
+		type = "ubus"
+	else:
+		type = "cli"
+	print >> fp, "\"mapping\": {"
+	print >> fp, "\"type\": \"%s\"," % type
+	print >> fp, "\"%s\": {" % type
+	if comment[0] == "UCI":
+		print >> fp, "\"file\": \"%s\"," % config[0]
+		print >> fp, "\"section\": {"
+		print >> fp, "\"type\": \"%s\"" % config[1]
+		print >> fp, "},"
+		print >> fp, "\"dmmapfile\": \"%s\"" % config[2]
+	print >> fp, "}"
+	print >> fp, "}"
+	fp.close()
+
+def printPARAMMaPPING (mapping):
+	fp = open('./.json_tmp', 'a')
+	lst = mapping.split("&")
+	count = len(lst)
+	print >> fp, "\"mapping\": ["
+	for i in range(count):
+		comment = lst[i].split(":")
+		config = comment[1].split("/")
+		if comment[0] == "UCI":
+			type = "uci"
+		elif comment[0] == "UBUS":
+			type = "ubus"
+		else:
+			type = "cli"
+		print >> fp, "{"
+		print >> fp, "\"type\": \"%s\"," % type
+		print >> fp, "\"%s\": {" % type
+
+		if comment[0] == "UCI":
+			print >> fp, "\"file\": \"%s\"," % config[0]
+			print >> fp, "\"section\": {"
+			var = config[1].split(",")
+			if len(var) == 1:
+				print >> fp, "\"type\": \"%s\"" % var[0]
+			elif len(var) > 1 and "@i" in var[1]:
+				print >> fp, "\"type\": \"%s\"," % var[0]
+				print >> fp, "\"index\": \"%s\"" % var[1]
+			elif len(var) > 1:
+				print >> fp, "\"type\": \"%s\"," % var[0]
+				print >> fp, "\"name\": \"%s\"" % var[1]		
+			print >> fp, "}"
+			if len(var) > 1:
+				print >> fp, "\"option\": {"
+				print >> fp, "\"name\": \"%s\"" % config[2]
+				print >> fp, "}"
+		elif comment[0] == "UBUS":
+			print >> fp, "\"object\": \"%s\"," % config[0]
+			print >> fp, "\"method\": \"%s\"," % config[1]
+			print >> fp, "\"args\": {"
+			if config[2] != "":
+				args = config[2].split(",")
+				print >> fp, "\"%s\": \"%s\"" % (args[0], args[1])
+			print >> fp, "}"
+			print >> fp, "\"key\": \"%s\"" % config[3]
+
+		else:
+			print >> fp, "\"command\": \"%s\"," % config[0]
+			print >> fp, "\"args\": \"%s\"" % config[1]
+
+		print >> fp, "}"
+		print >> fp, "}"
+	print >> fp, "]"
+	print >> fp, "}"
+	fp.close()
+
+def removelastline ():
+	file = open("./.json_tmp")
+	lines = file.readlines()
+	lines = lines[:-1]
+	file.close()
+	w = open("./.json_tmp",'w')
+	w.writelines(lines)
+	w.close()
+	printclosefile ()
+
+def replace_data_in_file( data_in, data_out ):
+	file_r = open("./.json_tmp", "rt")
+	file_w = open("./.json_tmp_1", "wt")
+	text = ''.join(file_r).replace(data_in, data_out)
+	file_w.write(text)
+	file_r.close()
+	file_w.close()
+	copyfile("./.json_tmp_1", "./.json_tmp")
+	removefile("./.json_tmp_1")
+
+def updatejsontmpfile ():
+	replace_data_in_file ("}\n", "},\n")
+	replace_data_in_file ("},\n},", "}\n},")
+	replace_data_in_file ("}\n},\n},", "}\n}\n},")
+	replace_data_in_file ("}\n},\n}\n},", "}\n}\n}\n},")
+	replace_data_in_file ("}\n},\n}\n}\n},", "}\n}\n}\n}\n},")
+	replace_data_in_file ("}\n}\n}\n},\n}\n},", "}\n}\n}\n}\n}\n},")
+	replace_data_in_file ("}\n}\n}\n}\n}\n}\n},", "}\n}\n}\n}\n}\n}\n},")
+	replace_data_in_file ("},\n]", "}\n]")
+
+def removetmpfiles():
+	removefile("./.json_tmp")
+	removefile("./.json_tmp_1")
+
+def printOBJ( dmobject, hasobj, hasparam, bbfdm_type ):
+	hasmapping, mapping = getobjmapping(dmobject)
+	if (dmobject.get('name')).endswith(".{i}."):
+		fbrowse = "true"
+	else:
+		fbrowse = "false"
+
+	fp = open('./.json_tmp', 'a')
+	print >> fp,  "\"type\" : \"object\","
+	print >> fp,  "\"protocols\" : [%s]," % bbfdm_type
+	if (dmobject.get('access') == "readOnly"):
+		print >> fp,  "\"access\" : false,"	
+	else:
+		print >> fp,  "\"access\" : true,"
+	if hasparam or hasobj:
+		print >> fp,  "\"array\" : %s," % fbrowse
+	else:
+		print >> fp,  "\"array\" : %s" % fbrowse
+	fp.close()
+	if hasmapping:
+		printOBJMaPPING (mapping)
+
+def printPARAM( dmparam, dmobject, bbfdm_type ):
+	hasmapping, mapping = getparammapping(dmobject, dmparam)
+	ptype = getparamtype(dmparam)
+	min, max = getparamrange(dmparam)
+	unit = getparamunit(dmparam)
+	hasvalues, values = getparamvalues(dmparam)
+	if (dmparam.get('access') == "readOnly"):
+		access = "false"
+	else:
+		access = "true"
+
+	fp = open('./.json_tmp', 'a')
+	print >> fp,  "\"%s\" : {" % dmparam.get('name')
+	print >> fp,  "\"type\" : \"%s\"," % ptype
+	print >> fp,  "\"protocols\" : [%s]," % bbfdm_type
+	if min != "" and max != "":
+		print >> fp,  "\"range\" : {"
+		print >> fp,  "\"min\" : \"%s\"," % min
+		print >> fp,  "\"max\" : \"%s\"" % max
+		print >> fp,  "},"
+	elif min != "" and max == "":
+		print >> fp,  "\"range\" : {"
+		print >> fp,  "\"min\" : \"%s\"" % min
+		print >> fp,  "},"
+	elif min == "" and max != "":
+		print >> fp,  "\"range\" : {"
+		print >> fp,  "\"max\" : \"%s\"" % max
+		print >> fp,  "},"
+	if unit != "":
+		print >> fp,  "\"unit\" : \"%s\"," % unit
+	print >> fp,  "\"read\" : true,"
+	if hasvalues and hasmapping:
+		print >> fp,  "\"write\" : %s," % access
+		print >> fp,  "\"values\": [%s]," % values
+		fp.close()
+		printPARAMMaPPING(mapping)
+	elif hasvalues and hasmapping == 0:
+		print >> fp,  "\"write\" : %s," % access
+		print >> fp,  "\"values\": [%s]" % values
+		print >> fp,  "}"
+		fp.close()
+	elif hasvalues == 0 and hasmapping:
+		print >> fp,  "\"write\" : %s," % access
+		fp.close()
+		printPARAMMaPPING(mapping)
+	else:
+		print >> fp,  "\"write\" : %s" % access
+		print >> fp,  "}"
+		fp.close()
+
+def printusage():
+	if "tr-181" in sys.argv[1]:
+		print "Usage: " + sys.argv[0] + " <tr-181 cwmp xml data model> <tr-181 usp xml data model> [Object path]"
+		print "Examples:"
+		print "  - " + sys.argv[0] + " tr-181-2-12-0-cwmp-full.xml tr-181-2-12-0-usp-full.xml Device."
+		print "    ==> Generate the json file of the sub tree Device. in tr181.json"
+	else:
+		print "Usage: " + sys.argv[0] + " <xml data model> [Object path]"
+		print "Examples:"
+		print "  - " + sys.argv[0] + " tr-104-1-1-0-full.xml VoiceService."
+		print "    ==> Generate the json file of the sub tree VoiceService. in tr104.json"
+		print "  - " + sys.argv[0] + " tr-106-1-2-0-full.xml Device."
+		print "    ==> Generate the json file of the sub tree Device. in tr106.json"
+
+	print ""
+	print "Example of xml data model file: https://www.broadband-forum.org/cwmp/tr-181-2-12-0-cwmp-full.xml"
+
+def getobjectpointer( objname ):
+	obj = None
+	for c in model1:
+		if c.tag == "object" and (c.get('name') == objname or c.get('name') == (objname + "{i}.")):
+			obj = c
+			break
+	return obj
+
+def chech_each_obj_with_other_obj(model1, model2):
+	for c in model2:
+		if c.tag == "object":
+			found = 0
+			for obj in model1:
+				if obj.tag == "object" and (obj.get('name') == c.get('name')):
+					found = 1
+					break;
+			if found == 0:
+				if c.get('name').count(".") - (c.get('name')).count("{i}.") != 2:
+					continue
+				dmlevel = (c.get('name')).count(".") - (c.get('name')).count("{i}.") + 1
+				printopenobject(c)
+				object_parse_childs(c, dmlevel, 0, 0)
+				printclosefile ()
+
+def check_if_obj_exist_in_other_xml_file( objname ):
+	obj = None
+	found = 0
+	for c in model2:
+		if c.tag == "object" and (c.get('name') == objname.get('name')):
+			obj = c
+			found = 1
+			break
+	return obj, found
+
+def chech_current_param_exist_in_other_obj(obj, c):
+	bbfdm_type = ""
+	for param in obj:
+		if param.tag == "parameter" and param.get('name') == c.get('name'):
+			bbfdm_type = "\"cwmp\", \"usp\""
+			break
+	if bbfdm_type == "" and "cwmp" in sys.argv[1]:
+		bbfdm_type =  "\"cwmp\""
+	elif bbfdm_type == "" and "usp" in sys.argv[1]:
+		bbfdm_type =  "\"usp\""
+	return bbfdm_type
+
+def chech_obj_with_other_obj(obj, dmobject):
+	for c in obj:
+		exist = 0
+		if c.tag == "parameter":
+			for param in dmobject:
+				if param.tag == "parameter" and c.get('name') == param.get('name'):
+					exist = 1
+					break
+			if exist == 0 and "cwmp" in sys.argv[1]:
+				printPARAM(c, obj, "\"usp\"")
+			elif exist == 0 and "usp" in sys.argv[1]:
+				printPARAM(c, obj, "\"cwmp\"")
+
+def object_parse_childs(dmobject, level, generatelist, check_obj):
+	if generatelist == 0 and (dmobject.get('name')).count(".") == 2:
+		generatelistfromfile(dmobject)
+	if check_obj ==1 and "tr-181" in sys.argv[1]:
+		obj, exist = check_if_obj_exist_in_other_xml_file(dmobject) 
+
+	hasobj = objhaschild(dmobject.get('name'), level, check_obj)
+	hasparam = objhasparam(dmobject)
+
+	if check_obj == 1 and "tr-181" in sys.argv[1] and exist == 0:
+		printOBJ(dmobject, hasobj, hasparam, "\"cwmp\"")
+	elif check_obj == 0 and "tr-181" in sys.argv[1]:
+		printOBJ(dmobject, hasobj, hasparam, "\"usp\"")
+	else:
+		printOBJ(dmobject, hasobj, hasparam, "\"cwmp\", \"usp\"")
+
+	if hasparam:
+		for c in dmobject:
+			if c.tag == "parameter":
+				if check_obj == 1 and "tr-181" in sys.argv[1] and exist == 1:
+					bbfdm_type = chech_current_param_exist_in_other_obj(obj, c)
+				elif check_obj == 1 and "tr-181" in sys.argv[1] and exist == 0:
+					bbfdm_type = "\"cwmp\""
+				elif check_obj == 0:
+					bbfdm_type = "\"usp\""
+				else:
+					bbfdm_type = "\"cwmp\", \"usp\""
+				printPARAM(c, dmobject, bbfdm_type)
+
+	if check_obj == 1 and "tr-181" in sys.argv[1] and exist == 1:
+		chech_obj_with_other_obj(obj, dmobject)
+
+	if hasobj and check_obj:
+		for c in model1:
+			objname = c.get('name')
+			if c.tag == "object" and dmobject.get('name') in objname and (objname.count('.') - objname.count('{i}')) == level:
+				printopenobject(c)
+				object_parse_childs(c, level+1, 0, 1)
+				printclosefile ()
+
+	if hasobj and check_obj == 0:
+		for c in model2:
+			objname = c.get('name')
+			if c.tag == "object" and dmobject.get('name') in objname and (objname.count('.') - objname.count('{i}')) == level:
+				printopenobject(c)
+				object_parse_childs(c, level+1, 0, 0)
+				printclosefile ()
+
+	return;
+
+def generatejsonfromobj(pobj, pdir):
+	generatelist = 0
+	securemkdir(pdir)
+	removetmpfiles()
+	dmlevel = (pobj.get('name')).count(".") - (pobj.get('name')).count("{i}.") + 1
+	if (pobj.get('name')).count(".") == 1:
+		generatelist = 0
+	else:
+		generatelistfromfile(pobj)
+		generatelist = 1
+	printopenfile ()
+	printopenobject(pobj)
+	object_parse_childs(pobj, dmlevel, generatelist, 1)
+	if "tr-181" in sys.argv[1] and Root.count(".") == 1:
+		chech_each_obj_with_other_obj(model1, model2)
+
+	if "tr-181" in sys.argv[1] and pobj.get("name").count(".") == 1:
+		dmfp = open(pdir + "/tr181.json", "a")
+	elif "tr-104" in sys.argv[1] and pobj.get("name").count(".") == 2:
+		dmfp = open(pdir + "/tr104.json", "a")
+	elif "tr-106" in sys.argv[1] and pobj.get("name").count(".") == 1:
+		dmfp = open(pdir + "/tr106.json", "a")
+	else:
+		dmfp = open(pdir + "/" +  (getname(pobj.get('name'))).lower() + ".json", "a")
+
+	printclosefile ()
+	printclosefile ()
+	updatejsontmpfile ()
+	removelastline ()
+
+	f = open("./.json_tmp", "r")
+	obj = json.load(f, object_pairs_hook=OrderedDict)
+	dump = json.dumps(obj, indent=4)
+	tabs = re.sub('\n +', lambda match: '\n' + '\t' * (len(match.group().strip('\n')) / 4), dump)
+
+	try:
+		print >> dmfp, "%s" % tabs
+		dmfp.close()
+	except:
+		pass
+
+	removetmpfiles()
+
+
+### main ###
+if "tr-181" in sys.argv[1]:
+	if len(sys.argv) < 4:
+		printusage()
+		exit(1)
+else:
+	if len(sys.argv) < 3:
+		printusage()
+		exit(1)
+
+if (sys.argv[1]).lower() == "-h" or (sys.argv[1]).lower() == "--help":
+	printusage()
+	exit(1)
+
+is_service_model = 0
+model_root_name = "Root"
+
+tree1 = xml.parse(sys.argv[1])
+xmlroot1 = tree1.getroot()
+model1 = xmlroot1
+
+for child in model1:
+	if child.tag == "model":
+		model1 = child
+
+if model1.tag != "model":
+	print "Wrong %s XML Data model format!" % sys.argv[1]
+	exit(1)
+
+dmroot1 = None
+for c in model1:
+	if c.tag == "object" and c.get("name").count(".") == 1:
+		dmroot1 = c
+		break;
+
+#If it is service data model
+if dmroot1 == None:
+	is_service_model = 1
+	for c in model1:
+		if c.tag == "object" and c.get("name").count(".") == 2:
+			dmroot1 = c
+			break;
+
+if dmroot1 == None:
+	print "Wrong %s XML Data model format!" % sys.argv[1]
+	exit(1)
+
+if "tr-181" in sys.argv[1]:
+	tree2 = xml.parse(sys.argv[2])
+	xmlroot2 = tree2.getroot()
+	model2 = xmlroot2
+
+	for child in model2:
+		if child.tag == "model":
+			model2 = child
+
+	if model2.tag != "model":
+		print "Wrong %s XML Data model format!" % sys.argv[2]
+		exit(1)
+
+	dmroot2 = None
+	for c in model2:
+		if c.tag == "object" and c.get("name").count(".") == 1:
+			dmroot2 = c
+			break;
+
+	if dmroot2 == None:
+		print "Wrong %s XML Data model format!" % sys.argv[2]
+		exit(1)
+
+if "tr-181" in sys.argv[1]:
+	gendir = "tr181_" + time.strftime("%Y-%m-%d_%H-%M-%S")
+elif "tr-104" in sys.argv[1]:
+	gendir = "tr104_" + time.strftime("%Y-%m-%d_%H-%M-%S")
+elif "tr-106" in sys.argv[1]:
+	gendir = "tr106_" + time.strftime("%Y-%m-%d_%H-%M-%S")
+else:
+	gendir = "source_" + time.strftime("%Y-%m-%d_%H-%M-%S")
+
+if "tr-181" in sys.argv[1]:
+	Root = sys.argv[3]
+	objstart = getobjectpointer(Root)
+else:
+	Root = sys.argv[2]
+	objstart = getobjectpointer(Root)
+
+if objstart == None:
+	print "Wrong Object Name! %s" % Root
+	exit(1)
+
+generatejsonfromobj(objstart, gendir)
+
+if (os.path.isdir(gendir)):
+	print "Json file generated under \"./%s\"" % gendir
+else:
+	print "No json file generated!"
+
diff --git a/tools/tr-104-1-1-0-full.xml b/tools/tr-104-1-1-0-full.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8ce29b168098a2f99a5605d67b590c01e8ccb162
--- /dev/null
+++ b/tools/tr-104-1-1-0-full.xml
@@ -0,0 +1,4797 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- DO NOT EDIT; generated by Broadband Forum report.pl#422 (2018/03/28 version) on 2018/04/02 at 12:13:55.
+     report.pl -exitcode=fatals -cwmpindex=.. -nofontstyles -nowarnreport -quiet -report=xml -outfile=tr-104-1-1-0-full.xml tr-104-1-1-0.xml
+     See https://github.com/BroadbandForum/cwmp-xml-tools/tree/master/Report_Tool. -->
+<!--
+    TR-069 VoiceService:1.1 Service Object definition
+    
+  Copyright (c) 2009-2017, Broadband Forum
+  
+  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.
+  
+  Summary:
+    TR-069 VoiceService:1.1 Service Object definition
+
+
+  Editors:
+    Sarah Banks, Cisco
+    Andrea Colmegna, FASTWEB
+    Tim Spets, Motorola Mobility
+
+  Editors Object Addressing Extensions:
+    Sarah Banks, Cisco
+    Andrea Colmegna, FASTWEB
+    Ping Fang, Huawei Technologies
+    Nils Magnusson, TeliaSonera
+    Anton Okmyanskiy, Cisco
+    Staffan Ungsgard, TeliaSonera
+
+  Editors Remote Management of non-TR-069 devices:
+    John Blackford, Pace
+    Ping Fang, Huawei Technologies
+    Tim Spets, Motorola Mobility
+
+  BroadbandHome™ Working Group Chairs:
+    Greg Bathrick, PMC-Sierra
+    Heather Kirksey, Alcatel-Lucent
+
+  Vice Chair: 
+    Jason Walls, UNH
+
+  Chief Editor: 
+    Michael Hanrahan, Huawei Technologies
+
+
+  Version History:
+    September 2009: tr-104-1-0-0.xml, corresponds to TR-104 Issue 1, Section 3 
+                    (Data Model Definition) and Section 4 (Profile Definition).
+    July      2011: tr-104-1-1-0.xml, corresponds to TR-104 Issue 1, Amendment 1
+
+-->
+<dm:document xmlns:dm="urn:broadband-forum-org:cwmp:datamodel-1-4"
+             xmlns:dmr="urn:broadband-forum-org:cwmp:datamodel-report-0-1"
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+             xsi:schemaLocation="urn:broadband-forum-org:cwmp:datamodel-1-4 http://www.broadband-forum.org/cwmp/cwmp-datamodel-1-4.xsd urn:broadband-forum-org:cwmp:datamodel-report-0-1 http://www.broadband-forum.org/cwmp/cwmp-datamodel-report.xsd"
+             spec="urn:broadband-forum-org:tr-104-1-1-0" file="tr-104-1-1-0-full.xml">
+  <description>
+    VoiceService:1.1 Service Object
+  </description>
+  <dataType name="IPAddress">
+    <description>
+      IP address, i.e. IPv4 address (or IPv4 subnet mask) or IPv6 address.
+      All IPv4 addresses and subnet masks MUST be represented as strings in IPv4 dotted-decimal notation.  Here are some examples of valid IPv4 address textual representations:
+      * 216.52.29.100
+      * 192.168.1.254
+      All IPv6 addresses MUST be represented using any of the 3 standard textual representations defined in {{bibref|RFC4291}} Sections 2.2.1, 2.2.2 and 2.2.3.  Both lower-case and upper-case letters can be used, but use of lower-case letters is RECOMMENDED.  Here are some examples of valid IPv6 address textual representations:
+      * 1080:0:0:800:ba98:3210:11aa:12dd
+      * 1080::800:ba98:3210:11aa:12dd
+      * 0:0:0:0:0:0:13.1.68.3
+      IPv6 addresses MUST NOT include zone identifiers. Zone identifiers are discussed in {{bibref|RFC4007|Section 6}}.
+      Unspecified or inapplicable addresses (or IPv4 subnet masks) MUST be represented as empty strings unless otherwise specified by the parameter definition.
+    </description>
+    <string>
+      <size maxLength="45"/>
+    </string>
+  </dataType>
+  <dataType name="IPv4Address" base="IPAddress">
+    <description>
+      IPv4 address (or subnet mask).
+      Can be any IPv4 address that is permitted by the ''IPAddress'' data type.
+    </description>
+    <size maxLength="15"/>
+  </dataType>
+  <dataType name="IPv6Address" base="IPAddress">
+    <description>
+      IPv6 address.
+      Can be any IPv6 address that is permitted by the ''IPAddress'' data type.
+    </description>
+    <size maxLength="45"/>
+  </dataType>
+  <dataType name="IPPrefix">
+    <description>
+      IPv4 or IPv6 routing prefix in Classless Inter-Domain Routing (CIDR) notation {{bibref|RFC4632}}. This is specified as an IP address followed by an appended "/n" suffix, where ''n'' (the prefix size) is an integer in the range 0-32 (for IPv4) or 0-128 (for IPv6) that indicates the number of (leftmost) '1' bits of the routing prefix. 
+      * IPv4 example: 192.168.1.0/24
+      * IPv6 example: 2001:edff:fe6a:f76::/64
+      If the IP address part is unspecified or inapplicable, it MUST be {{empty}} unless otherwise specified by the parameter definition.  In this case the IP prefix will be of the form "/n".
+      If the entire IP prefix is unspecified or inapplicable, it MUST be {{empty}} unless otherwise specified by the parameter definition.
+    </description>
+    <string>
+      <size maxLength="49"/>
+    </string>
+  </dataType>
+  <dataType name="IPv4Prefix" base="IPPrefix">
+    <description>
+      IPv4 address prefix. 
+      Can be any IPv4 prefix that is permitted by the ''IPPrefix'' data type.
+    </description>
+    <size maxLength="18"/>
+  </dataType>
+  <dataType name="IPv6Prefix" base="IPPrefix">
+    <description>
+      IPv6 address prefix.
+      Can be any IPv6 prefix that is permitted by the ''IPPrefix'' data type.
+    </description>
+    <size maxLength="49"/>
+  </dataType>
+  <dataType name="MACAddress">
+    <description>
+      All MAC addresses are represented as strings of 12 hexadecimal digits (digits 0-9, letters A-F or a-f) displayed as six pairs of digits separated by colons.  Unspecified or inapplicable MAC addresses MUST be represented as empty strings unless otherwise specified by the parameter definition.
+    </description>
+    <string>
+      <size maxLength="17"/>
+      <pattern value=""/>
+      <pattern value="([0-9A-Fa-f][0-9A-Fa-f]:){5}([0-9A-Fa-f][0-9A-Fa-f])"/>
+    </string>
+  </dataType>
+  <dataType name="StatsCounter32">
+    <description>
+      A 32-bit statistics parameter, e.g. a byte counter.
+      This data type SHOULD NOT be used for statistics parameters whose values might become greater than the maximum value that can be represented as an ''unsignedInt'' (i.e. 0xffffffff, referred to below as ''maxval''). ''StatsCounter64'' SHOULD be used for such parameters.
+      The value ''maxval'' indicates that no data is available for this parameter.  In the unlikely event that the actual value of the statistic is ''maxval'', the CPE SHOULD return ''maxval - 1''.
+      The actual value of the statistic might be greater than ''maxval''. Such values SHOULD wrap around through zero.
+      The term ''packet'' is to be interpreted as the transmission unit appropriate to the protocol layer in question, e.g. an IP packet or an Ethernet frame.
+    </description>
+    <unsignedInt>
+    </unsignedInt>
+  </dataType>
+  <dataType name="StatsCounter64">
+    <description>
+      A 64-bit statistics parameter, e.g. a byte counter.
+      This data type SHOULD be used for all statistics parameters whose values might become greater than the maximum value that can be represented as an ''unsignedInt''.
+      The maximum value that can be represented as an ''unsignedLong'' (i.e. 0xffffffffffffffff) indicates that no data is available for this parameter.
+      The term ''packet'' is to be interpreted as the transmission unit appropriate to the protocol layer in question, e.g. an IP packet or an Ethernet frame.
+    </description>
+    <unsignedLong>
+    </unsignedLong>
+  </dataType>
+  <dataType name="Alias">
+    <description>
+      A non-volatile handle used to reference this instance. Alias provides a mechanism for an ACS to label this instance for future reference.
+      If the CPE supports the Alias-based Addressing feature as defined in {{bibref|TR-069a4|3.6.1}} and described in {{bibref|TR-069a4|Appendix II}}, the following mandatory constraints MUST be enforced:
+      *Its value MUST NOT be empty.
+      *Its value MUST start with a letter.
+      *If its value is not assigned by the ACS, it MUST start with a "cpe-" prefix.
+      *The CPE MUST NOT change the parameter value.
+    </description>
+    <string>
+      <size maxLength="64"/>
+    </string>
+  </dataType>
+  <dataType name="Dbm1000">
+    <description>
+      The value is measured in ''dBm/1000'', i.e. the value divided by 1000 is dB relative to 1 mW.  For example, -12345 means -12.345 dBm, 0 means 0 dBm (1 mW) and 12345 means 12.345 dBm.
+    </description>
+    <int>
+    </int>
+  </dataType>
+  <dataType name="UUID">
+    <description>
+      Universally Unique Identifier.  See {{bibref|RFC4122}}.
+    </description>
+    <string>
+      <size minLength="36" maxLength="36"/>
+      <pattern value="[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}"/>
+    </string>
+  </dataType>
+  <dataType name="IEEE_EUI64">
+    <description>
+      The IEEE EUI 64-bit identifier as defined in {{bibref|EUI64}}. The IEEE defined 64-bit extended unique identifier (EUI-64) is a concatenation of:
+      * The 24-bit (OUI-24) or 36-bit (OUI-36) company_id value assigned by the IEEE Registration Authority (IEEE-RA), and
+      * The extension identifier (40 bits for OUI-24 or 28 bits for OUI-36) assigned by the organization with that company_id assignment.
+    </description>
+    <string>
+      <size maxLength="23"/>
+      <pattern value=""/>
+      <pattern value="([0-9A-Fa-f][0-9A-Fa-f]:){7}([0-9A-Fa-f][0-9A-Fa-f])"/>
+    </string>
+  </dataType>
+  <dataType name="ZigBeeNetworkAddress">
+    <description>
+      The ZigBee 16-bit network address (NWK) as defined in {{bibref|ZigBee2007}}. The address is assigned to a device by the network layer and used by the network layer for routing messages between devices.
+    </description>
+    <string>
+      <size maxLength="4"/>
+      <pattern value=""/>
+      <pattern value="([0-9A-Fa-f]){4}"/>
+    </string>
+  </dataType>
+  <bibliography>
+    <reference id="802.1D-2004">
+      <name>IEEE Std 802.1D-2004</name>
+      <title>Media Access Control (MAC) Bridges</title>
+      <organization>IEEE</organization>
+      <date>2004</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.1D-2004.pdf</hyperlink>
+    </reference>
+    <reference id="802.1Q-2005">
+      <name>IEEE Std 802.1Q-2005</name>
+      <title>Virtual Bridged Local Area Networks</title>
+      <organization>IEEE</organization>
+      <date>2006</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.1Q-2005.pdf</hyperlink>
+    </reference>
+    <reference id="ISO3166">
+      <name>RFC 2833</name>
+      <title>Codes for the Representation of Names of Countries and Their Subdivisions</title>
+      <organization>ISO</organization>
+    </reference>
+    <reference id="ITU-H.235.1">
+      <name>ITU-T H.235.1</name>
+      <title>H.323 security framework: Baseline security profile  </title>
+      <organization>ITU-T</organization>
+      <hyperlink>http://www.itu.int/rec/T-REC-H.235.1/en</hyperlink>
+    </reference>
+    <reference id="RFC2198">
+      <name>RFC 2198</name>
+      <title>RTP Payload for Redundant Audio Data</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2198</hyperlink>
+    </reference>
+    <reference id="RFC2833">
+      <name>RFC 2833</name>
+      <title>RTP Payload for DTMF Digits, Telephony Tones and Telephony Signals</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2833</hyperlink>
+    </reference>
+    <reference id="RFC3261">
+      <name>RFC 3261</name>
+      <title>SIP: Session Initiation Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>June 2002</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3261</hyperlink>
+    </reference>
+    <reference id="RFC3435">
+      <name>RFC 3435</name>
+      <title>Media Gateway Control Protocol (MGCP) Version 1.0</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc3435</hyperlink>
+    </reference>
+    <reference id="RFC3550">
+      <name>RFC 3550</name>
+      <title>RTP: A Transport Protocol for Real-Time Applications</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>July 2003</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3550</hyperlink>
+    </reference>
+    <reference id="RFC4122">
+      <name>RFC 4122</name>
+      <title>A Universally Unique IDentifier (UUID) URN Namespace</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4122</hyperlink>
+    </reference>
+    <reference id="RFC4291">
+      <name>RFC 4291</name>
+      <title>IP Version 6 Addressing Architecture</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4291</hyperlink>
+    </reference>
+    <reference id="RFC4632">
+      <name>RFC 4632</name>
+      <title>Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4632</hyperlink>
+    </reference>
+    <reference id="SOAP1.1">
+      <name>Simple Object Access Protocol (SOAP) 1.1</name>
+      <organization>W3C</organization>
+      <hyperlink>http://www.w3.org/TR/2000/NOTE-SOAP-20000508</hyperlink>
+    </reference>
+    <reference id="TR-069a4">
+      <name>TR-069 Amendment 4</name>
+      <title>CPE WAN Management Protocol</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2011</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-069_Amendment-4.pdf</hyperlink>
+    </reference>
+    <reference id="TR-104">
+      <name>TR-104</name>
+      <title>Provisioning Parameters for VoIP CPE</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-104.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106">
+      <name>TR-106</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2005</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106a7">
+      <name>TR-106 Amendment 7</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2013</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106_Amendment-7.pdf</hyperlink>
+    </reference>
+    <reference id="ZigBee2007">
+      <name>ZigBee 2007 Specification</name>
+      <title>ZigBee 2007 Specification</title>
+      <organization>ZigBee Alliance</organization>
+      <date>October 2007</date>
+      <hyperlink>http://www.zigbee.org/Specifications/ZigBee/download.aspx</hyperlink>
+    </reference>
+  </bibliography>
+  <model name="VoiceService:1.1" isService="true">
+    <parameter name="VoiceServiceNumberOfEntries" access="readOnly" dmr:version="1.0">
+      <description>
+        Number of entries in VoiceService table.
+      </description>
+      <syntax>
+        <unsignedInt/>
+      </syntax>
+    </parameter>
+    <object name="VoiceService.{i}." access="readOnly" numEntriesParameter="VoiceServiceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        The top-level object for VoIP CPE.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="VoiceProfileNumberOfEntries" access="readOnly" dmr:version="1.0">
+        <description>
+          Number of instances of VoiceProfile.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.Capabilities." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        The overall capabilities of the VoIP CPE.
+      </description>
+      <parameter name="MaxProfileCount" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Maximum total number of distinct voice profiles supported.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxLineCount" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Maximum total number of lines supported across all profiles.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxSessionsPerLine" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Maximum number of voice sessions supported for any given line across all profiles.  A value greater than one indicates support for CPE provided conference calling.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxSessionCount" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Maximum total number of voice sessions supported across all lines and profiles.  (This might differ from {{param|MaxLineCount}} if each line can support more than one session for CPE provided conference calling.  This value MAY be less than the product of {{param|MaxLineCount}} and {{param|MaxSessionsPerLine}}.)
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SignalingProtocols" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}}  Each item is a supported signaling protocol.  {{pattern}}
+          Each entry MAY be appended with a version indicator in the form "/X.Y".  For example:
+          "SIP/2.0"
+          The list MAY include vendor-specific protocols, which MUST be in the format defined in {{bibref|TR-106}}.  For example:
+          "X_EXAMPLE-COM_MyProt"
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string>
+            <pattern value="SIP"/>
+            <pattern value="MGCP"/>
+            <pattern value="MGCP-NCS"/>
+            <pattern value="H\.248"/>
+            <pattern value="H\.323"/>
+            <pattern value="SIP/\d+\.\d+"/>
+            <pattern value="MGCP/\d+\.\d+"/>
+            <pattern value="MGCP-NCS/\d+\.\d+"/>
+            <pattern value="H\.248/\d+\.\d+"/>
+            <pattern value="H\.323/\d+\.\d+"/>
+            <pattern value="X_.+"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Regions" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}} Each item is a geographic region supported by the CPE.  Each item is the list MUST be an alpha-2 (two-character alphabetic) country code as specified by {{bibref|ISO3166}}. If {{empty}} indicates that the CPE does not support region-based customization via {{object|.VoiceProfile.{i}.}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="RTCP" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for RTCP.  If {{true}} indicates support for {{object|.VoiceProfile.{i}.RTP.RTCP.}}.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SRTP" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for SRTP.  If {{true}} indicates support for {{object|.VoiceProfile.{i}.RTP.SRTP.}}.
+          If {{true}} also indicates that {{param|SRTPKeyingMethods}} and {{param|SRTPEncryptionKeySizes}} are present.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SRTPKeyingMethods" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}} Each item is a keying protocol supported by this endpoint for SRTP. {{enum}}
+          This list MAY include vendor-specific keying methods, which MUST use the format defined in {{bibref|TR-106}}.
+          This parameter is applicable only if {{param|SRTP}} is {{true}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string>
+            <enumeration value="Null"/>
+            <enumeration value="Static"/>
+            <enumeration value="SDP"/>
+            <enumeration value="IKE"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SRTPEncryptionKeySizes" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}} Each item is a supported SRTP encryption key size.
+          This parameter is applicable only if {{param|SRTP}} is {{true}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTPRedundancy" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for RTP payload redundancy as defined in {{bibref|RFC2198}}.  If {{true}} indicates support for {{object|.VoiceProfile.{i}.RTP.Redundancy.}}.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPCoupled" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          If {{true}} indicates that the CPE is constrained such that transmitted call control packets use the same DSCP marking as transmitted RTP packets.
+          If {{true}}, the CPE MUST NOT support {{param|.VoiceProfile.{i}.MGCP.DSCPMark}}, {{param|.VoiceProfile.{i}.H323.DSCPMark}}, or {{param|.VoiceProfile.{i}.SIP.DSCPMark}} for call control.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetTaggingCoupled" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          If {{true}} indicates that the CPE is constrained such that transmitted call control packets use the same Ethernet tagging (VLAN ID Ethernet Priority) as transmitted RTP packets.
+          If {{true}}, the CPE MUST NOT support the {{param|.VoiceProfile.{i}.MGCP.VLANIDMark}}, {{param|.VoiceProfile.{i}.H323.VLANIDMark}}, {{param|.VoiceProfile.{i}.SIP.VLANIDMark}} {{param|.VoiceProfile.{i}.MGCP.EthernetPriorityMark}}, {{param|.VoiceProfile.{i}.H323.EthernetPriorityMark}}, or {{param|.VoiceProfile.{i}.SIP.EthernetPriorityMark}} for call control.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PSTNSoftSwitchOver" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          If {{true}} indicates the CPE is capable of supporting the PSO_Activate Facility Action, which allows a call to be switched to a PSTN FXO (Foreign eXchange Office) line.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FaxT38" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for T.38 fax.  If {{true}} indicates support for {{object|.VoiceProfile.{i}.FaxT38.}}.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FaxPassThrough" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for fax pass-through.  If {{true}} indicates support for {{param|.VoiceProfile.{i}.FaxPassThrough}}.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ModemPassThrough" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for modem pass-through.  If {{true}} indicates support for the {{param|.VoiceProfile.{i}.ModemPassThrough}}.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ToneGeneration" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for tone generation.  If {{true}} indicates support for {{object|.VoiceProfile.{i}.Tone.}}.
+          If {{true}} also indicates that {{param|ToneDescriptionsEditable}}, {{param|PatternBasedToneGeneration}}, and {{param|FileBasedToneGeneration}} are present.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ToneDescriptionsEditable" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          If {{true}} indicates that {{object|.VoiceProfile.{i}.Tone.Description.}} and {{object|.VoiceProfile.{i}.Tone.Pattern.}} are editable (if entries can be added, removed, or modified).
+          This parameter is applicable only if {{param|ToneGeneration}} is {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PatternBasedToneGeneration" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for tone generation by pattern specification.  If {{true}} indicates support for {{object|.VoiceProfile.{i}.Tone.}}.
+          If {{param|ToneGeneration}} is {{true}}, at least one of {{param}} and {{param|FileBasedToneGeneration}} MUST also be {{true}}.
+          This parameter is applicable only if {{param|ToneGeneration}} is {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FileBasedToneGeneration" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for tone generation by file playback.  If {{true}} indicates support for {{object|.VoiceProfile.{i}.Tone.}}.
+          If {{true}} also indicates that {{param|ToneFileFormats}} is present.
+          If {{param|ToneGeneration}} is {{true}}, at least one of {{param|PatternBasedToneGeneration}} and {{param}} MUST also be {{true}}.
+          This parameter is applicable only if {{param|ToneGeneration}} is {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ToneFileFormats" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}} Each item is a supported tone file format.  The specified file formats are raw codec data files, using one of the codecs listed below. {{enum}}
+          The list MAY include vendor-specific -specific extensions, which MUST use the format defined in {{bibref|TR-106}}.
+          Example:
+          "G.711MuLaw, MP3, X_EXAMPLE-COM_MyFileFormat"
+          If the CPE does not support tone files, this parameter MUST be {{empty}}.
+          This parameter is applicable only if {{param|FileBasedToneGeneration}} is {{true}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string>
+            <enumeration value="G.711MuLaw"/>
+            <enumeration value="G.711ALaw"/>
+            <enumeration value="MP3"/>
+            <enumeration value="WAV"/>
+            <enumeration value="AMR"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RingGeneration" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for ring generation.  If {{true}} indicates support for control of ring generation via {{object|.VoiceProfile.{i}.Line.{i}.Ringer.}}. 
+          If {{true}} also indicates that {{param|RingDescriptionsEditable}}, {{param|PatternBasedRingGeneration}}, and {{param|FileBasedRingGeneration}} are present.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RingDescriptionsEditable" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          If {{true}} indicates that {{object|.VoiceProfile.{i}.Line.{i}.Ringer.Description.}} and {{object|.VoiceProfile.{i}.Line.{i}.Ringer.Pattern.}} are editable (if entries can be added, removed, or modified).
+          This parameter is applicable only if {{param|RingGeneration}} is {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PatternBasedRingGeneration" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for ring generation by pattern specification.  If {{true}} indicates support for {{object|.VoiceProfile.{i}.Line.{i}.Ringer.Pattern.}}.
+          If {{true}} also indicates that {{param|RingPatternEditable}} is present.
+          This parameter is applicable only if {{param|RingGeneration}} is {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RingPatternEditable" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          If {{true}} indicates that {{object|.VoiceProfile.{i}.Line.{i}.Ringer.Pattern.}} is editable (if entries can be added, removed, or modified).
+          This parameter is applicable only if {{param|PatternBasedRingGeneration}} is {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FileBasedRingGeneration" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for ring generation by file playback.  If {{true}} indicates support for specification of ringer files in {{object|.VoiceProfile.{i}.Line.{i}.Ringer.Description.}}.
+          If {{true}} also indicates that {{param|RingFileFormats}} is present.
+          This parameter is applicable only if {{param|RingGeneration}} is {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RingFileFormats" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}} Each item is a supported ring file format. {{enum}}
+          The list MAY include vendor-specific-specific extensions, which MUST use the format defined in {{bibref|TR-106}}.
+          Example:
+          "MIDI, AMR, X_EXAMPLE-COM_MyFileFormat"
+          If the CPE does not support ring files, this parameter MUST be {{empty}}.
+          This parameter is applicable only if {{param|FileBasedRingGeneration}} is {{true}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string>
+            <enumeration value="MIDI"/>
+            <enumeration value="SMAF">
+              <description>
+                MMF
+              </description>
+            </enumeration>
+            <enumeration value="RTTTL">
+              <description>
+                RTTTL or RTX
+              </description>
+            </enumeration>
+            <enumeration value="MP3"/>
+            <enumeration value="WAV"/>
+            <enumeration value="AMR"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DigitMap" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for a configurable digit map string.  If {{true}} indicates full support for {{param|.VoiceProfile.{i}.DigitMap}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="NumberingPlan" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for a configurable numbering plan.  If {{true}} indicates support for a configurable numbering plan via {{object|.VoiceProfile.{i}.NumberingPlan.}}.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ButtonMap" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for a configurable button map.  If {{true}} indicates support for a configurable button map via {{object|.VoiceProfile.{i}.ButtonMap}}.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="VoicePortTests" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for remotely accessible voice-port tests.  If {{true}} indicates support for {{object|.PhyInterface.{i}.Tests.}}.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.Capabilities.SIP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        SIP-specific capabilities.  Applicable only if the value of {{param|.Capabilities.SignalingProtocols}} includes {{pattern|SIP|.Capabilities.SignalingProtocols}}.
+      </description>
+      <parameter name="Role" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          The role of this VoIP CPE. {{enum}}
+          A single VoiceService instance MUST have only one role.  If a device includes the capabilities for more than one role, each role MUST be represented as separate VoiceService instances.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="UserAgent"/>
+            <enumeration value="BackToBackUserAgents"/>
+            <enumeration value="OutboundProxy"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Extensions" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}}  Each item is a supported SIP extension method.  SIP extension methods MUST be in the form of the method name in upper case. 
+          The list MAY include vendor-specific extensions, which MUST use the format defined in {{bibref|TR-106}}.
+          Examples:
+          : "REFER"
+          : "INFO"
+          : "X_EXAMPLE-COM_MyExt"
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Transports" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}} Each item is a supported SIP transport protocol. {{enum}}
+          The list MAY include vendor-specific transports, which MUST use the format defined in {{bibref|TR-106}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string>
+            <enumeration value="UDP"/>
+            <enumeration value="TCP"/>
+            <enumeration value="TLS"/>
+            <enumeration value="SCTP"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="URISchemes" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}} Each item is a supported URI scheme beyond the URI schemes required by the SIP specification.  Each URI scheme is given by the URI prefix, without the colon separator.  Example:
+          "tel, fax"
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="EventSubscription" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for SIP event subscription.  If {{true}} value indicates support for {{object|.VoiceProfile.{i}.SIP.EventSubscribe.}} and {{object|.VoiceProfile.{i}.Line.{i}.SIP.EventSubscribe.{i}.}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ResponseMap" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for SIP response map.  If {{true}} indicates support for {{object|.VoiceProfile.{i}.SIP.ResponseMap.}}.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="TLSAuthenticationProtocols" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}} Each item is a supported authentication protocol for TLS transport. {{enum}}
+          The list MAY include vendor-specific protocols, which MUST use the format defined in {{bibref|TR-106}}.
+          Support for this parameter is applicable only if the value of {{param|Transports}} includes {{enum|TLS|Transports}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string>
+            <enumeration value="Null"/>
+            <enumeration value="MD5"/>
+            <enumeration value="SHA-1"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TLSAuthenticationKeySizes" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}} Each item represents a supported TLS authentication key size.
+          Support for this parameter is applicable only if the value of {{param|Transports}} includes {{enum|TLS|Transports}} and {{param|TLSAuthenticationProtocols}} is present and non-empty and includes at least one value other than {{enum|Null|TLSAuthenticationProtocols}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TLSEncryptionProtocols" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}} Each item is a supported authentication protocol for TLS transport.  {{enum}}
+          The list MAY include vendor-specific protocols, which MUST use the format defined in {{bibref|TR-106}}.
+          Support for this parameter is applicable only if the value of {{param|Transports}}  includes "{{enum|TLS|Transports}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string>
+            <enumeration value="Null"/>
+            <enumeration value="RC4"/>
+            <enumeration value="RC2"/>
+            <enumeration value="DES"/>
+            <enumeration value="3DES"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TLSEncryptionKeySizes" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}}  Each item is a supported TLS encryption key size.
+          Support for this parameter is applicable only if the value of {{param|Transports}} includes {{enum|TLS|Transports}} and {{param|TLSEncryptionProtocols}} is present and non-empty and includes at least one value other than {{enum|Null|TLSEncryptionProtocols}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TLSKeyExchangeProtocols" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}} Each item is a supported authentication protocol for TLS transport.  {{enum}}
+          The list MAY include vendor-specific protocols, which MUST use the format defined in {{bibref|TR-106}}.
+          Support for this parameter is applicable only if {{param|Transports}}  includes the value {{enum|TLS|Transports}} and {param|TLSEncryptionProtocols}} is present and non-empty and includes at least one value other than {{enum|Null|TLSEncryptionProtocols}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string>
+            <enumeration value="RSA"/>
+            <enumeration value="DSS"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.Capabilities.MGCP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        MGCP-specific capabilities.  Applicable only if the value of {{param|.Capabilities.SignalingProtocols}} includes the value {{pattern|MGCP|.Capabilities.SignalingProtocols}} or {{pattern|MGCP-NCS|.Capabilities.SignalingProtocols}}.
+      </description>
+      <parameter name="Extensions" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}}  Each item is a supported optional MGCP package.  MGCP packages are listed using the uppercase package abbreviation.
+          The list MAY include vendor-specific extensions, which MUST use the format defined in {{bibref|TR-106}}.
+          Examples:
+          : "BP"
+          : "X_EXAMPLE-COM_MyExt"
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.Capabilities.H323." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        H.323-specific capabilities.  Applicable only if the value of {{param|.Capabilities.SignalingProtocols}}  includes {{pattern|H\.323|.Capabilities.SignalingProtocols}}.
+      </description>
+      <parameter name="FastStart" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Support for H323 fast start.  If {{true}} indicates support for fast start.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="H235AuthenticationMethods" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}} Each item is a supported authentication method. {{enum}}
+          The list MAY include vendor-specific protocols, which MUST use the format defined in {{bibref|TR-106}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string>
+            <enumeration value="dhExch">
+              <description>
+                Diffie-Hellman
+              </description>
+            </enumeration>
+            <enumeration value="pwdSymEnc">
+              <description>
+                password with symmetric encryption
+              </description>
+            </enumeration>
+            <enumeration value="pwdHash">
+              <description>
+                password with hashing
+              </description>
+            </enumeration>
+            <enumeration value="certSign">
+              <description>
+                certificate with signature
+              </description>
+            </enumeration>
+            <enumeration value="ipsec">
+              <description>
+                IPSEC based connection
+              </description>
+            </enumeration>
+            <enumeration value="tls">
+              <description>
+                TLS
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.Capabilities.Codecs.{i}." access="readOnly" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Table to describe the set of supported codecs.  The table MUST include a distinct entry for each supported combination of these {{param|Codec}} and {{param|BitRate}}.
+        Applicable only for a VoIP endpoint.
+      </description>
+      <uniqueKey>
+        <parameter ref="EntryID"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Codec"/>
+        <parameter ref="BitRate"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="EntryID" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Unique identifier for each entry in this table.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Codec" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Identifier of the type of codec. {{enum}}
+          The parameter MAY instead be a vendor-specific codec, which MUST be in the format defined in {{bibref|TR-106}}.  For example:
+          "X_EXAMPLE-COM_MyCodec"
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <enumeration value="G.711MuLaw"/>
+            <enumeration value="G.711ALaw"/>
+            <enumeration value="G.726"/>
+            <enumeration value="G.729"/>
+            <enumeration value="G.729a"/>
+            <enumeration value="G.729e"/>
+            <enumeration value="G.728"/>
+            <enumeration value="G.723.1"/>
+            <enumeration value="G.722"/>
+            <enumeration value="G.722.1"/>
+            <enumeration value="G.722.2"/>
+            <enumeration value="GSM-FR"/>
+            <enumeration value="GSM-HR"/>
+            <enumeration value="GSM-EFR"/>
+            <enumeration value="iLBC"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BitRate" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Bit rate, specified in {{units}}.  The value MUST be among the values appropriate for the specified codec.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PacketizationPeriod" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          {{list}} Each item is a supported packetization period, in milliseconds, or a continuous range of packetization periods.  Ranges are indicated as a hyphen-separated pair of unsigned integers.  Examples:
+          : "20" indicates a single discrete value.
+          : "10, 20, 30" indicates a set of discrete values.
+          : "5-40" indicates a continuous inclusive range.
+          : "5-10, 20, 30" indicates a continuous range in addition to a set of discrete values.
+          A range MUST only be indicated if all values within the range are supported.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SilenceSuppression" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          If {{true}} indicates support for silence suppression for this codec.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}." access="readWrite" numEntriesParameter="VoiceProfileNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Object associated with a collection of voice lines with common characteristics.  Support for adding and removing profiles is conditional on whether more than one profile is supported as indicated by {{param|.Capabilities.MaxProfileCount}}.  By default, a single VoiceProfile object SHOULD be present in a VoiceService, initially in the disabled state.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enables or disables all lines in this profile, or places them into a quiescent state. {{enum}}
+          If the value is {{enum|Quiescent}}, in-progress sessions remain intact, but no new sessions are allowed.  If the value is set to {{enum|Quiescent}} in a CPE that does not support {{enum|Quiescent}}, the CPE MUST treat it as if the value is {{enum|Disabled}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Quiescent" optional="true"/>
+            <enumeration value="Enabled"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Reset" access="readWrite" dmr:version="1.0">
+        <description>
+          When written as {{true}}, forces the all lines in this profile to be reset, causing it to re-initialize and perform all start-up actions such as registration.  Always {{false}} when read.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfLines" access="readOnly" dmr:version="1.0">
+        <description>
+          Number of instances of {{object|.VoiceProfile.{i}.Line.{i}.}} within this {{object}}.
+          Applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="1.0">
+        <description>
+          Human-readable string to identify the profile instance.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SignalingProtocol" access="readWrite" dmr:version="1.0">
+        <description>
+          The protocol to be used for this profile.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam=".Capabilities.SignalingProtocols"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxSessions" access="readWrite" dmr:version="1.0">
+        <description>
+          Limit on the number of simultaneous voice sessions across all lines in this {{object}}.  Must be less than or equal to {{param|.Capabilities.MaxSessionCount}}.   (This MAY be greater than {{param|NumberOfLines}} if each line can support more than one session, for example for CPE provided conference calling.)
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DTMFMethod" access="readWrite" dmr:version="1.0">
+        <description>
+          Method by which DTMF digits MUST be passed. {{enum}}
+          If {{param|DTMFMethodG711}} is non-empty, then this parameter applies only when the current codec is not G.711.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <enumeration value="InBand"/>
+            <enumeration value="RFC2833"/>
+            <enumeration value="SIPInfo">
+              <description>
+                Applicable only if the value of {{param|SignalingProtocol}} is {{pattern|SIP|SignalingProtocol}}.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="InBand"/>
+        </syntax>
+      </parameter>
+      <parameter name="DTMFMethodG711" access="readWrite" dmr:version="1.0">
+        <description>
+          Method by which DTMF digits MUST be passed if the the current codec is G.711.  {{enum}}
+          If {{empty}} indicates that the value of {{param|DTMFMethod}} is to apply whether or not the the the current codec is G.711.
+          This parameter is applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <enumeration value="InBand"/>
+            <enumeration value="RFC2833"/>
+            <enumeration value="SIPInfo">
+              <description>
+                Applicable only if the value of {{param|SignalingProtocol}} is {{pattern|SIP|SignalingProtocol}}.
+              </description>
+            </enumeration>
+            <enumeration value=""/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Region" access="readWrite" dmr:version="1.0">
+        <description>
+          The geographic region associated with this profile.  This MAY be used by the CPE to customize localization settings.  If {{empty}} indicates that the region is unspecified and the CPE SHOULD use default localization settings.
+          This parameter is applicable only if {{param|.Capabilities.Regions}} is non-empty.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam=".Capabilities.Regions" nullValue=""/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DigitMap" access="readWrite" dmr:version="1.0">
+        <description>
+          Digit map controlling the transmission of dialed digit information.  The string defines the criteria to be met as digits are collected before an outgoing request (e.g., a SIP INVITE) can be initiated.
+          The syntax of this parameter is exactly the syntax used by MGCP as defined in {{bibref|RFC3435|Section 2.1.5}}.
+          This parameter is applicable only if the device supports a dialing mechanism for which a dialing plan is needed (for example, a device with an explicit Dial button may not need to be aware of the dialing plan) and if the device does not already support a dialing plan mechanism for this profile (e.g., in-band via MGCP).
+          This object is supported only if {{param|.Capabilities.DigitMap}} is {{true}}.
+          Applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DigitMapEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enables use of {{param|DigitMap}}.
+          When {{true}}, {{object|.VoiceProfile.{i}.NumberingPlan.}}, if present, MUST be ignored.
+          This parameter is required if and only if both {{param|DigitMap}} and {{object|.VoiceProfile.{i}.NumberingPlan}} are present.
+          Applicable only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="STUNEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable use of STUN to allow operation through NAT.  Note: enabling STUN is to be interpreted as enabling the use of STUN for discovery, not use as a keep-alive mechanism.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="STUNServer" access="readWrite" dmr:version="1.0">
+        <description>
+          Domain name or IP address of the STUN server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="NonVoiceBandwidthReservedUpstream" access="readWrite" dmr:version="1.0">
+        <description>
+          For bandwidth-based admission control, indicates the amount of upstream bandwidth, in {{units}}, that must be left available for non-voice traffic when determining whether a session can proceed.  This parameter is appropriate only in implementations in which the actual bandwidth can be known, such as a VoIP device embedded in a DSL B-NT.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="NonVoiceBandwidthReservedDownstream" access="readWrite" dmr:version="1.0">
+        <description>
+          For bandwidth-based admission control, indicates the amount of downstream bandwidth, in {{units}}, that must be left available for non-voice traffic when determining whether a session can proceed.  This parameter is appropriate only in implementations in which the actual bandwidth can be known, such as a VoIP device embedded in a DSL B-NT.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PSTNFailOver" access="readWrite" dmr:version="1.0">
+        <description>
+          Specifies whether or not the CPE SHOULD fail over to PSTN service, if available, on loss of connectivity to the VoIP service.  This parameter is appropriate only in implementations in which PSTN fail-over is possible.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="FaxPassThrough" access="readWrite" dmr:version="1.0">
+        <description>
+          Specifies the behavior of the CPE for pass-through of fax data. {{enum}}
+          If this parameter is supported, the value of {{param|.Capabilities.FaxPassThrough}} MUST be {{true}}.
+          This parameter is appropriate only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disable">
+              <description>
+                Prevents the CPE from switching to a fax pass-through mode.
+              </description>
+            </enumeration>
+            <enumeration value="Auto">
+              <description>
+                Allows the CPE to automatically detect fax data to determine whether or not to switch to a fax pass-through mode.
+              </description>
+            </enumeration>
+            <enumeration value="Force">
+              <description>
+                Forces the CPE to switch to a fax pass-through mode regardless of whether fax signaling is detected.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Auto"/>
+        </syntax>
+      </parameter>
+      <parameter name="ModemPassThrough" access="readWrite" dmr:version="1.0">
+        <description>
+          Specifies the behavior of the CPE for pass-through of modem data. {{enum}}
+          If this parameter is supported, the value of {{param|.Capabilities.ModemPassThrough}} MUST be {{true}}.
+          This parameter is appropriate only for a VoIP endpoint.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disable">
+              <description>
+                Prevents the CPE from switching to a modem pass-through mode.
+              </description>
+            </enumeration>
+            <enumeration value="Auto">
+              <description>
+                Allows the CPE to automatically detect modem data to determine whether or not to switch to a modem pass-through mode.
+              </description>
+            </enumeration>
+            <enumeration value="Force">
+              <description>
+                Forces the CPE to switch to a modem pass-through mode regardless of whether modem signaling is detected.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Auto"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.ServiceProviderInfo." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        Information regarding the organization providing service for this voice profile instance.
+      </description>
+      <parameter name="Name" access="readWrite" dmr:version="1.0">
+        <description>
+          Human-readable string identifying the service provider.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="URL" access="readWrite" dmr:version="1.0">
+        <description>
+          URL of the service provider for this profile instance.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ContactPhoneNumber" access="readWrite" dmr:version="1.0">
+        <description>
+          Phone number to contact the service provider for this profile instance.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="EmailAddress" access="readWrite" dmr:version="1.0">
+        <description>
+          Email address to contact the service provider for this profile instance.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.SIP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        Voice profile parameters that are specific to SIP user agents.
+        Creation of this object occurs on specification of {{pattern|SIP|.VoiceProfile.{i}.SignalingProtocol}}.
+      </description>
+      <parameter name="ProxyServer" access="readWrite" dmr:version="1.0">
+        <description>
+          Host name or IP address of the SIP proxy server.
+          All SIP signaling traffic MUST be sent to the host indicated by this parameter and the port indicated by {{param|ProxyServerPort}} unless {{param|OutboundProxy}} is non-empty or a different route was discovered during normal operations SIP routing operation.
+          Regardless of which host the traffic gets sent to ({{param}} or {{param|OutboundProxy}}), the value of this parameter MUST be used to derive the URI placed into the SIP Route header field of all requests originated by this end-point unless a different proxy host was discovered dynamically during normal SIP routing operations.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ProxyServerPort" access="readWrite" dmr:version="1.0">
+        <description>
+          Destination port to be used in connecting to the SIP server.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="5060"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProxyServerTransport" access="readWrite" dmr:version="1.0">
+        <description>
+          Transport protocol to be used in connecting to the SIP server.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam=".Capabilities.SIP.Transports"/>
+          </string>
+          <default type="object" value="UDP"/>
+        </syntax>
+      </parameter>
+      <parameter name="RegistrarServer" access="readWrite" dmr:version="1.0">
+        <description>
+          Host name or IP address of the SIP registrar server.
+          If this parameter is {{empty}}, the CPE MUST obtain all of the registrar server configuration information, including host name or IP address, port, and transport protocol, from the values in {{param|ProxyServer}}, {{param|ProxyServerPort}}, and {{param|ProxyServerTransport}} and MUST ignore the values in {{param}}, {{param|RegistrarServerPort}} and {{param|RegistrarServerTransport}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="RegistrarServerPort" access="readWrite" dmr:version="1.0">
+        <description>
+          Destination port to be used in connecting to the SIP registrar server.
+          If {{param|RegistrarServer}} is empty the CPE MUST obtain all of the registrar server configuration information, including host name or IP address, port, and transport protocol, from the values in {{param|ProxyServer}}, {{param|ProxyServerPort}}, and {{param|ProxyServerTransport}} and MUST ignore the values in {{param|RegistrarServer}}, {{param}} and {{param|RegistrarServerTransport}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="5060"/>
+        </syntax>
+      </parameter>
+      <parameter name="RegistrarServerTransport" access="readWrite" dmr:version="1.0">
+        <description>
+          Transport protocol to be used in connecting to the registrar server.{{enum}}
+          If {{param|RegistrarServer}} is empty the CPE MUST obtain all of the registrar server configuration information, including host name or IP address, port, and transport protocol, from the values in {{param|ProxyServer}}, {{param|ProxyServerPort}}, and {{param|ProxyServerTransport}} and MUST ignore the values in {{param|RegistrarServer}}, {{param|RegistrarServerPort}} and {{param}}.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam=".Capabilities.SIP.Transports"/>
+          </string>
+          <default type="object" value="UDP"/>
+        </syntax>
+      </parameter>
+      <parameter name="UserAgentDomain" access="readWrite" dmr:version="1.0">
+        <description>
+          CPE domain string.  If {{empty}}, the CPE SHOULD use its IP address as the domain.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="UserAgentPort" access="readWrite" dmr:version="1.0">
+        <description>
+          Port used for incoming call control signaling.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="UserAgentTransport" access="readWrite" dmr:version="1.0">
+        <description>
+          Transport protocol to be used for incoming call control signaling.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam=".Capabilities.SIP.Transports"/>
+          </string>
+          <default type="object" value="UDP"/>
+        </syntax>
+      </parameter>
+      <parameter name="OutboundProxy" access="readWrite" dmr:version="1.0">
+        <description>
+          Host name or IP address of the outbound proxy.  If the value is not {{empty}}, the SIP endpoint MUST send all SIP traffic (requests and responses) to the host indicated by this parameter and the port indicated by {{param|OutboundProxyPort}}.  This MUST be done regardless of the routes discovered using normal SIP operations, including use of Route headers initialized from Service-Route and Record-Route headers previously received.   The OutboundProxy value is NOT used to generate the URI placed into the Route header of any requests.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="OutboundProxyPort" access="readWrite" dmr:version="1.0">
+        <description>
+          Destination port to be used in connecting to the outbound proxy.  This parameter MUST be ignored unless the value of {{param|OutboundProxy}} is non-empty.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="5060"/>
+        </syntax>
+      </parameter>
+      <parameter name="Organization" access="readWrite" dmr:version="1.0">
+        <description>
+          Text string to be used in the Organization header.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="RegistrationPeriod" access="readWrite" dmr:version="1.0">
+        <description>
+          Period over which the user agent must periodically register, in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimerT1" access="readWrite" dmr:version="1.0">
+        <description>
+          Value of SIP timer T1, in {{units}}, as defined in {{bibref|RFC3261}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimerT2" access="readWrite" dmr:version="1.0">
+        <description>
+          Value of SIP timer T2, in {{units}}, as defined in {{bibref|RFC3261}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimerT4" access="readWrite" dmr:version="1.0">
+        <description>
+          Value of SIP timer T4, in {{units}}, as defined in {{bibref|RFC3261}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimerA" access="readWrite" dmr:version="1.0">
+        <description>
+          Value of SIP timer A, in {{units}}, as defined in {{bibref|RFC3261}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimerB" access="readWrite" dmr:version="1.0">
+        <description>
+          Value of SIP timer B, in {{units}}, as defined in {{bibref|RFC3261}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimerC" access="readWrite" dmr:version="1.0">
+        <description>
+          Value of SIP timer C, in {{units}}, as defined in {{bibref|RFC3261}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimerD" access="readWrite" dmr:version="1.0">
+        <description>
+          Value of SIP timer D, in {{units}}, as defined in {{bibref|RFC3261}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimerE" access="readWrite" dmr:version="1.0">
+        <description>
+          Value of SIP timer E, in {{units}}, as defined in {{bibref|RFC3261}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimerF" access="readWrite" dmr:version="1.0">
+        <description>
+          Value of SIP timer F, in {{units}}, as defined in {{bibref|RFC3261}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimerG" access="readWrite" dmr:version="1.0">
+        <description>
+          Value of SIP timer G, in {{units}}, as defined in {{bibref|RFC3261}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimerH" access="readWrite" dmr:version="1.0">
+        <description>
+          Value of SIP timer H, in {{units}}, as defined in {{bibref|RFC3261}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimerI" access="readWrite" dmr:version="1.0">
+        <description>
+          Value of SIP timer I, in {{units}}, as defined in {{bibref|RFC3261}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimerJ" access="readWrite" dmr:version="1.0">
+        <description>
+          Value of SIP timer J, in {{units}}, as defined in {{bibref|RFC3261}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimerK" access="readWrite" dmr:version="1.0">
+        <description>
+          Value of SIP timer K, in {{units}}, as defined in {{bibref|RFC3261}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="InviteExpires" access="readWrite" dmr:version="1.0">
+        <description>
+          Invite request Expires header value, in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ReInviteExpires" access="readWrite" dmr:version="1.0">
+        <description>
+          Re-invite request Expires header value, in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RegisterExpires" access="readWrite" dmr:version="1.0">
+        <description>
+          Register request Expires header value, in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RegistersMinExpires" access="readWrite" dmr:version="1.0">
+        <description>
+          Register request Min-Expires header value, in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RegisterRetryInterval" access="readWrite" dmr:version="1.0">
+        <description>
+          Register retry interval, in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="InboundAuth" access="readWrite" dmr:version="1.0">
+        <description>
+          Type of inbound authentication, if any, required.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="Digest"/>
+          </string>
+          <default type="object" value="None"/>
+        </syntax>
+      </parameter>
+      <parameter name="InboundAuthUsername" access="readWrite" dmr:version="1.0">
+        <description>
+          If inbound authentication is required, the username credentials.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="InboundAuthPassword" access="readWrite" dmr:version="1.0">
+        <description>
+          If inbound authentication is required, the password credentials.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="UseCodecPriorityInSDPResponse" access="readWrite" dmr:version="1.0">
+        <description>
+          When {{true}}, in the SDP included in an OK response to an Invite, the first listed codec MUST be the highest priority codec among those offered in the Invite, based on the priorities specified in {{object|.VoiceProfile.{i}.Line.{i}.Codec.List.{i}.}}. The list of codecs in the SDP MAY also include other lower priority codecs.
+          When {{false}}, there is no specific requirement for choosing the codecs listed in the SDP included in an OK response.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMark" access="readWrite" dmr:version="1.0">
+        <description>
+          Diffserv code point to be used for outgoing SIP signaling packets.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="63"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDMark" access="readWrite" dmr:version="1.0">
+        <description>
+          VLAN ID (as defined in {{bibref|802.1Q-2005}}) to be used for outgoing SIP signaling packets for this profile.  A value of -1 indicates the default value is to be used.
+          If either {{param}} or {{param|EthernetPriorityMark}} are greater than zero, then the outgoing frames MUST be tagged.  Otherwise, the outgoing frames MAY be tagged or untagged.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriorityMark" access="readWrite" dmr:version="1.0">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1Q-2005}}) to be used for outgoing SIP signaling packets for this profile.  A value of -1 indicates the default value is to be used.
+          If either {{param|VLANIDMark}} or {{param}} are greater than zero, then the outgoing frames MUST be tagged.  Otherwise, the outgoing frames MAY be tagged or untagged.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SIPEventSubscribeNumberOfElements" access="readOnly" dmr:version="1.0">
+        <description>
+          Indicates the number of EventSubscribe objects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="SIPResponseMapNumberOfElements" access="readOnly" dmr:version="1.0">
+        <description>
+          Indicates the number of SIPResponseMap objects.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="999"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.SIP.EventSubscribe.{i}." access="readWrite" numEntriesParameter="SIPEventSubscribeNumberOfElements" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Table to specify the SIP events to which the CPE MUST subscribe.
+        If supported, the value of {{param|.Capabilities.SIP.EventSubscription}} MUST be {{true}} and {{param|.VoiceProfile.{i}.SIP.SIPEventSubscribeNumberOfElements}} MUST be present.
+      </description>
+      <uniqueKey>
+        <parameter ref="Event"/>
+        <parameter ref="Notifier"/>
+        <parameter ref="NotifierPort"/>
+        <parameter ref="NotifierTransport"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Event" access="readWrite" dmr:version="1.0">
+        <description>
+          SIP event name to appear in the EVENT header of the SIP SUBSCRIBE request.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Notifier" access="readWrite" dmr:version="1.0">
+        <description>
+          Host name or IP address of the event notify server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="NotifierPort" access="readWrite" dmr:version="1.0">
+        <description>
+          Destination port to be used in connecting to the event notifier.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="NotifierTransport" access="readWrite" dmr:version="1.0">
+        <description>
+          Transport protocol to be used in connecting to the event notifier.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam=".Capabilities.SIP.Transports"/>
+          </string>
+          <default type="object" value="UDP"/>
+        </syntax>
+      </parameter>
+      <parameter name="ExpireTime" access="readWrite" dmr:version="1.0">
+        <description>
+          Subscription refresh timer, in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.SIP.ResponseMap.{i}." access="readWrite" numEntriesParameter="SIPResponseMapNumberOfElements" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Each entry in this table specifies the tone and message to be provided to the user for a particular SIP Response received (normally 4xx and 5xx).
+        If supported, the value of {{param|.Capabilities.SIP.ResponseMap}} MUST be {{true}} and {{param|.VoiceProfile.{i}.SIP.SIPResponseMapNumberOfElements}} MUST be present. 
+        Applicable only for a VoIP endpoint.
+      </description>
+      <uniqueKey>
+        <parameter ref="SIPResponseNumber"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="SIPResponseNumber" access="readWrite" dmr:version="1.0">
+        <description>
+          The SIP Response code number.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="100" maxInclusive="999"/>
+          </unsignedInt>
+          <default type="object" value="100"/>
+        </syntax>
+      </parameter>
+      <parameter name="TextMessage" access="readWrite" dmr:version="1.0">
+        <description>
+          The message to be provided on the screen or display of the VoIP device when the SIP response is received.
+          If this parameter is not {{empty}}, display of this text preempts the value of {{param|.VoiceProfile.{i}.Tone.Description.{i}.ToneText}} associated with {{param|Tone}}.  If this parameter is {{empty}}, the value of {{param|.VoiceProfile.{i}.Tone.Description.{i}.ToneText}} associated with {{param|Tone}}, if any, is displayed instead.
+          This parameter is applicable only for VoIP devices capable of text display.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Tone" access="readWrite" dmr:version="1.0">
+        <description>
+          The tone to be played to the user when the SIP response is received.  The value corresponds to EntryID of an entry in {{object|.VoiceProfile.{i}.Tone.Description.}}.  A value of zero, or any value that is not valid, results in no tone played.  If the value of {{param|.Capabilities.ToneGeneration}} is {{false}}, no tone is played regardless of the value of this parameter.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.MGCP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        Voice profile parameters that are specific to MGCP call signaling.
+        Creation of this object occurs on specification of {{pattern|MGCP|.VoiceProfile.{i}.SignalingProtocol}}.
+      </description>
+      <parameter name="CallAgent1" access="readWrite" dmr:version="1.0">
+        <description>
+          Host name or IP address of the main MGCP call agent.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="CallAgentPort1" access="readWrite" dmr:version="1.0">
+        <description>
+          Destination port to be used in connecting with the main MGCP call agent.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="CallAgent2" access="readWrite" dmr:version="1.0">
+        <description>
+          Host name or IP address of the backup MGCP call agent.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="CallAgentPort2" access="readWrite" dmr:version="1.0">
+        <description>
+          Destination port to be used in connecting with the backup MGCP call agent.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="RetranIntervalTimer" access="readWrite" dmr:version="1.0">
+        <description>
+          Message retransfer interval, in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxRetranCount" access="readWrite" dmr:version="1.0">
+        <description>
+          Max number of message retransfers.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="10"/>
+        </syntax>
+      </parameter>
+      <parameter name="RegisterMode" access="readWrite" dmr:version="1.0">
+        <description>
+          Register mode.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Wildcard"/>
+            <enumeration value="Individual"/>
+          </string>
+          <default type="object" value="Wildcard"/>
+        </syntax>
+      </parameter>
+      <parameter name="LocalPort" access="readWrite" dmr:version="1.0">
+        <description>
+          Port listening for incoming call control signaling.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Domain" access="readWrite" dmr:version="1.0">
+        <description>
+          CPE domain string.  If {{empty}}, the CPE SHOULD use its IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="User" access="readWrite" dmr:version="1.0">
+        <description>
+          User string used in accessing the call agent.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMark" access="readWrite" dmr:version="1.0">
+        <description>
+          Diffserv code point to be used for outgoing MGCP signaling packets.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="63"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDMark" access="readWrite" dmr:version="1.0">
+        <description>
+          VLAN ID (as defined in {{bibref|802.1Q-2005}}) to be used for outgoing MGCP signaling packets for this profile.  A value of -1 indicates the default value is to be used.
+          If either {{param}} or {{param|EthernetPriorityMark}} are greater than zero, then the outgoing frames MUST be tagged.  Otherwise, the outgoing frames MAY be tagged or untagged.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriorityMark" access="readWrite" dmr:version="1.0">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1D-2004}}) to be used for outgoing MGCP signaling packets for this profile.  A value of -1 indicates the default value is to be used.
+          If either {{param|VLANIDMark}} or {{param}} are greater than zero, then the outgoing frames MUST be tagged.  Otherwise, the outgoing frames MAY be tagged or untagged.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="AllowPiggybackEvents" access="readWrite" dmr:version="1.0">
+        <description>
+          Indicates whether or not piggyback events are allowed to the MGCP call agent.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SendRSIPImmediately" access="readWrite" dmr:version="1.0">
+        <description>
+          Indicates whether or not to send RSIP immediately on restart.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.H323." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        Voice profile parameters that are specific to H.323 call signaling.
+        Creation of this object occurs on specification of {{pattern|H\.323|.VoiceProfile.{i}.SignalingProtocol}} as the Signaling Protocol.
+      </description>
+      <parameter name="Gatekeeper" access="readWrite" dmr:version="1.0">
+        <description>
+          Host name or IP address of H.323 Gatekeeper.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="GatekeeperPort" access="readWrite" dmr:version="1.0">
+        <description>
+          Destination port to be used in connecting to the H.323 Gatekeeper.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="1719"/>
+        </syntax>
+      </parameter>
+      <parameter name="GatekeeperID" access="readWrite" dmr:version="1.0">
+        <description>
+          Gatekeeper ID.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="TimeToLive" access="readWrite" dmr:version="1.0">
+        <description>
+          Defines the TimeToLive specification in the registration with the Gatekeeper in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="86400"/>
+        </syntax>
+      </parameter>
+      <parameter name="H235Authentication" access="readWrite" dmr:version="1.0">
+        <description>
+          Enables or disables usage of H.235 security baseline security profile as defined in {{bibref|ITU-H.235.1}} baseline security profile.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="AuthPassword" access="readWrite" dmr:version="1.0">
+        <description>
+          Password to be used when H.235 is enabled.
+        </description>
+        <syntax hidden="true">
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SendersID" access="readWrite" dmr:version="1.0">
+        <description>
+          In ITU-T based H.235 authentication, the sendersID is the ID of the gateway as received from the Gatekeeper. As long as the endpointID is not received from the Gatekeeper, the sendersID will be applied as configured here.  The generalID is the GatekeeperID.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMark" access="readWrite" dmr:version="1.0">
+        <description>
+          Diffserv code point to be used for outgoing H.323 signaling packets.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="63"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDMark" access="readWrite" dmr:version="1.0">
+        <description>
+          VLAN ID (as defined in {{bibref|802.1Q-2005}}) to be used for outgoing H.323 signaling packets for this profile.  A value of -1 indicates the default value is to be used.
+          If either {{param}} or {{param|EthernetPriorityMark}} is greater than zero, then the outgoing frames MUST be tagged.  Otherwise, the outgoing frames MAY be tagged or untagged.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriorityMark" access="readWrite" dmr:version="1.0">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1D-2004}}) to be used for outgoing H.323 signaling packets for this profile.  A value of -1 indicates the default value is to be used.
+          If either {{param|VLANIDMark}} or {{param}} is greater than zero, then the outgoing frames MUST be tagged.  Otherwise, the outgoing frames MAY be tagged or untagged.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.RTP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        Voice profile parameters related to the voice stream sent via RTP.
+        Applicable only for a VoIP endpoint.
+      </description>
+      <parameter name="LocalPortMin" access="readWrite" dmr:version="1.0">
+        <description>
+          Base of port range to be used for incoming RTP streams for this profile.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="LocalPortMax" access="readWrite" dmr:version="1.0">
+        <description>
+          Top of port range to be used for incoming RTP streams for this profile.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMark" access="readWrite" dmr:version="1.0">
+        <description>
+          Diffserv code point to be used for outgoing RTP packets for this profile.  It is RECOMMENDED that by default the DSCP for RTP traffic be set to the value to indicate EF traffic.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="63"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDMark" access="readWrite" dmr:version="1.0">
+        <description>
+          VLAN ID (as defined in {{bibref|802.1Q-2005}}) to be used for outgoing RTP packets for this profile.  A value of -1 indicates the default value is to be used.
+          If either {{param}} or {{param|EthernetPriorityMark}} is greater than zero, then the outgoing frames MUST be tagged.  Otherwise, the outgoing frames MAY be tagged or untagged.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriorityMark" access="readWrite" dmr:version="1.0">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1D-2004}}) to be used for outgoing RTP packets for this profile.  A value of -1 indicates the default value is to be used.
+          If either {{param|VLANIDMark}} or {{param}} is greater than zero, then the outgoing frames MUST be tagged.  Otherwise, the outgoing frames MAY be tagged or untagged.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="TelephoneEventPayloadType" access="readWrite" dmr:version="1.0">
+        <description>
+          Payload type to be used for RTP telephone events.
+          This parameter indicates the payload type to be used for DTMF events if transmission of DTMF information is in use according to {{bibref|RFC2833}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="128"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.RTP.RTCP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        Voice profile parameters related to RTCP.
+        If supported, the value of {{param|.Capabilities.RTCP}} MUST be {{true}}.
+        Applicable only for a VoIP endpoint.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable RTCP.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="TxRepeatInterval" access="readWrite" dmr:version="1.0">
+        <description>
+          Transmission repeat interval, in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LocalCName" access="readWrite" dmr:version="1.0">
+        <description>
+          Local Cname (canonical name).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.RTP.SRTP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        Voice profile parameters for secure voice transmission via SRTP.
+        If supported, the value of {{param|.Capabilities.SRTP}} MUST be {{true}}.
+        Applicable only for a VoIP endpoint.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable the use of SRTP.
+          If RTCP is enabled, a true value of this parameter also implies the use of SRTCP.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="KeyingMethods" access="readWrite" dmr:version="1.0">
+        <description>
+          {{list}} Each item is a keying method that may be used.  By default this parameter MUST have the value of {{param|.Capabilities.SRTPKeyingMethods}}-
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string>
+            <enumerationRef targetParam=".Capabilities.SRTPKeyingMethods"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EncryptionKeySizes" access="readWrite" dmr:version="1.0">
+        <description>
+          {{list}}  Each item is an encryption key size that may be used.  By default this parameter MUST have the value of {{param|.Capabilities.SRTPEncryptionKeySizes}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string>
+            <enumerationRef targetParam=".Capabilities.SRTPEncryptionKeySizes"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.RTP.Redundancy." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        Voice profile parameters for RTP payload redundancy as defined by {{bibref|RFC2198}}.
+        If supported, the value of {{param|.Capabilities.RTPRedundancy}} MUST be {{true}}.
+        Applicable only for a VoIP endpoint.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable the use of RTP payload redundancy as defined by {{bibref|RFC2198}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PayloadType" access="readWrite" dmr:version="1.0">
+        <description>
+          The Payload Type of RTP packet as defined in {{bibref|RFC2198}}.  Values SHOULD be within the range of dynamic Payload Types (96-127).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="127"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="BlockPayloadType" access="readOnly" dmr:version="1.0">
+        <description>
+          Block Payload Type of redundancy packet.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="127"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="FaxAndModemRedundancy" access="readWrite" dmr:version="1.0">
+        <description>
+          Specifies the redundancy number for fax and modem pass-through data transmissions.
+          A non-negative value indicates that {{bibref|RFC2198}} is to be used for fax and modem pass-through data.  The value indicates the number of redundant copies to be transmitted (the total number transmitted is one plus this value).
+          A value of -1 indicates {{bibref|RFC2198}} is not to be used for fax and modem pass-through data.
+          If {{param|ModemRedundancy}} is present, then {{param}} applies only to fax transmissions, but not to modem transmissions.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="5"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ModemRedundancy" access="readWrite" dmr:version="1.0">
+        <description>
+          Specifies the redundancy number for modem pass-through data transmissions.
+          A non-negative value indicates that {{bibref|RFC2198}} is to be used for modem pass-through data.  The value indicates the number of redundant copies to be transmitted (the total number transmitted is one plus this value).
+          A value of -1 indicates {{bibref|RFC2198}} is not to be used for modem pass-through data.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="5"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DTMFRedundancy" access="readWrite" dmr:version="1.0">
+        <description>
+          Specifies the redundancy number for DTMF transmissions.
+          A non-negative value indicates that {{bibref|RFC2198}} is to be used for DTMF.  The value indicates the number of redundant copies to be transmitted (the total number transmitted is one plus this value).
+          A value of -1 indicates {{bibref|RFC2198}} is not to be used for DTMF.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="5"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="VoiceRedundancy" access="readWrite" dmr:version="1.0">
+        <description>
+          Specifies the redundancy number for general voice transmissions.
+          A non-negative value indicates that {{bibref|RFC2198}} is to be used for voice.  The value indicates the number of redundant copies to be transmitted (the total number transmitted is one plus this value).
+          A value of -1 indicates {{bibref|RFC2198}} is not to be used for voice.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="5"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxSessionsUsingRedundancy" access="readWrite" dmr:version="1.0">
+        <description>
+          The maximum number of sessions using {{bibref|RFC2198}} payload redundancy simultaneously in this VoiceProfile.
+          A value of zero indicates no explicit limit on the number of sessions using redundancy.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.NumberingPlan." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object contains information related the numbering plan.
+        This object is applicable only if the device supports a dialing mechanism for which a number plan is needed (for example, a device with an explicit Dial button may not need to be aware of the dialing plan) and if the device does not already support a numbering plan mechanism for this profile (e.g., in-band via MGCP).
+        If supported, the value of {{param|.Capabilities.NumberingPlan}} MUST be {{true}}.
+        Applicable only for a VoIP endpoint.
+      </description>
+      <parameter name="MinimumNumberOfDigits" access="readWrite" dmr:version="1.0">
+        <description>
+          This is the minimum number of digits that must be collected before an outgoing request (e.g., a SIP INVITE) can be initiated.
+          If "End of Dialing" (refer to the definition of the InterDigitTimer) occurs before the minimum number of digits has been reached then the number will be considered incomplete and no request will be initiated.
+          In practice, searching {{object|.VoiceProfile.{i}.NumberingPlan.PrefixInfo.{i}.}} should only commence once the minimum number of digits (as specified by this parameter) has been received.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="40"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumNumberOfDigits" access="readWrite" dmr:version="1.0">
+        <description>
+          This is the maximum number of digits that may be collected before an outgoing request (e.g., a SIP INVITE) must be initiated. Any additional dialed digits will be ignored. This parameter is only used in the case that no match in {{object|.VoiceProfile.{i}.NumberingPlan.PrefixInfo.{i}.}} has been found.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="40"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="InterDigitTimerStd" access="readWrite" dmr:version="1.0">
+        <description>
+          This timer is the maximum allowable time (expressed in {{units}}) between the dialing of digits. This timer is restarted every time a digit is dialed. Expiration of this timer indicates "End of Dialing".
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="50000"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="InterDigitTimerOpen" access="readWrite" dmr:version="1.0">
+        <description>
+          This timer is the maximum allowable time (expressed in {{units}}) between the dialing of digits once the minimum number of digits defined on a prefix based has been reached.
+          This timer is only applicable to "open numbering", where the exact number of digits for a prefix is not known.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="50000"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="InvalidNumberTone" access="readWrite" dmr:version="1.0">
+        <description>
+          The tone that should be provided to the user when the number dialed is determined to be invalid.  The value corresponds to an instance of an EntryID in {{object|.VoiceProfile.{i}.Tone.Description.}}.  A value of zero, or any value that does not match a valid EntryID, results in no tone played.
+          If {{param|.Capabilities.ToneGeneration}} is equal to false, no tone is played regardless of the value of this parameter.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PrefixInfoMaxEntries" access="readOnly" dmr:version="1.0">
+        <description>
+          This is the maximum number of instances of {{object|.VoiceProfile.{i}.NumberingPlan.PrefixInfo.{i}.}} that can be supported.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PrefixInfoNumberOfEntries" access="readOnly" dmr:version="1.0">
+        <description>
+          Indicates the number of instances of {{object|.VoiceProfile.{i}.NumberingPlan.PrefixInfo.{i}.}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.NumberingPlan.PrefixInfo.{i}." access="readWrite" numEntriesParameter="PrefixInfoNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Each entry in this table contains information related to an individual prefix in the numbering plan.
+        It is anticipated that once the minimum number of digits has been received, the VoIP device will search this prefix list every time a new digit is received. If no new entry is found, then the object that was previously found will be used instead.
+        If supported, {{param|.VoiceProfile.{i}.NumberingPlan.PrefixInfoMaxEntries}} and {{param|.VoiceProfile.{i}.NumberingPlan.PrefixInfoNumberOfEntries}} MUST be present.
+        The defaults given for this object apply only to explicit creation of an instance of this object and not to automatic creation of instances of this object due to creation of a parent object.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="PrefixRange" access="readWrite" dmr:version="1.0">
+        <description>
+          This is a string representation of a range of prefixes. Each prefix consists of a "From" part consisting of 1 to n digits (string representation) followed by an optional "To" part consisting of exactly one digit prefixed by a "-" symbol. 
+          It should be noted that only the characters "0-9", "*": and "#" can be used to represent the "From" and "To" parts of the prefix range.
+          A further constraint is that the "To" digit MUST always be numerically greater than the last digit of the "From" part.
+          Examples:
+          : 02
+          : 031-5
+          : 032
+          : 0325
+          : *#34
+          : #22
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="42"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="PrefixMinNumberOfDigits" access="readWrite" dmr:version="1.0">
+        <description>
+          This is the minimum number of allowable digits for the prefix range. Once the minimum number of digits has been reached, {{param|.VoiceProfile.{i}.NumberingPlan.InterDigitTimerOpen}} will be used instead of {{param|.VoiceProfile.{i}.NumberingPlan.InterDigitTimerStd}}.
+          If the minimum number of digits has been reached and the inter-digit timer expires, an outgoing request should be initiated.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="40"/>
+          </unsignedInt>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+      <parameter name="PrefixMaxNumberOfDigits" access="readWrite" dmr:version="1.0">
+        <description>
+          This is the maximum number of allowable digits for the prefix range. Once the number of digits received reaches this value an outgoing request should be initiated.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="40"/>
+          </unsignedInt>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfDigitsToRemove" access="readWrite" dmr:version="1.0">
+        <description>
+          If this parameter has a non-zero value, the specified number of digits will be removed from the internal digit buffer (which contains the dialed digits) from the position specified by {{param|PosOfDigitsToRemove}}.
+          Subsequently a search of {{object}} for a matching prefix using the modified number should be performed. Note that this parameter does not have any impact on the number sent in the outgoing request - but is instead only used for searching within the Numbering Plan.
+          This parameter has no effect if it is set to 0.
+          This parameter is provided to handle Carrier override and other codes that may prefix standard numbers and to ensure that the correct "End of Dialing" can be specified without significant data duplication.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="40"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PosOfDigitsToRemove" access="readWrite" dmr:version="1.0">
+        <description>
+          This parameter is used in conjunction with {{param|NumberOfDigitsToRemove}}. It specifies the position within the internal digit buffer from which the digits are to be removed.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="40"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DialTone" access="readWrite" dmr:version="1.0">
+        <description>
+          The tone to be played by the VoIP device when the user has dialed exactly the same digits as defined in the prefix.  The VoIP device will cease playing the tone once an additional digit has been dialed.
+          The value corresponds to an instance of and EntryID in {{object|.VoiceProfile.{i}.Tone.Description.}}.  A value of zero, or any value that does not match a valid EntryID, results in no tone played.
+          If {{param|.Capabilities.ToneGeneration}} is equal to false, no tone is played regardless of the value of this parameter.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="FacilityAction" access="readWrite" dmr:version="1.0">
+        <description>
+          This is a string representing a Facility Action implemented by the VoIP device.
+          {{bibref|TR-104|Appendix A}} lists a set of defined values for this string.
+          The parameter MAY instead indicate a vendor-specific FacilityAction, which MUST use the format defined in {{bibref|TR-106}}.
+          An empty or unrecognized string (i.e., a Facility Action not supported by the CPE) should be treated as a normal outgoing request.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="FacilityActionArgument" access="readWrite" dmr:version="1.0">
+        <description>
+          Optional argument associated with {{param|FacilityAction}}.  The interpretation of the argument is dependent on a specific value of {{param|FacilityAction}}.  Where used, the value is specified in {{bibref|TR-104|Appendix A}} in the definition of the corresponding {{param|FacilityAction}} value.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Tone." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object defines the contents of the tones and announcements generated locally by the VoIP device.
+        If this object is supported, {{param|.Capabilities.ToneGeneration}} MUST be {{true}}.
+        Applicable only for a VoIP endpoint.
+      </description>
+      <parameter name="EventNumberOfEntries" access="readOnly" dmr:version="1.0">
+        <description>
+          Indicates the number of entries in {{object|.VoiceProfile.{i}.Tone.Event.{i}.}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DescriptionNumberOfEntries" access="readOnly" dmr:version="1.0">
+        <description>
+          Indicates the number of entries in {{object|.VoiceProfile.{i}.Tone.Description.{i}.}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PatternNumberOfEntries" access="readOnly" dmr:version="1.0">
+        <description>
+          Indicates the number of entries in {{object|.VoiceProfile.{i}.Tone.Pattern.{i}.}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Tone.Event.{i}." access="readOnly" numEntriesParameter="EventNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Table of events for which a tone is defined.  The table is pre-populated with the list of events for which the CPE supports definition of tones.
+        If this table is supported, {{param|.VoiceProfile.{i}.Tone.EventNumberOfEntries}} MUST be present.
+      </description>
+      <uniqueKey>
+        <parameter ref="Function"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Function" access="readOnly" dmr:version="1.0">
+        <description>
+          The event for which the tone is to apply. {{enum}}
+          The parameter MAY instead indicate a vendor-specific event name, which MUST use the format defined in {{bibref|TR-106}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <enumeration value="Busy"/>
+            <enumeration value="Confirmation"/>
+            <enumeration value="Dial"/>
+            <enumeration value="MessageWaiting"/>
+            <enumeration value="OffHookWarning"/>
+            <enumeration value="RingBack"/>
+            <enumeration value="ReOrder"/>
+            <enumeration value="Stutterdial"/>
+            <enumeration value="CallWaiting1"/>
+            <enumeration value="CallWaiting2"/>
+            <enumeration value="CallWaiting3"/>
+            <enumeration value="CallWaiting4"/>
+            <enumeration value="AlertingSignal"/>
+            <enumeration value="SpecialDial"/>
+            <enumeration value="SpecialInfo"/>
+            <enumeration value="Release"/>
+            <enumeration value="Congestion"/>
+            <enumeration value="UserDefined1"/>
+            <enumeration value="UserDefined2"/>
+            <enumeration value="UserDefined3"/>
+            <enumeration value="UserDefined4"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ToneID" access="readWrite" dmr:version="1.0">
+        <description>
+          The EntryID of the entry in {{object|.VoiceProfile.{i}.Tone.Description.{i}.}} for the tone to be associated with the given event.
+          A value of zero indicates no tone is to be played for this event.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Tone.Description.{i}." access="readWrite" numEntriesParameter="DescriptionNumberOfEntries" enableParameter="ToneEnable" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Each entry in this table defines the contents of an individual tone.
+        If ability to add, delete, and modify entries in this table is supported, {{param|.Capabilities.ToneDescriptionsEditable}} MUST be {{true}}.
+        If this table is supported, {{param|.VoiceProfile.{i}.Tone.DescriptionNumberOfEntries}} MUST be present.
+        The defaults given for this object apply only to explicit creation of an instance of this object and not to automatic creation of instances of this object due to creation of a parent object.
+      </description>
+      <uniqueKey>
+        <parameter ref="EntryID"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="EntryID" access="readOnly" dmr:version="1.0">
+        <description>
+          Unique identifier of this tone.  Assigned by the CPE upon creation of the entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ToneEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enables or disables the tone entry.  If a disabled tone entry is referenced, the result is that no tone is played.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="ToneName" access="readWrite" dmr:version="1.0">
+        <description>
+          Name of the tone. 
+          This parameter is required to be editable only {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="TonePattern" access="readWrite" dmr:version="1.0">
+        <description>
+          EntryID of the entry in {{object|.VoiceProfile.{i}.Tone.Pattern.}} that begins the tone pattern for this tone.  If the tone is specified by a tone file instead of a tone pattern, this parameter MUST be set to zero.
+          This parameter is applicable only if {{param|.Capabilities.PatternBasedToneGeneration}} is equal to {{true}}.
+          This parameter is required to be editable only if {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ToneFile" access="readWrite" dmr:version="1.0">
+        <description>
+          This is the file name of a tone file that has been downloaded to the CPE.  The download may have occurred via the TR-069 Download mechanism or by some other means.
+          If the tone is specified by a tone pattern instead of a tone file, this parameter MUST be {{empty}}.
+          This parameter is applicable only if {{param|.Capabilities.FileBasedToneGeneration}} is equal to {{true}}.
+          This parameter is required to be editable only if {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ToneRepetitions" access="readWrite" dmr:version="1.0">
+        <description>
+          The default number of times the data in {{param|ToneFile}} should be repeated. If the value 0 (zero) is specified then {{param|ToneFile}} should be played indefinitely.
+          This parameter is required to be editable only if {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ToneText" access="readWrite" dmr:version="1.0">
+        <description>
+          The text to be displayed by on the screen of the VoIP device when the tone is played and no specific error message has been provided.
+          This parameter is applicable only for VoIP devices capable text display.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Tone.Pattern.{i}." access="readWrite" numEntriesParameter="PatternNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Each entry in the table defines a single phase in an overall tone pattern.  Each phase identifies the entry that corresponds to the next phase.
+        Each entry in the table refers to the entry that corresponds to the next phase of the pattern.  The table MAY be set up such that entries form loops, or MAY end after a finite sequence.
+        If this object is supported, {{param|.Capabilities.PatternBasedToneGeneration}} MUST be equal to {{true}}, and {{param|.VoiceProfile.{i}.Tone.PatternNumberOfEntries}} MUST be present.
+        If ability to add, delete, and modify entries in this table is supported, {{param|.Capabilities.ToneDescriptionsEditable}} MUST be equal to {{true}}.
+        The defaults given for this object apply only to explicit creation of an instance of this object and not to automatic creation of instances of this object due to creation of a parent object.
+      </description>
+      <uniqueKey>
+        <parameter ref="EntryID"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="EntryID" access="readWrite" dmr:version="1.0">
+        <description>
+          Identifier of a tone-pattern entry.  This parameter is required to be editable only if {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+          Note: when {{param|.Capabilities.ToneDescriptionsEditable}} is {{true}}, this parameter is editable so that the {{param|NextEntryID}} values for each table entry can be pre-assigned for a series of associated table entries rather than requiring the ACS to set the value according to an ID assigned dynamically upon creation of each entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ToneOn" access="readWrite" dmr:version="1.0">
+        <description>
+          Whether or not a tone is on during this phase of the pattern.  If the value is {{false}}, the frequency and power parameters in this entry MUST be ignored.
+          This parameter is required to be editable only if {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Frequency1" access="readWrite" dmr:version="1.0">
+        <description>
+          First tone frequency in {{units}}. 
+          A value of zero indicates this tone component is not used.
+          This parameter is required to be editable only if {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="4095"/>
+            <units value="hertz"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Power1" access="readWrite" dmr:version="1.0">
+        <description>
+          First tone power level in units of 0.1 {{units}}.
+          This parameter is required to be editable only if {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="dBm0"/>
+          </int>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Frequency2" access="readWrite" dmr:version="1.0">
+        <description>
+          Second tone frequency in {{units}}.
+          A value of zero indicates this tone component is not used.
+          This parameter is required to be editable only if {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="4095"/>
+            <units value="hertz"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Power2" access="readWrite" dmr:version="1.0">
+        <description>
+          Second tone power level in units of 0.1 {{units}}.
+          This parameter is required to be editable only if {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="dBm0"/>
+          </int>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Frequency3" access="readWrite" dmr:version="1.0">
+        <description>
+          Third tone frequency in {{units}}.
+          A value of zero indicates this tone component is not used.
+          This parameter is required to be editable only if the parameter is supported for reading and {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="4095"/>
+            <units value="hertz"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Power3" access="readWrite" dmr:version="1.0">
+        <description>
+          Third tone power level in units of 0.1 {{units}}.
+          This parameter is required to be editable only if the parameter is supported for reading and {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="dBm0"/>
+          </int>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Frequency4" access="readWrite" dmr:version="1.0">
+        <description>
+          Fourth tone frequency in {{units}}.
+          A value of zero indicates this tone component is not used.
+          This parameter is required to be editable only if the parameter is supported for reading and {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="4095"/>
+            <units value="herts"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Power4" access="readWrite" dmr:version="1.0">
+        <description>
+          Fourth tone power level in units of 0.1 {{units}}.
+          This parameter is required to be editable only if the parameter is supported for reading and {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="dBm0"/>
+          </int>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ModulationFrequency" access="readWrite" dmr:version="1.0">
+        <description>
+          Modulation frequency in {{units}}.
+          A value of zero indicates this tone component is not used.
+          This parameter is required to be editable only if {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="4095"/>
+            <units value="hertz"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ModulationPower" access="readWrite" dmr:version="1.0">
+        <description>
+          Modulation power level in units of 0.1 {{units}}.
+          This parameter is required to be editable only if {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="dBm0"/>
+          </int>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Duration" access="readWrite" dmr:version="1.0">
+        <description>
+          The duration of this phase of the tone pattern, in {{units}}.
+          A value of zero indicates an unlimited duration.
+          This parameter is required to be editable only if {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="NextEntryID" access="readWrite" dmr:version="1.0">
+        <description>
+          The {{param|EntryID}} for the next phase of the tone pattern, after the specified {{param|Duration}} of this phase has completed.
+          A value of zero indicates that the tone pattern is to terminate after the current phase is completed.
+          This parameter is required to be editable only if {{param|.Capabilities.ToneDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.ButtonMap." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object is provided to permit the purpose of the CPE buttons and function keys to be defined via the ACS.
+        Support of this object is appropriate only for a device that has programmable buttons in its user interface.
+        If this object is supported, {{param|.Capabilities.ButtonMap}} MUST be equal to {{true}}.
+        Applicable only for a VoIP endpoint.
+      </description>
+      <parameter name="NumberOfButtons" access="readOnly" dmr:version="1.0">
+        <description>
+          Indicates the number of Button objects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.ButtonMap.Button.{i}." access="readOnly" numEntriesParameter="NumberOfButtons" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Each entry in this table specifies the purpose of each programmable CPE button / function key and whether the user has permission to reprogram the button.
+      </description>
+      <uniqueKey>
+        <parameter ref="ButtonName"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="ButtonName" access="readOnly" dmr:version="1.0">
+        <description>
+          Name of the Button.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="16"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FacilityAction" access="readWrite" dmr:version="1.0">
+        <description>
+          This is an optional parameter that should only be specified for buttons related to a particular Facility Action (e.g., invocation of "Call Return") implemented by the VoIP device.
+          {{bibref|TR-104|Appendix A}} lists a set of defined values for this string.
+          The parameter MAY instead indicate a vendor-specific FacilityAction, which MUST use the format defined in {{bibref|TR-106}}.
+          An empty or unrecognized string (i.e. a Facility Action not supported by the CPE) should be treated as no Facility Action to be taken.
+          Note that If this parameter is specified (non-empty) then {{param|QuickDialNumber}} SHOULD be {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FacilityActionArgument" access="readWrite" dmr:version="1.0">
+        <description>
+          Optional argument associated with the specified {{param|FacilityAction}}.  The interpretation of the argument is dependent on the specific FacilityAction.  Where used, the value is specified in {{bibref|TR-104|Appendix A}} in the definition of the corresponding {{param|FacilityAction}} value.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="QuickDialNumber" access="readWrite" dmr:version="1.0">
+        <description>
+          This is a string representing a quick dial destination number. Only the characters '0-9', '*' and '#' can be used.
+          Note that If this parameter is specified (non-empty) then {{param|FacilityAction}} should be {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="40"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ButtonMessage" access="readWrite" dmr:version="1.0">
+        <description>
+          This string represents the message to be displayed on the screen when the button or function key is pressed.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UserAccess" access="readWrite" dmr:version="1.0">
+        <description>
+          This parameter indicates whether the user has permission to program the button or function key. If this parameter is set to {{true}} then {{param|FacilityAction}}, {{param|QuickDialNumber}} and {{param|ButtonMessage}} MUST all be {{empty}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.FaxT38." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        T.38 Fax information for devices that support T.38 relay.
+        If this object is supported, {{param|.Capabilities.FaxT38}} MUST be equal to {{true}}.
+        Applicable only to a VoIP endpoint.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable the use of T.38.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="BitRate" access="readWrite" dmr:version="1.0">
+        <description>
+          Maximum data rate for fax.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="2400" maxInclusive="2400"/>
+            <range minInclusive="4800" maxInclusive="4800"/>
+            <range minInclusive="7200" maxInclusive="7200"/>
+            <range minInclusive="9600" maxInclusive="9600"/>
+            <range minInclusive="12000" maxInclusive="12000"/>
+            <range minInclusive="14400" maxInclusive="14400"/>
+            <range minInclusive="33600" maxInclusive="33600"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="HighSpeedPacketRate" access="readWrite" dmr:version="1.0">
+        <description>
+          The rate at which high speed data will be sent across the network, in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="10" maxInclusive="10"/>
+            <range minInclusive="20" maxInclusive="20"/>
+            <range minInclusive="30" maxInclusive="30"/>
+            <range minInclusive="40" maxInclusive="40"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="HighSpeedRedundancy" access="readWrite" dmr:version="1.0">
+        <description>
+          Specifies the packet-level redundancy for high-speed data transmissions (i.e., T.4 image data).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="3"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowSpeedRedundancy" access="readWrite" dmr:version="1.0">
+        <description>
+          Specifies the packet-level redundancy for low-speed data transmissions (i.e., T.30 handshaking information).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="5"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TCFMethod" access="readWrite" dmr:version="1.0">
+        <description>
+          The method with which data is handled over the network.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Local"/>
+            <enumeration value="Network"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Line.{i}." access="readWrite" numEntriesParameter="NumberOfLines" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Object associated with a distinct voice line.  Support for adding and removing lines is conditional on whether the CPE supports more than one line in total as indicated by {{param|.Capabilities.MaxLineCount}}.  By default, on creation of a given {{object|.VoiceProfile.{i}.}}, a single Line object MUST be present, initially with value {{enum|Disabled|Enable}}.
+        Applicable only for a VoIP endpoint.
+      </description>
+      <uniqueKey>
+        <parameter ref="DirectoryNumber"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enables or disables this line, or places it into a quiescent state. {{enum}}
+          In the {{enum|Quiescent}} state, in-progress sessions remain intact, but no new sessions are allowed. If this parameter is set to {{enum|Quiescent}} in a CPE that does not support the {{enum|Quiescent}} state, it MUST treat it the same as the {{enum|Disabled}} state (and indicate {{enum|Disabled|Status}} in {{param|Status}}).
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Quiescent" optional="true"/>
+            <enumeration value="Enabled"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="DirectoryNumber" access="readWrite" dmr:version="1.0">
+        <description>
+          Directory number associated with this line.  May be used to identify the line to the user.
+          In case of H.323 signaling, this MUST be an E.164 number.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="1.0">
+        <description>
+          Indicates the status of this line.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Initializing"/>
+            <enumeration value="Registering"/>
+            <enumeration value="Unregistering"/>
+            <enumeration value="Error"/>
+            <enumeration value="Testing"/>
+            <enumeration value="Quiescent"/>
+            <enumeration value="Disabled"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="CallState" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Indicates the call state for this line.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Idle"/>
+            <enumeration value="Calling"/>
+            <enumeration value="Ringing"/>
+            <enumeration value="Connecting"/>
+            <enumeration value="InCall"/>
+            <enumeration value="Hold"/>
+            <enumeration value="Disconnecting"/>
+          </string>
+          <default type="object" value="Idle"/>
+        </syntax>
+      </parameter>
+      <parameter name="PhyReferenceList" access="readWrite" dmr:version="1.0">
+        <description>
+          {{list}} Each item corresponds to the value of a particular instance of {{param|.PhyInterface.{i}.InterfaceID}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="32"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="RingMuteStatus" access="readOnly" dmr:version="1.0">
+        <description>
+          Whether or not ringing has been locally muted.  Applicable only if the line is associated with a single telephony device for which ringing can be muted.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RingVolumeStatus" access="readOnly" dmr:version="1.0">
+        <description>
+          Percent value of current ringer volume level.  Applicable only if the line is associated with a single telephony device for which the ringer volume can be controlled.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.SIP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        Voice line parameters that are specific to SIP call signaling.
+      </description>
+      <parameter name="AuthUserName" access="readWrite" dmr:version="1.0">
+        <description>
+          Username used to authenticate the connection to the server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AuthPassword" access="readWrite" dmr:version="1.0">
+        <description>
+          Password used to authenticate the connection to the server.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="128"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="URI" access="readWrite" dmr:version="1.0">
+        <description>
+          URI by which the user agent will identify itself for this line.
+          If empty, the actual URI used in the SIP signaling SHOULD be automatically formed by the CPE as:
+          "sip:UserName@Domain"
+          Where UserName is username given for this line in {{param|AuthUserName}}, and Domain is the domain given for this profile in {{param|.VoiceProfile.{i}.SIP.UserAgentDomain}}.  If {{param|.VoiceProfile.{i}.SIP.UserAgentDomain}} is {{empty}}, then the IP address of the CPE SHOULD be used for the domain.
+          If URI is non-empty, but is a SIP or SIPS URI that contains no "@" character, then the actual URI used in the SIP signaling SHOULD be automatically formed by the CPE by appending this parameter with an "@" character followed by the value of {{param|.VoiceProfile.{i}.SIP.UserAgentDomain}}.  If {{param|.VoiceProfile.{i}.SIP.UserAgentDomain}} is {{empty}}, then the IP address of the CPE SHOULD be used for the domain.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="389"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SIPEventSubscribeNumberOfElements" access="readOnly" dmr:version="1.0">
+        <description>
+          Indicates the number of EventSubscribe objects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.SIP.EventSubscribe.{i}." access="readOnly" numEntriesParameter="SIPEventSubscribeNumberOfElements" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Table of SIP Events automatically populated by the CPE with each of the SIP event subscriptions in {{object|.VoiceProfile.{i}.SIP.EventSubscribe.{i}.}}.  This table allows specification of the authentication credentials needed for each event subscription.
+        If this table is supported, {{param|.Capabilities.SIP.EventSubscription}} MUST be equal to {{true}} and {{param|.VoiceProfile.{i}.Line.{i}.SIP.SIPEventSubscribeNumberOfElements}} MUST be present.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Event" access="readOnly" dmr:version="1.0">
+        <description>
+          SIP event name corresponding to the value given in {{object|.VoiceProfile.{i}.SIP.EventSubscribe.{i}.}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AuthUserName" access="readWrite" dmr:version="1.0">
+        <description>
+          Username used to authenticate the connection to the event notify server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AuthPassword" access="readWrite" dmr:version="1.0">
+        <description>
+          Password used to authenticate the connection to the event notify server.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="128"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.MGCP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        Voice line parameters that are specific to MGCP call signaling.
+      </description>
+      <parameter name="LineName" access="readWrite" dmr:version="1.0">
+        <description>
+          Used to identify the line when using MGCP signaling.  If empty, the CPE SHOULD use the default names "aaln/1", etc.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.H323." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        Voice line parameters that are specific to H.323 call signaling.
+      </description>
+      <parameter name="H323ID" access="readWrite" dmr:version="1.0">
+        <description>
+          The H.323 ID assigned to the line.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Ringer." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object defines the ring sequences generated by the VoIP device. 
+        If this object is supported, {{param|.Capabilities.RingGeneration}} MUST be equal to {{true}}.
+      </description>
+      <parameter name="EventNumberOfEntries" access="readOnly" dmr:version="1.0">
+        <description>
+          Number of entries in {{object|.VoiceProfile.{i}.Line.{i}.Ringer.Event.{i}.}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DescriptionNumberOfEntries" access="readOnly" dmr:version="1.0">
+        <description>
+          Number of entries in {{object|.VoiceProfile.{i}.Line.{i}.Ringer.Description.{i}.}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PatternNumberOfEntries" access="readOnly" dmr:version="1.0">
+        <description>
+          Number of entries in {{object|.VoiceProfile.{i}.Line.{i}.Ringer.Pattern.{i}.}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Ringer.Event.{i}." access="readOnly" numEntriesParameter="EventNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Table of events for which a ring pattern is defined.  The table is pre-populated with the complete list of events for which the CPE supports definition of ring patterns.
+        If this table is supported, {{param|.VoiceProfile.{i}.Line.{i}.Ringer.EventNumberOfEntries}} MUST be present.
+      </description>
+      <uniqueKey>
+        <parameter ref="Function"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Function" access="readOnly" dmr:version="1.0">
+        <description>
+          The event for which the ring pattern is to apply. {{enum}}
+          The parameter MAY instead indicate a vendor-specific event name, which MUST use the format defined in {{bibref|TR-106}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <enumeration value="Default"/>
+            <enumeration value="RingSplash"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RingID" access="readWrite" dmr:version="1.0">
+        <description>
+          The value of an instance of {{param|.VoiceProfile.{i}.Line.{i}.Ringer.Description.{i}.EntryID}} for the ring to be associated with the given event.
+          A value of zero indicates ringing is to be disabled for this event.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Ringer.Description.{i}." access="readWrite" numEntriesParameter="DescriptionNumberOfEntries" enableParameter="RingEnable" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Each entry in this table defines the contents of an individual ring specification.
+        If ability to add, delete, and modify entries in this table is supported, {{param|.Capabilities.RingDescriptionsEditable}} MUST be equal to {{true}}.
+        If this table is supported, the parameter DescriptionNumberOfEntries in the parent object MUST be present.
+        The defaults given for this object apply only to explicit creation of an instance of this object and not to automatic creation of instances of this object due to creation of a parent object.
+      </description>
+      <uniqueKey>
+        <parameter ref="EntryID"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="EntryID" access="readOnly" dmr:version="1.0">
+        <description>
+          Unique identifier of this ring description.  Assigned by the CPE upon creation of the entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RingEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enables or disables the ring description entry.  If a disabled ring description entry is referenced, the result is that no ring is played.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="RingName" access="readWrite" dmr:version="1.0">
+        <description>
+          Name of the ring description. 
+          This parameter is required to be editable only if {{param|.Capabilities.RingDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="RingPattern" access="readWrite" dmr:version="1.0">
+        <description>
+          The instance of {{param|.VoiceProfile.{i}.Line.{i}.Ringer.Pattern.{i}.EntryID}} that begins the ring pattern for this ring description.
+          If the ring is specified by a ring file instead of a ring pattern, this parameter MUST be set to zero.
+          This parameter is applicable only if {{param|.Capabilities.PatternBasedRingGeneration}} is equal to {{true}}.
+          This parameter is required to be editable only if {{param|.Capabilities.RingDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="RingFile" access="readWrite" dmr:version="1.0">
+        <description>
+          This is the file name of a ring file that has been downloaded to the CPE.  The download may have occurred via the TR-069 Download mechanism or by some other means.
+          If the ring is specified by a ring pattern instead of a ring file, this parameter MUST be empty.
+          This parameter is applicable only if {{param|.Capabilities.FileBasedRingGeneration}} is equal to {{true}}.
+          This parameter is required to be editable only {{param|.Capabilities.RingDescriptionsEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Ringer.Pattern.{i}." access="readWrite" numEntriesParameter="PatternNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Each entry in the table defines a single phase in an overall ring pattern.  Each phase identifies the entry that corresponds to the next phase.
+        Each entry in the table refers to the entry that corresponds to the next phase of the pattern.  The table MAY be set up such that entries form loops, or MAY end after a finite sequence.
+        If this object is supported, {{param|.Capabilities.PatternBasedRingGeneration}} MUST be equal to {{true}} and {{param|.VoiceProfile.{i}.Line.{i}.Ringer.PatternNumberOfEntries}} MUST be present.
+        If ability to add, delete, and modify entries in this table is supported, {{param|.Capabilities.RingPatternEditable}} MUST be equal to {{true}}.
+        The defaults given for this object apply only to explicit creation of an instance of this object and not to automatic creation of instances of this object due to creation of a parent object.
+      </description>
+      <uniqueKey>
+        <parameter ref="EntryID"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="EntryID" access="readWrite" dmr:version="1.0">
+        <description>
+          Identifier of a ring-pattern entry.
+          This parameter is required to be editable only if {{param|.Capabilities.RingPatternEditable}} is equal to {{true}}.
+          Note: when {{param|.Capabilities.RingPatternEditable}} is {{true}}, this parameter is editable so that the {{param|NextEntryID}} values for each table entry can be pre-assigned for a series of associated table entries rather than requiring the ACS to set the value according to an ID assigned dynamically upon creation of each entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RingerOn" access="readWrite" dmr:version="1.0">
+        <description>
+          If {{true}}, indicates the ringer is to be on for the specified period.  {{false}} indicates the ringer is to be off for the specified period.
+          This parameter is required to be editable only if {{param|.Capabilities.RingPatternEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Duration" access="readWrite" dmr:version="1.0">
+        <description>
+          The duration of this phase of the ring pattern, in {{units}}.
+          A value of zero indicates an unlimited duration.
+          This parameter is required to be editable only if {{param|.Capabilities.RingPatternEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="NextEntryID" access="readWrite" dmr:version="1.0">
+        <description>
+          The value of {{param|EntryID}} for the next phase of the ring pattern, after the value specified by {{param|Duration}} of this phase has completed.
+          A value of zero indicates that the ring pattern is to terminate after the current phase is completed.
+          This parameter is required to be editable only if {{param|.Capabilities.RingPatternEditable}} is equal to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.CallingFeatures." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        Voice line parameters related to optional endpoint based calling features.
+      </description>
+      <parameter name="CallerIDEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable the transmission of caller ID information on outgoing calls.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="CallerIDNameEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable the transmission of caller ID name information on outgoing calls.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="CallerIDName" access="readWrite" dmr:version="1.0">
+        <description>
+          String used to identify the caller.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CallWaitingEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable call waiting in the endpoint.  This parameter should not be present if the CPE does not support endpoint managed call waiting.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="CallWaitingStatus" access="readOnly" dmr:version="1.0">
+        <description>
+          Status of endpoint managed call waiting, if supported.  {{enum}}
+          This parameter should not be present if the CPE does not support endpoint managed call waiting.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Idle"/>
+            <enumeration value="SecondaryRinging"/>
+            <enumeration value="SecondaryConnecting"/>
+            <enumeration value="SecondaryConnected"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxSessions" access="readWrite" dmr:version="1.0">
+        <description>
+          Indicates the maximum number of simultaneous sessions that may be conferenced together by the endpoint.  This value SHOULD be less than the value of {{param|.Capabilities.MaxSessionsPerLine}}.  This parameter should not be present if the CPE does not support endpoint managed conference calling.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ConferenceCallingStatus" access="readOnly" dmr:version="1.0">
+        <description>
+          Status of endpoint managed conference calling, if supported.  {{enum}}
+          This parameter should not be present if the CPE does not support endpoint managed conference calling.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Idle"/>
+            <enumeration value="SecondaryCalling"/>
+            <enumeration value="SecondaryConnecting"/>
+            <enumeration value="SecondaryConnected"/>
+            <enumeration value="InConferenceCall"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConferenceCallingSessionCount" access="readOnly" dmr:version="1.0">
+        <description>
+          Number of active sessions on this line.  This parameter should not be present if the CPE does not support endpoint managed conference calling.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="0"/>
+            <range minInclusive="1" maxInclusive="1"/>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CallForwardUnconditionalEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable call forwarding by the endpoint.  This parameter should not be present if the CPE does not support endpoint based call forwarding.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="CallForwardUnconditionalNumber" access="readWrite" dmr:version="1.0">
+        <description>
+          Directory number to which all incoming calls to this line should be forwarded if {{param|CallForwardUnconditionalEnable}} is {{true}}.  This parameter should not be present if the CPE does not support endpoint based call forwarding
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CallForwardOnBusyEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable call forwarding-on-busy by the endpoint.  This parameter should not be present if the CPE does not support endpoint based call forwarding.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="CallForwardOnBusyNumber" access="readWrite" dmr:version="1.0">
+        <description>
+          Directory number to which all incoming calls to this line should be forwarded if {{param|CallForwardOnBusyEnable}} is {{true}} and the line is busy.  This parameter should not be present if the CPE does not support endpoint based call forwarding
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CallForwardOnNoAnswerEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable call forwarding-on-no-answer by the endpoint.  This parameter should not be present if the CPE does not support endpoint based call forwarding.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="CallForwardOnNoAnswerNumber" access="readWrite" dmr:version="1.0">
+        <description>
+          Directory number to which all incoming calls to this line should be forwarded if {{param|CallForwardOnNoAnswerEnable}} is {{true}} and there is no local answer.  This parameter should not be present if the CPE does not support endpoint based call forwarding
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CallForwardOnNoAnswerRingCount" access="readWrite" dmr:version="1.0">
+        <description>
+          Number of rings before considering there to be no answer for call forwarding-on-no-answer.  This parameter should not be present if the CPE does not support endpoint based call forwarding
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CallTransferEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable call transfer by the endpoint.  This parameter should not be present if the CPE does not support endpoint based call transfer.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MWIEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable Message Waiting Indication by the endpoint.  This parameter should not be present if the CPE does not support MWI.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MessageWaiting" access="readOnly" dmr:version="1.0">
+        <description>
+          Indicates whether or not a message is currently waiting on this line as known by the CPE.  This parameter should not be present if the CPE does not support MWI.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="AnonymousCallBlockEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable Anonymous Call Block capability in the endpoint.  This parameter should not be present if the CPE does not support endpoint based Anonymous Call Block capability.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="AnonymousCalEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable Anonymous Call capability in the endpoint.  This parameter should not be present if the CPE does not support endpoint based Anonymous Call capability.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="DoNotDisturbEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable Do Not Disturb capability in the endpoint.  This parameter should not be present if the CPE does not support endpoint based Do Not Disturb capability.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="CallReturnEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable Call Return capability in the endpoint.  This parameter should not be present if the CPE does not support endpoint based Call Return capability.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RepeatDialEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable Repeat Dial capability in the endpoint.  This parameter should not be present if the CPE does not support endpoint based Repeat Dial capability.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.VoiceProcessing." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        Voice line parameters related to voice processing capabilities.
+      </description>
+      <parameter name="TransmitGain" access="readWrite" dmr:version="1.0">
+        <description>
+          Gain in {{units}} to apply to the transmitted voice signal prior to encoding.  This gain is a modifier of the default transmit-gain, which is unspecified.
+        </description>
+        <syntax>
+          <int>
+            <units value="01. dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ReceiveGain" access="readWrite" dmr:version="1.0">
+        <description>
+          Gain in {{units}} to apply to the received voice signal after decoding.  This gain is a modifier of the default receive-gain, which is unspecified.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1 dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="EchoCancellationEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable echo cancellation for this line.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EchoCancellationInUse" access="readOnly" dmr:version="1.0">
+        <description>
+          Indication of whether or not echo cancellation is currently in use for this line.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EchoCancellationTail" access="readOnly" dmr:version="1.0">
+        <description>
+          Tail length in {{units}} of the echo canceller associated with this line (whether or not it is currently in use).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Codec." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object indicates the state of the transmit and receive codec for this voice line instance.
+      </description>
+      <parameter name="TransmitCodec" access="readOnly" dmr:version="1.0">
+        <description>
+          The codec currently in use for the outgoing voice stream.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <enumeration value="G.711MuLaw"/>
+            <enumeration value="G.711ALaw"/>
+            <enumeration value="G.726"/>
+            <enumeration value="G.729"/>
+            <enumeration value="G.729a"/>
+            <enumeration value="G.729e"/>
+            <enumeration value="G.728"/>
+            <enumeration value="G.723.1"/>
+            <enumeration value="G.722"/>
+            <enumeration value="G.722.1"/>
+            <enumeration value="G.722.2"/>
+            <enumeration value="GSM-FR"/>
+            <enumeration value="GSM-HR"/>
+            <enumeration value="GSM-EFR"/>
+            <enumeration value="iLBC"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ReceiveCodec" access="readOnly" dmr:version="1.0">
+        <description>
+          The codec currently in use for the incoming voice stream.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <enumeration value="G.711MuLaw"/>
+            <enumeration value="G.711ALaw"/>
+            <enumeration value="G.726"/>
+            <enumeration value="G.729"/>
+            <enumeration value="G.729a"/>
+            <enumeration value="G.729e"/>
+            <enumeration value="G.728"/>
+            <enumeration value="G.723.1"/>
+            <enumeration value="G.722"/>
+            <enumeration value="G.722.1"/>
+            <enumeration value="G.722.2"/>
+            <enumeration value="GSM-FR"/>
+            <enumeration value="GSM-HR"/>
+            <enumeration value="GSM-EFR"/>
+            <enumeration value="iLBC"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TransmitBitRate" access="readOnly" dmr:version="1.0">
+        <description>
+          Codec bit rate in {{units}} for the codec currently in use for the outgoing voice stream.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ReceiveBitRate" access="readOnly" dmr:version="1.0">
+        <description>
+          Codec bit rate in {{units}} for the codec currently in use for the incoming voice stream.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TransmitSilenceSuppression" access="readOnly" dmr:version="1.0">
+        <description>
+          Whether or not silence suppression is in use for the outgoing voice stream.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceiveSilenceSuppression" access="readOnly" dmr:version="1.0">
+        <description>
+          Whether or not silence suppression is in use for the incoming voice stream.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmitPacketizationPeriod" access="readOnly" dmr:version="1.0">
+        <description>
+          Current outgoing packetization period in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Codec.List.{i}." access="readOnly" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Table to describe the set of codecs enabled for use with this line.  Each entry in this table refers to a distinct combination of codec and bit rate.  When an instance of {{object|.VoiceProfile.{i}.Line.{i}.}} is created, this object MUST be populated with the set of supported codecs matching {{object|.Capabilities.Codecs.}}.  The ACS MAY restrict and/or prioritize the codec support for this profile using this object.
+        Applicable only for a VoIP endpoint.
+      </description>
+      <uniqueKey>
+        <parameter ref="EntryID"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Codec"/>
+        <parameter ref="BitRate"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="EntryID" access="readOnly" dmr:version="1.0">
+        <description>
+          Unique identifier for each entry in this table.  The value MUST match that of the corresponding entry in {{object|.Capabilities.Codecs.}} table.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Codec" access="readOnly" dmr:version="1.0">
+        <description>
+          Identifier of the codec type.  The value MUST match that of the corresponding entry in {{object|.Capabilities.Codecs.}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BitRate" access="readOnly" dmr:version="1.0">
+        <description>
+          Bit rate, in {{units}}.  The value MUST match that of the corresponding entry in {{object|.Capabilities.Codecs.}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PacketizationPeriod" access="readWrite" dmr:version="1.0">
+        <description>
+          {{list}} Each item is a supported packetization period, in milliseconds, or continuous ranges of packetization periods as defined in {{param|.Capabilities.Codecs.{i}.PacketizationPeriod}}.
+          The set of packetization periods may be restricted by modifying the value of this parameter to a more restricted set of values than is listed in {{param|.Capabilities.Codecs.{i}.PacketizationPeriod}}.  The CPE MUST ignore any values or portions of ranges outside of those specified in {{param|.Capabilities.Codecs.{i}.PacketizationPeriod}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SilenceSuppression" access="readWrite" dmr:version="1.0">
+        <description>
+          Indicates support for silence suppression for this codec.  If silence suppression is supported, it can be disabled for this codec/bit-rate by setting this parameter to {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="1.0">
+        <description>
+          Enable or disable the use of this combination of codec parameters.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="Priority" access="readWrite" dmr:version="1.0">
+        <description>
+          Indicates the priority for this combination of codec parameters, where 1 is the highest priority.  Where the priority differs between entries in this table, the CPE SHOULD use the highest priority (lowest numbered) entry among those supported by the remote endpoint and consistent with the available bandwidth.  Where the priorities are equal among multiple entries, the CPE MAY apply a local criterion for choosing among them.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Session.{i}." access="readOnly" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Information on each active session associated with this voice line instance.
+      </description>
+      <parameter name="SessionStartTime" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          The time that the session started, in UTC.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="SessionDuration" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Duration time of the current session, in seconds.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FarEndIPAddress" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          The IP address of far end VoIP device.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="FarEndUDPPort" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          The UDP port used for current RTP session in the far end device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LocalUDPPort" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          The local UDP port used for current RTP session.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        Statistics for this voice line instance.
+      </description>
+      <parameter name="ResetStatistics" access="readWrite" dmr:version="1.0">
+        <description>
+          When set to one, resets the statistics for this voice line.  Always False when read.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of RTP packets sent for this line.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of RTP packets received for this line.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of RTP payload bytes sent for this line.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of RTP payload bytes received for this line.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsLost" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of RTP packets that have been lost for this line.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Overruns" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of times the receive jitter buffer has overrun for this line.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Underruns" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of times the receive jitter buffer has underrun for this line.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IncomingCallsReceived" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total incoming calls received.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IncomingCallsAnswered" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total incoming calls answered by the local user.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IncomingCallsConnected" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total incoming calls that successfully completed call setup signaling.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IncomingCallsFailed" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total incoming calls that failed to successfully complete call setup signaling.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OutgoingCallsAttempted" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total outgoing calls attempted.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OutgoingCallsAnswered" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total outgoing calls answered by the called party.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OutgoingCallsConnected" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total outgoing calls that successfully completed call setup signaling.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OutgoingCallsFailed" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total outgoing calls that failed to successfully complete call setup signaling.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CallsDropped" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total calls that were successfully connected (incoming or outgoing), but dropped unexpectedly while in progress without explicit user termination.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalCallTime" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Cumulative call duration in seconds.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerDownTime" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          The number of seconds the CPE is unable to maintain a connection to the server.  SHOULD not include time in which overall network connectivity is unavailable.  Applies only to SIP.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivePacketLossRate" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Current receive packet loss rate in percent, calculated as defined in {{bibref|RFC3550|Section6.4}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FarEndPacketLossRate" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Current far end receive packet lost rate in percent, calculated as defined in {{bibref|RFC3550|Section6.4}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ReceiveInterarrivalJitter" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Current receive interarrival jitter in {{units}}.  Calculated from J(i) as defined in {{bibref|RFC3550|Section6.4}}, with units converted to {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FarEndInterarrivalJitter" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Current Interarrival jitter in {{units}} as reported from the far-end device via RTCP.  Calculated from J(i) as defined in {{bibref|RFC3550|Section64.}}, with units converted to {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RoundTripDelay" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Current round trip delay in {{units}} calculated as defined in {{bibref|RFC3550|Section6.4}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AverageReceiveInterarrivalJitter" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Average receive interarrival jitter in {{units}} since the beginning of the current call.  Calculated as the average of D(i,j) as defined in {{bibref|RFC3550|Section6.4}}, with units converted to {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AverageFarEndInterarrivalJitter" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Average far-end interarrival jitter in {{units}} since the beginning of the current call.  Calculated as the average of the interarrival jitter values reported by the far-end, with units converted to {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AverageRoundTripDelay" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Average round trip delay in {{units}} since the beginning of the current call.  Average of the {{param|RoundTripDelay}} statistic accumulated each time the delay is calculated.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.PhyInterface.{i}." access="readOnly" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Each instance is associated with a distinct physical FXS (Foreign eXchange Station) port.  Instances of this object are statically created by the CPE.
+        Applicable only for a VoIP Endpoint.
+      </description>
+      <uniqueKey>
+        <parameter ref="InterfaceID"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="PhyPort"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="1.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="PhyPort" access="readOnly" dmr:version="1.0">
+        <description>
+          The physical port number on the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="2"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceID" access="readOnly" dmr:version="1.0">
+        <description>
+          The unique identifier of the physical port.  This value MAY be used in {{param|.VoiceProfile.{i}.Line.{i}.PhyReferenceList}} to indicate which physical ports are associated with a line.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readOnly" dmr:version="1.0">
+        <description>
+          A description of the physical port.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="VoiceService.{i}.PhyInterface.{i}.Tests." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        Voice port tests.
+        If this object is supported, {{param|.Capabilities.VoicePortTests}} MUST be equal to {{true}}.
+      </description>
+      <parameter name="TestState" access="readWrite" dmr:version="1.0">
+        <description>
+          Indicates the current test state.  {{enum}}
+          Value MAY be set to {{enum|Requested}} to initiate a diagnostic test.  When writing, the only allowed value is {{enum|Requested}}.  To ensure the use of the proper test parameters (the writable parameters in this object), the test parameters MUST be set either prior to or at the same time as (in the same SetParameterValues) setting the value {{enum|Requested}}.
+          When requested, the CPE SHOULD wait until after completion of the communication session with the ACS before starting the test.
+          When the test initiated by the ACS is completed (successfully or not), the CPE MUST establish a new connection to the ACS to allow the ACS to view the results, indicating the Event code "8 DIAGNOSTICS COMPLETE" in the Inform message.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Complete"/>
+            <enumeration value="Error_TestNotSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TestSelector" access="readWrite" dmr:version="1.0">
+        <description>
+          Indicates which test to perform.  {{enum}}
+          The phone connectivity test indicates that the CPE should determine if one or more phones associated with this physical port are properly connected.  This test is appropriate only for CPE that connect to phones of any type.
+          The parameter MAY instead indicate a vendor-specific test, which MUST use the format defined in {{bibref|TR-106}}.  For example:
+          "X_EXAMPLE-COM_MyTest"
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <enumeration value="PhoneConnectivityTest"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PhoneConnectivity" access="readOnly" dmr:version="1.0">
+        <description>
+          Indicates whether or not at least one phone associated with this physical port is properly connected.  This parameter is applicable only if {{enum|PhoneConnectivityTest|TestSelector}} is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <profile name="Endpoint:1" dmr:version="1.0">
+      <object ref="VoiceService.{i}." requirement="present">
+        <parameter ref="VoiceProfileNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="VoiceService.{i}.Capabilities." requirement="present">
+        <parameter ref="MaxProfileCount" requirement="readOnly"/>
+        <parameter ref="MaxLineCount" requirement="readOnly"/>
+        <parameter ref="MaxSessionsPerLine" requirement="readOnly"/>
+        <parameter ref="MaxSessionCount" requirement="readOnly"/>
+        <parameter ref="SignalingProtocols" requirement="readOnly"/>
+        <parameter ref="Regions" requirement="readOnly"/>
+        <parameter ref="RTCP" requirement="readOnly"/>
+        <parameter ref="SRTP" requirement="readOnly"/>
+        <parameter ref="RTPRedundancy" requirement="readOnly"/>
+        <parameter ref="DSCPCoupled" requirement="readOnly"/>
+        <parameter ref="EthernetTaggingCoupled" requirement="readOnly"/>
+        <parameter ref="PSTNSoftSwitchOver" requirement="readOnly"/>
+        <parameter ref="FaxT38" requirement="readOnly"/>
+        <parameter ref="FaxPassThrough" requirement="readOnly"/>
+        <parameter ref="ModemPassThrough" requirement="readOnly"/>
+        <parameter ref="ToneGeneration" requirement="readOnly"/>
+        <parameter ref="RingGeneration" requirement="readOnly"/>
+        <parameter ref="NumberingPlan" requirement="readOnly"/>
+        <parameter ref="ButtonMap" requirement="readOnly"/>
+        <parameter ref="VoicePortTests" requirement="readOnly"/>
+      </object>
+      <object ref="VoiceService.{i}.Capabilities.Codecs.{i}." requirement="present">
+        <parameter ref="EntryID" requirement="readOnly"/>
+        <parameter ref="Codec" requirement="readOnly"/>
+        <parameter ref="BitRate" requirement="readOnly"/>
+        <parameter ref="PacketizationPeriod" requirement="readOnly"/>
+        <parameter ref="SilenceSuppression" requirement="readOnly"/>
+      </object>
+      <object ref="VoiceService.{i}.VoiceProfile.{i}." requirement="createDelete">
+        <description>
+          Support for creation and deletion of Profiles is REQUIRED only if more than one Profile is supported as
+          indicated by {{param|.Capabilities.MaxProfileCount}}.
+        </description>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Reset" requirement="readWrite"/>
+        <parameter ref="NumberOfLines" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="SignalingProtocol" requirement="readWrite"/>
+        <parameter ref="MaxSessions" requirement="readWrite"/>
+        <parameter ref="DTMFMethod" requirement="readWrite"/>
+        <parameter ref="DTMFMethodG711" requirement="readWrite"/>
+      </object>
+      <object ref="VoiceService.{i}.VoiceProfile.{i}.RTP." requirement="present">
+        <parameter ref="LocalPortMin" requirement="readWrite"/>
+        <parameter ref="LocalPortMax" requirement="readWrite"/>
+        <parameter ref="DSCPMark" requirement="readWrite"/>
+        <parameter ref="TelephoneEventPayloadType" requirement="readWrite"/>
+      </object>
+      <object ref="VoiceService.{i}.VoiceProfile.{i}.Line.{i}." requirement="createDelete">
+        <description>
+          Support for creation and deletion of Lines is REQUIRED only if more than one Line is supported as
+          indicated by {{param|.Capabilities.MaxLineCount}}.
+        </description>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="CallState" requirement="readOnly"/>
+      </object>
+      <object ref="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Codec." requirement="present">
+        <parameter ref="TransmitCodec" requirement="readOnly"/>
+        <parameter ref="ReceiveCodec" requirement="readOnly"/>
+        <parameter ref="TransmitBitRate" requirement="readOnly"/>
+        <parameter ref="ReceiveBitRate" requirement="readOnly"/>
+        <parameter ref="TransmitSilenceSuppression" requirement="readOnly"/>
+        <parameter ref="ReceiveSilenceSuppression" requirement="readOnly"/>
+        <parameter ref="TransmitPacketizationPeriod" requirement="readOnly"/>
+      </object>
+      <object ref="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Codec.List.{i}." requirement="present">
+        <parameter ref="EntryID" requirement="readOnly"/>
+        <parameter ref="Codec" requirement="readOnly"/>
+        <parameter ref="BitRate" requirement="readOnly"/>
+        <parameter ref="PacketizationPeriod" requirement="readWrite"/>
+        <parameter ref="SilenceSuppression" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite">
+          <description>
+            This parameter is REQUIRED to be writable only if there is more than one entry in this table.
+          </description>
+        </parameter>
+        <parameter ref="Priority" requirement="readWrite">
+          <description>
+            This parameter is REQUIRED to be writable only if there is more than one entry in this table.
+          </description>
+        </parameter>
+      </object>
+      <object ref="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Session.{i}." requirement="present">
+        <parameter ref="SessionStartTime" requirement="readOnly"/>
+        <parameter ref="SessionDuration" requirement="readOnly"/>
+        <parameter ref="FarEndIPAddress" requirement="readOnly"/>
+        <parameter ref="FarEndUDPPort" requirement="readOnly"/>
+        <parameter ref="LocalUDPPort" requirement="readOnly"/>
+      </object>
+      <object ref="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.Stats." requirement="present">
+        <parameter ref="ResetStatistics" requirement="readWrite"/>
+        <parameter ref="PacketsSent" requirement="readOnly"/>
+        <parameter ref="PacketsReceived" requirement="readOnly"/>
+        <parameter ref="BytesSent" requirement="readOnly"/>
+        <parameter ref="BytesReceived" requirement="readOnly"/>
+        <parameter ref="PacketsLost" requirement="readOnly"/>
+        <parameter ref="Overruns" requirement="readOnly"/>
+        <parameter ref="Underruns" requirement="readOnly"/>
+        <parameter ref="IncomingCallsReceived" requirement="readOnly"/>
+        <parameter ref="IncomingCallsAnswered" requirement="readOnly"/>
+        <parameter ref="IncomingCallsConnected" requirement="readOnly"/>
+        <parameter ref="IncomingCallsFailed" requirement="readOnly"/>
+        <parameter ref="OutgoingCallsAttempted" requirement="readOnly"/>
+        <parameter ref="OutgoingCallsAnswered" requirement="readOnly"/>
+        <parameter ref="OutgoingCallsConnected" requirement="readOnly"/>
+        <parameter ref="OutgoingCallsFailed" requirement="readOnly"/>
+        <parameter ref="CallsDropped" requirement="readOnly"/>
+        <parameter ref="TotalCallTime" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="SIPEndpoint:1" extends="Endpoint:1" dmr:version="1.0">
+      <object ref="VoiceService.{i}.Capabilities.SIP." requirement="present">
+        <parameter ref="Role" requirement="readOnly"/>
+        <parameter ref="Extensions" requirement="readOnly"/>
+        <parameter ref="Transports" requirement="readOnly"/>
+        <parameter ref="URISchemes" requirement="readOnly"/>
+        <parameter ref="EventSubscription" requirement="readOnly"/>
+        <parameter ref="ResponseMap" requirement="readOnly"/>
+      </object>
+      <object ref="VoiceService.{i}.VoiceProfile.{i}.SIP." requirement="present">
+        <parameter ref="ProxyServer" requirement="readWrite"/>
+        <parameter ref="ProxyServerPort" requirement="readWrite"/>
+        <parameter ref="ProxyServerTransport" requirement="readWrite"/>
+        <parameter ref="RegistrarServer" requirement="readWrite"/>
+        <parameter ref="RegistrarServerPort" requirement="readWrite"/>
+        <parameter ref="RegistrarServerTransport" requirement="readWrite"/>
+        <parameter ref="UserAgentDomain" requirement="readWrite"/>
+        <parameter ref="UserAgentPort" requirement="readWrite"/>
+        <parameter ref="UserAgentTransport" requirement="readWrite"/>
+        <parameter ref="OutboundProxy" requirement="readWrite"/>
+        <parameter ref="OutboundProxyPort" requirement="readWrite"/>
+        <parameter ref="Organization" requirement="readWrite"/>
+        <parameter ref="RegistrationPeriod" requirement="readWrite"/>
+        <parameter ref="RegisterExpires" requirement="readWrite"/>
+        <parameter ref="UseCodecPriorityInSDPResponse" requirement="readWrite"/>
+      </object>
+      <object ref="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.SIP." requirement="present">
+        <parameter ref="AuthUserName" requirement="readWrite"/>
+        <parameter ref="AuthPassword" requirement="readWrite"/>
+        <parameter ref="URI" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="MGCPEndpoint:1" extends="Endpoint:1" dmr:version="1.0">
+      <object ref="VoiceService.{i}.Capabilities.MGCP." requirement="present">
+        <parameter ref="Extensions" requirement="readOnly"/>
+      </object>
+      <object ref="VoiceService.{i}.VoiceProfile.{i}.MGCP." requirement="present">
+        <parameter ref="CallAgent1" requirement="readWrite"/>
+        <parameter ref="CallAgentPort1" requirement="readWrite"/>
+        <parameter ref="CallAgent2" requirement="readWrite"/>
+        <parameter ref="CallAgentPort2" requirement="readWrite"/>
+        <parameter ref="RetranIntervalTimer" requirement="readWrite"/>
+        <parameter ref="MaxRetranCount" requirement="readWrite"/>
+        <parameter ref="RegisterMode" requirement="readWrite"/>
+        <parameter ref="LocalPort" requirement="readWrite"/>
+        <parameter ref="Domain" requirement="readWrite"/>
+        <parameter ref="User" requirement="readWrite"/>
+        <parameter ref="AllowPiggybackEvents" requirement="readWrite"/>
+        <parameter ref="SendRSIPImmediately" requirement="readWrite"/>
+      </object>
+      <object ref="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.MGCP." requirement="present">
+        <parameter ref="LineName" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="H323Endpoint:1" extends="Endpoint:1" dmr:version="1.0">
+      <object ref="VoiceService.{i}.Capabilities.H323." requirement="present">
+        <parameter ref="FastStart" requirement="readOnly"/>
+        <parameter ref="H235AuthenticationMethods" requirement="readOnly"/>
+      </object>
+      <object ref="VoiceService.{i}.VoiceProfile.{i}.H323." requirement="present">
+        <parameter ref="Gatekeeper" requirement="readWrite"/>
+        <parameter ref="GatekeeperPort" requirement="readWrite"/>
+        <parameter ref="GatekeeperID" requirement="readWrite"/>
+        <parameter ref="TimeToLive" requirement="readWrite"/>
+        <parameter ref="H235Authentication" requirement="readWrite"/>
+        <parameter ref="AuthPassword" requirement="readWrite"/>
+        <parameter ref="SendersID" requirement="readWrite"/>
+      </object>
+      <object ref="VoiceService.{i}.VoiceProfile.{i}.Line.{i}.H323." requirement="present">
+        <parameter ref="H323ID" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="TAEndpoint:1" extends="Endpoint:1" dmr:version="1.0">
+      <object ref="VoiceService.{i}.VoiceProfile.{i}.Line.{i}." requirement="present">
+        <parameter ref="PhyReferenceList" requirement="readWrite"/>
+      </object>
+      <object ref="VoiceService.{i}.PhyInterface.{i}." requirement="present">
+        <parameter ref="PhyPort" requirement="readOnly"/>
+        <parameter ref="InterfaceID" requirement="readOnly"/>
+      </object>
+    </profile>
+  </model>
+</dm:document>
diff --git a/tools/tr-106-1-2-0-full.xml b/tools/tr-106-1-2-0-full.xml
new file mode 100644
index 0000000000000000000000000000000000000000..31a61869f15c40c9794da64f4f852608c04a8df6
--- /dev/null
+++ b/tools/tr-106-1-2-0-full.xml
@@ -0,0 +1,2261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- DO NOT EDIT; generated by Broadband Forum report.pl#422 (2018/03/28 version) on 2018/04/02 at 12:14:03.
+     report.pl -exitcode=fatals -cwmpindex=.. -nofontstyles -nowarnreport -quiet -report=xml -outfile=tr-106-1-2-0-full.xml tr-106-1-2-0.xml
+     See https://github.com/BroadbandForum/cwmp-xml-tools/tree/master/Report_Tool. -->
+<!--
+  TR-069 Device:1.2 Root Object errata and clarifications
+
+  Copyright (c) 2008-2017, Broadband Forum
+  
+  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.
+  
+  Summary:
+  TR-069 Device:1.2 Root Object errata and clarifications.
+
+  Version History:
+  November 2008: tr-106-1-2-0.xml, corresponds to TR-106 Amendment 2 section
+                 3.4 (Common Object Definitions), section 3.5 (Inform Require-
+                 ments), section 3.6 (Notification Requirements) and section 4
+                 (Profile Definitions).  Contains only the differences from
+                 Device:1.2 as defined in TR-143.
+  September 2009: tr-106-1-2-0.xml (name unchanged)
+                 - removed duplicate bibrefs
+                 - fixed cwmp-datamodel.xsd to be cwmp-datamodel-1-0.xsd
+-->
+<dm:document xmlns:dm="urn:broadband-forum-org:cwmp:datamodel-1-0"
+             xmlns:dmr="urn:broadband-forum-org:cwmp:datamodel-report-0-1"
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+             xsi:schemaLocation="urn:broadband-forum-org:cwmp:datamodel-1-0 http://www.broadband-forum.org/cwmp/cwmp-datamodel-1-0.xsd urn:broadband-forum-org:cwmp:datamodel-report-0-1 http://www.broadband-forum.org/cwmp/cwmp-datamodel-report.xsd"
+             spec="urn:broadband-forum-org:tr-106-1-2-0">
+  <dataType name="IPAddress">
+    <description>
+      IP address, i.e. IPv4 address (or IPv4 subnet mask) or IPv6 address.
+      All IPv4 addresses and subnet masks MUST be represented as strings in IPv4 dotted-decimal notation.  Here are some examples of valid IPv4 address textual representations:
+      * 216.52.29.100
+      * 192.168.1.254
+      All IPv6 addresses MUST be represented using any of the 3 standard textual representations defined in {{bibref|RFC4291}} Sections 2.2.1, 2.2.2 and 2.2.3.  Both lower-case and upper-case letters can be used, but use of lower-case letters is RECOMMENDED.  Here are some examples of valid IPv6 address textual representations:
+      * 1080:0:0:800:ba98:3210:11aa:12dd
+      * 1080::800:ba98:3210:11aa:12dd
+      * 0:0:0:0:0:0:13.1.68.3
+      IPv6 addresses MUST NOT include zone identifiers. Zone identifiers are discussed in {{bibref|RFC4007|Section 6}}.
+      Unspecified or inapplicable addresses (or IPv4 subnet masks) MUST be represented as empty strings unless otherwise specified by the parameter definition.
+    </description>
+    <string>
+      <size maxLength="45"/>
+    </string>
+  </dataType>
+  <dataType name="IPv4Address" base="IPAddress">
+    <description>
+      IPv4 address (or subnet mask).
+      Can be any IPv4 address that is permitted by the ''IPAddress'' data type.
+    </description>
+    <size maxLength="15"/>
+  </dataType>
+  <dataType name="IPv6Address" base="IPAddress">
+    <description>
+      IPv6 address.
+      Can be any IPv6 address that is permitted by the ''IPAddress'' data type.
+    </description>
+    <size maxLength="45"/>
+  </dataType>
+  <dataType name="IPPrefix">
+    <description>
+      IPv4 or IPv6 routing prefix in Classless Inter-Domain Routing (CIDR) notation {{bibref|RFC4632}}. This is specified as an IP address followed by an appended "/n" suffix, where ''n'' (the prefix size) is an integer in the range 0-32 (for IPv4) or 0-128 (for IPv6) that indicates the number of (leftmost) '1' bits of the routing prefix. 
+      * IPv4 example: 192.168.1.0/24
+      * IPv6 example: 2001:edff:fe6a:f76::/64
+      If the IP address part is unspecified or inapplicable, it MUST be {{empty}} unless otherwise specified by the parameter definition.  In this case the IP prefix will be of the form "/n".
+      If the entire IP prefix is unspecified or inapplicable, it MUST be {{empty}} unless otherwise specified by the parameter definition.
+    </description>
+    <string>
+      <size maxLength="49"/>
+    </string>
+  </dataType>
+  <dataType name="IPv4Prefix" base="IPPrefix">
+    <description>
+      IPv4 address prefix. 
+      Can be any IPv4 prefix that is permitted by the ''IPPrefix'' data type.
+    </description>
+    <size maxLength="18"/>
+  </dataType>
+  <dataType name="IPv6Prefix" base="IPPrefix">
+    <description>
+      IPv6 address prefix.
+      Can be any IPv6 prefix that is permitted by the ''IPPrefix'' data type.
+    </description>
+    <size maxLength="49"/>
+  </dataType>
+  <dataType name="MACAddress">
+    <description>
+      All MAC addresses are represented as strings of 12 hexadecimal digits (digits 0-9, letters A-F or a-f) displayed as six pairs of digits separated by colons.  Unspecified or inapplicable MAC addresses MUST be represented as empty strings unless otherwise specified by the parameter definition.
+    </description>
+    <string>
+      <size maxLength="17"/>
+      <pattern value=""/>
+      <pattern value="([0-9A-Fa-f][0-9A-Fa-f]:){5}([0-9A-Fa-f][0-9A-Fa-f])"/>
+    </string>
+  </dataType>
+  <dataType name="StatsCounter32">
+    <description>
+      A 32-bit statistics parameter, e.g. a byte counter.
+      This data type SHOULD NOT be used for statistics parameters whose values might become greater than the maximum value that can be represented as an ''unsignedInt'' (i.e. 0xffffffff, referred to below as ''maxval''). ''StatsCounter64'' SHOULD be used for such parameters.
+      The value ''maxval'' indicates that no data is available for this parameter.  In the unlikely event that the actual value of the statistic is ''maxval'', the CPE SHOULD return ''maxval - 1''.
+      The actual value of the statistic might be greater than ''maxval''. Such values SHOULD wrap around through zero.
+      The term ''packet'' is to be interpreted as the transmission unit appropriate to the protocol layer in question, e.g. an IP packet or an Ethernet frame.
+    </description>
+    <unsignedInt>
+    </unsignedInt>
+  </dataType>
+  <dataType name="StatsCounter64">
+    <description>
+      A 64-bit statistics parameter, e.g. a byte counter.
+      This data type SHOULD be used for all statistics parameters whose values might become greater than the maximum value that can be represented as an ''unsignedInt''.
+      The maximum value that can be represented as an ''unsignedLong'' (i.e. 0xffffffffffffffff) indicates that no data is available for this parameter.
+      The term ''packet'' is to be interpreted as the transmission unit appropriate to the protocol layer in question, e.g. an IP packet or an Ethernet frame.
+    </description>
+    <unsignedLong>
+    </unsignedLong>
+  </dataType>
+  <dataType name="Alias">
+    <description>
+      A non-volatile handle used to reference this instance. Alias provides a mechanism for an ACS to label this instance for future reference.
+      If the CPE supports the Alias-based Addressing feature as defined in {{bibref|TR-069a4|3.6.1}} and described in {{bibref|TR-069a4|Appendix II}}, the following mandatory constraints MUST be enforced:
+      *Its value MUST NOT be empty.
+      *Its value MUST start with a letter.
+      *If its value is not assigned by the ACS, it MUST start with a "cpe-" prefix.
+      *The CPE MUST NOT change the parameter value.
+    </description>
+    <string>
+      <size maxLength="64"/>
+    </string>
+  </dataType>
+  <dataType name="Dbm1000">
+    <description>
+      The value is measured in ''dBm/1000'', i.e. the value divided by 1000 is dB relative to 1 mW.  For example, -12345 means -12.345 dBm, 0 means 0 dBm (1 mW) and 12345 means 12.345 dBm.
+    </description>
+    <int>
+    </int>
+  </dataType>
+  <dataType name="UUID">
+    <description>
+      Universally Unique Identifier.  See {{bibref|RFC4122}}.
+    </description>
+    <string>
+      <size minLength="36" maxLength="36"/>
+      <pattern value="[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}"/>
+    </string>
+  </dataType>
+  <dataType name="IEEE_EUI64">
+    <description>
+      The IEEE EUI 64-bit identifier as defined in {{bibref|EUI64}}. The IEEE defined 64-bit extended unique identifier (EUI-64) is a concatenation of:
+      * The 24-bit (OUI-24) or 36-bit (OUI-36) company_id value assigned by the IEEE Registration Authority (IEEE-RA), and
+      * The extension identifier (40 bits for OUI-24 or 28 bits for OUI-36) assigned by the organization with that company_id assignment.
+    </description>
+    <string>
+      <size maxLength="23"/>
+      <pattern value=""/>
+      <pattern value="([0-9A-Fa-f][0-9A-Fa-f]:){7}([0-9A-Fa-f][0-9A-Fa-f])"/>
+    </string>
+  </dataType>
+  <dataType name="ZigBeeNetworkAddress">
+    <description>
+      The ZigBee 16-bit network address (NWK) as defined in {{bibref|ZigBee2007}}. The address is assigned to a device by the network layer and used by the network layer for routing messages between devices.
+    </description>
+    <string>
+      <size maxLength="4"/>
+      <pattern value=""/>
+      <pattern value="([0-9A-Fa-f]){4}"/>
+    </string>
+  </dataType>
+  <bibliography>
+    <reference id="OUI">
+      <name>Organizationally Unique Identifiers (OUIs)</name>
+      <hyperlink>http://standards.ieee.org/faqs/OUI.html</hyperlink>
+    </reference>
+    <reference id="RFC862">
+      <name>RFC 862</name>
+      <title>Echo Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1983</date>
+      <hyperlink>http://tools.ietf.org/html/rfc862</hyperlink>
+    </reference>
+    <reference id="RFC959">
+      <name>RFC 959</name>
+      <title>File Transfer Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1985</date>
+      <hyperlink>http://tools.ietf.org/html/rfc959</hyperlink>
+    </reference>
+    <reference id="RFC2616">
+      <name>RFC 2616</name>
+      <title>Hypertext Transfer Protocol -- HTTP/1.1</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1999</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2616</hyperlink>
+    </reference>
+    <reference id="RFC3066">
+      <name>RFC 3066</name>
+      <title>Tags for the Identification of Languages</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc3066</hyperlink>
+    </reference>
+    <reference id="RFC3489">
+      <name>RFC 3489</name>
+      <title>STUN - Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc3489</hyperlink>
+    </reference>
+    <reference id="RFC3986">
+      <name>RFC 3986</name>
+      <title>Uniform Resource Identifier (URI): Generic Syntax</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc3986</hyperlink>
+    </reference>
+    <reference id="RFC4122">
+      <name>RFC 4122</name>
+      <title>A Universally Unique IDentifier (UUID) URN Namespace</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4122</hyperlink>
+    </reference>
+    <reference id="RFC4291">
+      <name>RFC 4291</name>
+      <title>IP Version 6 Addressing Architecture</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4291</hyperlink>
+    </reference>
+    <reference id="RFC4632">
+      <name>RFC 4632</name>
+      <title>Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4632</hyperlink>
+    </reference>
+    <reference id="SOAP1.1">
+      <name>Simple Object Access Protocol (SOAP) 1.1</name>
+      <organization>W3C</organization>
+      <hyperlink>http://www.w3.org/TR/2000/NOTE-SOAP-20000508</hyperlink>
+    </reference>
+    <reference id="TR-069">
+      <name>TR-069</name>
+      <title>CPE WAN Management Protocol</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2004</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-069.pdf</hyperlink>
+    </reference>
+    <reference id="TR-069a1">
+      <name>TR-069 Amendment 1</name>
+      <title>CPE WAN Management Protocol</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2006</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-069_Amendment-1.pdf</hyperlink>
+    </reference>
+    <reference id="TR-069a2">
+      <name>TR-069 Amendment 2</name>
+      <title>CPE WAN Management Protocol</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2007</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-069_Amendment-2.pdf</hyperlink>
+    </reference>
+    <reference id="TR-069a4">
+      <name>TR-069 Amendment 4</name>
+      <title>CPE WAN Management Protocol</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2011</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-069_Amendment-4.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106">
+      <name>TR-106</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2005</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106a1">
+      <name>TR-106 Amendment 1</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2006</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106_Amendment-1.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106a2">
+      <name>TR-106 Amendment 2</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2008</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106_Amendment-2.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106a7">
+      <name>TR-106 Amendment 7</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2013</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106_Amendment-7.pdf</hyperlink>
+    </reference>
+    <reference id="TR-143">
+      <name>TR-143</name>
+      <title>Enabling Network Throughput Performance Tests and Statistical Monitoring</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2008</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-143.pdf</hyperlink>
+    </reference>
+    <reference id="ZigBee2007">
+      <name>ZigBee 2007 Specification</name>
+      <title>ZigBee 2007 Specification</title>
+      <organization>ZigBee Alliance</organization>
+      <date>October 2007</date>
+      <hyperlink>http://www.zigbee.org/Specifications/ZigBee/download.aspx</hyperlink>
+    </reference>
+  </bibliography>
+  <model name="Device:1.2">
+    <object name="Device." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        The top-level object for a Device.
+      </description>
+      <parameter name="DeviceSummary" access="readOnly" forcedInform="true" dmr:version="1.0">
+        <description>
+          See {{bibref|TR-106|section 3.7}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Services." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object contains general services information.
+      </description>
+    </object>
+    <object name="Device.Capabilities." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.2">
+      <description>
+        The capabilities of the device.  This is a constant read-only object, meaning that only a firmware upgrade will cause these values to be altered.
+      </description>
+    </object>
+    <object name="Device.Capabilities.PerformanceDiagnostic." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.2">
+      <description>
+        The capabilities of the Performance Diagnostics (''DownloadDiagnostics'' and ''UploadDiagnostics'') for the device.
+      </description>
+      <parameter name="DownloadTransports" access="readOnly" dmr:version="1.2">
+        <description>
+          Supported ''DownloadDiagnostics'' transport protocols for a CPE device.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="HTTP"/>
+            <enumeration value="FTP" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UploadTransports" access="readOnly" dmr:version="1.2">
+        <description>
+          Supported ''UploadDiagnostics'' transport protocols for a CPE device.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="HTTP"/>
+            <enumeration value="FTP" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object contains general device information.
+      </description>
+      <parameter name="Manufacturer" access="readOnly" dmr:version="1.0">
+        <description>
+          The manufacturer of the CPE (human readable string).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerOUI" access="readOnly" dmr:version="1.0">
+        <description>
+          Organizationally unique identifier of the device manufacturer.  Represented as a six hexadecimal-digit value using all upper-case letters and including any leading zeros.  The value MUST be a valid OUI as defined in {{bibref|OUI}}.
+          This value MUST remain fixed over the lifetime of the device, including across firmware updates.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="6"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModelName" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Model name of the CPE (human readable string).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          A full description of the CPE device (human readable string).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProductClass" access="readOnly" dmr:version="1.0">
+        <description>
+          Identifier of the class of product for which the serial number applies.  That is, for a given manufacturer, this parameter is used to identify the product or class of product over which the {{param|SerialNumber}} parameter is unique.
+          This value MUST remain fixed over the lifetime of the device, including across firmware updates.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="1.0">
+        <description>
+          Serial number of the CPE.
+          This value MUST remain fixed over the lifetime of the device, including across firmware updates.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="HardwareVersion" access="readOnly" forcedInform="true" dmr:version="1.0">
+        <description>
+          A string identifying the particular CPE model and version.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SoftwareVersion" access="readOnly" forcedInform="true" dmr:version="1.0">
+        <description>
+          A string identifying the software version currently installed in the CPE.
+          To allow version comparisons, this element SHOULD be in the form of dot-delimited integers, where each successive integer represents a more minor category of variation.  For example, ''3.0.21'' where the components mean: ''Major.Minor.Build''.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EnabledOptions" access="readOnly" dmr:version="1.0">
+        <description>
+          Comma-separated list of the OptionName of each Option that is currently enabled in the CPE.  The OptionName of each is identical to the OptionName element of the OptionStruct described in {{bibref|TR-069a2}}.  Only those options are listed whose State indicates the option is enabled.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalHardwareVersion" access="readOnly" dmr:version="1.0">
+        <description>
+          A comma-separated list of any additional versions.  Represents any additional hardware version information the vendor might wish to supply.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="64"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalSoftwareVersion" access="readOnly" dmr:version="1.0">
+        <description>
+          A comma-separated list of any additional versions.  Represents any additional software version information the vendor might wish to supply.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="64"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ProvisioningCode" access="readWrite" dmr:version="1.0">
+        <description>
+          Identifier of the primary service provider and other provisioning information, which MAY be used by the ACS to determine service provider-specific customization and provisioning parameters.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceStatus" access="readOnly" dmr:version="1.0">
+        <description>
+          Current operational status of the device.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Initializing"/>
+            <enumeration value="Error"/>
+            <enumeration value="Disabled"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UpTime" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Time in seconds since the CPE was last restarted.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FirstUseDate" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Date and time in UTC that the CPE first both successfully established an IP-layer network connection and acquired an absolute time reference using NTP or equivalent over that network connection.  The CPE MAY reset this date after a factory reset.
+          If NTP or equivalent is not available, this parameter, if present, SHOULD be set to the Unknown Time value.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceLog" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Vendor-specific log(s).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32768"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ManagementServer." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object contains parameters relating to the CPE's association with an ACS.
+      </description>
+      <parameter name="URL" access="readWrite" dmr:version="1.0">
+        <description>
+          URL, as defined in {{bibref|RFC3986}}, for the CPE to connect to the ACS using the CPE WAN Management Protocol. 
+          This parameter MUST be in the form of a valid HTTP or HTTPS URL.
+          The ''host'' portion of this URL is used by the CPE for validating the ACS certificate when using SSL or TLS.
+          Note that on a factory reset of the CPE, the value of this parameter might be reset to its factory value.  If an ACS modifies the value of this parameter, it SHOULD be prepared to accommodate the situation that the original value is restored as the result of a factory reset.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="1.0">
+        <description>
+          Username used to authenticate the CPE when making a connection to the ACS using the CPE WAN Management Protocol.
+          This username is used only for HTTP-based authentication of the CPE.
+          Note that on a factory reset of the CPE, the value of this parameter might be reset to its factory value.  If an ACS modifies the value of this parameter, it SHOULD be prepared to accommodate the situation that the original value is restored as the result of a factory reset.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="1.0">
+        <description>
+          Password used to authenticate the CPE when making a connection to the ACS using the CPE WAN Management Protocol.
+          This password is used only for HTTP-based authentication of the CPE.
+          When read, this parameter returns {{empty}}, regardless of the actual value.
+          Note that on a factory reset of the CPE, the value of this parameter might be reset to its factory value.  If an ACS modifies the value of this parameter, it SHOULD be prepared to accommodate the situation that the original value is restored as the result of a factory reset.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicInformEnable" access="readWrite" dmr:version="1.0">
+        <description>
+          Whether or not the CPE MUST periodically send CPE information to the ACS using the Inform method call.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicInformInterval" access="readWrite" dmr:version="1.0">
+        <description>
+          The duration in seconds of the interval for which the CPE MUST attempt to connect with the ACS and call the Inform method if {{param|PeriodicInformEnable}} is {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicInformTime" access="readWrite" dmr:version="1.0">
+        <description>
+          An absolute time reference in UTC to determine when the CPE will initiate the periodic Inform method calls.  Each Inform call MUST occur at this reference time plus or minus an integer multiple of the {{param|PeriodicInformInterval}}.
+          {{param}} is used only to set the ''phase'' of the periodic Informs.  The actual value of {{param}} can be arbitrarily far into the past or future.
+          For example, if {{param|PeriodicInformInterval}} is 86400 (a day) and if {{param}} is set to UTC midnight on some day (in the past, present, or future) then periodic Informs will occur every day at UTC midnight.  These MUST begin on the very next midnight, even if {{param}} refers to a day in the future.
+          The Unknown Time value defined in {{bibref|TR-106a2|section 3.2}} indicates that no particular time reference is specified.  That is, the CPE MAY locally choose the time reference, and needs only to adhere to the specified {{param|PeriodicInformInterval}}.
+          If absolute time is not available to the CPE, its periodic Inform behavior MUST be the same as if the {{param}} parameter was set to the Unknown Time value.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ParameterKey" access="readOnly" activeNotify="canDeny" forcedInform="true" dmr:version="1.0">
+        <description>
+          {{param}} provides the ACS a reliable and extensible means to track changes made by the ACS.  The value of {{param}} MUST be equal to the value of the ParameterKey argument from the most recent successful SetParameterValues, AddObject, or DeleteObject method call from the ACS.
+          The CPE MUST set {{param}} to the value specified in the corresponding method arguments if and only if the method completes successfully and no fault response is generated.  If a method call does not complete successfully (implying that the changes requested in the method did not take effect), the value of {{param}} MUST NOT be modified.
+          The CPE MUST only modify the value of {{param}} as a result of SetParameterValues, AddObject, DeleteObject, or due to a factory reset.  On factory reset, the value of {{param}} MUST be set to {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionRequestURL" access="readOnly" forcedInform="true" dmr:version="1.0">
+        <description>
+          HTTP URL, as defined in {{bibref|RFC3986}}, for an ACS to make a Connection Request notification to the CPE.
+          In the form:
+          : http://host:port/path
+          The ''host'' portion of the URL MAY be the IP address for the management interface of the CPE in lieu of a host name.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionRequestUsername" access="readWrite" dmr:version="1.0">
+        <description>
+          Username used to authenticate an ACS making a Connection Request to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionRequestPassword" access="readWrite" dmr:version="1.0">
+        <description>
+          Password used to authenticate an ACS making a Connection Request to the CPE.
+          When read, this parameter returns {{empty}}, regardless of the actual value.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UpgradesManaged" access="readWrite" dmr:version="1.0">
+        <description>
+          Indicates whether or not the ACS will manage upgrades for the CPE.  If {{true}}, the CPE SHOULD NOT use other means other than the ACS to seek out available upgrades.  If {{false}}, the CPE MAY use other means for this purpose.
+          Note that an autonomous upgrade (reported via an "10 AUTONOMOUS TRANSFER COMPLETE" Inform Event code) SHOULD be regarded as a managed upgrade if it is performed according to ACS-specified policy.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="KickURL" access="readOnly" dmr:version="1.0">
+        <description>
+          Present only for a CPE that supports the Kicked RPC method.
+          LAN-accessible URL, as defined in {{bibref|RFC3986}}, from which the CPE can be ''kicked'' to initiate the Kicked RPC method call.  MUST be an absolute URL including a host name or IP address as would be used on the LAN side of the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DownloadProgressURL" access="readOnly" dmr:version="1.0">
+        <description>
+          Present only for a CPE that provides a LAN-side web page to show progress during a file download.
+          LAN-accessible URL, as defined in {{bibref|RFC3986}}, to which a web-server associated with the ACS MAY redirect a user's browser on initiation of a file download to observer the status of the download.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UDPConnectionRequestAddress" access="readOnly" dmr:version="1.1">
+        <description>
+          Address and port to which an ACS MAY send a UDP Connection Request to the CPE (see {{bibref|TR-069a2|Annex G}}).
+          This parameter is represented in the form of an Authority element as defined in {{bibref|RFC3986}}.  The value MUST be in one of the following two forms:
+          : host:port
+          : host
+          * When {{param|STUNEnable}} is {{true}}, the ''host'' and ''port'' portions of this parameter MUST represent the public address and port corresponding to the NAT binding through which the ACS can send UDP Connection Request messages (once this information is learned by the CPE through the use of STUN).
+          * When {{param|STUNEnable}} is {{false}}, the ''host'' and ''port'' portions of the URL MUST represent the local IP address and port on which the CPE is listening for UDP Connection Request messages.
+          The second form of this parameter MAY be used only if the port value is equal to ''80''.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UDPConnectionRequestAddressNotificationLimit" access="readWrite" dmr:version="1.1">
+        <description>
+          The minimum time, in seconds, between Active Notifications resulting from changes to the {{param|UDPConnectionRequestAddress}} (if Active Notification is enabled).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="STUNEnable" access="readWrite" dmr:version="1.1">
+        <description>
+          Enables or disables the use of STUN by the CPE.  This applies only to the use of STUN in association with the ACS to allow UDP Connection Requests.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="STUNServerAddress" access="readWrite" dmr:version="1.1">
+        <description>
+          Host name or IP address of the STUN server for the CPE to send Binding Requests if STUN is enabled via {{param|STUNEnable}}.
+          If is {{empty}} and {{param|STUNEnable}} is {{true}}, the CPE MUST use the address of the ACS extracted from the host portion of the ACS URL.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="STUNServerPort" access="readWrite" dmr:version="1.1">
+        <description>
+          Port number of the STUN server for the CPE to send Binding Requests if STUN is enabled via {{param|STUNEnable}}.
+          By default, this SHOULD be the equal to the default STUN port, 3478.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="STUNUsername" access="readWrite" dmr:version="1.1">
+        <description>
+          If is not {{empty}}, the value of the STUN USERNAME attribute to be used in Binding Requests (only if message integrity has been requested by the STUN server).
+          If is {{empty}}, the CPE MUST NOT send STUN Binding Requests with message integrity.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="STUNPassword" access="readWrite" dmr:version="1.1">
+        <description>
+          The value of the STUN Password to be used in computing the MESSAGE-INTEGRITY attribute to be used in Binding Requests (only if message integrity has been requested by the STUN server).
+          When read, this parameter returns {{empty}}, regardless of the actual value.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="STUNMaximumKeepAlivePeriod" access="readWrite" dmr:version="1.1">
+        <description>
+          If STUN Is enabled, the maximum period, in seconds, that STUN Binding Requests MUST be sent by the CPE for the purpose of maintaining the binding in the Gateway.  This applies specifically to Binding Requests sent from the UDP Connection Request address and port.
+          A value of -1 indicates that no maximum period is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="STUNMinimumKeepAlivePeriod" access="readWrite" dmr:version="1.1">
+        <description>
+          If STUN Is enabled, the minimum period, in seconds, that STUN Binding Requests can be sent by the CPE for the purpose of maintaining the binding in the Gateway.  This limit applies only to Binding Requests sent from the UDP Connection Request address and port, and only those that do not contain the BINDING-CHANGE attribute.  This limit does not apply to retransmissions following the procedures defined in {{bibref|RFC3489}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="NATDetected" access="readOnly" dmr:version="1.1">
+        <description>
+          When STUN is enabled, this parameter indicates whether or not the CPE has detected address and/or port mapping in use.
+          A {{true}} value indicates that the received MAPPED-ADDRESS in the most recent Binding Response differs from the CPE's source address and port.
+          When {{param|STUNEnable}} is {{false}}, this value MUST be {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.GatewayInfo." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object contains information associated with a connected Internet Gateway Device.
+      </description>
+      <parameter name="ManufacturerOUI" access="readOnly" dmr:version="1.0">
+        <description>
+          Organizationally unique identifier of the associated Internet Gateway Device.  {{empty}} indicates that there is no associated Internet Gateway Device that has been detected.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="6"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProductClass" access="readOnly" dmr:version="1.0">
+        <description>
+          Identifier of the product class of the associated Internet Gateway Device.  {{empty}} indicates either that there is no associated Internet Gateway Device that has been detected, or the Internet Gateway Device does not support the use of the product-class parameter.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="1.0">
+        <description>
+          Serial number of the associated Internet Gateway Device.  {{empty}} indicates that there is no associated Internet Gateway Device that has been detected.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Config." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object contains general configuration parameters.
+      </description>
+      <parameter name="PersistentData" access="readWrite" dmr:version="1.0">
+        <description>
+          Arbitrary user data that MUST persist across CPE reboots.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConfigFile" access="readWrite" dmr:version="1.0">
+        <description>
+          A dump of the currently running configuration on the CPE.  This parameter enables the ability to backup and restore the last known good state of the CPE.  It returns a vendor-specific document that defines the state of the CPE.  The document MUST be capable of restoring the CPE's state when written back to the CPE using SetParameterValues.
+          An alternative to this parameter, e.g. when the configuration file is larger than the parameter size limit, is to use the Upload and Download RPCs with a FileType of ''1 Vendor Configuration File''.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32768"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Time." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object contains parameters relating an NTP or SNTP time client in the CPE.
+      </description>
+      <parameter name="NTPServer1" access="readWrite" dmr:version="1.0">
+        <description>
+          First NTP timeserver.  Either a host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NTPServer2" access="readWrite" dmr:version="1.0">
+        <description>
+          Second NTP timeserver.  Either a host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NTPServer3" access="readWrite" dmr:version="1.0">
+        <description>
+          Third NTP timeserver.  Either a host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NTPServer4" access="readWrite" dmr:version="1.0">
+        <description>
+          Fourth NTP timeserver.  Either a host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NTPServer5" access="readWrite" dmr:version="1.0">
+        <description>
+          Fifth NTP timeserver.  Either a host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentLocalTime" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          The current date and time in the CPE's local time zone.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LocalTimeZone" access="readWrite" dmr:version="1.0">
+        <description>
+          The local time zone definition, encoded according to IEEE 1003.1 (POSIX).  The following is an example value:
+          : EST+5 EDT,M4.1.0/2,M10.5.0/2
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UserInterface." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object contains parameters relating to the user interface of the CPE.
+      </description>
+      <parameter name="PasswordRequired" access="readWrite" dmr:version="1.0">
+        <description>
+          Present only if the CPE provides a password-protected LAN-side user interface.
+          Indicates whether or not the local user interface MUST require a password to be chosen by the user.  If {{false}}, the choice of whether or not a password is used is left to the user.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PasswordUserSelectable" access="readWrite" dmr:version="1.0">
+        <description>
+          Present only if the CPE provides a password-protected LAN-side user interface and supports LAN-side Auto-Configuration.
+          Indicates whether or not a password to protect the local user interface of the CPE MAY be selected by the user directly, or MUST be equal to the password used by the LAN-side Auto-Configuration protocol.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UpgradeAvailable" access="readWrite" dmr:version="1.0">
+        <description>
+          Indicates that a CPE upgrade is available, allowing the CPE to display this information to the user.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="WarrantyDate" access="readWrite" dmr:version="1.0">
+        <description>
+          Indicates the date and time in UTC that the warranty associated with the CPE is to expire.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ISPName" access="readWrite" dmr:version="1.0">
+        <description>
+          The name of the customer's ISP.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ISPHelpDesk" access="readWrite" dmr:version="1.0">
+        <description>
+          The help desk phone number of the ISP.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ISPHomePage" access="readWrite" dmr:version="1.0">
+        <description>
+          The URL of the ISP's home page.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ISPHelpPage" access="readWrite" dmr:version="1.0">
+        <description>
+          The URL of the ISP's on-line support page.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ISPLogo" access="readWrite" dmr:version="1.0">
+        <description>
+          Base64 encoded GIF or JPEG image. The binary image is constrained to 4095 bytes or less.
+        </description>
+        <syntax>
+          <base64>
+            <size minLength="0" maxLength="4095"/>
+          </base64>
+        </syntax>
+      </parameter>
+      <parameter name="ISPLogoSize" access="readWrite" dmr:version="1.0">
+        <description>
+          Un-encoded binary image size in bytes.
+          If ISPLogoSize input value is 0 then the ISPLogo is cleared.
+          ISPLogoSize can also be used as a check to verify correct transfer and conversion of Base64 string to image size.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="4095"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ISPMailServer" access="readWrite" dmr:version="1.0">
+        <description>
+          The URL of the ISP's mail server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ISPNewsServer" access="readWrite" dmr:version="1.0">
+        <description>
+          The URL of the ISP's news server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TextColor" access="readWrite" dmr:version="1.0">
+        <description>
+          The color of text on the GUI screens in RGB hexidecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="6"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BackgroundColor" access="readWrite" dmr:version="1.0">
+        <description>
+          The color of the GUI screen backgrounds in RGB hexidecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="6"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ButtonColor" access="readWrite" dmr:version="1.0">
+        <description>
+          The color of buttons on the GUI screens in RGB hexidecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="6"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ButtonTextColor" access="readWrite" dmr:version="1.0">
+        <description>
+          The color of text on buttons on the GUI screens in RGB hexidecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="6"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AutoUpdateServer" access="readWrite" dmr:version="1.0">
+        <description>
+          The server the CPE can check to see if an update is available for direct download to it.  This MUST NOT be used by the CPE if the {{param|.ManagementServer.UpgradesManaged}} parameter is {{true}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UserUpdateServer" access="readWrite" dmr:version="1.0">
+        <description>
+          The server where a user can check via a web browser if an update is available for download to a PC.  This MUST NOT be used by the CPE if the {{param|.ManagementServer.UpgradesManaged}} parameter is {{true}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AvailableLanguages" access="readOnly" dmr:version="1.0">
+        <description>
+          Comma-separated list of user-interface languages that are available, where each language is specified according to RFC 3066 {{bibref|RFC3066}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentLanguage" access="readWrite" dmr:version="1.0">
+        <description>
+          Current user-interface language, specified according to RFC 3066 {{bibref|RFC3066}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="16"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LAN." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object contains parameters relating to IP-based LAN connectivity of a device.
+        This object relates only to IP-layer LAN capabilities.  Lower-layer aspects of LAN connectivity are not considered part of the common data model defined in this specification.
+        For a device that contains multiple IP interfaces, the scope of this object is limited to the default IP interface.  Data that might be associated with other interfaces is not considered part of the common data model defined in this specification.
+      </description>
+      <parameter name="AddressingType" access="readWrite" dmr:version="1.0">
+        <description>
+          The method used to assign an address to this interface.  {{enum}}
+          The ability to modify this parameter is OPTIONAL.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCP"/>
+            <enumeration value="Static"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddress" access="readWrite" forcedInform="true" dmr:version="1.0">
+        <description>
+          The current IP address assigned to this interface.
+          The ability to modify this parameter is OPTIONAL, and this parameter cannot be modified if the {{param|AddressingType}} is {{enum|DHCP|AddressingType}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="SubnetMask" access="readWrite" dmr:version="1.0">
+        <description>
+          The current subnet mask.
+          The ability to modify this parameter is OPTIONAL, and this parameter cannot be modified if the {{param|AddressingType}} is {{enum|DHCP|AddressingType}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultGateway" access="readWrite" dmr:version="1.0">
+        <description>
+          The IP address of the current default gateway for this interface.
+          The ability to modify this parameter is OPTIONAL, and this parameter cannot be modified if the {{param|AddressingType}} is {{enum|DHCP|AddressingType}}.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="DNSServers" access="readWrite" dmr:version="1.0">
+        <description>
+          Comma-separated list of IP address of the DNS servers for this interface.
+          The ability to modify this parameter is OPTIONAL, and this parameter cannot be modified if the {{param|AddressingType}} is {{enum|DHCP|AddressingType}}.
+          If this parameter is modifiable, the device MAY ignore any DNS servers beyond the first two in the list.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readWrite" dmr:version="1.0">
+        <description>
+          The physical address of this interface.  Writable only if {{param|MACAddressOverride}} is present and equal to {{true}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddressOverride" access="readWrite" dmr:version="1.0">
+        <description>
+          Whether the value of MACAddress parameter can be overridden.
+          * When {{true}}, {{param|MACAddress}} is writable.
+          * When {{false}}, {{param|MACAddress}} is not writable, and the default MAC address assigned by the device SHOULD be restored.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="DHCPOptionNumberOfEntries" access="readOnly" dmr:version="1.0">
+        <description>
+          Number of entries in the DHCP option table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LAN.DHCPOption.{i}." access="readWrite" numEntriesParameter="DHCPOptionNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        This object is for configuration of DHCP options.  Each instance of this object represents a DHCP option to be included by the DHCP client in client requests.  The DHCP client MAY include any other options not specified in this table.
+      </description>
+      <parameter name="Request" access="readWrite" dmr:version="1.0">
+        <description>
+          Whether this entry represents a request to the DHCP server, or a value to be sent by the DHCP client.
+          * When {{true}}, this entry represents a request.  In this case, the DHCP client MUST include the specified {{param|Tag}} in the Parameter Request List, as defined in RFC 2132.  The {{param|Value}} parameter is ignored in this case.
+          * When {{false}}, this entry represents a value to be sent by the DHCP client.  In this case, the DHCP client MUST include a DHCP option formed from the {{param|Tag}} and {{param|Value}} parameters (with the Length derived from the length of the {{param|Value}} parameter).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Tag" access="readWrite" dmr:version="1.0">
+        <description>
+          Tag of the DHCP option as defined in RFC 2132.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="254"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="1.0">
+        <description>
+          Base64 encoded octet string to be used as the Value of the DHCP option if {{param|Request}} is {{false}}.
+        </description>
+        <syntax>
+          <base64>
+            <size maxLength="255"/>
+          </base64>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LAN.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object contains statistics for the default IP interface.
+      </description>
+      <parameter name="ConnectionUpTime" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          The time in seconds that this IP interface has been connected.
+          * If the IP interface is using DHCP, this is the time that the DHCP client has been only in the Bound or Renewing states and the lower-layer interface has continuously maintained a link.
+          * If the IP interface is using static addressing, this is the time that the lower-layer interface has continuously maintained a link.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesSent" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of IP payload bytes sent over this interface since the device was last restarted as specified in {{param|.DeviceInfo.UpTime}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of IP payload bytes received over this interface since the device was last restarted as specified in {{param|.DeviceInfo.UpTime}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of IP packets sent over this interface since the device was last restarted as specified in {{param|.DeviceInfo.UpTime}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of IP packets received over this interface since the device was last restarted as specified in {{param|.DeviceInfo.UpTime}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentDayInterval" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Number of seconds since the beginning of the period used for collection of CurrentDay statistics.
+          The device MAY align the beginning of each CurrentDay interval with days in the UTC time zone, but does not need to do so.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentDayBytesSent" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of IP payload bytes sent over this interface since the beginning of the current-day interval as specified by {{param|CurrentDayInterval}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentDayBytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of IP payload bytes received over this interface since the beginning of the current-day interval as specified by {{param|CurrentDayInterval}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentDayPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of IP packets sent over this interface since the beginning of the current-day interval as specified by {{param|CurrentDayInterval}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentDayPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of IP packets received over this interface since the beginning of the current-day interval as specified by {{param|CurrentDayInterval}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QuarterHourInterval" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Number of seconds since the beginning of the period used for collection of QuarterHour statistics.
+          The device MAY align the beginning of each QuarterHour interval with real-time quarter-hour intervals, but does not need to do so.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QuarterHourBytesSent" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of IP payload bytes sent over this interface since the beginning of the quarter-hour interval as specified by {{param|QuarterHourInterval}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QuarterHourBytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of IP payload bytes received over this interface since the beginning of the quarter-hour interval as specified by {{param|QuarterHourInterval}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QuarterHourPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of IP packets sent over this interface since the beginning of the quarter-hour interval as specified by {{param|QuarterHourInterval}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QuarterHourPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Total number of IP packets received over this interface since the beginning of the quarter-hour interval as specified by {{param|QuarterHourInterval}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LAN.IPPingDiagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object defines access to an IP-layer ping test for the default IP interface.
+      </description>
+      <parameter name="DiagnosticsState" access="readWrite" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Indicates availability of diagnostic data.  {{enum}}
+          If the ACS sets the value of this parameter to {{enum|Requested}}, the CPE MUST initiate the corresponding diagnostic test.  When writing, the only allowed value is {{enum|Requested}}.  To ensure the use of the proper test parameters (the writable parameters in this object), the test parameters MUST be set either prior to or at the same time as (in the same SetParameterValues) setting the {{param}} to {{enum|Requested}}.
+          When requested, the CPE SHOULD wait until after completion of the communication session with the ACS before starting the diagnostic.
+          When the test is completed, the value of this parameter MUST be either {{enum|Complete}} (if the test completed successfully), or one of the ''Error'' values listed above.
+          If the value of this parameter is anything other than {{enum|Complete}}, the values of the results parameters for this test are indeterminate.
+          When the diagnostic initiated by the ACS is completed (successfully or not), the CPE MUST establish a new connection to the ACS to allow the ACS to view the results, indicating the Event code ''8 DIAGNOSTICS COMPLETE'' in the Inform message.
+          After the diagnostic is complete, the value of all result parameters (all read-only parameters in this object) MUST be retained by the CPE until either this diagnostic is run again, or the CPE reboots.  After a reboot, if the CPE has not retained the result parameters from the most recent test, it MUST set the value of this parameter to {{enum|None}}.
+          Modifying any of the writable parameters in this object except for this one MUST result in the value of this parameter being set to {{enum|None}}.
+          While the test is in progress, modifying any of the writable parameters in this object except for this one MUST result in the test being terminated and the value of this parameter being set to {{enum|None}}.
+          While the test is in progress, setting this parameter to {{enum|Requested}} (and possibly modifying other writable parameters in this object) MUST result in the test being terminated and then restarted using the current values of the test parameters.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Complete"/>
+            <enumeration value="Error_CannotResolveHostName"/>
+            <enumeration value="Error_Internal"/>
+            <enumeration value="Error_Other"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readWrite" dmr:version="1.0">
+        <description>
+          Host name or address of the host to ping.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfRepetitions" access="readWrite" dmr:version="1.0">
+        <description>
+          Number of repetitions of the ping test to perform before reporting the results.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Timeout" access="readWrite" dmr:version="1.0">
+        <description>
+          Timeout in milliseconds for the ping test.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DataBlockSize" access="readWrite" dmr:version="1.0">
+        <description>
+          Size of the data block in bytes to be sent for each ping.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DSCP" access="readWrite" dmr:version="1.0">
+        <description>
+          DiffServ codepoint to be used for the test packets.  By default the CPE SHOULD set this value to zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="63"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessCount" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Result parameter indicating the number of successful pings (those in which a successful response was received prior to the timeout) in the most recent ping test.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FailureCount" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Result parameter indicating the number of failed pings in the most recent ping test.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AverageResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Result parameter indicating the average response time in milliseconds over all repetitions with successful responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MinimumResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Result parameter indicating the minimum response time in milliseconds over all repetitions with successful responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Result parameter indicating the maximum response time in milliseconds over all repetitions with successful responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LAN.TraceRouteDiagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.0">
+      <description>
+        This object is defines access to an IP-layer trace-route test for the default IP interface.
+      </description>
+      <parameter name="DiagnosticsState" access="readWrite" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Indicates availability of diagnostic data.  {{enum}}
+          If the ACS sets the value of this parameter to {{enum|Requested}}, the CPE MUST initiate the corresponding diagnostic test.  When writing, the only allowed value is {{enum|Requested}}.  To ensure the use of the proper test parameters (the writable parameters in this object), the test parameters MUST be set either prior to or at the same time as (in the same SetParameterValues) setting the {{param}} to {{enum|Requested}}.
+          When requested, the CPE SHOULD wait until after completion of the communication session with the ACS before starting the diagnostic.
+          When the test is completed, the value of this parameter MUST be either {{enum|Complete}} (if the test completed successfully), or one of the ''Error'' values listed above.
+          If the value of this parameter is anything other than {{enum|Complete}}, the values of the results parameters for this test are indeterminate.
+          When the diagnostic initiated by the ACS is completed (successfully or not), the CPE MUST establish a new connection to the ACS to allow the ACS to view the results, indicating the Event code ''8 DIAGNOSTICS COMPLETE'' in the Inform message.
+          After the diagnostic is complete, the value of all result parameters (all read-only parameters in this object) MUST be retained by the CPE until either this diagnostic is run again, or the CPE reboots.  After a reboot, if the CPE has not retained the result parameters from the most recent test, it MUST set the value of this parameter to {{enum|None}}.
+          Modifying any of the writable parameters in this object except for this one MUST result in the value of this parameter being set to {{enum|None}}.
+          While the test is in progress, modifying any of the writable parameters in this object except for this one MUST result in the test being terminated and the value of this parameter being set to {{enum|None}}.
+          While the test is in progress, setting this parameter to {{enum|Requested}} (and possibly modifying other writable parameters in this object) MUST result in the test being terminated and then restarted using the current values of the test parameters.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Complete"/>
+            <enumeration value="Error_CannotResolveHostName"/>
+            <enumeration value="Error_MaxHopCountExceeded"/>
+            <enumeration value="Error_Internal"/>
+            <enumeration value="Error_Other"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readWrite" dmr:version="1.0">
+        <description>
+          Host name or address of the host to find a route to.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Timeout" access="readWrite" dmr:version="1.0">
+        <description>
+          Timeout in milliseconds for the trace route test.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DataBlockSize" access="readWrite" dmr:version="1.0">
+        <description>
+          Size of the data block in bytes to be sent for each trace route.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxHopCount" access="readWrite" dmr:version="1.0">
+        <description>
+          The maximum number of hop used in outgoing probe packets (max TTL).  The default is 30 hops.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="64"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DSCP" access="readWrite" dmr:version="1.0">
+        <description>
+          DiffServ codepoint to be used for the test packets.  By default the CPE SHOULD set this value to zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="63"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Result parameter indicating the response time in milliseconds the most recent trace route test.  If a route could not be determined, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfRouteHops" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Result parameter indicating the number of hops within the discovered route.  If a route could not be determined, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LAN.TraceRouteDiagnostics.RouteHops.{i}." access="readOnly" numEntriesParameter="NumberOfRouteHops" minEntries="0" maxEntries="unbounded" dmr:version="1.0">
+      <description>
+        Result parameter indicating the components of the discovered route.  If a route could not be determined, there will be no instances of this object.
+      </description>
+      <parameter name="HopHost" access="readOnly" activeNotify="canDeny" dmr:version="1.0">
+        <description>
+          Result parameter indicating the Host Name or IP Address of a hop along the discovered route.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DownloadDiagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.2">
+      <description>
+        This object 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>
+      <parameter name="DiagnosticsState" access="readWrite" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          Indicate the availability of diagnostic data.  {{enum}}
+          If the ACS sets the value of this parameter to {{enum|Requested}}, the CPE MUST initiate the corresponding diagnostic test.  When writing, the only allowed value is {{enum|Requested}}.  To ensure the use of the proper test parameters (the writable parameters in this object), the test parameters MUST be set either prior to or at the same time as (in the same SetParameterValues) setting the {{param}} to {{enum|Requested}}.
+          When requested, the CPE SHOULD wait until after completion of the communication session with the ACS before starting the diagnostic.
+          When the test is completed, the value of this parameter MUST be either {{enum|Completed}} (if the test completed successfully), or one of the ''Error'' values listed above.
+          If the value of this parameter is anything other than {{enum|Completed}}, the values of the results parameters for this test are indeterminate.
+          When the diagnostic initiated by the ACS is completed (successfully or not), the CPE MUST establish a new connection to the ACS to allow the ACS to view the results, indicating the Event code ''8 DIAGNOSTICS COMPLETE'' in the Inform message.
+          After the diagnostic is complete, the value of all result parameters (all read-only parameters in this object) MUST be retained by the CPE until either this diagnostic is run again, or the CPE reboots.  After a reboot, if the CPE has not retained the result parameters from the most recent test, it MUST set the value of this parameter to {{enum|None}}.
+          Modifying any of the writable parameters in this object except for this one MUST result in the value of this parameter being set to {{enum|None}}.
+          While the test is in progress, modifying any of the writable parameters in this object except for this one MUST result in the test being terminated and the value of this parameter being set to {{enum|None}}.
+          While the test is in progress, setting this parameter to Requested (and possibly modifying other writable parameters in this object) MUST result in the test being terminated and then restarted using the current values of the test parameters.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Completed" access="readOnly"/>
+            <enumeration value="Error_InitConnectionFailed" access="readOnly"/>
+            <enumeration value="Error_NoResponse" access="readOnly"/>
+            <enumeration value="Error_TransferFailed" access="readOnly"/>
+            <enumeration value="Error_PasswordRequestFailed" access="readOnly"/>
+            <enumeration value="Error_LoginFailed" access="readOnly"/>
+            <enumeration value="Error_NoTransferMode" access="readOnly"/>
+            <enumeration value="Error_NoPASV" access="readOnly"/>
+            <enumeration value="Error_IncorrectSize" access="readOnly"/>
+            <enumeration value="Error_Timeout" access="readOnly"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="1.2">
+        <description>
+          {{reference|the IP-layer interface over which the test is to be performed}}
+          The value of this parameter MUST be either a valid interface or {{empty}}.  An attempt to set this parameter to a different value MUST be rejected as an invalid parameter value.
+          If {{empty}} is specified, the CPE MUST use the default routing interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DownloadURL" access="readWrite" dmr:version="1.2">
+        <description>
+          The URL, as defined in {{bibref|RFC3986}}, for the CPE to perform the download on. This parameter MUST be in the form of a valid HTTP {{bibref|RFC2616}} or FTP {{bibref|RFC959}} URL.
+          * When using FTP transport, FTP binary transfer MUST be used.
+          * When using HTTP transport, persistent connections MUST be used and pipelining MUST NOT be used.
+          * When using HTTP transport the HTTP Authentication MUST NOT be used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DSCP" access="readWrite" dmr:version="1.2">
+        <description>
+          The DiffServ code point for marking packets transmitted in the test. 
+          The default value SHOULD be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="63"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriority" access="readWrite" dmr:version="1.2">
+        <description>
+          Ethernet priority code for marking packets transmitted in the test (if applicable). 
+          The default value SHOULD be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ROMTime" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          Request time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456
+          * For HTTP this is the time at which the client sends the GET command.
+          * For FTP this is the time at which the client sends the RTRV command.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="BOMTime" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          Begin of transmission time in UTC, which MUST be specified to microsecond precision
+          For example: 2008-04-09T15:01:05.123456
+          * For HTTP this is the time at which the first data packet is received.
+          * For FTP this is the time at which the client receives the first data packet on the data connection.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EOMTime" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          End of transmission in UTC, which MUST be specified to microsecond precision. 
+          For example: 2008-04-09T15:01:05.123456
+          * For HTTP this is the time at which the last data packet is received.
+          * For FTP this is the time at which the client receives the last packet on the data connection.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TestBytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          The test traffic received in bytes during the FTP/HTTP transaction including FTP/HTTP headers, between {{param|BOMTime}} and {{param|EOMTime}},
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          The total number of bytes received on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TCPOpenRequestTime" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          Request time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456
+          * For HTTP this is the time at which the TCP socket open (SYN) was sent for the HTTP connection.
+          * For FTP this is the time at which the TCP socket open (SYN) was sent for the data connection.
+          Note: Interval of 1 microsecond SHOULD be supported.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TCPOpenResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          Response time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456
+          * For HTTP this is the time at which the TCP ACK to the socket opening the HTTP connection was received.
+          * For FTP this is the time at which the TCP ACK to the socket opening the data connection was received.
+          Note: Interval of 1 microsecond SHOULD be supported.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UploadDiagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.2">
+      <description>
+        This object 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>
+      <parameter name="DiagnosticsState" access="readWrite" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          Indicate the availability of diagnostic data.  {{enum}}
+          If the ACS sets the value of this parameter to {{enum|Requested}}, the CPE MUST initiate the corresponding diagnostic test.  When writing, the only allowed value is {{enum|Requested}}.  To ensure the use of the proper test parameters (the writable parameters in this object), the test parameters MUST be set either prior to or at the same time as (in the same SetParameterValues) setting the {{param}} to {{enum|Requested}}.
+          When requested, the CPE SHOULD wait until after completion of the communication session with the ACS before starting the diagnostic.
+          When the test is completed, the value of this parameter MUST be either {{enum|Completed}} (if the test completed successfully), or one of the ''Error'' values listed above.
+          If the value of this parameter is anything other than {{enum|Completed}}, the values of the results parameters for this test are indeterminate.
+          When the diagnostic initiated by the ACS is completed (successfully or not), the CPE MUST establish a new connection to the ACS to allow the ACS to view the results, indicating the Event code ''8 DIAGNOSTICS COMPLETE'' in the Inform message.
+          After the diagnostic is complete, the value of all result parameters (all read-only parameters in this object) MUST be retained by the CPE until either this diagnostic is run again, or the CPE reboots.  After a reboot, if the CPE has not retained the result parameters from the most recent test, it MUST set the value of this parameter to {{enum|None}}.
+          Modifying any of the writable parameters in this object except for this one MUST result in the value of this parameter being set to {{enum|None}}.
+          While the test is in progress, modifying any of the writable parameters in this object except for this one MUST result in the test being terminated and the value of this parameter being set to {{enum|None}}.
+          While the test is in progress, setting this parameter to {{enum|Requested}} (and possibly modifying other writable parameters in this object) MUST result in the test being terminated and then restarted using the current values of the test parameters.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Completed" access="readOnly"/>
+            <enumeration value="Error_InitConnectionFailed" access="readOnly"/>
+            <enumeration value="Error_NoResponse" access="readOnly"/>
+            <enumeration value="Error_PasswordRequestFailed" access="readOnly"/>
+            <enumeration value="Error_LoginFailed" access="readOnly"/>
+            <enumeration value="Error_NoTransferMode" access="readOnly"/>
+            <enumeration value="Error_NoPASV" access="readOnly"/>
+            <enumeration value="Error_NoCWD" access="readOnly"/>
+            <enumeration value="Error_NoSTOR" access="readOnly"/>
+            <enumeration value="Error_NoTransferComplete" access="readOnly"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="1.2">
+        <description>
+          {{reference|the IP-layer interface over which the test is to be performed}}
+          The value of this parameter MUST be either a valid interface or an empty string.  An attempt to set this parameter to a different value MUST be rejected as an invalid parameter value.
+          If {{empty}} is specified, the CPE MUST use the default routing interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UploadURL" access="readWrite" dmr:version="1.2">
+        <description>
+          The URL, as defined in {{bibref|RFC3986}}, for the CPE to Upload to. This parameter MUST be in the form of a valid HTTP {{bibref|RFC2616}} or FTP {{bibref|RFC959}} URL.
+          * When using FTP transport, FTP binary transfer MUST be used.
+          * When using HTTP transport, persistent connections MUST be used and pipelining MUST NOT be used.
+          * When using HTTP transport the HTTP Authentication MUST NOT be used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DSCP" access="readWrite" dmr:version="1.2">
+        <description>
+          DiffServ code point for marking packets transmitted in the test. 
+          The default value SHOULD be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="63"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriority" access="readWrite" dmr:version="1.2">
+        <description>
+          Ethernet priority code for marking packets transmitted in the test (if applicable).
+          The default value SHOULD be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TestFileLength" access="readWrite" dmr:version="1.2">
+        <description>
+          The size of the file (in bytes) to be uploaded to the server.
+          The CPE MUST insure the appropriate number of bytes are sent.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ROMTime" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          Request time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456
+          * For HTTP this is the time at which the client sends the PUT command
+          * For FTP this is the time at which the STOR command is sent.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="BOMTime" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          Begin of transmission time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456
+          * For HTTP this is the time at which the first data packet is sent.
+          * For FTP this is the time at which the client receives the ready for transfer notification.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EOMTime" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          End of transmission in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456
+          * For HTTP this is the time when the HTTP successful response code is received.
+          * For FTP this is the time when the client receives a transfer complete.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesSent" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          The total number of bytes sent on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TCPOpenRequestTime" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          Request time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456
+          * For HTTP this is the time at which the TCP socket open (SYN) was sent for the HTTP connection.
+          * For FTP this is the time at which the TCP socket open (SYN) was sent for the data connection
+          Note: Interval of 1 microsecond SHOULD be supported.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TCPOpenResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          Response time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456
+          * For HTTP this is the Time at which the TCP ACK to the socket opening the HTTP connection was received.
+          * For FTP this is  the Time at which the TCP ACK to the socket opening the Data connection was received.
+          Note: Interval of 1 microsecond SHOULD be supported.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UDPEchoConfig." access="readOnly" minEntries="1" maxEntries="1" dmr:version="1.2">
+      <description>
+        This object allows the CPE to be configured to perform the UDP Echo Service defined in {{bibref|RFC862}} and UDP Echo Plus Service defined in {{bibref|TR-143|Appendix A.1}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="1.2">
+        <description>
+          MUST be enabled to receive UDP echo. When enabled from a disabled state all related timestamps, statistics and UDP Echo Plus counters are cleared.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="1.2">
+        <description>
+          {{reference|IP-layer interface over which the CPE MUST listen and receive UDP echo requests on}}
+          The value of this parameter MUST be either a valid interface or {{empty}}.  An attempt to set this parameter to a different value MUST be rejected as an invalid parameter value.
+          If {{empty}} is specified, the CPE MUST listen and receive UDP echo requests on all interfaces.
+          Note: Interfaces behind a NAT MAY require port forwarding rules configured in the Gateway to enable receiving the UDP packets.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIPAddress" access="readWrite" dmr:version="1.2">
+        <description>
+          The Source IP address of the UDP echo packet. The CPE MUST only respond to a UDP echo from this source IP address.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="UDPPort" access="readWrite" dmr:version="1.2">
+        <description>
+          The UDP port on which the UDP server MUST listen and respond to UDP echo requests.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="EchoPlusEnabled" access="readWrite" dmr:version="1.2">
+        <description>
+          If {{true}} the CPE will perform necessary packet processing for UDP Echo Plus packets.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EchoPlusSupported" access="readOnly" dmr:version="1.2">
+        <description>
+          {{true}} if UDP Echo Plus is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          Incremented upon each valid UDP echo packet received.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsResponded" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          Incremented for each UDP echo response sent.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          The number of UDP received bytes including payload and UDP header after the UDPEchoConfig is enabled.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesResponded" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          The number of UDP responded bytes, including payload and UDP header sent after the UDPEchoConfig is enabled.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TimeFirstPacketReceived" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          Time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456, 
+          The time that the server receives the first UDP echo packet after the UDPEchoConfig is enabled.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TimeLastPacketReceived" access="readOnly" activeNotify="canDeny" dmr:version="1.2">
+        <description>
+          Time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456
+          The time that the server receives the most recent UDP echo packet.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <profile name="Baseline:1" dmr:version="1.0">
+      <object ref="Device." requirement="present">
+        <parameter ref="DeviceSummary" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DeviceInfo." requirement="present">
+        <parameter ref="Manufacturer" requirement="readOnly"/>
+        <parameter ref="ManufacturerOUI" requirement="readOnly"/>
+        <parameter ref="ModelName" requirement="readOnly"/>
+        <parameter ref="Description" requirement="readOnly"/>
+        <parameter ref="SerialNumber" requirement="readOnly"/>
+        <parameter ref="HardwareVersion" requirement="readOnly"/>
+        <parameter ref="SoftwareVersion" requirement="readOnly"/>
+        <parameter ref="DeviceStatus" requirement="readOnly"/>
+        <parameter ref="UpTime" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ManagementServer." requirement="present">
+        <parameter ref="URL" requirement="readWrite"/>
+        <parameter ref="Username" requirement="readWrite"/>
+        <parameter ref="Password" requirement="readWrite"/>
+        <parameter ref="PeriodicInformEnable" requirement="readWrite"/>
+        <parameter ref="PeriodicInformInterval" requirement="readWrite"/>
+        <parameter ref="PeriodicInformTime" requirement="readWrite"/>
+        <parameter ref="ParameterKey" requirement="readOnly"/>
+        <parameter ref="ConnectionRequestURL" requirement="readOnly"/>
+        <parameter ref="ConnectionRequestUsername" requirement="readWrite"/>
+        <parameter ref="ConnectionRequestPassword" requirement="readWrite"/>
+        <parameter ref="UpgradesManaged" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="GatewayInfo:1" dmr:version="1.0">
+      <object ref="Device.GatewayInfo." requirement="present">
+        <parameter ref="ManufacturerOUI" requirement="readOnly"/>
+        <parameter ref="ProductClass" requirement="readOnly"/>
+        <parameter ref="SerialNumber" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Time:1" dmr:version="1.0">
+      <object ref="Device.Time." requirement="present">
+        <parameter ref="NTPServer1" requirement="readWrite"/>
+        <parameter ref="NTPServer2" requirement="readWrite"/>
+        <parameter ref="CurrentLocalTime" requirement="readOnly"/>
+        <parameter ref="LocalTimeZone" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="LAN:1" dmr:version="1.0">
+      <object ref="Device.LAN." requirement="present">
+        <parameter ref="AddressingType" requirement="readOnly"/>
+        <parameter ref="IPAddress" requirement="readOnly"/>
+        <parameter ref="SubnetMask" requirement="readOnly"/>
+        <parameter ref="DefaultGateway" requirement="readOnly"/>
+        <parameter ref="DNSServers" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LAN.Stats." requirement="present">
+        <parameter ref="ConnectionUpTime" requirement="readOnly"/>
+        <parameter ref="TotalBytesSent" requirement="readOnly"/>
+        <parameter ref="TotalBytesReceived" requirement="readOnly"/>
+        <parameter ref="TotalPacketsSent" requirement="readOnly"/>
+        <parameter ref="TotalPacketsReceived" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IPPing:1" dmr:version="1.0">
+      <object ref="Device.LAN.IPPingDiagnostics." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Host" requirement="readWrite"/>
+        <parameter ref="NumberOfRepetitions" requirement="readWrite"/>
+        <parameter ref="Timeout" requirement="readWrite"/>
+        <parameter ref="DataBlockSize" requirement="readWrite"/>
+        <parameter ref="DSCP" requirement="readWrite"/>
+        <parameter ref="SuccessCount" requirement="readOnly"/>
+        <parameter ref="FailureCount" requirement="readOnly"/>
+        <parameter ref="AverageResponseTime" requirement="readOnly"/>
+        <parameter ref="MinimumResponseTime" requirement="readOnly"/>
+        <parameter ref="MaximumResponseTime" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="TraceRoute:1" dmr:version="1.0">
+      <object ref="Device.LAN.TraceRouteDiagnostics." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Host" requirement="readWrite"/>
+        <parameter ref="Timeout" requirement="readWrite"/>
+        <parameter ref="DataBlockSize" requirement="readWrite"/>
+        <parameter ref="MaxHopCount" requirement="readWrite"/>
+        <parameter ref="DSCP" requirement="readWrite"/>
+        <parameter ref="ResponseTime" requirement="readOnly"/>
+        <parameter ref="NumberOfRouteHops" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LAN.TraceRouteDiagnostics.RouteHops.{i}." requirement="present">
+        <parameter ref="HopHost" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Download:1" dmr:version="1.2">
+      <object ref="Device.Capabilities.PerformanceDiagnostic." requirement="present">
+        <parameter ref="DownloadTransports" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DownloadDiagnostics." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="DownloadURL" requirement="readWrite"/>
+        <parameter ref="DSCP" requirement="readWrite"/>
+        <parameter ref="EthernetPriority" requirement="readWrite"/>
+        <parameter ref="ROMTime" requirement="readOnly"/>
+        <parameter ref="BOMTime" requirement="readOnly"/>
+        <parameter ref="EOMTime" requirement="readOnly"/>
+        <parameter ref="TestBytesReceived" requirement="readOnly"/>
+        <parameter ref="TotalBytesReceived" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DownloadTCP:1" dmr:version="1.2">
+      <object ref="Device.DownloadDiagnostics." requirement="present">
+        <parameter ref="TCPOpenRequestTime" requirement="readOnly"/>
+        <parameter ref="TCPOpenResponseTime" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Upload:1" dmr:version="1.2">
+      <object ref="Device.Capabilities.PerformanceDiagnostic." requirement="present">
+        <parameter ref="UploadTransports" requirement="readOnly"/>
+      </object>
+      <object ref="Device.UploadDiagnostics." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="UploadURL" requirement="readWrite"/>
+        <parameter ref="DSCP" requirement="readWrite"/>
+        <parameter ref="EthernetPriority" requirement="readWrite"/>
+        <parameter ref="ROMTime" requirement="readOnly"/>
+        <parameter ref="BOMTime" requirement="readOnly"/>
+        <parameter ref="EOMTime" requirement="readOnly"/>
+        <parameter ref="TestFileLength" requirement="readOnly"/>
+        <parameter ref="TotalBytesSent" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UploadTCP:1" dmr:version="1.2">
+      <object ref="Device.UploadDiagnostics." requirement="present">
+        <parameter ref="TCPOpenRequestTime" requirement="readOnly"/>
+        <parameter ref="TCPOpenResponseTime" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UDPEcho:1" dmr:version="1.2">
+      <object ref="Device.UDPEchoConfig." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="SourceIPAddress" requirement="readWrite"/>
+        <parameter ref="UDPPort" requirement="readWrite"/>
+        <parameter ref="PacketsReceived" requirement="readOnly"/>
+        <parameter ref="PacketsResponded" requirement="readOnly"/>
+        <parameter ref="BytesReceived" requirement="readOnly"/>
+        <parameter ref="BytesResponded" requirement="readOnly"/>
+        <parameter ref="TimeFirstPacketReceived" requirement="readOnly"/>
+        <parameter ref="TimeLastPacketReceived" requirement="readOnly"/>
+        <parameter ref="EchoPlusSupported" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UDPEchoPlus:1" dmr:version="1.2">
+      <object ref="Device.UDPEchoConfig." requirement="present">
+        <parameter ref="EchoPlusEnabled" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="UDPConnReq:1" dmr:version="1.1">
+      <object ref="Device.ManagementServer." requirement="notSpecified">
+        <parameter ref="UDPConnectionRequestAddress" requirement="readOnly"/>
+        <parameter ref="UDPConnectionRequestAddressNotificationLimit" requirement="readWrite"/>
+        <parameter ref="STUNEnable" requirement="readWrite"/>
+        <parameter ref="STUNServerAddress" requirement="readWrite"/>
+        <parameter ref="STUNServerPort" requirement="readWrite"/>
+        <parameter ref="STUNUsername" requirement="readWrite"/>
+        <parameter ref="STUNPassword" requirement="readWrite"/>
+        <parameter ref="STUNMaximumKeepAlivePeriod" requirement="readWrite"/>
+        <parameter ref="STUNMinimumKeepAlivePeriod" requirement="readWrite"/>
+        <parameter ref="NATDetected" requirement="readOnly"/>
+      </object>
+    </profile>
+  </model>
+</dm:document>
diff --git a/tools/tr-181-2-12-0-cwmp-full.xml b/tools/tr-181-2-12-0-cwmp-full.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cfefc0fde6d7790e337b541dc8eef6d166269ee4
--- /dev/null
+++ b/tools/tr-181-2-12-0-cwmp-full.xml
@@ -0,0 +1,56596 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- DO NOT EDIT; generated by Broadband Forum report.pl#422 (2018/03/28 version) on 2018/04/02 at 12:17:19.
+     report.pl -exitcode=fatals -cwmpindex=.. -nofontstyles -nowarnreport -quiet -report=xml -outfile=tr-181-2-12-0-cwmp-full.xml tr-181-2-12-0-cwmp.xml
+     See https://github.com/BroadbandForum/cwmp-xml-tools/tree/master/Report_Tool. -->
+<!--
+  TR-069 Device:2.12 Root Object definition [CWMP]
+
+  Copyright (c) 2010-2018, Broadband Forum
+
+  The undersigned members have elected to grant the copyright to
+  their contributed material used in this software:
+    Copyright (c) 2017-2018 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.
+
+  Summary:
+    TR-069 Device:2.12 Root Object definition.
+
+  Editors:
+  * John Blackford, ARRIS
+  * Tim Carey, Nokia
+  * Tim Spets, Greenwave System
+  * Klaus Wich, Huawei
+
+  Broadband User Service Work Area Directors:
+  * Jason Walls, QA Cafe
+  * John Blackford, ARRIS
+
+  Issue History (Filename: Approval Date: Publication Date: Changes):
+  * tr-181-2-0-0.xml: May 2010:
+    - corresponds to TR-181 Issue 2.
+  * tr-181-2-1-0.xml: November 2010:
+    - corresponds to TR-181 Issue 2 Amendment 1.
+  * tr-181-2-2-0.xml: March 2011:
+    - corresponds to TR-181 Issue 2 Amendment 2.
+  * tr-181-2-3-0.xml: September 2011:
+    - corresponds to TR-181 Issue 2 Amendment 3.
+  * tr-181-2-4-0.xml: November 2011:
+    - corresponds to TR-181 Issue 2 Amendment 4.
+  * tr-181-2-5-0.xml: May 2012:
+    - corresponds to TR-181 Issue 2 Amendment 5.
+  * tr-181-2-6-0.xml: November 2012:
+    - corresponds to TR-181 Issue 2 Amendment 6.
+  * tr-181-2-7-0.xml: November 2013: January 17, 2014
+    - corresponds to TR-181 Issue 2 Amendment 7.
+  * tr-181-2-8-0.xml: 8 September 2014: 17 September 2014:
+    - corresponds to TR-181 Issue 2 Amendment 8.
+  * tr-181-2-9-0.xml:  1 December 2014:  4 February 2015:
+    - Added WiFi MAC Address Filtering
+    - Added Traceroute fixes
+    - Added IEEE 1905 data model
+    - Incorporated TR-143a1
+  * tr-181-2-10-0.xml: 9 November 2015: 13 November 2015:
+    - corresponds to TR-181 Issue 2 Amendment 10.
+  * tr-181-2-11-0.xml: 18 July 2016: 12 August 2016
+    - corresponds to TR-181 Issue 2 Amendment 11.
+  * tr-181-2-12-0-cwmp.xml: 26 March 2018: 26 March 2018
+    - corresponds to TR-181 Issue 2 Amendment 12.
+-->
+<dm:document xmlns:dm="urn:broadband-forum-org:cwmp:datamodel-1-6"
+             xmlns:dmr="urn:broadband-forum-org:cwmp:datamodel-report-0-1"
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+             xsi:schemaLocation="urn:broadband-forum-org:cwmp:datamodel-1-6 http://www.broadband-forum.org/cwmp/cwmp-datamodel-1-6.xsd urn:broadband-forum-org:cwmp:datamodel-report-0-1 http://www.broadband-forum.org/cwmp/cwmp-datamodel-report.xsd"
+             spec="urn:broadband-forum-org:tr-181-2-12-0-cwmp" file="tr-181-2-12-0-cwmp-full.xml">
+  <description>
+    {{docname|Device:2 Root Data Model for CWMP (TR-069)}}
+    {{appdate|March 2018}}
+    {{trname|TR-181i2a12}}
+    * Added TR-069a6 support
+    * Added Firmware Image support
+    * Added Ethernet Link Aggregation Group
+    * Added additional Wi-Fi and WAN statistics
+    * Added support for Two-Way Active Measurement Protocol (TWAMP) reflector
+    * Added support for Layer Two Tunneling Protocol version 3 (L2TPv3)
+    * Added support for Virtual eXtensible Local Area Network (VXLAN) tunnels
+    * Added support for Broadband Access Service Attributes and Performance Metrics measurement test framework (BASAPM)
+    * Added support for Large-Scale Measurement of Broadband Performance (LMAP)
+  </description>
+  <dataType name="IPAddress">
+    <description>
+      IP address, i.e. IPv4 address (or IPv4 subnet mask) or IPv6 address.
+      All IPv4 addresses and subnet masks MUST be represented as strings in IPv4 dotted-decimal notation.  Here are some examples of valid IPv4 address textual representations:
+      * 216.52.29.100
+      * 192.168.1.254
+      All IPv6 addresses MUST be represented using any of the 3 standard textual representations defined in {{bibref|RFC4291}} Sections 2.2.1, 2.2.2 and 2.2.3.  Both lower-case and upper-case letters can be used, but use of lower-case letters is RECOMMENDED.  Here are some examples of valid IPv6 address textual representations:
+      * 1080:0:0:800:ba98:3210:11aa:12dd
+      * 1080::800:ba98:3210:11aa:12dd
+      * 0:0:0:0:0:0:13.1.68.3
+      IPv6 addresses MUST NOT include zone identifiers. Zone identifiers are discussed in {{bibref|RFC4007|Section 6}}.
+      Unspecified or inapplicable addresses (or IPv4 subnet masks) MUST be represented as empty strings unless otherwise specified by the parameter definition.
+    </description>
+    <string>
+      <size maxLength="45"/>
+    </string>
+  </dataType>
+  <dataType name="IPv4Address" base="IPAddress">
+    <description>
+      IPv4 address (or subnet mask).
+      Can be any IPv4 address that is permitted by the ''IPAddress'' data type.
+    </description>
+    <size maxLength="15"/>
+  </dataType>
+  <dataType name="IPv6Address" base="IPAddress">
+    <description>
+      IPv6 address.
+      Can be any IPv6 address that is permitted by the ''IPAddress'' data type.
+    </description>
+    <size maxLength="45"/>
+  </dataType>
+  <dataType name="IPPrefix">
+    <description>
+      IPv4 or IPv6 routing prefix in Classless Inter-Domain Routing (CIDR) notation {{bibref|RFC4632}}. This is specified as an IP address followed by an appended "/n" suffix, where ''n'' (the prefix size) is an integer in the range 0-32 (for IPv4) or 0-128 (for IPv6) that indicates the number of (leftmost) '1' bits of the routing prefix. 
+      * IPv4 example: 192.168.1.0/24
+      * IPv6 example: 2001:edff:fe6a:f76::/64
+      If the IP address part is unspecified or inapplicable, it MUST be {{empty}} unless otherwise specified by the parameter definition.  In this case the IP prefix will be of the form "/n".
+      If the entire IP prefix is unspecified or inapplicable, it MUST be {{empty}} unless otherwise specified by the parameter definition.
+    </description>
+    <string>
+      <size maxLength="49"/>
+    </string>
+  </dataType>
+  <dataType name="IPv4Prefix" base="IPPrefix">
+    <description>
+      IPv4 address prefix. 
+      Can be any IPv4 prefix that is permitted by the ''IPPrefix'' data type.
+    </description>
+    <size maxLength="18"/>
+  </dataType>
+  <dataType name="IPv6Prefix" base="IPPrefix">
+    <description>
+      IPv6 address prefix.
+      Can be any IPv6 prefix that is permitted by the ''IPPrefix'' data type.
+    </description>
+    <size maxLength="49"/>
+  </dataType>
+  <dataType name="MACAddress">
+    <description>
+      All MAC addresses are represented as strings of 12 hexadecimal digits (digits 0-9, letters A-F or a-f) displayed as six pairs of digits separated by colons.  Unspecified or inapplicable MAC addresses MUST be represented as empty strings unless otherwise specified by the parameter definition.
+    </description>
+    <string>
+      <size maxLength="17"/>
+      <pattern value=""/>
+      <pattern value="([0-9A-Fa-f][0-9A-Fa-f]:){5}([0-9A-Fa-f][0-9A-Fa-f])"/>
+    </string>
+  </dataType>
+  <dataType name="StatsCounter32">
+    <description>
+      A 32-bit statistics parameter, e.g. a byte counter.
+      This data type SHOULD NOT be used for statistics parameters whose values might become greater than the maximum value that can be represented as an ''unsignedInt'' (i.e. 0xffffffff, referred to below as ''maxval''). ''StatsCounter64'' SHOULD be used for such parameters.
+      The value ''maxval'' indicates that no data is available for this parameter.  In the unlikely event that the actual value of the statistic is ''maxval'', the CPE SHOULD return ''maxval - 1''.
+      The actual value of the statistic might be greater than ''maxval''. Such values SHOULD wrap around through zero.
+      The term ''packet'' is to be interpreted as the transmission unit appropriate to the protocol layer in question, e.g. an IP packet or an Ethernet frame.
+    </description>
+    <unsignedInt>
+    </unsignedInt>
+  </dataType>
+  <dataType name="StatsCounter64">
+    <description>
+      A 64-bit statistics parameter, e.g. a byte counter.
+      This data type SHOULD be used for all statistics parameters whose values might become greater than the maximum value that can be represented as an ''unsignedInt''.
+      The maximum value that can be represented as an ''unsignedLong'' (i.e. 0xffffffffffffffff) indicates that no data is available for this parameter.
+      The term ''packet'' is to be interpreted as the transmission unit appropriate to the protocol layer in question, e.g. an IP packet or an Ethernet frame.
+    </description>
+    <unsignedLong>
+    </unsignedLong>
+  </dataType>
+  <dataType name="Alias">
+    <description>
+      A non-volatile handle used to reference this instance. Alias provides a mechanism for an ACS to label this instance for future reference.
+      If the CPE supports the Alias-based Addressing feature as defined in {{bibref|TR-069a4|3.6.1}} and described in {{bibref|TR-069a4|Appendix II}}, the following mandatory constraints MUST be enforced:
+      *Its value MUST NOT be empty.
+      *Its value MUST start with a letter.
+      *If its value is not assigned by the ACS, it MUST start with a "cpe-" prefix.
+      *The CPE MUST NOT change the parameter value.
+    </description>
+    <string>
+      <size maxLength="64"/>
+    </string>
+  </dataType>
+  <dataType name="Dbm1000">
+    <description>
+      The value is measured in ''dBm/1000'', i.e. the value divided by 1000 is dB relative to 1 mW.  For example, -12345 means -12.345 dBm, 0 means 0 dBm (1 mW) and 12345 means 12.345 dBm.
+    </description>
+    <int>
+    </int>
+  </dataType>
+  <dataType name="UUID">
+    <description>
+      Universally Unique Identifier.  See {{bibref|RFC4122}}.
+    </description>
+    <string>
+      <size minLength="36" maxLength="36"/>
+      <pattern value="[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}"/>
+    </string>
+  </dataType>
+  <dataType name="IEEE_EUI64">
+    <description>
+      The IEEE EUI 64-bit identifier as defined in {{bibref|EUI64}}. The IEEE defined 64-bit extended unique identifier (EUI-64) is a concatenation of:
+      * The 24-bit (OUI-24) or 36-bit (OUI-36) company_id value assigned by the IEEE Registration Authority (IEEE-RA), and
+      * The extension identifier (40 bits for OUI-24 or 28 bits for OUI-36) assigned by the organization with that company_id assignment.
+    </description>
+    <string>
+      <size maxLength="23"/>
+      <pattern value=""/>
+      <pattern value="([0-9A-Fa-f][0-9A-Fa-f]:){7}([0-9A-Fa-f][0-9A-Fa-f])"/>
+    </string>
+  </dataType>
+  <dataType name="ZigBeeNetworkAddress">
+    <description>
+      The ZigBee 16-bit network address (NWK) as defined in {{bibref|ZigBee2007}}. The address is assigned to a device by the network layer and used by the network layer for routing messages between devices.
+    </description>
+    <string>
+      <size maxLength="4"/>
+      <pattern value=""/>
+      <pattern value="([0-9A-Fa-f]){4}"/>
+    </string>
+  </dataType>
+  <dataType name="DiagnosticsState">
+    <description>
+      Indicates the availability of diagnostics data. Enumeration of:
+      {{enum}}
+      If the ACS sets the value of this parameter to {{enum|Requested}}, the CPE MUST initiate the corresponding diagnostic test. When writing, the only allowed values are {{enum|Requested}} and {{enum|Canceled}}. To ensure the use of the proper test parameters (the writable parameters in this object), the test parameters MUST be set, and any errors or inconsistencies in the test parameters MUST be detected, either prior to or at the same time as (in the same SetParameterValues) setting this parameter to {{enum|Requested}}.
+      When requested, the CPE SHOULD wait until after completion of the communication session with the ACS before starting the diagnostic test.
+      When the test is completed, the value of this parameter MUST be either {{enum|Complete}} (if the test completed successfully), or one of the ''Error'' values listed above.
+      If the value of this parameter is anything other than {{enum|Complete}}, the values of the results parameters for this test are indeterminate.
+      When the diagnostic initiated by the ACS is completed (successfully or not), but not if it is canceled for any reason, the CPE MUST establish a new connection to the ACS to allow the ACS to view the results, indicating the Event code ''8 DIAGNOSTICS COMPLETE'' in the Inform message.
+      After the diagnostic is complete, the value of all result parameters (all read-only parameters in this object) MUST be retained by the CPE until either this diagnostic is run again, or the CPE reboots. After a reboot, if the CPE has not retained the result parameters from the most recent test, it MUST set the value of this parameter to {{enum|None}}.
+      Modifying any of the writable parameters in this object except for this one MUST result in the value of this parameter being set to {{enum|None}}.
+      While the test is in progress, modifying any of the writable parameters in this object except for this one MUST result in the test being terminated and the value of this parameter being set to {{enum|None}}.
+      While the test is in progress, setting this parameter to {{enum|Requested}} (and possibly modifying other writable parameters in this object) MUST result in the test being terminated and then restarted using the current values of the test parameters.
+      While the test is in progress, setting this parameter to {{enum|Canceled}} MUST result in the test being canceled and the value of this parameter being set to {{enum|None}}. If the CPE does not support the {{enum|Canceled}} value, it MUST return a SPV error with "Invalid Parameter value" (9007) to the ACS instead.
+    </description>
+    <string>
+      <enumeration value="None" access="readOnly"/>
+      <enumeration value="Requested"/>
+      <enumeration value="Canceled" optional="true"/>
+      <enumeration value="Complete" access="readOnly"/>
+      <enumeration value="Error" access="readOnly" optional="true"/>
+    </string>
+  </dataType>
+  <dataType name="PSMBreakPointIndexAndLevel">
+    <description>
+      # The PSM breakpoint sub-carrier index in the range [0:4095], and
+      # the value of the level of the PSM at this sub-carrier expressed in ''0.1 dBm/Hz'' with an offset of -140 dBm/Hz.
+      Both values are represented as unsignedInt.
+      {{bibref|G.9964|Clause 5.2}} defines limits on PSM breakpoint levels.
+    </description>
+    <list minItems="2" maxItems="2"/>
+    <unsignedInt>
+    </unsignedInt>
+  </dataType>
+  <bibliography>
+    <reference id="3GPP-HSPA">
+      <name>High Speed Packet data Access (HSPA)</name>
+      <organization>3GPP</organization>
+      <hyperlink>http://www.3gpp.org/technologies/keywords-acronyms/99-hspa</hyperlink>
+    </reference>
+    <reference id="3GPP-TS.25.171">
+      <name>3GPP TS 25.171</name>
+      <title>Requirements for support of Assisted Global Positioning System (A-GPS)</title>
+      <organization>3GPP RAN WG4</organization>
+      <hyperlink>http://www.3gpp.org/ftp/Specs/html-info/25171.htm</hyperlink>
+    </reference>
+    <reference id="802.11-2007">
+      <name>IEEE Std 802.11-2007</name>
+      <title>Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications</title>
+      <organization>IEEE</organization>
+      <date>2007</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.11-2007.pdf</hyperlink>
+    </reference>
+    <reference id="802.11-2012">
+      <name>IEEE Std 802.11-2012</name>
+      <title>Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications</title>
+      <organization>IEEE</organization>
+      <date>March 2012</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.11-2012.pdf</hyperlink>
+    </reference>
+    <reference id="802.11a-1999">
+      <name>IEEE Std 802.11a-1999</name>
+      <title>High-speed Physical Layer in the 5 GHz band</title>
+      <organization>IEEE</organization>
+      <date>1999</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.11a-1999.pdf</hyperlink>
+    </reference>
+    <reference id="802.11ac-2013">
+      <name>IEEE Std 802.11ac-2013</name>
+      <organization>IEEE</organization>
+      <hyperlink>http://www.ieee802.org/11/Reports/tgac_update.htm</hyperlink>
+    </reference>
+    <reference id="802.11b-1999">
+      <name>IEEE Std 802.11b-1999</name>
+      <title>Higher Speed Physical Layer Extension in the 2.4 GHz band</title>
+      <organization>IEEE</organization>
+      <date>1999</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.11b-1999.pdf</hyperlink>
+    </reference>
+    <reference id="802.11g-2003">
+      <name>IEEE Std 802.11g-2003</name>
+      <title>Further Higher Data Rate Extension in the 2.4 GHz Band</title>
+      <organization>IEEE</organization>
+      <date>2003</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.11g-2003.pdf</hyperlink>
+    </reference>
+    <reference id="802.11h-2003">
+      <name>IEEE Std 802.11h-2003</name>
+      <title>Spectrum and Transmit Power Management Extensions</title>
+      <organization>IEEE</organization>
+      <date>2003</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.11h-2003.pdf</hyperlink>
+    </reference>
+    <reference id="802.11n-2009">
+      <name>IEEE Std 802.11n-2009</name>
+      <title>Amendment 5: Enhancements for Higher Throughput</title>
+      <organization>IEEE</organization>
+      <date>2009</date>
+      <hyperlink>http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?reload=true&amp;arnumber=5307322</hyperlink>
+    </reference>
+    <reference id="802.1AB-2009">
+      <name>IEEE Std 802.1AB-2009</name>
+      <title>Station and Media Access Control Connectivity Discovery</title>
+      <organization>IEEE</organization>
+      <date>2009</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.1AB-2009.pdf</hyperlink>
+    </reference>
+    <reference id="802.1ad-2005">
+      <name>IEEE Std 802.1ad-2005</name>
+      <title>Virtual Bridged Local Area Networks Amendment 4: Provider Bridges</title>
+      <organization>IEEE</organization>
+      <date>May 2005</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.1ad-2005.pdf</hyperlink>
+    </reference>
+    <reference id="802.1AX-2014">
+      <name>IEEE Std 802.1AX-2014</name>
+      <title>IEEE Standard for Local and metropolitan area networks -- Link Aggregation</title>
+      <organization>IEEE</organization>
+      <date>2014</date>
+      <hyperlink>http://ieeexplore.ieee.org/servlet/opac?punumber=6997981</hyperlink>
+    </reference>
+    <reference id="802.1D-2004">
+      <name>IEEE Std 802.1D-2004</name>
+      <title>Media Access Control (MAC) Bridges</title>
+      <organization>IEEE</organization>
+      <date>2004</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.1D-2004.pdf</hyperlink>
+    </reference>
+    <reference id="802.1Q-2005">
+      <name>IEEE Std 802.1Q-2005</name>
+      <title>Virtual Bridged Local Area Networks</title>
+      <organization>IEEE</organization>
+      <date>2006</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.1Q-2005.pdf</hyperlink>
+    </reference>
+    <reference id="802.1Q-2011">
+      <name>IEEE Std 802.1Q-2011</name>
+      <title>MAC Bridges and Virtual Bridge Local Area Networks</title>
+      <organization>IEEE</organization>
+      <date>2011</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.1Q-2011.pdf</hyperlink>
+    </reference>
+    <reference id="802.1x-2004">
+      <name>IEEE Std 802.1x-2004</name>
+      <title>Standards for Local and Metropolitan Area Networks: Port based Network Access Control</title>
+      <organization>IEEE</organization>
+      <date>2004</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.1X-2004.pdf</hyperlink>
+    </reference>
+    <reference id="802.3-2015">
+      <name>IEEE Std 802.3-2015</name>
+      <title>IEEE Standard for Ethernet</title>
+      <organization>IEEE</organization>
+      <date>2015</date>
+      <hyperlink>http://ieeexplore.ieee.org/servlet/opac?punumber=7428774</hyperlink>
+    </reference>
+    <reference id="802.3-2012_section6">
+      <name>IEEE 802.3-2012 - Section Six</name>
+      <title>IEEE Standard for Ethernet - Section Six</title>
+      <organization>IEEE</organization>
+      <date>December 2012</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.3-2012_section6.pdf</hyperlink>
+    </reference>
+    <reference id="BLUE">
+      <name>Blue</name>
+      <title>A New Class of Active Queue Management Algorithms</title>
+      <hyperlink>http://www.thefengs.com/wuchang/work/blue</hyperlink>
+    </reference>
+    <reference id="DLNA-NDIG">
+      <name>DLNA Networked Device Interoperability Guidelines</name>
+      <title>DLNA Networked Device Interoperability Guidelines, Volume 2: Media Format Profiles.</title>
+      <organization>DLNA</organization>
+      <date>October 2006</date>
+      <hyperlink>http://www.dlna.org/industry/certification/guidelines/</hyperlink>
+    </reference>
+    <reference id="DNS-SD">
+      <name>RFC 6763</name>
+      <title>DNS-Based Service Discovery</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2013</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6763</hyperlink>
+    </reference>
+    <reference id="DSLite">
+      <name>RFC 6333</name>
+      <title>Dual-Stack Lite Broadband Deployments Following IPv4 Exhaustion</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2011</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6333</hyperlink>
+    </reference>
+    <reference id="DSLite-options">
+      <name>RFC 6334</name>
+      <title>Dynamic Host Configuation Protocol for IPv6 (DHCPv6) Option for Dual-Stack Lite</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2011</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6334</hyperlink>
+    </reference>
+    <reference id="DVB-TS.102.824">
+      <name>TS 102 824</name>
+      <title>Digital Video Broadcasting (DVB);Remote Management and Firmware Update System for DVB IP Services</title>
+      <organization>ETSI</organization>
+      <date>July 2008</date>
+      <hyperlink>http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=27769</hyperlink>
+    </reference>
+    <reference id="ETSIBRAN">
+      <name>ETSI EN 301 893</name>
+      <title>Broadband Radio Access Networks (BRAN); 5 GHz high performance RLAN; Harmonized EN covering the essential requirements of article 3.2 of the RTTE Directive</title>
+      <organization>ETSI</organization>
+      <hyperlink>http://www.etsi.org/deliver/etsi_en/301800_301899/301893/01.08.01_60/en_301893v010801p.pdf</hyperlink>
+    </reference>
+    <reference id="ETSIM2MFA">
+      <name>ETSI TS 102 690 v1.1.6</name>
+      <title>Machine-to-Machine Communications (M2M Functional Architecture)</title>
+      <organization>ETSI</organization>
+      <date>June 2012</date>
+      <hyperlink>http://docbox.etsi.org/M2M/Open/Latest_Drafts/00002ed121v116.pdf</hyperlink>
+    </reference>
+    <reference id="ETSIM2MInterfaces">
+      <name>ETSI TS 102 921 v1.1.6</name>
+      <title>M2M mIa, dIa and mId Interfaces</title>
+      <organization>ETSI</organization>
+      <date>August 2012</date>
+      <hyperlink>http://docbox.etsi.org/M2M/Open/Latest_Drafts/00010ed121v116.pdf</hyperlink>
+    </reference>
+    <reference id="G.988">
+      <name>G.988</name>
+      <title>ONU management and control interface (OMCI) specification</title>
+      <organization>ITU-T</organization>
+      <date>2010</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.988-201010-P/en</hyperlink>
+    </reference>
+    <reference id="G.9701">
+      <name>G.9701</name>
+      <title>Fast access to subscriber terminals (G.fast)- Physical layer specification</title>
+      <organization>ITU-T</organization>
+      <date>2014</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.9701-201412-P</hyperlink>
+    </reference>
+    <reference id="G.9954">
+      <name>G.9954</name>
+      <title>Phoneline networking transceivers - Enhanced physical, media access, and link layer specifications (HPNA 3.0 and 3.1)</title>
+      <organization>ITU-T</organization>
+      <date>2007</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.9954/en</hyperlink>
+    </reference>
+    <reference id="G.9960">
+      <name>G.9960</name>
+      <title>Unified high-speed wire-line based home networking transceivers - System architecture and physical layer specification</title>
+      <organization>ITU-T</organization>
+      <category>G.hn series</category>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.9960-201006-P</hyperlink>
+    </reference>
+    <reference id="G.9961">
+      <name>G.9961</name>
+      <title>Unified high-speed wire-line based home networking transceivers - Data link layer specification</title>
+      <organization>ITU-T</organization>
+      <category>G.hn series</category>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.9961-201006-P</hyperlink>
+    </reference>
+    <reference id="G.9962">
+      <name>G.9962</name>
+      <title>Unified high-speed wire-line based home networking transceivers - Management specification</title>
+      <organization>ITU-T</organization>
+      <category>G.hn series</category>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.9962-201308-P</hyperlink>
+    </reference>
+    <reference id="G.9964">
+      <name>G.9964</name>
+      <title>Unified high-speed wire-line based home networking transceivers - Power spectral density specification</title>
+      <organization>ITU-T</organization>
+      <category>G.hn series</category>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.9962-201308-P</hyperlink>
+    </reference>
+    <reference id="G.9973">
+      <name>G.9973</name>
+      <title>Protocol for identifying home network topology</title>
+      <organization>ITU-T</organization>
+      <date>2011</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.9973-201110-I/en</hyperlink>
+    </reference>
+    <reference id="G.993.1">
+      <name>G.993.1</name>
+      <title>Very high speed digital subscriber line transceivers</title>
+      <organization>ITU-T</organization>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.993.1</hyperlink>
+    </reference>
+    <reference id="G.993.2">
+      <name>G.993.2</name>
+      <title>Very high speed digital subscriber line transceivers 2 (VDSL2)</title>
+      <organization>ITU-T</organization>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.993.2</hyperlink>
+    </reference>
+    <reference id="G.997.1">
+      <name>G.997.1</name>
+      <title>Physical layer management for digital subscriber line (DSL) transceivers</title>
+      <organization>ITU-T</organization>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.997.1</hyperlink>
+    </reference>
+    <reference id="G.997.2">
+      <name>G.997.2</name>
+      <title>Physical layer management for FAST transceivers</title>
+      <organization>ITU-T</organization>
+      <date>2015</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.997.2-201505-I</hyperlink>
+    </reference>
+    <reference id="G.998.1">
+      <name>G.998.1</name>
+      <title>ATM-based Multi-Pair Bonding</title>
+      <organization>ITU-T</organization>
+      <date>2005</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.998.1</hyperlink>
+    </reference>
+    <reference id="G.998.2">
+      <name>G.998.2</name>
+      <title>Ethernet-based Multi-Pair Bonding</title>
+      <organization>ITU-T</organization>
+      <date>2005</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.998.2</hyperlink>
+    </reference>
+    <reference id="G.998.3">
+      <name>G.998.3</name>
+      <title>Multi-Pair Bonding Using Time-Division Inverse Multiplexing</title>
+      <organization>ITU-T</organization>
+      <date>2005</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.998.2</hyperlink>
+    </reference>
+    <reference id="HPAV1.1">
+      <name>HomePlug AV Specification</name>
+      <title>Version 1.1</title>
+      <organization>HomePlug</organization>
+      <date>2007</date>
+      <hyperlink>http://www.homeplug.org</hyperlink>
+    </reference>
+    <reference id="HTML4.01">
+      <name>HTML 4.01 Specification</name>
+      <organization>W3C</organization>
+      <hyperlink>http://www.w3.org/TR/html4</hyperlink>
+    </reference>
+    <reference id="IANA-protocolnumbers">
+      <name>IANA Protocol Numbers</name>
+      <title>Protocol Numbers</title>
+      <organization>IANA</organization>
+      <hyperlink>http://www.iana.org/assignments/protocol-numbers</hyperlink>
+    </reference>
+    <reference id="IANAifType">
+      <name>IANAifType</name>
+      <title>IANAifType-MIB DEFINITIONS</title>
+      <organization>IANA</organization>
+      <date>2009</date>
+      <hyperlink>http://www.iana.org/assignments/ianaiftype-mib/ianaiftype-mib</hyperlink>
+    </reference>
+    <reference id="ICSA-Baseline">
+      <name>ICSA Baseline Modular Firewall Certification Criteria</name>
+      <title>Baseline module - version 4.1</title>
+      <organization>ICSA Labs</organization>
+      <date>2008</date>
+      <hyperlink>http://www.icsalabs.com/sites/default/files/baseline.pdf</hyperlink>
+    </reference>
+    <reference id="ICSA-Residential">
+      <name>ICSA Residential Modular Firewall Certification Criteria</name>
+      <title>Required Services Security Policy - Residential Category module - version 4.1</title>
+      <organization>ICSA Labs</organization>
+      <date>2008</date>
+      <hyperlink>http://www.icsalabs.com/sites/default/files/residential.pdf</hyperlink>
+    </reference>
+    <reference id="IEEE1905.1a">
+      <name>IEEE 1905.1a</name>
+      <title>IEEE Std 1905.1a, Convergent Digital Home Network for Heterogeneous Technologies Amendment 1: Support of new MAC/PHYs and enhancements, IEEE, December 2014.</title>
+      <organization>IEEE</organization>
+      <date>December 2014</date>
+      <hyperlink>http://www.IEEE.org</hyperlink>
+    </reference>
+    <reference id="IKEv2-params">
+      <name>IKEv2 Parameters</name>
+      <title>Internet Key Exchange Version 2 (IKEv2) Parameters</title>
+      <organization>IETF</organization>
+      <hyperlink>http://www.iana.org/assignments/ikev2-parameters/ikev2-parameters.xml</hyperlink>
+    </reference>
+    <reference id="IPDR-FTP">
+      <name>IPDR File Transfer Protocol</name>
+      <title>IPDR/File Transfer Protocol</title>
+      <organization>TM Forum</organization>
+      <hyperlink>http://www.ipdr.org/public/</hyperlink>
+    </reference>
+    <reference id="IPDR-SP">
+      <name>IPDR Streaming Protocol</name>
+      <title>IPDR Streaming Protocol (IPDR/SP) Specification</title>
+      <organization>TM Forum</organization>
+      <hyperlink>http://www.ipdr.org/public/</hyperlink>
+    </reference>
+    <reference id="IPDR-XDR">
+      <name>IPDR XDR Encoding Format</name>
+      <title>IPDR/XDR Encoding Format</title>
+      <organization>TM Forum</organization>
+      <hyperlink>http://www.ipdr.org/public/</hyperlink>
+    </reference>
+    <reference id="IPDR-XML">
+      <name>IPDR XML File Encoding Format</name>
+      <title>IPDR/XML File Encoding Format</title>
+      <organization>TM Forum</organization>
+      <hyperlink>http://www.ipdr.org/public/</hyperlink>
+    </reference>
+    <reference id="ISO-13818-6:1998">
+      <name>ISO/IEC 13818-6:1998</name>
+      <title>Information Technology - Generic coding of moving pictures and associated audio information - Part 6: Extensions for DSM-CC</title>
+      <organization>ISO</organization>
+      <date>1998</date>
+      <hyperlink>http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=25039</hyperlink>
+    </reference>
+    <reference id="ISO3166-1">
+      <name>ISO 3166-1</name>
+      <title>Codes for the representation of names of countries and their subdivisions - Part 1: Country codes</title>
+      <organization>ISO</organization>
+      <date>2006</date>
+      <hyperlink>http://www.iso.org/iso/country_codes.htm</hyperlink>
+    </reference>
+    <reference id="ISO639-1">
+      <name>ISO 639-1</name>
+      <title>Codes for the representation of names of Languages - Part 1: Alpha-2 code</title>
+      <organization>ISO</organization>
+      <date>2002</date>
+      <hyperlink>http://www.iso.org/iso/language_codes</hyperlink>
+    </reference>
+    <reference id="ISO646-1991">
+      <name>ISO/IEC 646-1991</name>
+      <title>Information Technology - ISO 7-bit coded character set for information interchange</title>
+      <organization>ISO</organization>
+      <date>1991</date>
+    </reference>
+    <reference id="ITU-E.118">
+      <name>ITU E.118</name>
+      <title>Overall Network Operation, Telephone Service, Service Operation and Human Factors</title>
+      <organization>International Telecommunication Union</organization>
+      <date>May 2006</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-E.118/en</hyperlink>
+    </reference>
+    <reference id="ITU-E.164">
+      <name>ITU E.164</name>
+      <title>The international public telecommunication numbering plan</title>
+      <organization>International Telecommunication Union</organization>
+      <date>October 2010</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-E.164-201011-I/en</hyperlink>
+    </reference>
+    <reference id="ITU-X.733">
+      <name>ITU X.733</name>
+      <title>Information technology - Open Systems Interconnection - Systems Management: Alarm reporting function</title>
+      <organization>International Telecommunication Union</organization>
+      <date>February 1992</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-X.733/en</hyperlink>
+    </reference>
+    <reference id="JJ-300.00">
+      <name>JJ-300.00</name>
+      <title>Home-network Topology Identifying Protocol</title>
+      <organization>TTC</organization>
+      <date>2011</date>
+      <hyperlink>http://www.ttc.or.jp/jp/document_list/pdf/e/STD/JJ-300.00(E)v1.1.pdf</hyperlink>
+    </reference>
+    <reference id="JJ-300.01">
+      <name>JJ-300.01</name>
+      <title>The List of Device Categories</title>
+      <organization>TTC</organization>
+      <date>2011</date>
+      <hyperlink>http://www.ttc.or.jp/jp/document_list/pdf/e/STD/JJ-300.01(E)v1.1.pdf</hyperlink>
+    </reference>
+    <reference id="LMAPIFM">
+      <name>RFC 8193</name>
+      <title>Information Model for Large-Scale Measurement Platforms (LMAPs)</title>
+      <organization>IETF</organization>
+      <category>Informational RFC</category>
+      <date>August 2017</date>
+      <hyperlink>http://tools.ietf.org/html/rfc8193</hyperlink>
+    </reference>
+    <reference id="LMAPREG">
+      <name>draft-ietf-ippm-metric-registry-12</name>
+      <title>Registry for Performance Metrics</title>
+      <organization>IETF</organization>
+      <category>Internet Draft</category>
+      <date>June 30, 2017</date>
+      <hyperlink>https://datatracker.ietf.org/doc/draft-ietf-ippm-metric-registry/</hyperlink>
+    </reference>
+    <reference id="MOCA11-MIB">
+      <name>MOCA11-MIB</name>
+      <title>Remote Management of MoCA Interfaces using SNMP MIB</title>
+      <organization>MoCA Alliance</organization>
+      <date>2009</date>
+      <hyperlink>http://www.mocalliance.org</hyperlink>
+    </reference>
+    <reference id="MoCAv1.0">
+      <name>MoCA v1.0</name>
+      <title>MoCA MAC/PHY Specification v1.0</title>
+      <organization>MoCA Alliance</organization>
+      <date>2009</date>
+      <hyperlink>http://www.mocalliance.org</hyperlink>
+    </reference>
+    <reference id="MoCAv1.1">
+      <name>MoCA v1.1</name>
+      <title>MoCA MAC/PHY Specification v1.1 Extensions</title>
+      <organization>MoCA Alliance</organization>
+      <date>2009</date>
+      <hyperlink>http://www.mocalliance.org</hyperlink>
+    </reference>
+    <reference id="MQTT31">
+      <name>MQTT v3.1</name>
+      <title>MQ Telemetry Transport (MQTT) V3.1 Protocol Specification</title>
+      <date>2010</date>
+      <hyperlink>http://www.ibm.com/developerworks/webservices/library/ws-mqtt/index.html</hyperlink>
+    </reference>
+    <reference id="MQTT311">
+      <name>MQTT Version 3.1.1</name>
+      <title>MQTT v3.1.1</title>
+      <organization>OASIS Message Queuing Telemetry Transport (MQTT) TC</organization>
+      <date>October 2014</date>
+      <hyperlink>https://www.oasis-open.org/standards#mqttv3.1.1</hyperlink>
+    </reference>
+    <reference id="OUI">
+      <name>Organizationally Unique Identifiers (OUIs)</name>
+      <hyperlink>http://standards.ieee.org/faqs/OUI.html</hyperlink>
+    </reference>
+    <reference id="PCPProxy">
+      <name>PCP Proxy Function</name>
+      <title>Port Control Protocol (PCP) Proxy Function</title>
+      <organization>IETF</organization>
+      <date>January 2014</date>
+      <hyperlink>http://tools.ietf.org/html/draft-ietf-pcp-proxy</hyperlink>
+    </reference>
+    <reference id="POSIXBase">
+      <name>ISO/IEC/IEEE 9945</name>
+      <title>Information technology - Portable Operating System Interface (POSIX) Base Specifications, Issue 7</title>
+      <organization>ISO/IEC/IEEE</organization>
+      <date>September 2009</date>
+      <hyperlink>http://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=4694974</hyperlink>
+    </reference>
+    <reference id="RED">
+      <name>References on RED (Random Early Detection) Queue Management</name>
+      <hyperlink>http://www.icir.org/floyd/red.html</hyperlink>
+    </reference>
+    <reference id="RFC793">
+      <name>RFC 793</name>
+      <title>Transmission Control Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>September 1981</date>
+      <hyperlink>http://tools.ietf.org/html/rfc793</hyperlink>
+    </reference>
+    <reference id="RFC862">
+      <name>RFC 862</name>
+      <title>Echo Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1983</date>
+      <hyperlink>http://tools.ietf.org/html/rfc862</hyperlink>
+    </reference>
+    <reference id="RFC959">
+      <name>RFC 959</name>
+      <title>File Transfer Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1985</date>
+      <hyperlink>http://tools.ietf.org/html/rfc959</hyperlink>
+    </reference>
+    <reference id="RFC1035">
+      <name>RFC 1035</name>
+      <title>Domain Names - Implementation and Specification</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1987</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1035</hyperlink>
+    </reference>
+    <reference id="RFC1323">
+      <name>RFC 1323</name>
+      <title>TCP Extensions for High Performance</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>May 1992</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1323</hyperlink>
+    </reference>
+    <reference id="RFC1332">
+      <name>RFC 1332</name>
+      <title>The PPP Internet Protocol Control Protocol (IPCP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1992</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1332</hyperlink>
+    </reference>
+    <reference id="RFC1378">
+      <name>RFC 1378</name>
+      <title>The PPP AppleTalk Control Protocol (ATCP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1992</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1378</hyperlink>
+    </reference>
+    <reference id="RFC1552">
+      <name>RFC 1552</name>
+      <title>The PPP Internetwork Packet Exchange Control Protocol (IPXCP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1993</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1552</hyperlink>
+    </reference>
+    <reference id="RFC1661">
+      <name>RFC 1661</name>
+      <title>The Point-to-Point Protocol (PPP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1994</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1661</hyperlink>
+    </reference>
+    <reference id="RFC1877">
+      <name>RFC 1877</name>
+      <title>PPP Internet Protocol Control Protocol Extensions for Name Server Addresses</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1995</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1877</hyperlink>
+    </reference>
+    <reference id="RFC1974">
+      <name>RFC 1974</name>
+      <title>PPP Stac LZS Compression Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1996</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1974</hyperlink>
+    </reference>
+    <reference id="RFC2080">
+      <name>RFC 2080</name>
+      <title>RIPng for IPv6</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1997</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2080</hyperlink>
+    </reference>
+    <reference id="RFC2097">
+      <name>RFC 2097</name>
+      <title>The PPP NetBIOS Frames Control Protocol (NBFCP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1997</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2097</hyperlink>
+    </reference>
+    <reference id="RFC2131">
+      <name>RFC 2131</name>
+      <title>Dynamic Host Configuration Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2131</hyperlink>
+    </reference>
+    <reference id="RFC2132">
+      <name>RFC 2132</name>
+      <title>DHCP Options and BOOTP Vendor Extensions</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2132</hyperlink>
+    </reference>
+    <reference id="RFC2225">
+      <name>RFC 2225</name>
+      <title>Classical IP and ARP over ATM</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2225</hyperlink>
+    </reference>
+    <reference id="RFC2364">
+      <name>RFC 2364</name>
+      <title>PPP Over AAL5</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1998</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2364</hyperlink>
+    </reference>
+    <reference id="RFC2474">
+      <name>RFC 2474</name>
+      <title>Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2474</hyperlink>
+    </reference>
+    <reference id="RFC2581">
+      <name>RFC 2581</name>
+      <title>TCP Congestion Control</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>April 1999</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2581</hyperlink>
+    </reference>
+    <reference id="RFC2582">
+      <name>RFC 2582</name>
+      <title>The NewReno Modification to TCP's Fast Recovery Algorithm</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>April 1999</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2582</hyperlink>
+    </reference>
+    <reference id="RFC2616">
+      <name>RFC 2616</name>
+      <title>Hypertext Transfer Protocol -- HTTP/1.1</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1999</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2616</hyperlink>
+    </reference>
+    <reference id="RFC2684">
+      <name>RFC 2684</name>
+      <title>Multiprotocol Encapsulation over ATM Adaptation Layer 5</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2684</hyperlink>
+    </reference>
+    <reference id="RFC2697">
+      <name>RFC 2697</name>
+      <title>A Single Rate Three Color Marker</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2697</hyperlink>
+    </reference>
+    <reference id="RFC2698">
+      <name>RFC 2698</name>
+      <title>A Two Rate Three Color Marker</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2698</hyperlink>
+    </reference>
+    <reference id="RFC2782">
+      <name>RFC 2782</name>
+      <title>A DNS RR for specifying the location of services (DNS SRV)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2782</hyperlink>
+    </reference>
+    <reference id="RFC2784">
+      <name>RFC 2784</name>
+      <title>Generic Routing Encapsulation (GRE)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>November 2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2784</hyperlink>
+    </reference>
+    <reference id="RFC2818">
+      <name>RFC 2818</name>
+      <title>HTTP Over TLS</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>May 2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2818</hyperlink>
+    </reference>
+    <reference id="RFC2819">
+      <name>RFC 2819</name>
+      <title>Remote Network Monitoring Management Information Base</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2819</hyperlink>
+    </reference>
+    <reference id="RFC2863">
+      <name>RFC 2863</name>
+      <title>The Interfaces Group MIB</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2863</hyperlink>
+    </reference>
+    <reference id="RFC2865">
+      <name>RFC 2865</name>
+      <title>Remote Authentication Dial In User Service (RADIUS)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2865</hyperlink>
+    </reference>
+    <reference id="RFC2866">
+      <name>RFC 2866</name>
+      <title>RADIUS Accounting</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2866</hyperlink>
+    </reference>
+    <reference id="RFC2869">
+      <name>RFC 2869</name>
+      <title>RADIUS Extensions</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2869</hyperlink>
+    </reference>
+    <reference id="RFC2890">
+      <name>RFC 2890</name>
+      <title>Key and Sequence Number Extensions to GRE</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>November 2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2890</hyperlink>
+    </reference>
+    <reference id="RFC2898">
+      <name>RFC 2898</name>
+      <title>PKCS #5: Password-Based Cryptography Specification Version 2.0</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2898</hyperlink>
+    </reference>
+    <reference id="RFC2974">
+      <name>RFC 2974</name>
+      <title>Session Announcement Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>October 2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2974</hyperlink>
+    </reference>
+    <reference id="RFC3004">
+      <name>RFC 3004</name>
+      <title>The User Class Option for DHCP</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc3004</hyperlink>
+    </reference>
+    <reference id="RFC3066">
+      <name>RFC 3066</name>
+      <title>Tags for the Identification of Languages</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc3066</hyperlink>
+    </reference>
+    <reference id="RFC3232">
+      <name>RFC 3232</name>
+      <title>"Assigned Numbers: RFC 1700 is Replaced by an On-line Database"</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2002</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3232</hyperlink>
+    </reference>
+    <reference id="RFC3315">
+      <name>RFC 3315</name>
+      <title>Dynamic Host Configuration Protocol for IPv6 (DHCPv6)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2003</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3315</hyperlink>
+    </reference>
+    <reference id="RFC3339">
+      <name>RFC 3339</name>
+      <title>Date and Time on the Internet: Timestamps</title>
+      <organization>IETF</organization>
+      <category>Draft Standard</category>
+      <date>July, 2002</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3339</hyperlink>
+    </reference>
+    <reference id="RFC3489">
+      <name>RFC 3489</name>
+      <title>STUN - Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc3489</hyperlink>
+    </reference>
+    <reference id="RFC3596">
+      <name>RFC 3596</name>
+      <title>DDNS Extensions to Support IP Version 6</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2003</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3596</hyperlink>
+    </reference>
+    <reference id="RFC3633">
+      <name>RFC 3633</name>
+      <title>IPv6 Prefix Options for Dynamic Host Configuration Protocol (DHCP) version 6</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2003</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3633</hyperlink>
+    </reference>
+    <reference id="RFC3646">
+      <name>RFC 3646</name>
+      <title>DNS Configuration options for Dynamic Host Configuration Protocol for IPv6 (DHCPv6)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2003</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3646</hyperlink>
+    </reference>
+    <reference id="RFC3775">
+      <name>RFC 3775</name>
+      <title>Mobility Support in IPv6</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2004</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3775</hyperlink>
+    </reference>
+    <reference id="RFC3925">
+      <name>RFC 3925</name>
+      <title>Vendor-Identifying Vendor Options for Dynamic Host Configuration Protocol version 4 (DHCPv4)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc3925</hyperlink>
+    </reference>
+    <reference id="RFC3926">
+      <name>RFC 3926</name>
+      <title>FLUTE - File Delivery over Unidirectional Transport</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>October 2004</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3926</hyperlink>
+    </reference>
+    <reference id="RFC3927">
+      <name>RFC 3927</name>
+      <title>Dynamic Configuration of IPv4 Link-Local Addresses</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3927</hyperlink>
+    </reference>
+    <reference id="RFC3931">
+      <name>RFC 3931</name>
+      <title>Layer Two Tunneling Protocol - Version 3 (L2TPv3)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>March 2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3931</hyperlink>
+    </reference>
+    <reference id="RFC3948">
+      <name>RFC 3948</name>
+      <title>UDP Encapsulation of IPsec ESP Packets</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>January 2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3948</hyperlink>
+    </reference>
+    <reference id="RFC3986">
+      <name>RFC 3986</name>
+      <title>Uniform Resource Identifier (URI): Generic Syntax</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc3986</hyperlink>
+    </reference>
+    <reference id="RFC4122">
+      <name>RFC 4122</name>
+      <title>A Universally Unique IDentifier (UUID) URN Namespace</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4122</hyperlink>
+    </reference>
+    <reference id="RFC4180">
+      <name>RFC4180</name>
+      <title>Common Format and MIME Type for Comma-Separated Values (CSV) Files</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>October 2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4180</hyperlink>
+    </reference>
+    <reference id="RFC4191">
+      <name>RFC 4191</name>
+      <title>Default Router Preferences and More-Specific Routes</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4191</hyperlink>
+    </reference>
+    <reference id="RFC4193">
+      <name>RFC 4193</name>
+      <title>Unique Local IPv6 Unicast Addresses</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4193</hyperlink>
+    </reference>
+    <reference id="RFC4242">
+      <name>RFC 4242</name>
+      <title>Information Refresh Time Option for Dynamic Host Configuration Protocol for IPv6 (DHCPv6)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4242</hyperlink>
+    </reference>
+    <reference id="RFC4291">
+      <name>RFC 4291</name>
+      <title>IP Version 6 Addressing Architecture</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4291</hyperlink>
+    </reference>
+    <reference id="RFC4292">
+      <name>RFC 4292</name>
+      <title>IP Forwarding Table MIB</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4292</hyperlink>
+    </reference>
+    <reference id="RFC4293">
+      <name>RFC 4293</name>
+      <title>Management Information Base for the Internet Protocol (IP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4293</hyperlink>
+    </reference>
+    <reference id="RFC4301">
+      <name>RFC 4301</name>
+      <title>Security Architecture for the Internet Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>December 2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4301</hyperlink>
+    </reference>
+    <reference id="RFC4302">
+      <name>RFC 4302</name>
+      <title>IP Authentication Header</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>December 2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4302</hyperlink>
+    </reference>
+    <reference id="RFC4303">
+      <name>RFC 4303</name>
+      <title>IP Encapsulating Security Payload (ESP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>December 2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4303</hyperlink>
+    </reference>
+    <reference id="RFC4389">
+      <name>RFC 4389</name>
+      <title>Neighbor Discovery Proxies (ND Proxy)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4389</hyperlink>
+    </reference>
+    <reference id="RFC4632">
+      <name>RFC 4632</name>
+      <title>Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4632</hyperlink>
+    </reference>
+    <reference id="RFC4719">
+      <name>RFC 4719</name>
+      <title>Transport of Ethernet Frames over Layer 2 Tunneling Protocol Version 3 (L2TPv3)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>November 2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4719</hyperlink>
+    </reference>
+    <reference id="RFC4835">
+      <name>RFC 4835</name>
+      <title>Cryptographic Algorithm Implementation Requirements for Encapsulating Security Payload (ESP) and Authentication Header (AH)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2007</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4835</hyperlink>
+    </reference>
+    <reference id="RFC4861">
+      <name>RFC 4861</name>
+      <title>Neighbor Discovery for IP version 6 (IPv6)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2007</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4861</hyperlink>
+    </reference>
+    <reference id="RFC4862">
+      <name>RFC 4862</name>
+      <title>IPv6 Stateless Address Autoconfiguration</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2007</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4862</hyperlink>
+    </reference>
+    <reference id="RFC5072">
+      <name>RFC 5072</name>
+      <title>IP Version 6 over PPP</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2007</date>
+      <hyperlink>http://tools.ietf.org/html/rfc5072</hyperlink>
+    </reference>
+    <reference id="RFC5139">
+      <name>RFC 5139</name>
+      <title>Revised Civic Location Format For Presence Information Data Format Location Object (PIDF-LO)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>February 2008</date>
+      <hyperlink>http://tools.ietf.org/html/rfc5139</hyperlink>
+    </reference>
+    <reference id="RFC5280">
+      <name>RFC 5280</name>
+      <title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>May 2008</date>
+      <hyperlink>http://tools.ietf.org/html/rfc5280</hyperlink>
+    </reference>
+    <reference id="RFC5491">
+      <name>RFC 5491</name>
+      <title>GEOPRIV Presence Information Data Format Location Object (PIDF-LO) Usage Clarification, Considerations, and Recommendations</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>March 2009</date>
+      <hyperlink>http://tools.ietf.org/html/rfc5491</hyperlink>
+    </reference>
+    <reference id="RFC5625">
+      <name>RFC 5625</name>
+      <title>DNS Proxy Implementation Guidelines</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2009</date>
+      <hyperlink>http://tools.ietf.org/html/rfc5625</hyperlink>
+    </reference>
+    <reference id="RFC5969">
+      <name>RFC 5969</name>
+      <title>IPv6 Rapid Deployment on IPv4 Infrastructures (6rd) - Protocol Specification</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2010</date>
+      <hyperlink>http://tools.ietf.org/html/rfc5969</hyperlink>
+    </reference>
+    <reference id="RFC5996">
+      <name>RFC 5996</name>
+      <title>Internet Key Exchange Protocol Version 2 (IKEv2)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>September 2010</date>
+      <hyperlink>http://tools.ietf.org/html/rfc5996</hyperlink>
+    </reference>
+    <reference id="RFC6106">
+      <name>RFC 6106</name>
+      <title>IPv6 Router Advertisement Option for DNS Configuration</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2010</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6106</hyperlink>
+    </reference>
+    <reference id="RFC6120">
+      <name>RFC 6120</name>
+      <title>Extensible Messaging and Presence Protocol (XMPP) : Core</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2011</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6120</hyperlink>
+    </reference>
+    <reference id="RFC6887">
+      <name>RFC 6887</name>
+      <title>Port Control Protocol (PCP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2013</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6887</hyperlink>
+    </reference>
+    <reference id="RFC6970">
+      <name>RFC 6970</name>
+      <title>Universal Plug and Play (UPnP) Internet Gateway Device (IGD) - Port Control Protocol (PCP) Interworking Function</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2013</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6970</hyperlink>
+    </reference>
+    <reference id="RFC7159">
+      <name>RFC7159</name>
+      <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>March 2014</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7159</hyperlink>
+    </reference>
+    <reference id="RFC7291">
+      <name>RFC 7291</name>
+      <title>DHCP Options for the Port Control Protocol (PCP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2014</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7291</hyperlink>
+    </reference>
+    <reference id="RFC7348">
+      <name>RFC 7348</name>
+      <title>Virtual eXtensible Local Area Network (VXLAN)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>August 2014</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7348</hyperlink>
+    </reference>
+    <reference id="RFC7395">
+      <name>RFC 7395</name>
+      <title>An Extensible Messaging and Presence Protocol (XMPP) Subprotocol for WebSocket</title>
+      <organization>IETF</organization>
+      <category>Standards Track</category>
+      <date>October 2014</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7395</hyperlink>
+    </reference>
+    <reference id="RFC7398">
+      <name>RFC 7398</name>
+      <title>A Reference Path and Measurement Points for Large-Scale Measurement of Broadband Performance</title>
+      <organization>IETF</organization>
+      <category>Informational RFC</category>
+      <date>February 2015</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7398</hyperlink>
+    </reference>
+    <reference id="RFC7594">
+      <name>RFC 7594</name>
+      <title>A Framework for Large-Scale Measurement of Broadband Performance (LMAP)</title>
+      <organization>IETF</organization>
+      <category>Informational RFC</category>
+      <date>September 2015</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7594</hyperlink>
+    </reference>
+    <reference id="RFC7597">
+      <name>RFC 7597</name>
+      <title>Mapping of Address and Port with Encapsulation (MAP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>July 2015</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7597</hyperlink>
+    </reference>
+    <reference id="RFC7598">
+      <name>RFC 7598</name>
+      <title>DHCPv6 Options for configuration of Softwire Address and Port Mapped Clients</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>July 2015</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7598</hyperlink>
+    </reference>
+    <reference id="RFC7599">
+      <name>RFC 7599</name>
+      <title>Mapping of Address and Port using Translation (MAP-T)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>July 2015</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7599</hyperlink>
+    </reference>
+    <reference id="SOAP1.1">
+      <name>Simple Object Access Protocol (SOAP) 1.1</name>
+      <organization>W3C</organization>
+      <hyperlink>http://www.w3.org/TR/2000/NOTE-SOAP-20000508</hyperlink>
+    </reference>
+    <reference id="TR-064">
+      <name>TR-064</name>
+      <title>LAN-Side DSL CPE Configuration Specification</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2004</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-064.pdf</hyperlink>
+    </reference>
+    <reference id="TR-069">
+      <name>TR-069</name>
+      <title>CPE WAN Management Protocol</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2004</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-069.pdf</hyperlink>
+    </reference>
+    <reference id="TR-069a2">
+      <name>TR-069 Amendment 2</name>
+      <title>CPE WAN Management Protocol</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2007</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-069_Amendment-2.pdf</hyperlink>
+    </reference>
+    <reference id="TR-069a3">
+      <name>TR-069 Amendment 3</name>
+      <title>CPE WAN Management Protocol</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2010</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-069_Amendment-3.pdf</hyperlink>
+    </reference>
+    <reference id="TR-069a4">
+      <name>TR-069 Amendment 4</name>
+      <title>CPE WAN Management Protocol</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2011</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-069_Amendment-4.pdf</hyperlink>
+    </reference>
+    <reference id="TR-069a5">
+      <name>TR-069 Amendment 5</name>
+      <title>CPE WAN Management Protocol</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>December 2013</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-069_Amendment-5.pdf</hyperlink>
+    </reference>
+    <reference id="TR-098">
+      <name>TR-098</name>
+      <title>Internet Gateway Device Data Model for TR-069</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2005</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-098.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106">
+      <name>TR-106</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2005</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106a2">
+      <name>TR-106 Amendment 2</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2008</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106_Amendment-2.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106a3">
+      <name>TR-106 Amendment 3</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2009</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106_Amendment-3.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106a4">
+      <name>TR-106 Amendment 4</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2010</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106_Amendment-4.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106a5">
+      <name>TR-106 Amendment 5</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2010</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106_Amendment-5.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106a6">
+      <name>TR-106 Amendment 6</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2011</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106_Amendment-6.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106a7">
+      <name>TR-106 Amendment 7</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2013</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106_Amendment-7.pdf</hyperlink>
+    </reference>
+    <reference id="TR-143">
+      <name>TR-143</name>
+      <title>Enabling Network Throughput Performance Tests and Statistical Monitoring</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2008</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-143.pdf</hyperlink>
+    </reference>
+    <reference id="TR-143a1">
+      <name>TR-143 Amendment 1</name>
+      <title>Enabling Network Throughput Performance Tests and Statistical Monitoring</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>December 2014</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-143_Amendment-1.pdf</hyperlink>
+    </reference>
+    <reference id="TR-157">
+      <name>TR-157</name>
+      <title>Component Object for CWMP</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>March 2009</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-157.pdf</hyperlink>
+    </reference>
+    <reference id="TR-157a10">
+      <name>TR-157 Amendment 10</name>
+      <title>Component Objects for CWMP</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2015</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-157_Amendment-10.pdf</hyperlink>
+    </reference>
+    <reference id="TR-157a3">
+      <name>TR-157 Amendment 3</name>
+      <title>Component Objects for CWMP</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2010</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-157_Amendment-3.pdf</hyperlink>
+    </reference>
+    <reference id="TR-159">
+      <name>TR-159</name>
+      <title>Management Framework for xDSL Bonding</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2008</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-159.pdf</hyperlink>
+    </reference>
+    <reference id="TR-181i1">
+      <name>TR-181 Issue 1</name>
+      <title>Device Data Model for TR-069</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2010</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-181_Issue-1.pdf</hyperlink>
+    </reference>
+    <reference id="TR-181i2">
+      <name>TR-181 Issue 2</name>
+      <title>Device Data Model for TR-069</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2010</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-181_Issue-2.pdf</hyperlink>
+    </reference>
+    <reference id="TR-232">
+      <name>TR-232</name>
+      <title>Bulk Data Collection</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>May 2012</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-232.pdf</hyperlink>
+    </reference>
+    <reference id="TR-262">
+      <name>TR-262</name>
+      <title>Femto Component Objects</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2011</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-262.pdf</hyperlink>
+    </reference>
+    <reference id="TR-304">
+      <name>TR-304</name>
+      <title>Broadband Access Service Attributes and Performance Metrics</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>March 2015</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-304.pdf</hyperlink>
+    </reference>
+    <reference id="TR-390">
+      <name>WT-390</name>
+      <title>Performance Measurement from Customer Equipment to IP Edge</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>November 2016</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-390.pdf</hyperlink>
+    </reference>
+    <reference id="TR-181i2a2">
+      <name>TR-181 Issue 2 Amendment 2</name>
+      <title>Device Data Model for TR-069</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2011</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-181_Issue-2_Amendment-2.pdf</hyperlink>
+    </reference>
+    <reference id="TR-181i2a5">
+      <name>TR-181 Issue 2 Amendment 5</name>
+      <title>Device Data Model for TR-069</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2012</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-181_Issue-2_Amendment-5.pdf</hyperlink>
+    </reference>
+    <reference id="TR-181i2a8">
+      <name>TR-181 Issue 2 Amendment 8</name>
+      <title>Device Data Model for TR-069</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>September 2014</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-181_Issue-2_Amendment-8.pdf</hyperlink>
+    </reference>
+    <reference id="UPA-PLC">
+      <name>Universal Powerline Association</name>
+      <organization>UPA</organization>
+      <hyperlink>http://www.upaplc.org</hyperlink>
+    </reference>
+    <reference id="UPnP-DAv1">
+      <name>UPnP Device Architecture</name>
+      <title>UPnP Device Architecture 1.0</title>
+      <organization>UPnP Forum</organization>
+      <date>April 2008</date>
+      <hyperlink>http://www.upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.0-20080424.pdf</hyperlink>
+    </reference>
+    <reference id="UPnP-DAv11">
+      <name>UPnP Device Architecture 1.1</name>
+      <title>UPnP Device Architecture 1.1</title>
+      <organization>UPnP Forum</organization>
+      <date>October, 2008</date>
+      <hyperlink>http://www.upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf</hyperlink>
+    </reference>
+    <reference id="UPnP-DM:1">
+      <name>UPnP Device Management:1</name>
+      <title>UPnP Device Management v1</title>
+      <hyperlink>http://upnp.org/specs/dm/dm1/</hyperlink>
+    </reference>
+    <reference id="UPnP-IGD:1">
+      <name>UPnP InternetGatewayDevice:1</name>
+      <title>InternetGatewayDevice:1 Device Template Version 1.01</title>
+      <organization>UPnP</organization>
+      <category>SDCP</category>
+      <date>2001</date>
+      <hyperlink>http://upnp.org/specs/gw/UPnP-gw-InternetGatewayDevice-v1-Device.pdf</hyperlink>
+    </reference>
+    <reference id="UPnP-IGD:2">
+      <name>UPnP InternetGatewayDevice:2</name>
+      <title>InternetGatewayDevice:2 Device Template Version 1.01</title>
+      <organization>UPnP</organization>
+      <category>SDCP</category>
+      <date>2010</date>
+      <hyperlink>http://upnp.org/specs/gw/UPnP-gw-InternetGatewayDevice-v2-Device.pdf</hyperlink>
+    </reference>
+    <reference id="USB1.0">
+      <name>USB 1.0</name>
+      <title>USB 1.0 Specification</title>
+      <organization>USB-IF</organization>
+      <date>January 1996</date>
+      <hyperlink>http://www.usb.org/developers/docs/</hyperlink>
+    </reference>
+    <reference id="USB2.0">
+      <name>USB 2.0</name>
+      <title>USB 2.0 Specification</title>
+      <organization>USB-IF</organization>
+      <date>April 2000</date>
+      <hyperlink>http://www.usb.org/developers/docs/usb_20_122208.zip</hyperlink>
+    </reference>
+    <reference id="USB3.0">
+      <name>USB 3.0</name>
+      <title>USB 3.0 Specification</title>
+      <organization>USB-IF</organization>
+      <date>November 2008</date>
+      <hyperlink>http://www.usb.org/developers/docs/usb_30_spec.zip</hyperlink>
+    </reference>
+    <reference id="WPS 2.0">
+      <name>WSC 2.0</name>
+      <title>Wi-Fi Simple Configuration Technical Specification Version 2.0.x </title>
+      <organization>Wi-Fi Alliance</organization>
+      <hyperlink>http://www.wi-fi.org/discover-wi-fi/wi-fi-protected-setup</hyperlink>
+    </reference>
+    <reference id="WPSv1.0">
+      <name>Wi-Fi Protected Setup Specification Version 1.0h</name>
+      <title>Wi-Fi Alliance</title>
+      <date>2006</date>
+      <hyperlink>http://www.wi-fi.org</hyperlink>
+    </reference>
+    <reference id="Z-Wave">
+      <name>Z-Wave</name>
+      <title>Z-Wave website</title>
+      <hyperlink>http://www.z-wave.com</hyperlink>
+    </reference>
+    <reference id="ZigBee">
+      <name>ZigBee</name>
+      <title>ZigBee Alliance website</title>
+      <hyperlink>http://www.zigbee.org</hyperlink>
+    </reference>
+    <reference id="ZigBee2007">
+      <name>ZigBee 2007 Specification</name>
+      <title>ZigBee 2007 Specification</title>
+      <organization>ZigBee Alliance</organization>
+      <date>October 2007</date>
+      <hyperlink>http://www.zigbee.org/Specifications/ZigBee/download.aspx</hyperlink>
+    </reference>
+  </bibliography>
+  <model name="Device:2.12">
+    <object name="Device." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The top-level object for a Device.
+      </description>
+      <parameter name="RootDataModelVersion" access="readOnly" forcedInform="true" dmr:version="2.4">
+        <description>
+          Root data model version, e.g. ''2.4''.  For a vendor-defined root data model, this is the standard Broadband Forum model on which the vendor-defined model is based.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+            <pattern value="2\.\d+"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceStackNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Services." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains general services information.
+      </description>
+    </object>
+    <object name="Device.DeviceInfo." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains general device information.
+      </description>
+      <parameter name="DeviceCategory" access="readOnly" dmr:version="2.8">
+        <description>
+          Each list item is a device category (e.g. "AV_TV" and "AV_Recorder"), or the value is {{empty}} if no such element is provided by the device.
+          Note: It is assumed that this list might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. Standard HTIP device categories are defined in {{bibref|JJ-300.01}}. In this case, the maximum length of the list is 127 and of each item is 31, and any non-HTIP device categories SHOULD NOT conflict with standard HTIP device categories.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Manufacturer" access="readOnly" dmr:version="2.0">
+        <description>
+          The manufacturer of the CPE (human readable string).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerOUI" access="readOnly" dmr:version="2.0">
+        <description>
+          Organizationally unique identifier of the device manufacturer. Represented as a six hexadecimal-digit value using all upper-case letters and including any leading zeros. {{pattern}}
+          The value MUST be a valid OUI as defined in {{bibref|OUI}}.
+          This value MUST remain fixed over the lifetime of the device, including across firmware updates.
+          Any change would indicate that it's a new device and would therefore require a BOOTSTRAP Inform.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedDataModelNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ModelName" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Model name of the CPE (human readable string).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModelNumber" access="readOnly" dmr:version="2.8">
+        <description>
+          The model number of the device (human readable string), or {{empty}} if no model number is provided by the device.
+          Note: It is assumed that this string might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, the maximum length of the string is 31.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          A full description of the CPE device (human readable string).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProductClass" access="readOnly" dmr:version="2.0">
+        <description>
+          Identifier of the class of product for which the serial number applies.  That is, for a given manufacturer, this  parameter is used to identify the product or class of product over which the {{param|SerialNumber}} parameter is unique.
+          This value MUST remain fixed over the lifetime of the device, including across firmware updates. Any change would indicate that it's  a new device and would therefore require a BOOTSTRAP Inform.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="2.0">
+        <description>
+          Identifier of the particular device that is unique for the indicated class of product and manufacturer.
+          This value MUST remain fixed over the lifetime of the device, including across firmware updates. Any change would indicate that it's  a new device and would therefore require a BOOTSTRAP Inform.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="HardwareVersion" access="readOnly" forcedInform="true" dmr:version="2.0">
+        <description>
+          A string identifying the particular CPE model and version.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SoftwareVersion" access="readOnly" activeNotify="forceEnabled" forcedInform="true" dmr:version="2.0">
+        <description>
+          A string identifying the software version currently installed in the CPE (i.e. version of the overall CPE  firmware).
+          To allow version comparisons, this element SHOULD be in the form of dot-delimited integers, where each successive integer represents a more minor category of variation. For example, ''3.0.21'' where the components mean: ''Major.Minor.Build''.
+          For CPEs that support multiple firmware images, the value for this parameter MUST be the software version of the active firmware image.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ActiveFirmwareImage" access="readOnly" dmr:version="2.12">
+        <description>
+          {{noreference}}A full path reference to the row in the {{object|FirmwareImage}} table representing the currently running firmware image.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="FirmwareImage." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BootFirmwareImage" access="readWrite" dmr:version="2.12">
+        <description>
+          {{noreference}}A full path reference to the row in the {{object|FirmwareImage}} table of the firmware image that is to be loaded the next time the device boots.
+          This parameter value cannot be empty and must point to a valid and enabled {{object|FirmwareImage}} object where the ({{param|FirmwareImage.{i}.Available}} parameter is set to 'true'). Out of the factory, this parameter should be set to point to the firmware image the CPE will attempt to boot when first powered on.
+          The firmware image instance referenced by this parameter must also have an Available parameter value of 'true'. Attempting to set this parameter to point to a non-enabled firmware image MUST result in the CPE responding with a CWMP fault (9007).
+          In situations where the CPE cannot boot the firmware image specified by this parameter and manages to boot a different firmware image, the CPE MUST NOT modify this value to point to the alternate firmware image that is currently active.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="FirmwareImage." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalHardwareVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}}  Each entry is an additional version.  Represents any additional hardware version information the vendor might wish to supply.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="64"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalSoftwareVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}}  Each entry is an additional version.  Represents any additional software version information the vendor might wish to supply.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="64"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ProvisioningCode" access="readWrite" activeNotify="forceEnabled" forcedInform="true" dmr:version="2.0">
+        <description>
+          Identifier of the primary service provider and other provisioning information, which MAY be used by the ACS to  determine service provider-specific customization and provisioning parameters.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UpTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Time in {{units}} since the CPE was last restarted.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FirstUseDate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Date and time in UTC that the CPE first both successfully established an IP-layer network connection and acquired an absolute time reference using NTP or equivalent over that network connection.  The CPE MAY reset this date after a factory reset.
+          If NTP or equivalent is not available, this parameter, if present, SHOULD be set to the Unknown Time value.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareImageNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorConfigFileNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ProcessorNumberOfEntries" access="readOnly" dmr:version="2.1">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorLogFileNumberOfEntries" access="readOnly" dmr:version="2.1">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LocationNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceImageNumberOfEntries" access="readOnly" dmr:version="2.11">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.VendorConfigFile.{i}." access="readOnly" numEntriesParameter="VendorConfigFileNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Every instance of this object is a Vendor Configuration File, and contains parameters associated with the Vendor  Configuration File.
+        This table of Vendor Configuration Files is for information only and does not allow the ACS to operate on these files in any way.
+        Whenever the CPE successfully downloads a configuration file as a result of the Download RPC with the FileType argument of ''3 Vendor Configuration File'', the CPE MUST update this table.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          Name of the vendor configuration file.
+          If the CPE is able to obtain the name of the configuration file from the file itself, then the value of this parameter MUST be set to that name.
+          Otherwise, if the CPE can extract the file name from the URL used to download the configuration file, then the value of this  parameter MUST be set to that name.
+          Otherwise, the value of this parameter MUST be set to the value of the TargetFileName argument of the Download RPC used to download this configuration file.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.0">
+        <description>
+          A string identifying the configuration file version currently used in the CPE.
+          If the CPE is able to obtain the version of the configuration file from the file itself, then the value of this parameter MUST be set to the obtained value.
+          Otherwise, the value of this parameter MUST be {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="16"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Date" access="readOnly" dmr:version="2.0">
+        <description>
+          Date and time when the content of the current version of this vendor configuration file was first applied by the CPE.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readOnly" dmr:version="2.0">
+        <description>
+          A description of the vendor configuration file (human-readable string).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UseForBackupRestore" access="readOnly" dmr:version="2.7">
+        <description>
+          When {{true}}, this parameter indicates that this {{object}} instance is to be used for backup and restoration purposes.
+          Note: The backup and restore operations may require the use of multiple {{object}} instances. In this scenario the mechanism for detemining the order and combination of {{object}} instances used for backup and restoration purposes is implementation specific.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.MemoryStatus." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Status of the device's volatile physical memory.
+      </description>
+      <parameter name="Total" access="readOnly" dmr:version="2.0">
+        <description>
+          The total physical RAM, in {{units}}, installed on the device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="kilobytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Free" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The free physical RAM, in {{units}}, currently available on the device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="kilobytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.ProcessStatus." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Status of the processes on the device.
+      </description>
+      <parameter name="CPUUsage" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total amount of the CPU, in {{units}}, rounded up to the nearest whole {{units}}.  In the case that multiple CPU are present, this value represents the average of all CPU.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="100"/>
+            <units value="percent"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ProcessNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+          Since a Process can come and go very quickly, the CPE SHOULD place a locally specified limit on the frequency at which it will notify the ACS of value changes, as described in {{bibref|TR-069a2|Section 3.2.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.ProcessStatus.Process.{i}." access="readOnly" numEntriesParameter="ProcessNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        List of all processes running on the device.
+      </description>
+      <uniqueKey>
+        <parameter ref="PID"/>
+      </uniqueKey>
+      <parameter name="PID" access="readOnly" dmr:version="2.0">
+        <description>
+          The Process Identifier.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Command" access="readOnly" dmr:version="2.0">
+        <description>
+          The name of the command that has caused the process to exist.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Size" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The size in {{units}} of the memory occupied by the process.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="kilobytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Priority" access="readOnly" dmr:version="2.0">
+        <description>
+          The priority of the process where 0 is highest.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="99"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CPUTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The amount of time in {{units}} that the process has spent taking up CPU time since the process was started.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="State" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current state that the process is in.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Running"/>
+            <enumeration value="Sleeping"/>
+            <enumeration value="Stopped"/>
+            <enumeration value="Idle" optional="true"/>
+            <enumeration value="Uninterruptible" optional="true"/>
+            <enumeration value="Zombie" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.TemperatureStatus." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Status of the temperature of the device.
+      </description>
+      <parameter name="TemperatureSensorNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.TemperatureStatus.TemperatureSensor.{i}." access="readOnly" numEntriesParameter="TemperatureSensorNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object represents information that the device has obtained via sampling an internal temperature sensor.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates whether or not the temperature sensor is enabled.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this temperature sensor.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled">
+              <description>
+                The sensor is not currently sampling the temperature.
+              </description>
+            </enumeration>
+            <enumeration value="Enabled">
+              <description>
+                The sensor is currently sampling the temperature.
+              </description>
+            </enumeration>
+            <enumeration value="Error">
+              <description>
+                The sensor error currently prevents sampling the temperature.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Reset" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, resets the temperature sensor.
+        </description>
+        <syntax command="true">
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ResetTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The time at which this temperature sensor was reset.
+          Reset can be caused by:
+          * {{param|Status}} transition from {{enum|Disabled|Status}} to {{enum|Enabled|Status}}
+          * {{param|Reset}} set to {{true}}.
+          * An internal reset of the temperature sensor (including a reboot of the device).
+          The Unknown Time value, as defined in {{bibref|TR-106a2}}, indicates that this temperature sensor has never been reset, which can only happen if it has never been enabled.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          Name of this temperature sensor. This text MUST be sufficient to distinguish this temperature sensor from other temperature sensors.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          This temperature sensor's last good reading in {{units}}.
+          A value of -274 (which is below absolute zero) indicates a good reading has not been obtained since last reset.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-274"/>
+            <units value="degrees celsius"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The time at which this temperature sensor's last good reading was obtained.
+          The Unknown Time value, as defined in {{bibref|TR-106a2}}, indicates a good reading has not been obtained since last reset.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="MinValue" access="readOnly" dmr:version="2.0">
+        <description>
+          This temperature sensor's lowest value  reading in {{units}} since last reset.
+          A value of -274 (which is below absolute zero) indicates a good reading has not been obtained since last reset.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-274"/>
+            <units value="degrees celsius"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="MinTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The time at which this temperature sensor's lowest value was read.
+          The Unknown Time value, as defined in {{bibref|TR-106a2}}, indicates a good reading has not been obtained since last reset.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxValue" access="readOnly" dmr:version="2.0">
+        <description>
+          This temperature sensor's highest value  reading in {{units}} since last reset.
+          A value of -274 (which is below absolute zero) indicates a good reading has not been obtained since last reset.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-274"/>
+            <units value="degrees celsius"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="MaxTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The time at which this temperature sensor's highest value was read.
+          The Unknown Time value, as defined in {{bibref|TR-106a2}}, indicates a good reading has not been obtained since last reset.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LowAlarmValue" access="readWrite" dmr:version="2.0">
+        <description>
+          This temperature sensor's low alarm value in {{units}}.
+          A value of -274 (which is below absolute zero) indicates a non configured value.
+          A change to this value will cause {{param|LowAlarmTime}} to be reset.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-274"/>
+            <units value="degrees celsius"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="LowAlarmTime" access="readOnly" dmr:version="2.0">
+        <description>
+          Initial time at which this temperature sensor's {{param|LowAlarmValue}} was encountered.
+          This value is only set the first time the alarm is seen and not changed until the next reset.
+          The Unknown Time value, as defined in {{bibref|TR-106a2}}, indicates that an alarm has not been encountered since the last reset.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="HighAlarmValue" access="readWrite" dmr:version="2.0">
+        <description>
+          This temperature sensor's high alarm value in {{units}}.
+          A value of -274 (which is below absolute zero) indicates a non configured value.
+          A change to this value will cause {{param|HighAlarmTime}} to be reset.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-274"/>
+            <units value="degrees celsius"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="PollingInterval" access="readWrite" dmr:version="2.1">
+        <description>
+          The interval, measured in {{units}}, in which the device polls this {{object}}.
+          If the value is 0 then the device selects its own polling interval.
+          If the value is greater than 0 then the device MUST use this value as the polling interval.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="HighAlarmTime" access="readOnly" dmr:version="2.0">
+        <description>
+          Initial time at which this temperature sensor's {{param|HighAlarmValue}} was encountered.
+          This value is only set the first time the alarm is seen and not changed until the next reset.
+          The Unknown Time value, as defined in {{bibref|TR-106a2}}, indicates that an alarm has not been encountered since the last reset.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.NetworkProperties." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object defines the parameters that describe how the device handles network traffic.
+      </description>
+      <parameter name="MaxTCPWindowSize" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum number of {{units}} of outstanding data a sender can send on a particular connection prior to an acknowledgment {{bibref|RFC793}}.  Any scaling factor SHOULD be included in this parameter {{bibref|RFC1323}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TCPImplementation" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the TCP congestion control mechanism(s) implemented. {{enum}}
+          Tahoe, Reno, and New Reno are defined in {{bibref|RFC2582}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="Tahoe">
+              <description>
+                Represents the base TCP implementation in {{bibref|RFC793}} and elements of {{bibref|RFC2582}}
+              </description>
+            </enumeration>
+            <enumeration value="Reno">
+              <description>
+                Represents the base TCP implementation in {{bibref|RFC793}} with the additional algorithms defined in {{bibref|RFC2581}}
+              </description>
+            </enumeration>
+            <enumeration value="New Reno">
+              <description>
+                Described as a modification to the Reno algorithms in {{bibref|RFC2582}}
+              </description>
+            </enumeration>
+            <enumeration value="Vegas">
+              <description>
+                An emerging TCP congestion control mechanism
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.Processor.{i}." access="readOnly" numEntriesParameter="ProcessorNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.1" dmr:noUniqueKeys="true">
+      <description>
+        Each table entry represents a hardware or virtual processor that resides on this device.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Architecture" access="readOnly" dmr:version="2.1">
+        <description>
+          The architecture of the processor on the underlying hardware. {{enum}}
+          For processor architectures not included in this list, the vendor MAY include vendor-specific values, which MUST use the format defined in {{bibref|TR-106a4|Section 3.3}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="arm"/>
+            <enumeration value="i386"/>
+            <enumeration value="m68010"/>
+            <enumeration value="m68k"/>
+            <enumeration value="mipseb">
+              <description>
+                big-endian
+              </description>
+            </enumeration>
+            <enumeration value="mipsel">
+              <description>
+                little-endian
+              </description>
+            </enumeration>
+            <enumeration value="powerpc"/>
+            <enumeration value="sh3eb">
+              <description>
+                big-endian
+              </description>
+            </enumeration>
+            <enumeration value="sh3el">
+              <description>
+                little-endian
+              </description>
+            </enumeration>
+            <enumeration value="x86_64"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.VendorLogFile.{i}." access="readOnly" numEntriesParameter="VendorLogFileNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.1">
+      <description>
+        Each table entry represents a Vendor Log File.
+        This table of log files is informational only and does not allow the ACS to operate on these files in any way.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.1">
+        <description>
+          Name of the log file.
+          Typically this will be the full file system path, but provided that it is guaranteed to be unique across current and future log files, it MAY be a shorter name derived from the file system path, or be derived via another mechanism.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumSize" access="readOnly" dmr:version="2.1">
+        <description>
+          The maximum size of the log file in {{units}}.  If the device doesn't know the maximum file size then {{param}} will be 0.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Persistent" access="readOnly" dmr:version="2.1">
+        <description>
+          When {{true}}, the log file contents are preserved across a device reboot.
+          When {{false}}, the log file contents will be purged when the device is rebooted.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.Location.{i}." access="readWrite" numEntriesParameter="LocationNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        This object contains Location information.
+      </description>
+      <uniqueKey>
+        <parameter ref="Source"/>
+        <parameter ref="ExternalSource"/>
+      </uniqueKey>
+      <parameter name="Source" access="readOnly" dmr:version="2.4">
+        <description>
+          Identifies the source of the location data.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="GPS"/>
+            <enumeration value="AGPS"/>
+            <enumeration value="Manual"/>
+            <enumeration value="External"/>
+          </string>
+          <default type="object" value="External"/>
+        </syntax>
+      </parameter>
+      <parameter name="AcquiredTime" access="readOnly" dmr:version="2.4">
+        <description>
+          The time when the location was acquired.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ExternalSource" access="readOnly" dmr:version="2.4">
+        <description>
+          URL, MAC address, or other identifier that identifies an "External" source of this location.
+          Meaningful only if {{param|Source}} has a value of {{enum|External|Source}}, otherwise it MUST be {{empty}}.
+          If {{param|ExternalProtocol}} has a value of {{enum|CWMP|ExternalProtocol}},  this is the URL or IP address of the ACS.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ExternalProtocol" access="readOnly" dmr:version="2.4">
+        <description>
+          Protocol used to acquire a location from an "External" source. {{enum}}
+          Meaningful only if {{param|Source}} has a value of {{enum|External|Source}}, otherwise it MUST be {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="">
+              <description>
+                {{empty}}
+              </description>
+            </enumeration>
+            <enumeration value="CWMP"/>
+            <enumeration value="OMA-DM"/>
+            <enumeration value="SNMP"/>
+            <enumeration value="UPnP"/>
+            <enumeration value="HELD"/>
+            <enumeration value="DHCPv4"/>
+            <enumeration value="DHCPv6"/>
+            <enumeration value="LLDP-MED"/>
+            <enumeration value="MLP"/>
+            <enumeration value="Other"/>
+          </string>
+          <default type="object" value="CWMP"/>
+        </syntax>
+      </parameter>
+      <parameter name="DataObject" access="readWrite" dmr:version="2.4">
+        <description>
+          The currently valid location information.
+          Writable only when {{param|ExternalProtocol}} has a value of {{enum|CWMP|ExternalProtocol}}.
+          If obtained through the local GPS/AGPS then the location information is formatted according to {{bibref|RFC5491}}.
+          If manually configured then location information will be XML-formatted according to {{bibref|RFC5491}} (geographical information) and {{bibref|RFC5139}} (civic addresses).
+          If obtained by an external source this is the location information as received.
+          If it's an XML document (e.g. CWMP, OMA-DM, UPnP, HELD, MLP) the location information will be represented as-is, otherwise it will be converted to base64.
+          CWMP configured location information will be XML-formatted according to {{bibref|RFC5491}} (geographical information) and {{bibref|RFC5139}} (civic addresses).
+          Only zero or one Location object instance with value {{enum|CWMP|ExternalProtocol}} MUST exist at any given time.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1200"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.DeviceImageFile.{i}." access="readOnly" numEntriesParameter="DeviceImageNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.11">
+      <description>
+        This object describes an image of the device.
+      </description>
+      <uniqueKey>
+        <parameter ref="Location"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Location" access="readOnly" dmr:version="2.11">
+        <description>
+          The location of the device that represents the image as the user looks at the front of the device in its typical orientation (e.g., on-end, flat).
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Front"/>
+            <enumeration value="Back"/>
+            <enumeration value="Left"/>
+            <enumeration value="Right"/>
+            <enumeration value="Top"/>
+            <enumeration value="Bottom"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Image" access="readOnly" dmr:version="2.11">
+        <description>
+          The device image in PNG, JPEG or GIF format.
+        </description>
+        <syntax>
+          <base64/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.FirmwareImage.{i}." access="readOnly" numEntriesParameter="FirmwareImageNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        Top-level object for mapping firmware images.
+        This is a static table – the number of object instances in this table is defined by the firmware that is currently running.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.12">
+        <description>
+          Firmware/software image name. Descriptive text of the image or filename.
+          The value of {{param}} is {{empty}} if {{param|Status}} is anything other than {{enum|Available|Status}}, {{enum|InstallationFailed|Status}}, or {{enum|ActivationFailed|Status}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.12">
+        <description>
+          A string identifying the version of the firmware image represented by this {{object}}. Whenever this firmware image is active (ie, the device has booted this firmware image), the value of the {{param|.DeviceInfo.SoftwareVersion}} parameter MUST be the same as the value contained in this parameter.
+          To allow version comparisons, this element SHOULD be in the form of dot-delimited integers, where each successive integer represents a more minor category of variation. For example, 3.0.21 where the components mean: ''Major.Minor.Build''.
+          The value of {{param}} is {{empty}} if {{param|Status}} is anything other than {{enum|Available|Status}}, {{enum|InstallationFailed|Status}}, or {{enum|ActivationFailed|Status}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Available" access="readWrite" dmr:version="2.12">
+        <description>
+          Specifies whether or not this particular firmware image can be used by the Agent. An Agent will only attempt to boot this particular firmware image if this parameter value is set to {{true}}.
+          This value MUST be set to {{true}} whenever a new firmware image is installed.
+          This value cannot be set to {{false}} if the firmware image is active or is referenced by the {{param|#.BootFirmwareImage}} parameter.
+          Firmware image instances cannot be deleted, so a Controller MAY use this parameter to subsequently mark a particular firmware as being invalid, which will prevent the Agent from attempting to boot it.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          Status of the firmware image, as determined by the Agent. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NoImage">
+              <description>
+                This Firmware Image instance is empty.
+                This value could happen on an Agent that supports multiple firmware images, but only has a single image installed.
+              </description>
+            </enumeration>
+            <enumeration value="Downloading">
+              <description>
+                This Firmware Image instance is being downloaded.
+              </description>
+            </enumeration>
+            <enumeration value="Validating">
+              <description>
+                This Firmware Image instance has been downloaded, and is in the process of being validated.
+              </description>
+            </enumeration>
+            <enumeration value="Available">
+              <description>
+                This Firmware Image instance has been downloaded, validated, and installed, and is ready to be activated.
+              </description>
+            </enumeration>
+            <enumeration value="DownloadFailed">
+              <description>
+                The Agent has attempted to download this Firmware Image instance, but ultimately failed while retrieving it from the source URL.
+              </description>
+            </enumeration>
+            <enumeration value="ValidationFailed">
+              <description>
+                The Agent has attempted to validate a Firmware Image downloaded to this instance, but ultimately failed while validating it.
+              </description>
+            </enumeration>
+            <enumeration value="InstallationFailed">
+              <description>
+                The Agent has attempted to install a Firmware Image downloaded and validated to this instance, but ultimately failed while installing it.
+              </description>
+            </enumeration>
+            <enumeration value="ActivationFailed">
+              <description>
+                The Agent has attempted to active this Firmware Image instance, but ultimately failed while being activated.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BootFailureLog" access="readOnly" dmr:version="2.12">
+        <description>
+          If the Agent is unable to boot into this firmware image, when specified, the Agent can use this parameter to record some information as to why the boot failed.
+          If the Agent successfully boots into this firmware, the value of this parameter SHOULD be {{empty}}. When a new firmware image is installed into this object instance, this parameter MUST be cleared.
+          The length of this string is defined as implementation-specific by the Agent.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.SupportedDataModel.{i}." access="readOnly" numEntriesParameter="SupportedDataModelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This table contains details of the device's Current Supported Data Model.
+        The table MUST describe the device's entire Supported Data Model.  Therefore, if a device's Supported Data Model changes at run-time, entries will need to be added or removed as appropriate.
+        Each table entry MUST refer to only a single Root Object or Service Object.  The device MAY choose to use more than one table entry for a given Root Object or Service Object.
+        Considering that every device has some form of a data model, this table MUST NOT be empty.
+      </description>
+      <uniqueKey>
+        <parameter ref="URL"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="UUID"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="URL" access="readOnly" dmr:version="2.0">
+        <description>
+          URL ({{bibref|RFC3986}}) that describes some or all of the device's Current Supported Data Model.
+          The URL MUST reference an XML file which describes the appropriate part of the Supported Data Model.
+          The referenced XML file MUST be compliant with the DT (Device Type) Schema that is described in {{bibref|TR-106a3|Annex B}}, including any additional normative requirements referenced within the Schema.
+          The XML file referenced by this URL MUST NOT change while the CPE is running, and SHOULD NOT change across a CPE reboot. Note that {{param|UUID}} is a unique key, so the XML file referenced by this URL will never change.
+          The XML file MAY be located within the CPE. In this scenario the CPE MAY use the value of "localhost" as URL host portion, When the "localhost" value is used, the ACS has the responsibility to substitute the "localhost" value with the host portion of the connection request URL.
+          Behavior in the event of an invalid URL, failure to access the referenced XML file, or an invalid XML file, is implementation-dependent.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UUID" access="readOnly" dmr:version="2.6">
+        <description>
+          UUID ({{bibref|RFC4122}}) that is the value of the uuid attribute in the DT Instance referenced by {{param|URL}}.
+        </description>
+        <syntax>
+          <dataType ref="UUID"/>
+        </syntax>
+      </parameter>
+      <parameter name="URN" access="readOnly" dmr:version="2.0">
+        <description>
+          URN ({{bibref|RFC3986}}) that is the value of the spec attribute in the DM (data model) Instance that defines the Root Object or Service Object referenced by this table entry.
+          For example, if this table entry references a DT Instance that refers to the ''Device:1.3'' Root Object, the value of this parameter would be ''urn:broadband-forum-org:tr-157-1-0-0'', because TR-157 defines ''Device:1.3''.  If the DT Instance instead referred to a vendor-specific Root Object, e.g. ''X_EXAMPLE_Device:1.0'' (derived from ''Device:1.3''), the value of this parameter would be something like ''urn:example-com:device-1-0-0''.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Features" access="readOnly" dmr:version="2.0">
+        <description>
+          This parameter MUST list exactly the features that are defined using the top-level ''feature'' element in the DT Instance referenced by {{param|URL}}.
+          For example, if the DT instance specified the following:
+          :&lt;feature name="DNSServer"/&gt;
+          :&lt;feature name="Router"/&gt;
+          :&lt;feature name="X_MyDeviceFeature"/&gt;
+          then the value of this parameter might be ''DNSServer,Router,X_MyDeviceFeature''.  The order in which the features are listed is not significant.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.ProxierInfo." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.3">
+      <description>
+        Represents the associated CPE Proxier for a Proxied Device that utilizes the Virtual CWMP Device Mechanism {{bibref|TR-069a4|Annex J.1.1}}.
+      </description>
+      <parameter name="ManufacturerOUI" access="readOnly" dmr:version="2.3">
+        <description>
+          Organizationally unique identifier of the associated CPE Proxier.  Represented as a six hexadecimal-digit value using all upper-case letters and including any leading zeros.  {{pattern}}
+          The value MUST be a valid OUI as defined in {{bibref|OUI}}.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProductClass" access="readOnly" dmr:version="2.3">
+        <description>
+          Identifier of the class of product of the associated CPE Proxier for which the serial number applies.
+          {{empty}} indicates either that the CPE Proxier does not use a product class to differentiate its serial number.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="2.3">
+        <description>
+          Serial number of the associated CPE Proxier.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProxyProtocol" access="readOnly" dmr:version="2.3">
+        <description>
+          The protocol being used to communicate between the CPE Proxier and this Proxied Device. {{enum}}
+          Vendors can extend the enumerated values with vendor specific extensions, in which case the rules outlined in {{bibref|TR-106a6|3.3}} MUST be adhered to.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Z-Wave">
+              <description>
+                see {{bibref|Z-Wave}}
+              </description>
+            </enumeration>
+            <enumeration value="ZigBee">
+              <description>
+                see {{bibref|ZigBee}}
+              </description>
+            </enumeration>
+            <enumeration value="UPnP-DM">
+              <description>
+                see {{bibref|UPnP-DM:1}}
+              </description>
+            </enumeration>
+            <enumeration value="ETSI-M2M">
+              <description>
+                see {{bibref|ETSIM2MFA}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ManagementServer." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains parameters relating to the CPE's association with an ACS.
+      </description>
+      <parameter name="EnableCWMP" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables and disables the CPE's support for CWMP.
+          {{false}} means that CWMP support in the CPE is disabled, in which case the device MUST NOT send any Inform messages to the ACS or  accept any Connection Request notifications from the ACS.
+          {{true}} means that CWMP support on the CPE is enabled.
+          The subscriber can re-enable the CPE's CWMP support either by performing a factory reset or by using a LAN-side protocol to change  the value of this parameter back to {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="URL" access="readWrite" dmr:version="2.0">
+        <description>
+          URL, as defined in {{bibref|RFC3986}}, for the CPE to connect to the ACS using the CPE WAN Management Protocol.
+          This parameter MUST be in the form of a valid HTTP or HTTPS URL.
+          The ''host'' portion of this URL is used by the CPE for validating the ACS certificate when using SSL or TLS.
+          Note that on a factory reset of the CPE, the value of this parameter might be reset to its factory value.  If an ACS modifies the  value of this parameter, it SHOULD be prepared to accommodate the situation that the original value is restored as the result of a  factory reset.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.0">
+        <description>
+          Username used to authenticate the CPE when making a connection to the ACS using the CPE WAN Management Protocol.
+          This username is used only for HTTP-based authentication of the CPE.
+          Note that on a factory reset of the CPE, the value of this parameter might be reset to its factory value.  If an ACS modifies the  value of this parameter, it SHOULD be prepared to accommodate the situation that the original value is restored as the result of a  factory reset.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.0">
+        <description>
+          Password used to authenticate the CPE when making a connection to the ACS using the CPE WAN Management Protocol.
+          This password is used only for HTTP-based authentication of the CPE.
+          Note that on a factory reset of the CPE, the value of this parameter might be reset to its factory value.  If an ACS modifies the  value of this parameter, it SHOULD be prepared to accommodate the situation that the original value is restored as the result of a  factory reset.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleReboot" access="readWrite" dmr:version="2.10">
+        <description>
+          An absolute date and time in UTC at which time the CPE will perform a reboot.
+          If a CWMP session is in progress at the specified time, the CPE MUST wait until the session has ended before performing the reboot.
+          If the value specifies a date and time that has already passed (i.e., a past date and time), no reboot will be performed.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="DelayReboot" access="readWrite" dmr:version="2.10">
+        <description>
+          The number of seconds from the time the CWMP session in which this parameter value is set is ended until the CPE performs a reboot.
+          Whenever the CPE reboots, this value MUST be reset by the CPE to -1.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicInformEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          Whether or not the CPE MUST periodically send CPE information to the ACS using the Inform method  call.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicInformInterval" access="readWrite" dmr:version="2.0">
+        <description>
+          The duration in {{units}} of the interval for which the CPE MUST attempt to connect with the ACS and call the  Inform method if {{param|PeriodicInformEnable}} is {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicInformTime" access="readWrite" dmr:version="2.0">
+        <description>
+          An absolute time reference in UTC to determine when the CPE will initiate the periodic Inform method calls. Each Inform call MUST occur at this reference time plus or minus an integer multiple of the {{param|PeriodicInformInterval}}.
+          {{param}} is used only to set the ''phase'' of the periodic Informs.  The actual value of {{param}} can be arbitrarily far into the  past or future.
+          For example, if {{param|PeriodicInformInterval}} is 86400 (a day) and if {{param}} is set to UTC midnight on some day (in the past,  present, or future) then periodic Informs will occur every day at UTC midnight.  These MUST begin on the very next midnight, even if  {{param}} refers to a day in the future.
+          The Unknown Time value defined in {{bibref|TR-106a2|section 3.2}} indicates that no particular time reference is specified.  That is,  the CPE MAY locally choose the time reference, and needs only to adhere to the specified {{param|PeriodicInformInterval}}.
+          If absolute time is not available to the CPE, its periodic Inform behavior MUST be the same as if the {{param}} parameter was set to the Unknown Time value.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ParameterKey" access="readOnly" activeNotify="canDeny" forcedInform="true" dmr:version="2.0">
+        <description>
+          {{param}} provides the ACS a reliable and extensible means to track changes made by the ACS.  The value of  {{param}} MUST be equal to the value of the ParameterKey argument from the most recent successful SetParameterValues, AddObject, or  DeleteObject method call from the ACS.
+          The CPE MUST set {{param}} to the value specified in the corresponding method arguments if and only if the method completes  successfully and no fault response is generated.  If a method call does not complete successfully (implying that the changes  requested in the method did not take effect), the value of {{param}} MUST NOT be modified.
+          The CPE MUST only modify the value of {{param}} as a result of SetParameterValues, AddObject, DeleteObject, or due to a factory  reset.  On factory reset, the value of {{param}} MUST be set to {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionRequestURL" access="readOnly" activeNotify="forceDefaultEnabled" forcedInform="true" dmr:version="2.0">
+        <description>
+          HTTP URL, as defined in {{bibref|RFC3986}}, for an ACS to make a Connection Request notification to the CPE.
+          In the form:
+          : http://host:port/path
+          The ''host'' portion of the URL MAY be the IP address for the management interface of the CPE in lieu of a host name.
+          Note: If the ''host'' portion of the URL is a literal IPv6 address then it MUST be enclosed in square brackets (see {{bibref|RFC3986|Section 3.2.2}}).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionRequestUsername" access="readWrite" dmr:version="2.0">
+        <description>
+          Username used to authenticate an ACS making a Connection Request to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionRequestPassword" access="readWrite" dmr:version="2.0">
+        <description>
+          Password used to authenticate an ACS making a Connection Request to the CPE.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UpgradesManaged" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates whether or not the ACS will manage upgrades for the CPE.  If {{true}}, the CPE SHOULD NOT use other  means other than the ACS to seek out available upgrades.  If {{false}}, the CPE MAY use other means for this purpose.
+          Note that an autonomous upgrade (reported via an "10 AUTONOMOUS TRANSFER COMPLETE" Inform Event code) SHOULD be regarded as a managed  upgrade if it is performed according to ACS-specified policy.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="KickURL" access="readOnly" dmr:version="2.0">
+        <description>
+          Present only for a CPE that supports the Kicked RPC method.
+          LAN-accessible URL, as defined in {{bibref|RFC3986}}, from which the CPE can be ''kicked'' to initiate the Kicked RPC method call.   MUST be an absolute URL including a host name or IP address as would be used on the LAN side of the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DownloadProgressURL" access="readOnly" dmr:version="2.0">
+        <description>
+          Present only for a CPE that provides a LAN-side web page to show progress during a file download.
+          LAN-accessible URL, as defined in {{bibref|RFC3986}}, to which a web-server associated with the ACS MAY redirect a user's browser on  initiation of a file download to observer the status of the download.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultActiveNotificationThrottle" access="readWrite" dmr:version="2.0">
+        <description>
+          This parameter is used to control throttling of active notifications sent by the CPE to the ACS.  It defines the  minimum number of {{units}} that the CPE MUST wait since the end of the last session with the ACS before establishing a new session for  the purpose of delivering an active notification.
+          In other words, if CPE needs to establish a new session with the ACS for the sole purpose of delivering an active notification, it  MUST delay establishing such a session as needed to ensure that the minimum time since the last session completion has been met.
+          The time is counted since the last successfully completed session, regardless of whether or not it was used for active notifications  or other purposes. However, if connection to the ACS is established for purposes other than just delivering active notifications,  including for the purpose of retrying a failed session, such connection MUST NOT be delayed based on this parameter value, and the  pending active notifications MUST be communicated during that connection.
+          The time of the last session completion does not need to be tracked across reboots.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CWMPRetryMinimumWaitInterval" access="readWrite" dmr:version="2.0">
+        <description>
+          Configures the first session retry wait interval, in {{units}}, as specified in {{bibref|TR-069a2|section 3.2.1.1}}.
+          A value of 5 corresponds to the default behavior that is described in {{bibref|TR-069a2}}.
+          The device MUST use a random value between {{param}}  and ({{param}} * {{param|CWMPRetryIntervalMultiplier}} / 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>
+        </syntax>
+      </parameter>
+      <parameter name="CWMPRetryIntervalMultiplier" access="readWrite" dmr:version="2.0">
+        <description>
+          Configures the retry interval multiplier as specified in {{bibref|TR-069a2|section 3.2.1.1}}.
+          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-069a2}}.
+          The device MUST use a random value between {{param|CWMPRetryMinimumWaitInterval}}  and ({{param|CWMPRetryMinimumWaitInterval}} *  {{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>
+        </syntax>
+      </parameter>
+      <parameter name="HTTPConnectionRequestEnable" access="readWrite" dmr:version="2.11">
+        <description>
+          Enables or disables HTTP connection request handling on the CPE.
+          If HTTP connection request handling is disabled ({{param}} is set to {{false}}), {{param|ConnectionRequestURL}} MUST be set to {{empty}} and the CPE MUST close the port used by the HTTP connection request server.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="UDPConnectionRequestAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          Address and port to which an ACS MAY send a UDP Connection Request to the CPE (see {{bibref|TR-069a2|Annex G}}).
+          This parameter is represented in the form of an Authority element as defined in {{bibref|RFC3986}}.  The value MUST be in one of the  following two forms:
+          : host:port
+          : host
+          * When {{param|STUNEnable}} is {{true}}, the ''host'' and ''port'' portions of this parameter MUST represent the public address and port corresponding to the NAT binding through which the ACS can send UDP Connection Request messages (once this information is learned by the CPE through the use of STUN).
+          * When {{param|STUNEnable}} is {{false}}, the ''host'' and ''port'' portions of the URL MUST represent the local IP address and port on which the CPE is listening for UDP Connection Request messages.
+          The second form of this parameter MAY be used only if the port value is equal to ''80''.
+          Note: If the ''host'' portion of the URL is a literal IPv6 address then it MUST be enclosed in square brackets (see {{bibref|RFC3986|Section 3.2.2}}).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="STUNEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the use of STUN by the CPE.  This applies only to the use of STUN in association with the  ACS to allow UDP Connection Requests.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="STUNServerAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          Host name or IP address of the STUN server for the CPE to send Binding Requests if STUN is enabled via  {{param|STUNEnable}}.
+          If is {{empty}} and {{param|STUNEnable}} is {{true}}, the CPE MUST use the address of the ACS extracted from the host portion of the  ACS URL.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="STUNServerPort" access="readWrite" dmr:version="2.0">
+        <description>
+          Port number of the STUN server for the CPE to send Binding Requests if STUN is enabled via {{param|STUNEnable}}.
+          By default, this SHOULD be the equal to the default STUN port, 3478.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="STUNUsername" access="readWrite" dmr:version="2.0">
+        <description>
+          If is not {{empty}}, the value of the STUN USERNAME attribute to be used in Binding Requests (only if message  integrity has been requested by the STUN server).
+          If is {{empty}}, the CPE MUST NOT send STUN Binding Requests with message integrity.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="STUNPassword" access="readWrite" dmr:version="2.0">
+        <description>
+          The value of the STUN Password to be used in computing the MESSAGE-INTEGRITY attribute to be used in Binding  Requests (only if message integrity has been requested by the STUN server).
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="STUNMaximumKeepAlivePeriod" access="readWrite" dmr:version="2.0">
+        <description>
+          If STUN Is enabled, the maximum period, in {{units}}, that STUN Binding Requests MUST be sent by the CPE for the  purpose of maintaining the binding in the Gateway.  This applies specifically to Binding Requests sent from the UDP Connection  Request address and port.
+          A value of -1 indicates that no maximum period is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="STUNMinimumKeepAlivePeriod" access="readWrite" dmr:version="2.0">
+        <description>
+          If STUN Is enabled, the minimum period, in {{units}}, that STUN Binding Requests can be sent by the CPE for the  purpose of maintaining the binding in the Gateway.  This limit applies only to Binding Requests sent from the UDP Connection Request  address and port, and only those that do not contain the BINDING-CHANGE attribute.  This limit does not apply to retransmissions  following the procedures defined in {{bibref|RFC3489}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NATDetected" access="readOnly" dmr:version="2.0">
+        <description>
+          When STUN is enabled, this parameter indicates whether or not the CPE has detected address and/or port mapping  in use.
+          A {{true}} value indicates that the received MAPPED-ADDRESS in the most recent Binding Response differs from the CPE's source address and port.
+          When {{param|STUNEnable}} is {{false}}, this value MUST be {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="AliasBasedAddressing" access="readOnly" forcedInform="true" dmr:version="2.3">
+        <description>
+          Indicates whether or not the Alias-Based Addressing Mechanism is supported.
+          A {{true}} value indicates that the CPE supports the Alias-Based Addressing Mechanism, as defined in {{bibref|TR-069a4|3.6.1}} and described in {{bibref|TR-069a4|Appendix II}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="InstanceMode" access="readWrite" dmr:version="2.3">
+        <description>
+          Instance identification mode as defined in {{bibref|TR-069a4|3.6.1}}. When {{param|AliasBasedAddressing}} is {{true}}, {{param}} is used by the ACS to control whether the CPE will use Instance Numbers or Instance Aliases in returned Path Names.  {{enum}}
+          This parameter is REQUIRED for any CPE supporting Alias-Based Addressing.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="InstanceNumber"/>
+            <enumeration value="InstanceAlias"/>
+          </string>
+          <default type="factory" value="InstanceNumber"/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoCreateInstances" access="readWrite" dmr:version="2.3">
+        <description>
+          Enable or disable the Auto-Create Instance Mechanism. When {{param|AliasBasedAddressing}} is {{true}}, {{param}} indicates whether or not the CPE will automatically create instances while processing a SetParameterValues RPC (as defined in {{bibref|TR-069a4|A.3.2.1}}).
+          *A {{true}} value indicates that the CPE will perform auto-creation of instances when the Alias-Based Addressing Mechanism is used in SetParameterValues RPC.
+          *A {{false}} value indicates that the CPE will not create new object instances. Instead, it will reject the setting of parameters in unrecognized instances and respond with a fault code.
+          This parameter is REQUIRED for any CPE supporting Alias-Based Addressing.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="ManageableDeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ManageableDeviceNotificationLimit" access="readWrite" dmr:version="2.7">
+        <description>
+          The minimum time, in seconds, between Active Notifications resulting from changes to the {{param|ManageableDeviceNumberOfEntries}} (if Active Notification is enabled).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="EmbeddedDeviceNumberOfEntries" access="readOnly" dmr:version="2.3">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="VirtualDeviceNumberOfEntries" access="readOnly" dmr:version="2.3">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedConnReqMethods" access="readOnly" dmr:version="2.7">
+        <description>
+          The connection request methods supported by this {{object}}. {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="HTTP">
+              <description>
+                The connection request method as specified in {{bibref|TR-069|Section 3.2.2 ACS Connection Initiation}}, '''REQUIRED'''
+              </description>
+            </enumeration>
+            <enumeration value="STUN" optional="true">
+              <description>
+                The connection request method as specified in {{bibref|TR-069|Annex G Connection Request via NAT Gateway}}
+              </description>
+            </enumeration>
+            <enumeration value="XMPP" optional="true">
+              <description>
+                The connection request method as specified in {{bibref|TR-069a5|Annex K XMPP Connection Request}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConnReqXMPPConnection" access="readWrite" dmr:version="2.7">
+        <description>
+          {{reference|the {{object|.XMPP.Connection}} instance that is used for connection requests to this {{object}}}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".XMPP.Connection." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConnReqAllowedJabberIDs" access="readWrite" dmr:version="2.7">
+        <description>
+          When an XMPP Connection Request is sent to a CPE the XMPP IQ Stanza will contian a "from" address that contains the Jabber ID of the initiating entity.
+          This parameter is a {{list}} Each entry represents a Jabber ID, or address, that is allowed to initiate an XMPP Connection Request.
+          Each Jabber ID is allowed to be either a "Full JID" (containing a local-part, domain-part, and resource-part in the following format: "local-part@domain-part/resource-part") or a "Bare JID" (containing a local-part and a domain-part in the following format: "local-part@domain-part").  "Full JID" entries require an exact match whereas "Bare JID" entries are a wildcard match and will match any Jabber ID with the same local-part and domain-part independent of the resource-part.
+          For example, if {{param}} contained "ACS1@tr069.example.com, ACS2@tr-069.example.com/resource1" then the following incoming "from" addresses would be '''allowed''':
+          * "ACS1@tr069.example.com/resource1"
+          * "ACS1@tr069.example.com/resource2"
+          * "ACS2@tr069.example.com/resource1"
+          And the following incoming "from" addresses '''would not be allowed''':
+          * "ACS2@tr069.example.com/resource2"
+          * "ACS@tr069.example.com/resource"
+          If this Parameter is {{empty}} then all Jabber IDs are allowed and an XMPP Connection Request can not be deemed invalid due to the "from" address.
+        </description>
+        <syntax>
+          <list maxItems="32"/>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConnReqJabberID" access="readOnly" activeNotify="forceDefaultEnabled" dmr:version="2.7">
+        <description>
+          The value MUST be the value of the {{param|.XMPP.Connection.{i}.JabberID}} contained in the {{object|.XMPP.Connection}} instance referenced by the {{param|ConnReqXMPPConnection}} parameter.
+          If the {{param|ConnReqXMPPConnection}} parameter is empty or the {{object|.XMPP.Connection}} instance being reference is disabled, then this value will be empty.
+          If the {{object|.XMPP.Connection}} instance being referenced by the {{param|ConnReqXMPPConnection}} parameter is lost ({{param|.XMPP.Connection.{i}.Status}} parameter changes from Enabled to some other value), then the value of this parameter MUST remain unchanged until the connection can be reestablished and a new {{param|.XMPP.Connection.{i}.JabberID}} can be established.  If the new {{param|.XMPP.Connection.{i}.JabberID}} is identical to the existing value, then the value of this parameter MUST NOT be altered and a VALUE CHANGE event MUST NOT be generated.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="HTTPCompressionSupported" access="readOnly" dmr:version="2.7">
+        <description>
+          Indicates the HTTP Compression mechanism(s) supported by this CPE.  Requirements for the use of HTTP Compression for CWMP can be found in {{bibref|TR-069a5|Section 3.4.7}}. {{enum}}
+          Vendors can extend the enumerated values with vendor specific extensions, in which case the rules outlined in {{bibref|TR-106a7|Section 3.3}} MUST be adhered to.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="GZIP">
+              <description>
+                As defined in {{bibref|RFC2616|Section 3.5}}
+              </description>
+            </enumeration>
+            <enumeration value="Compress">
+              <description>
+                As defined in {{bibref|RFC2616|Section 3.5}}
+              </description>
+            </enumeration>
+            <enumeration value="Deflate">
+              <description>
+                As defined in {{bibref|RFC2616|Section 3.5}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="HTTPCompression" access="readWrite" dmr:version="2.7">
+        <description>
+          The value of this parameter represents the HTTP Compression mechanism to be used by the CPE when communicating with the ACS.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="HTTPCompressionSupported" nullValue="Disabled"/>
+          </string>
+          <default type="factory" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="LightweightNotificationProtocolsSupported" access="readOnly" dmr:version="2.7">
+        <description>
+          Indicates the Lightweight Notification Protocol(s) supported by this CPE.  {{enum}}
+          Vendors can extend the enumerated values with vendor specific extensions, in which case the rules outlined in {{bibref|TR-106a7|Section 3.3}} MUST be adhered to.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="UDP">
+              <description>
+                As defined in {{bibref|TR-069a5|Annex M}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LightweightNotificationProtocolsUsed" access="readWrite" dmr:version="2.7">
+        <description>
+          The value of this parameter represents the protocol(s) that will be used by the CPE when sending Lightweight Notifications.
+          {{empty}} means that Lightweight Notifications are disabled, despite any SetParameterAttributes that have been configured on various parameters.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam="LightweightNotificationProtocolsSupported" nullValue=""/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LightweightNotificationTriggerInterval" access="readWrite" dmr:version="2.12">
+        <description>
+          The duration in {{units}} of the interval for which the CPE MUST attempt to deliver any pending Passive Lightweight Notifications.
+          A value of 0 means that the trigger interval is effectively disabled. In this case pending Passive Lightweight Notifications are only sent when triggered by an Active Lightweight Notification.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LightweightNotificationTriggerTime" access="readWrite" dmr:version="2.12">
+        <description>
+          An absolute time reference in UTC to determine when the CPE will initiate the Lightweight Notification (in the case that there are pending Passive Lightweight Notifications that need to be delivered). Each Passive Lightweight Notification (that is waiting for the Lightweight Notification Trigger mechanism for delivery) MUST occur at this reference time plus or minus an integer multiple of the {{param|LightweightNotificationTriggerInterval}}. {{param}} is used only to set the ''phase'' of the Passive Lightweight Notification. The actual value of {{param}} can be arbitrarily far into the past or future.
+          For example, if {{param|LightweightNotificationTriggerInterval}} is 86400 (a day) and if {{param}} is set to UTC midnight on some day (in the past, present, or future) then Lightweight Notifications for pending Passive Lightweight Notifications will occur every day at UTC midnight. These MUST begin on the very next midnight, even if {{param}} refers to a day in the future. The Unknown Time value defined in {{bibref|TR-106a2|section 3.2}} indicates that no particular time reference is specified. That is, the CPE MAY locally choose the time reference, and needs only to adhere to the specified {{param|LightweightNotificationTriggerInterval}}. If absolute time is not available to the CPE, its Lightweight Notifications behavior MUST be the same as if the {{param}} parameter was set to the Unknown Time value.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="UDPLightweightNotificationHost" access="readWrite" dmr:version="2.7">
+        <description>
+          Host name or address to be used when sending the UDP Lightweight Notifications.
+          {{param}} is only applicable when {{param|LightweightNotificationProtocolsUsed}} contains the {{enum|UDP|LightweightNotificationProtocolsUsed}} enumeration.
+          If {{param}} is not implemented or is {{empty}}, and UDP Lightweight Notifications are supported, the destination host MUST be the same as the ACS (as contained in the host portion of the {{param|URL}}).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UDPLightweightNotificationPort" access="readWrite" dmr:version="2.7">
+        <description>
+          The port number to be used when sending UDP Lightweight Notifications.
+          {{param}} is only applicable when {{param|LightweightNotificationProtocolsUsed}} contains the {{enum|UDP|LightweightNotificationProtocolsUsed}} enumeration.
+          If {{param}} is not implemented and UDP Lightweight Notifications are supported, the destination port MUST be 7547.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="InstanceWildcardsSupported" access="readOnly" dmr:version="2.12">
+        <description>
+          Indicates whether or not instance wildcards are supported.
+          A {{true}} value indicates that the CPE supports instance wildcards for GPV, GPN and GPA RPC calls, as defined in [TR-069a6].
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="InformParameterNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ManagementServer.ManageableDevice.{i}." access="readOnly" numEntriesParameter="ManageableDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Each entry in this table corresponds to a distinct LAN Device that supports Device-Gateway Association according to {{bibref|TR-069a2|Annex F}} as indicated by the presence of the DHCP option specified in that Annex.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="ManufacturerOUI"/>
+        <parameter ref="SerialNumber"/>
+        <parameter ref="ProductClass"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" status="deprecated" dmr:version="2.0">
+        <description>
+          A non-volatile handle used to reference this instance. {{param}} provides a mechanism for an ACS to label this instance for future reference. An initial unique value MUST be assigned when the CPE creates an instance of this object.
+          This parameter is DEPRECATED because {{object}} is a transient object.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerOUI" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Organizationally unique identifier of the Device manufacturer as provided to the Gateway by the Device.   Represented as a six hexadecimal-digit value using all upper-case letters and including any leading zeros.  {{pattern}}
+          The value MUST be a valid  OUI as defined in {{bibref|OUI}}.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Serial number of the Device as provided to the Gateway by the Device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProductClass" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Identifier of the class of product for which the Device's serial number applies as provided to the Gateway by  the Device.
+          If the Device does not provide a Product Class, then this parameter MUST be {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} {{reference}}  References all the {{object|.Hosts.Host}} table entries, whether active or inactive, that correspond to this physical LAN device.  There can be multiple such entries if the device has more than one network interface.
+          For example: ''Device.Hosts.Host.1,Device.Hosts.Host.5''
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetParent=".Hosts.Host." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ManagementServer.AutonomousTransferCompletePolicy." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object allows configuration of CPE policy for notification of AUTONOMOUS TRANSFER COMPLETE events, defined in {{bibref|TR-069a2}}.
+        The CPE policy determines the conditions under which the CPE notifies the ACS of the completion of file transfers that were not specifically requested by the ACS.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enable/disable CPE notification of AUTONOMOUS TRANSFER COMPLETE events to the ACS.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="TransferTypeFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates the transfer types that MUST be included when the CPE notifies the ACS of AUTONOMOUS TRANSFER COMPLETE events.   Transfer types not indicated by this filter MUST NOT be included when the CPE notifies the ACS. {{enum}}
+          Note that this includes any backup or restore operations that were not specifically requested by the ACS.  A backup is regarded as an Upload and a restore is regarded as a Download.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Upload"/>
+            <enumeration value="Download"/>
+            <enumeration value="Both">
+              <description>
+                Upload and Download
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ResultTypeFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates the transfer results that MUST be included when the CPE notifies the ACS of AUTONOMOUS TRANSFER COMPLETE events.  Transfer results omitted from this list MUST NOT be included when the CPE notifies the ACS.
+          Note that this includes any backup or restore operations that were not specifically requested by the ACS.  A backup is regarded as an Upload and a restore is regarded as a Download.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Success">
+              <description>
+                The autonomous file transfer completed successfully; i.e., the FaultCode was zero
+              </description>
+            </enumeration>
+            <enumeration value="Failure">
+              <description>
+                The autonomous file transfer did not complete successfully; i.e., the FaultCode was non-zero
+              </description>
+            </enumeration>
+            <enumeration value="Both">
+              <description>
+                Success and Failure
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FileTypeFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the file types that MUST be included when the CPE notifies the ACS of AUTONOMOUS TRANSFER COMPLETE events.  File types omitted from this list MUST NOT be included when the CPE notifies the ACS.
+          {{pattern}}
+          Additionally, the following format is defined to allow the unique definition of vendor-specific file types:
+          * ''"X &lt;OUI&gt; &lt;Vendor-specific identifier&gt;"''
+          &lt;OUI&gt; is replaced by a 6 hexadecimal-digit OUI (organizationally unique identifier) as defined in {{bibref|OUI}}, with all upper-case letters and any leading zeros included. The OUI used for a given vendor-specific file type MUST be one that is assigned to the organization that defined this file type (which is not necessarily the same as the vendor of the CPE or ACS).
+          Note that {{empty}} indicates that all file types are excluded from this filter, effectively disabling CPE notification of AUTONOMOUS TRANSFER COMPLETE events to the ACS.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pattern value="1 Firmware Upgrade Image">
+              <description>
+                Download Only
+              </description>
+            </pattern>
+            <pattern value="2 Web Content">
+              <description>
+                Download Only
+              </description>
+            </pattern>
+            <pattern value="3 Vendor Configuration File">
+              <description>
+                Download or Upload
+              </description>
+            </pattern>
+            <pattern value="4 Vendor Log File">
+              <description>
+                Upload Only
+              </description>
+            </pattern>
+            <pattern value="X [0-9A-F]{6} .*">
+              <description>
+                For Vendor-Specific File Types, could be for either Download or Upload
+              </description>
+            </pattern>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ManagementServer.DownloadAvailability." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains multicast announcement and query parameters used for the purpose of downloading files.
+      </description>
+    </object>
+    <object name="Device.ManagementServer.DownloadAvailability.Announcement." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains multicast announcement parameters used to download files.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enable/disable CPE ability to receive and use multicast announcements from a server for the purpose of downloading files.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of the announcement service.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true">
+              <description>
+                MAY be used by the CPE to indicate a locally defined error condition.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GroupNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ManagementServer.DownloadAvailability.Announcement.Group.{i}." access="readWrite" numEntriesParameter="GroupNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Multicast groups to which the CPE SHOULD listen for announcements.
+      </description>
+      <uniqueKey>
+        <parameter ref="URL"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enable/disable listening to this multicast group.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this group table entry.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true">
+              <description>
+                MAY be used by the CPE to indicate a locally defined error condition, e.g. unable to parse received announcements.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="URL" access="readWrite" dmr:version="2.0">
+        <description>
+          URL {{bibref|RFC3986}} encoding the group address, source and port on which to listen, and other protocol information, e.g. expected announcement format.
+          Depending on the application, the messages identified by this URL MAY directly contain the data to be downloaded, or alternatively MAY contain information informing the CPE how to obtain the data to be downloaded via a separate mechanism, which itself could involve a unicast or a multicast download protocol.
+          Refer to {{bibref|DVB-TS.102.824}} for an example of a URL format that identifies a SAP {{bibref|RFC2974}} stream that indicates how to use either FLUTE {{bibref|RFC3926}} or DSM-CC {{bibref|ISO-13818-6:1998}} to perform the download.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ManagementServer.DownloadAvailability.Query." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains multicast query parameters used to download files.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enable/disable CPE ability to autonomously query a server for the purpose of downloading files.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of the query service.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true">
+              <description>
+                MAY be used by the CPE to indicate a locally defined error condition, e.g. unable to contact query response server.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="URL" access="readWrite" dmr:version="2.0">
+        <description>
+          URL {{bibref|RFC3986}} of the query response server.
+          Depending on the application, the protocol described by this URL MAY be a SOAP interface, or MAY be any other RPC mechanism.
+          Refer to {{bibref|DVB-TS.102.824}} for an example of a URL format that identifies a SOAP interface running over HTTP or HTTPS.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ManagementServer.DUStateChangeComplPolicy." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.1">
+      <description>
+        This object allows configuration of CPE policy for notification of "12 AUTONOMOUS DU STATE CHANGE COMPLETE" events defined in {{bibref|TR-069a3}}.
+        The CPE policy determines the conditions under which the CPE notifies the ACS of the completion of Deployment Unit state changes that were not specifically requested via CWMP.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.1">
+        <description>
+          Enables/Disables CPE notification of "12 AUTONOMOUS DU STATE CHANGE COMPLETE" events to the ACS.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="OperationTypeFilter" access="readWrite" dmr:version="2.1">
+        <description>
+          Indicates the Deployment Unit operations that MUST be included when the CPE notifies the ACS of "12 AUTONOMOUS DU STATE CHANGE COMPLETE" events.
+          Operation types not indicated by this list MUST NOT be included when the CPE notifies the ACS.  {{empty}} is essentially the same as setting {{param|Enable}} to {{false}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="Install"/>
+            <enumeration value="Update"/>
+            <enumeration value="Uninstall"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ResultTypeFilter" access="readWrite" dmr:version="2.1">
+        <description>
+          Indicates the Deployment Unit state change results that MUST be included when the CPE notifies the ACS of "12 AUTONOMOUS DU STATE CHANGE COMPLETE" events.  State change results omitted from this filter MUST NOT be included when the CPE notifies the ACS.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Success">
+              <description>
+                The autonomous state change completed successfully; i.e., the FaultCode was zero
+              </description>
+            </enumeration>
+            <enumeration value="Failure">
+              <description>
+                The autonomous state change did not complete successfully; i.e., the FaultCode was non-zero
+              </description>
+            </enumeration>
+            <enumeration value="Both">
+              <description>
+                All result types independent of Success or Failure
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FaultCodeFilter" access="readWrite" dmr:version="2.1">
+        <description>
+          Indicates the Deployment Unit state change fault codes that MUST be included when the CPE notifies the ACS of "12 AUTONOMOUS DU STATE CHANGE COMPLETE" events.  State change fault codes omitted from this filter MUST NOT be included when the CPE notifies the ACS.
+          This filter has no effect on the notification of a successful autonomous state change. This filter only applies when {{param|ResultTypeFilter}} is set to either {{enum|Failure|ResultTypeFilter}} or {{enum|Both|ResultTypeFilter}}.  {{empty}} means that failed autonomous state changes will not be sent to the ACS.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="9001"/>
+            <enumeration value="9003"/>
+            <enumeration value="9012"/>
+            <enumeration value="9013"/>
+            <enumeration value="9015"/>
+            <enumeration value="9016"/>
+            <enumeration value="9017"/>
+            <enumeration value="9018"/>
+            <enumeration value="9022"/>
+            <enumeration value="9023"/>
+            <enumeration value="9024"/>
+            <enumeration value="9025"/>
+            <enumeration value="9026"/>
+            <enumeration value="9027"/>
+            <enumeration value="9028"/>
+            <enumeration value="9029"/>
+            <enumeration value="9030"/>
+            <enumeration value="9031"/>
+            <enumeration value="9032"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ManagementServer.EmbeddedDevice.{i}." access="readOnly" numEntriesParameter="EmbeddedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.3">
+      <description>
+        Each entry in this table represents a distinct Proxied Device that utilizes the Embedded Object Mechanism {{bibref|TR-069a4|Annex J.1.2}} for proxying devices.
+      </description>
+      <uniqueKey>
+        <parameter ref="ControllerID"/>
+        <parameter ref="ProxiedDeviceID"/>
+      </uniqueKey>
+      <parameter name="ControllerID" access="readOnly" dmr:version="2.3">
+        <description>
+          Identifier of the controller that is responsible for a sub-network of Proxied Devices within the LAN.
+          {{empty}} indicates that this Proxied Device either:
+          * Isn't part of a sub-network, within the LAN, with a controller entity.
+          * Doesn't need a {{param}} to ensure its {{param|ProxiedDeviceID}} is unique throughout the LAN.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProxiedDeviceID" access="readOnly" dmr:version="2.3">
+        <description>
+          Idenitfier of the Proxied Device.
+          This is an opaque string that is unique to the Proxied Device within a specific sub-network within the LAN (identified by the {{param|ControllerID}}).  If the {{param|ControllerID}} is {{empty}} this {{param}} is unique across the LAN.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Reference" access="readOnly" dmr:version="2.3">
+        <description>
+          {{noreference}}The value MUST be the path name of a table row.  If the referenced object is deleted, this {{object}} instance MUST also be removed. Represents the instance of a multi-instanced object that is directly controlled by, and has come into existence because of, this Proxied Device  that utilizes the Embedded Object Mechanism {{bibref|TR-069a4|Annex J.1.2}}.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedDataModel" access="readOnly" dmr:version="2.3">
+        <description>
+          Represents the CWMP-DT schema instance(s) that this Proxied Device is utilizing.  The CWMP-DT schema instance is also the one being utilized by the object referenced within {{param|Reference}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".DeviceInfo.SupportedDataModel." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.3">
+        <description>
+          References the {{object|.Hosts.Host}} table entry(s), whether active or inactive, that corresponds to this proxied LAN device.
+        </description>
+        <syntax>
+          <list maxItems="32"/>
+          <string>
+            <pathRef refType="strong" targetParent=".Hosts.Host." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProxyProtocol" access="readOnly" dmr:version="2.3">
+        <description>
+          The protocol being used to communicate between the CPE Proxier and this Proxied Device. {{enum}}
+          Vendors can extend the enumerated values with vendor specific extensions, in which case the rules outlined in {{bibref|TR-106a6|3.3}} MUST be adhered to.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Z-Wave">
+              <description>
+                see {{bibref|Z-Wave}}
+              </description>
+            </enumeration>
+            <enumeration value="ZigBee">
+              <description>
+                see {{bibref|ZigBee}}
+              </description>
+            </enumeration>
+            <enumeration value="UPnP-DM">
+              <description>
+                see {{bibref|UPnP-DM:1}}
+              </description>
+            </enumeration>
+            <enumeration value="ETSI-M2M">
+              <description>
+                see {{bibref|ETSIM2MFA}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProxyProtocolReference" access="readOnly" dmr:version="2.6">
+        <description>
+          {{reference|a protocol object that uses the {{param|ProxyProtocol}}}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DiscoveryProtocol" access="readOnly" dmr:version="2.6">
+        <description>
+          {{list|that represents the discovery protocol(s) for this proxied device}}
+          {{enum}}
+          Vendors can extend the enumerated values with vendor specific extensions, in which case the rules outlined in {{bibref|TR-106a3|Section 3.3}} MUST be adhered to.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="Z-Wave">
+              <description>
+                see {{bibref|Z-Wave}}
+              </description>
+            </enumeration>
+            <enumeration value="ZigBee">
+              <description>
+                see {{bibref|ZigBee}}
+              </description>
+            </enumeration>
+            <enumeration value="UPnP">
+              <description>
+                see {{bibref|UPnP-DAv1}}
+              </description>
+            </enumeration>
+            <enumeration value="ETSI-M2M">
+              <description>
+                see {{bibref|ETSIM2MFA}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DiscoveryProtocolReference" access="readOnly" dmr:version="2.6">
+        <description>
+          {{list}} {{reference|an object discovered using one or more protocols listed in {{param|DiscoveryProtocol}}|ignore}}
+          For objects discovered by the UPnP discovery protocol, the {{param}} would contain items that are references to instances of the following:
+          * {{object|.UPnP.Discovery.RootDevice}}
+          * {{object|.UPnP.Discovery.Device}}
+          * {{object|.UPnP.Discovery.Service}}
+          For objects discovered by the ETSI-M2M discovery protocol, the {{param}} would contain items that are references to instances of ETSIM2M.SCL.{i}.AreaNwkDeviceInfoInstance.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CommandProcessed" access="readOnly" dmr:version="2.3">
+        <description>
+          Whether or not the CPE Proxier has successfully communicated all pending configuration commands down to the Proxied Device.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Pending"/>
+            <enumeration value="Retrying"/>
+            <enumeration value="Success"/>
+            <enumeration value="Error"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CommandProcessingErrMsg" access="readOnly" dmr:version="2.3">
+        <description>
+          Detailed {{param|CommandProcessed}} error description (vendor specific).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastSyncTime" access="readOnly" dmr:version="2.3">
+        <description>
+          The last time that the CPE Proxier synchronized the state of the Proxied Device.  This parameter MUST be updated when a proxy command is executed successfully on the Proxied Device.
+          The Unknown Time value, as defined in {{bibref|TR-106a6}}, indicates that the Proxied Device's state has not been synchronized since the CPE Proxier was last rebooted.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ManagementServer.VirtualDevice.{i}." access="readOnly" numEntriesParameter="VirtualDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.3">
+      <description>
+        Each entry in this table represents a distinct Proxied Device that utilizes the Virtual CWMP Device Mechanism {{bibref|TR-069a4|Annex I.1.1}} for proxying devices.
+      </description>
+      <uniqueKey>
+        <parameter ref="ManufacturerOUI"/>
+        <parameter ref="ProductClass"/>
+        <parameter ref="SerialNumber"/>
+      </uniqueKey>
+      <parameter name="ManufacturerOUI" access="readOnly" dmr:version="2.3">
+        <description>
+          Organizationally unique identifier of the associated Proxied Device.  Represented as a six hexadecimal-digit value using all upper-case letters and including any leading zeros.  {{pattern}}
+          The value MUST be a valid OUI as defined in {{bibref|OUI}}.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProductClass" access="readOnly" dmr:version="2.3">
+        <description>
+          Identifier of the class of product of the associated Proxied Device for which the serial number applies.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="2.3">
+        <description>
+          Serial number of the associated Proxied Device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.3">
+        <description>
+          {{list}} {{reference}}  References all the {{object|.Hosts.Host}} table entries, whether active or inactive, that correspond to this proxied LAN device.  There can be multiple such entries if the Proxied Device has more than one network interface.
+        </description>
+        <syntax>
+          <list maxItems="32"/>
+          <string>
+            <pathRef refType="strong" targetParent=".Hosts.Host." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProxyProtocol" access="readOnly" dmr:version="2.3">
+        <description>
+          The protocol being used to communicate between the CPE Proxier and this Proxied Device. {{enum}}
+          Vendors can extend the enumerated values with vendor specific extensions, in which case the rules outlined in {{bibref|TR-106a6|3.3}} MUST be adhered to.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Z-Wave">
+              <description>
+                see {{bibref|Z-Wave}}
+              </description>
+            </enumeration>
+            <enumeration value="ZigBee">
+              <description>
+                see {{bibref|ZigBee}}
+              </description>
+            </enumeration>
+            <enumeration value="UPnP-DM">
+              <description>
+                see {{bibref|UPnP-DM:1}}
+              </description>
+            </enumeration>
+            <enumeration value="ETSI-M2M">
+              <description>
+                see {{bibref|ETSIM2MFA}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProxyProtocolReference" access="readOnly" dmr:version="2.6">
+        <description>
+          {{reference|a protocol object that uses the {{param|ProxyProtocol}}}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DiscoveryProtocol" access="readOnly" dmr:version="2.6">
+        <description>
+          {{list|that represents the discovery protocol(s) for this proxied device}}
+          {{enum}}
+          Vendors can extend the enumerated values with vendor specific extensions, in which case the rules outlined in {{bibref|TR-106a3|Section 3.3}} MUST be adhered to.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="Z-Wave">
+              <description>
+                see {{bibref|Z-Wave}}
+              </description>
+            </enumeration>
+            <enumeration value="ZigBee">
+              <description>
+                see {{bibref|ZigBee}}
+              </description>
+            </enumeration>
+            <enumeration value="UPnP">
+              <description>
+                see {{bibref|UPnP-DAv1}}
+              </description>
+            </enumeration>
+            <enumeration value="ETSI-M2M">
+              <description>
+                see {{bibref|ETSIM2MFA}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DiscoveryProtocolReference" access="readOnly" dmr:version="2.6">
+        <description>
+          {{list}} {{reference|an object discovered using one or more protocols listed in {{param|DiscoveryProtocol}}|ignore}}
+          For objects discovered by the UPnP discovery protocol, the {{param}} would contain items that are references to instances of the following:
+          * {{object|.UPnP.Discovery.RootDevice}}
+          * {{object|.UPnP.Discovery.Device}}
+          * {{object|.UPnP.Discovery.Service}}
+          For objects discovered by the ETSI-M2M discovery protocol, the {{param}} would contain items that are references to instances of ETSIM2M.SCL.{i}.AreaNwkDeviceInfoInstance.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ManagementServer.StandbyPolicy." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        Parameters related to CPE behavior when waking up from standby. If this object is supported then the CPE MUST support the requirements of {{bibref|TR-069a5|Annex L}}.
+        NOTE: "CR", as used in the names and descriptions of the parameters defined in this object, refers to the Connection Request concept defined in TR-069.
+      </description>
+      <parameter name="CRUnawarenessMaxDuration" access="readWrite" dmr:version="2.7">
+        <description>
+          When waking up from a non CR-Aware Standby that lasted more than this parameter's value (in {{units}}), the CPE MUST issue a WAKEUP Event.
+          If the value is -1, the CPE MUST NOT ever issue WAKEUP Events for having been non CR-aware.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+          <default type="factory" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxMissedPeriodic" access="readWrite" dmr:version="2.7">
+        <description>
+          When waking up from a non fully Timer-Aware Standby that made it miss more than this parameter's value Periodic Contacts, the CPE MUST issue a WAKEUP Event.
+          If the value is -1, the CPE MUST NOT ever issue WAKEUP Events for exceeding that limit.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="factory" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="NotifyMissedScheduled" access="readWrite" dmr:version="2.7">
+        <description>
+          When waking up from a non fully Timer-Aware Standby that made it miss at least one Scheduled Contact, the CPE MUST issue a WAKEUP Event if this parameter is {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkAwarenessCapable" access="readOnly" dmr:version="2.7">
+        <description>
+          Indicates that the CPE is capable of CR-Aware Standby.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SelfTimerCapable" access="readOnly" dmr:version="2.7">
+        <description>
+          Indicates that the CPE is capable of Timer-Aware Standby.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="CRAwarenessRequested" access="readWrite" dmr:version="2.7">
+        <description>
+          If {{param|NetworkAwarenessCapable}} and this parameter are both {{true}}, the CPE MUST NOT go into a non CR-Aware Standby state.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicAwarenessRequested" access="readWrite" dmr:version="2.7">
+        <description>
+          If {{param|SelfTimerCapable}} and this parameter are both {{true}}, the CPE MUST NOT go into a standby state that prevents it from honoring Periodic Contacts.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduledAwarenessRequested" access="readWrite" dmr:version="2.7">
+        <description>
+          If this parameter is true, the CPE MUST NOT go into a standby state that prevents it from honoring Scheduled Contacts. This means that, whenever the ACS has requested a Scheduled Contact:
+          *if {{param|SelfTimerCapable}} is {{true}} and the CPE chooses to go into Standby before the Scheduled Contact has been honored, it MUST use a Timer-Aware Standby;
+          *if {{param|SelfTimerCapable}} is {{false}}, the CPE MUST NOT go into Standby before the Scheduled Contact has been honored.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ManagementServer.InformParameter.{i}." access="readWrite" numEntriesParameter="InformParameterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        This table provides the ACS with the ability to control the Parameters that are delivered by the Inform RPC.
+        Any Parameter (identified by {{param|ParameterName}}) contained in this table MUST be included within the ParameterList argument of the Inform RPC whenever any Event within the {{param|EventList}} is being delivered.
+        This table does not include Forced Inform Parameters, and Forced Inform Parameters are not allowed to be inserted into this table.  Any attempt by an ACS to configure this table to contain a Forced Inform Parameter MUST result in the failure of the SetParameterValues RPC with error code 9007.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="ParameterName"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables this {{object}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="ParameterName" access="readWrite" dmr:version="2.8">
+        <description>
+          A pattern that describes the Parameter(s) to be included in the Inform’s ParameterList argument.  Specifically, patterns with wildcards (an "*" character) in place of Instance Identifiers are allowed; any attempt to set the value otherwise MUST be rejected by the CPE.
+          If the pattern does not match any existing Parameters at the time that the CPE is creating the Inform RPC, then this {{object|#.InformParameter}} instance is not included in the Inform’s ParameterList argument.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="EventList" access="readWrite" dmr:version="2.8">
+        <description>
+          Each entry in this list represents an Event for which this Parameter MUST be included within the ParameterList argument of the Inform RPC.
+          All Inform Events (see {{bibref|TR-069|Section 3.7.1.5}}), except for "4 VALUE CHANGE", are allowed as entries in this list.  "4 VALUE CHANGE" is not allowed as that would violate requirements contained in {{bibref|TR-069|Section A.3.3.1}}.
+          {{empty}} means all events except "4 VALUE CHANGE".
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ManagementServer.HeartbeatPolicy." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        Parameters related to CPE behavior in order to issue a Heartbeat event to the ACS using the Inform method call.
+        If this object is supported then the CPE MUST support the requirements of {{bibref|TR-069|Annex O}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          When {{true}}, Heartbeat events are enabled to be sent to the ACS based on the values of the {{param|ReportingInterval}} and {{param|InitiationTime}} parameters.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ReportingInterval" access="readWrite" dmr:version="2.12">
+        <description>
+          The duration in {{units}} of the interval for which the CPE MUST attempt to connect with the ACS and call the Inform method if {{param|Enable}} is {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="30"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="InitiationTime" access="readWrite" dmr:version="2.12">
+        <description>
+          An absolute time reference in UTC to determine when the CPE will initiate the Heartbeat event Inform method calls. Each Inform call MUST occur at this reference time plus or minus an integer multiple of the {{param|ReportingInterval}}.
+          {{param}} is used only to set the ''phase'' of the Heartbeat event Informs. The actual value of {{param}} can be arbitrarily far into the past or future.
+          For example, if {{param|ReportingInterval}} is 60 (one minute) and if {{param}} is set to UTC midnight on some day (in the past,  present, or future) then Heartbeat Informs will occur every minute at the next UTC midnight. These MUST begin on the very next midnight, even if {{param}} refers to a day in the future.
+          The Unknown Time value defined in {{bibref|TR-106a2|section 3.2}} indicates that no particular time reference is specified.  The CPE MUST locally choose a random time reference.
+          If absolute time is not available to the CPE, its Heartbeat Inform behavior MUST be the same as if the {{param}} parameter was set to the Unknown Time value.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.SoftwareModules." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.1">
+      <description>
+        Top level object for dynamically managed software applications.
+      </description>
+      <parameter name="ExecEnvNumberOfEntries" access="readOnly" dmr:version="2.1">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DeploymentUnitNumberOfEntries" access="readOnly" dmr:version="2.1">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutionUnitNumberOfEntries" access="readOnly" dmr:version="2.1">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.SoftwareModules.ExecEnv.{i}." access="readOnly" numEntriesParameter="ExecEnvNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.1">
+      <description>
+        The Execution Environments that are available on the device, along with their properties and configurable settings.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.1">
+        <description>
+          Indicates whether or not this {{object}} is enabled.
+          Disabling an enabled Execution Environment stops it, while enabling a disabled Execution Environment starts it.
+          When an Execution Environment is disabled, Deployment Units installed to that Execution Environment will be unaffected, but any Execution Units currently running on that Execution Environment will automatically transition to {{enum|Idle|#.ExecutionUnit.{i}.Status}}.
+          If a ChangeDUState is attempted on a {{object|#.DeploymentUnit}} that is to be applied against a disabled {{object}}, that ChangeDUState operation fails and the associated DUStateChangeComplete RPC will contain a FaultStruct for that operation.
+          If a SetParameterValues is attempted against the {{param|#.ExecutionUnit.{i}.RequestedState}} for an {{object|#.ExecutionUnit}} that is associated with a disabled {{object}} a CWMP Fault will be issued in response.
+          Disabling an Execution Environment could place the device in a non-manageable state.  For example, if the operating system itself was modeled as an {{object}} and the ACS disabled it, the CWMP management agent might be terminated leaving the device unmanageable.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.1">
+        <description>
+          Indicates the status of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Error" optional="true"/>
+            <enumeration value="Disabled"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Reset" access="readWrite" dmr:version="2.1">
+        <description>
+          Setting this parameter to {{true}} causes this {{object}} to revert back to the state it was in when the device last issued a "0 BOOTSTRAP" Inform event.  The following requirements dictate what MUST happen for the reset to be complete:
+          # All Deployment Units that were installed after the last "0 BOOTSTRAP" Inform event MUST be removed
+          # All persistent storage, configuration files, and log files that were associated with the removed Deployment Units MUST be removed
+          # Any Deployment Unit that is still installed against the Execution Environment MUST be restored to the version present when the last "0 BOOTSTRAP" Inform event was issued
+          # Any Deployment Unit that was present when the last "0 BOOTSTRAP" Inform event was issued, but was subsequently uninstalled and is now not present, MUST be installed with the version that was present when the last "0 BOOTSTRAP" Inform event was issued
+          # The Execution Environment MUST be restored to the version and configuration present when the last "0 BOOTSTRAP" Inform event was issued
+          # The Execution Environment MUST be restarted after all other restoration requirements have been met
+        </description>
+        <syntax command="true">
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.1">
+        <description>
+          A Name provided by the CPE that adequately distinguishes this {{object}} from all other {{object}} instances.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.1">
+        <description>
+          Indicates the complete type and specification version of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InitialRunLevel" access="readWrite" dmr:version="2.1">
+        <description>
+          The run level that this {{object}} will be in upon startup (whether that is caused by a CPE Boot or the Execution Environment starting).
+          Run levels dictate which Execution Units will be started.  Execution Units will be started if {{param|CurrentRunLevel}} is greater than or equal to {{param|#.ExecutionUnit.{i}.RunLevel}} and {{param|#.ExecutionUnit.{i}.AutoStart}} is {{true}}.
+          If the value of {{param|CurrentRunLevel}} is -1, then the value of this parameter is irrelevant when read and setting its value has no impact on the Run Level of this {{object}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RequestedRunLevel" access="readWrite" dmr:version="2.1">
+        <description>
+          Provides a mechanism to remotely manipulate the run level of this {{object}}, meaning that altering this parameter's value will change the value of the {{param|CurrentRunLevel}}.
+          Run levels dictate which Execution Units will be started.  Execution Units will be started if {{param|CurrentRunLevel}} is greater than or equal to {{param|#.ExecutionUnit.{i}.RunLevel}} and {{param|#.ExecutionUnit.{i}.AutoStart}} is {{true}}.
+          Setting this value when {{param|CurrentRunLevel}} is -1 has no impact to the Run Level of this {{object}}.
+        </description>
+        <syntax command="true">
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentRunLevel" access="readOnly" dmr:version="2.1">
+        <description>
+          The run level that this {{object}} is currently operating in.  This value is altered by changing the {{param|RequestedRunLevel}} parameter.
+          Upon startup (whether that is caused by a CPE Boot or the Execution Environment starting) {{param}} will be equal to {{param|InitialRunLevel}}, unless Run Levels are not supported by this {{object}} in which case {{param}} will be -1.
+          Run levels dictate which Execution Units will be started.  Execution Units will be started if {{param}} is greater than or equal to {{param|#.ExecutionUnit.{i}.RunLevel}} and {{param|#.ExecutionUnit.{i}.AutoStart}} is {{true}}.
+          If {{param}} is -1 then Run Levels are not supported by this {{object}} and setting {{param|InitialRunLevel}} or {{param|RequestedRunLevel}} will not impact the Run Level of this {{object}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="InitialExecutionUnitRunLevel" access="readWrite" dmr:version="2.4">
+        <description>
+          Indicates the initial value on creation for {{param|#.ExecutionUnit.{i}.RunLevel}} for all Execution Unit instances associated with this {{object}}.
+          If the value of {{param|CurrentRunLevel}} is -1, then the value of this parameter is irrelevant when read and setting its value has no impact on the Run Level of any Execution Unit.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Vendor" access="readOnly" dmr:version="2.1">
+        <description>
+          The vendor that produced this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.1">
+        <description>
+          The Version of this {{object}} as specified by the Vendor that implemented this {{object}}, not the version of the specification.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ParentExecEnv" access="readOnly" dmr:version="2.1">
+        <description>
+          Represents the parent {{object}} of this {{object}}.
+          If this value is {{empty}} then this is the Primary Execution Environment.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.ExecEnv." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AllocatedDiskSpace" access="readOnly" dmr:version="2.1">
+        <description>
+          The amount of disk space measured in {{units}} allocated to this {{object}}.  A value of -1 MUST be used for {{object}} instances where this parameter is not applicable.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="kilobytes"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="AvailableDiskSpace" access="readOnly" activeNotify="canDeny" dmr:version="2.1">
+        <description>
+          The amount of disk space measured in {{units}} currently available to this {{object}}.  This value changes as the {{object|#.ExecutionUnit}} instances associated with this {{object}} consumes disk space.  A value of -1 MUST be used for {{object}} instances where this parameter is not applicable.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="kilobytes"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="AllocatedMemory" access="readOnly" dmr:version="2.1">
+        <description>
+          The amount of physical RAM measured in {{units}} allocated to this {{object}}.  A value of -1 MUST be used for {{object}} instances where this parameter is not applicable.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="kilobytes"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="AvailableMemory" access="readOnly" activeNotify="canDeny" dmr:version="2.1">
+        <description>
+          The amount of physical RAM measured in {{units}} currently available to this {{object}}.  This value changes as the {{object|#.ExecutionUnit}} instances associated with this {{object}} are started/stopped and consume the physical RAM.  A value of -1 MUST be used for {{object}} instances where this parameter is not applicable.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="kilobytes"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ActiveExecutionUnits" access="readOnly" activeNotify="canDeny" dmr:version="2.1">
+        <description>
+          Represents the {{object|#.ExecutionUnit}} instances currently running on this {{object}}.  This parameter only contains {{object|#.ExecutionUnit}} instances that currently have a {{param|#.ExecutionUnit.{i}.Status}} of {{enum|Active|#.ExecutionUnit.{i}.Status}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.ExecutionUnit." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProcessorRefList" access="readOnly" dmr:version="2.1">
+        <description>
+          Represents the processors that this {{object}} has available to it.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".DeviceInfo.Processor." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.SoftwareModules.DeploymentUnit.{i}." access="readOnly" numEntriesParameter="DeploymentUnitNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.1">
+      <description>
+        This table serves as the Deployment Unit inventory and contains status information about each Deployment Unit.
+        A new instance of this table gets created during the installation of a Software Module.
+      </description>
+      <uniqueKey>
+        <parameter ref="UUID"/>
+        <parameter ref="Version"/>
+        <parameter ref="ExecutionEnvRef"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="UUID" access="readOnly" dmr:version="2.1">
+        <description>
+          A Universally Unique Identifier either provided by the ACS, or generated by the CPE, at the time of Deployment Unit Installation.  The format of this value is defined by {{bibref|RFC4122}} Version 3 (Name-Based) and {{bibref|TR-069a3|Annex H}}.
+          This value MUST NOT be altered when the {{object}} is updated.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="36"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DUID" access="readOnly" dmr:version="2.1">
+        <description>
+          Deployment Unit Identifier chosen by the targeted {{object|#.ExecEnv}}.  The format of this value is Execution Environment specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.1">
+        <description>
+          Indicates the Name of this {{object}}, which is chosen by the author of the Deployment Unit.
+          The value of this parameter is used in the generation of the {{param|UUID}} based on the rules defined in {{bibref|TR-069a3|Annex H}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" activeNotify="canDeny" dmr:version="2.1">
+        <description>
+          Indicates the status of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Installing">
+              <description>
+                This instance is in the process of being Installed and SHOULD transition to the {{enum|Installed}} state.
+              </description>
+            </enumeration>
+            <enumeration value="Installed">
+              <description>
+                This instance has been successfully Installed.  The {{param|Resolved}} flag SHOULD also be referenced for dependency resolution.
+              </description>
+            </enumeration>
+            <enumeration value="Updating">
+              <description>
+                This instance is in the process of being Updated and SHOULD transition to the {{enum|Installed}} state.
+              </description>
+            </enumeration>
+            <enumeration value="Uninstalling">
+              <description>
+                This instance is in the process of being Uninstalled and SHOULD transition to the {{enum|Uninstalled}} state.
+              </description>
+            </enumeration>
+            <enumeration value="Uninstalled">
+              <description>
+                This instance has been successfully Uninstalled.  This status will typically not be seen within a {{object}} instance.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Resolved" access="readOnly" dmr:version="2.1">
+        <description>
+          Indicates whether or not this {{object}} has resolved all of its dependencies.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="URL" access="readOnly" dmr:version="2.1">
+        <description>
+          Contains the URL used by the most recent ChangeDUState RPC to either Install or Update this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readOnly" dmr:version="2.1">
+        <description>
+          Textual description of this {{object}}. The format of this value is Execution Environment specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Vendor" access="readOnly" dmr:version="2.1">
+        <description>
+          The author of this {{object}} formatted as a domain name.
+          The value of this parameter is used in the generation of the {{param|UUID}} based on the rules defined in {{bibref|TR-069a3|Annex H}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.1">
+        <description>
+          Version of this {{object}}.  The format of this value is Execution Environment specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorLogList" access="readOnly" dmr:version="2.1">
+        <description>
+          Represents the vendor log files that have come into existence because of this {{object}}.  This does not include any vendor log files that have come into existence because of {{object|#.ExecutionUnit}} instances that are contained within this {{object}}.
+          When this {{object}} is uninstalled the vendor log files referenced here SHOULD be removed from the CPE.
+          Not all {{object}} instances will actually have a corresponding vendor log file, in which case the value of this parameter will be {{empty}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".DeviceInfo.VendorLogFile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorConfigList" access="readOnly" dmr:version="2.1">
+        <description>
+          Represents the vendor config files that have come into existence because of this {{object}}.  This does not include any vendor config files that have come into existence because of {{object|#.ExecutionUnit}} instances that are contained within this {{object}}.
+          When this {{object}} is uninstalled the vendor config files referenced here SHOULD be removed from the CPE.
+          Not all {{object}} instances will actually have a corresponding vendor config file, in which case the value of this parameter will be {{empty}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".DeviceInfo.VendorConfigFile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutionUnitList" access="readOnly" dmr:version="2.1">
+        <description>
+          Represents the {{object|#.ExecutionUnit}} instances that are associated with this {{object}} instance.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.ExecutionUnit." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutionEnvRef" access="readOnly" dmr:version="2.1">
+        <description>
+          Represents the {{object|#.ExecEnv}} instance where this {{object}} instance is installed.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.ExecEnv." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.SoftwareModules.ExecutionUnit.{i}." access="readOnly" numEntriesParameter="ExecutionUnitNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.1">
+      <description>
+        This table serves as the Execution Unit inventory and contains both status information about each Execution Unit as well as configurable parameters for each Execution Unit.
+        Each {{object|#.DeploymentUnit}} that is installed can have zero or more Execution Units.
+        Once a Deployment Unit is installed it populates this table with its contained Execution Units.
+        When the Deployment Unit (that caused this {{object}} to come into existence) is updated, this instance MAY be removed and new instances MAY come into existence.  While the Deployment Unit (that caused this {{object}} to come into existence) is being updated, all {{object}} instances associated with the Deployment Unit will be stopped until the update is complete at which time they will be restored to the state that they were in before the update started.
+        When the Deployment Unit (that caused this {{object}} to come into existence) is uninstalled, this instance is removed.
+        Each {{object}} MAY also contain a set of vendor specific parameters displaying status and maintaining configuration that reside under the {{object|Extensions}} object.
+      </description>
+      <uniqueKey>
+        <parameter ref="EUID"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="EUID" access="readOnly" dmr:version="2.1">
+        <description>
+          Execution Unit Identifier chosen by the {{object|#.ExecEnv}} during installation of the associated {{object|#.DeploymentUnit}}.
+          The format of this value is Execution Environment specific, but it MUST be unique across {{object|#.ExecEnv}} instances.  Thus, it is recommended that this be a combination of the {{param|#.ExecEnv.{i}.Name}} and an Execution Environment local unique value.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.1">
+        <description>
+          The name of this {{object}} as it pertains to its associated {{object|#.DeploymentUnit}}, which SHOULD be unique across all {{object}} instances contained within its associated {{object|#.DeploymentUnit}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ExecEnvLabel" access="readOnly" dmr:version="2.1">
+        <description>
+          The name of this {{object}} as provided by the {{object|#.ExecEnv}}, which SHOULD be unique across all {{object}} instances contained within a specific {{object|#.ExecEnv}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" activeNotify="forceDefaultEnabled" dmr:version="2.1">
+        <description>
+          Indicates the status of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Idle">
+              <description>
+                This instance is in an Idle state and not running.
+              </description>
+            </enumeration>
+            <enumeration value="Starting">
+              <description>
+                This instance is in the process of Starting and SHOULD transition to the {{enum|Active}} state.
+              </description>
+            </enumeration>
+            <enumeration value="Active">
+              <description>
+                This instance is currently running.
+              </description>
+            </enumeration>
+            <enumeration value="Stopping">
+              <description>
+                This instance is in the process of Stopping and SHOULD transition to the {{enum|Idle}} state.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RequestedState" access="readWrite" dmr:version="2.1">
+        <description>
+          Indicates the state transition that the ACS is requesting for this {{object}}.  {{enum}}
+          If this {{object}} is associated with an Execution Environment that is disabled and an attempt is made to alter this value, then a CWMP Fault MUST be generated.
+        </description>
+        <syntax command="true">
+          <string>
+            <enumeration value="Idle">
+              <description>
+                If this {{object}} is currently in {{enum|Starting|Status}} or {{enum|Active|Status}} the CPE will attempt to Stop the Execution Unit; otherwise this requested state is ignored.
+              </description>
+            </enumeration>
+            <enumeration value="Active">
+              <description>
+                If this {{object}} is currently in {{enum|Idle|Status}} the CPE will attempt to Start the Execution Unit.  If this {{object}} is in {{enum|Stopping|Status}} the request is rejected and a fault raised.  Otherwise this requested state is ignored.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutionFaultCode" access="readOnly" dmr:version="2.1">
+        <description>
+          If while running or transitioning between states this {{object}} identifies a fault this parameter embodies the problem.  The value of {{enum|NoFault}} MUST be used when everything is working as intended. {{enum}}
+          For fault codes not included in this list, the vendor MAY include vendor-specific values, which MUST use the format defined in {{bibref|TR-106a4|Section 3.3}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NoFault"/>
+            <enumeration value="FailureOnStart"/>
+            <enumeration value="FailureOnAutoStart"/>
+            <enumeration value="FailureOnStop"/>
+            <enumeration value="FailureWhileActive"/>
+            <enumeration value="DependencyFailure"/>
+            <enumeration value="UnStartable"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutionFaultMessage" access="readOnly" dmr:version="2.1">
+        <description>
+          If while running or transitioning between states this {{object}} identifies a fault this parameter provides a more detailed explanation of the problem.
+          If {{param|ExecutionFaultCode}} has the value of {{enum|NoFault|ExecutionFaultCode}} then the value of this parameter MUST {{empty}} and ignored by the ACS.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AutoStart" access="readWrite" dmr:version="2.1">
+        <description>
+          If {{true}} and the {{param|RunLevel}} verification is also met, then this {{object}} will be automatically started by the device after its {{object|#.ExecEnv}} is either rebooted or restarted.
+          If {{false}} this {{object}} will not be started after its {{object|#.ExecEnv}} is either rebooted or restarted until it is explicitly commanded to do so by either the ACS or another Execution Unit.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RunLevel" access="readWrite" dmr:version="2.1">
+        <description>
+          Determines when this {{object}} will be started.
+          If {{param|AutoStart}} is {{true}} and {{param|#.ExecEnv.{i}.CurrentRunLevel}} is greater than or equal to {{param}}, then this {{object}} will be started.
+          If the value of {{param|#.ExecEnv.{i}.CurrentRunLevel}} is -1, then the associated {{object|#.ExecEnv.}} doesn't support Run Levels, thus the value of this parameter is irrelevant when read and setting its value has no impact to the Run Level of this {{object}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Vendor" access="readOnly" dmr:version="2.1">
+        <description>
+          Vendor of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.1">
+        <description>
+          Version of the {{object}}.  The format of this value is Execution Environment specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readOnly" dmr:version="2.1">
+        <description>
+          Textual description of this {{object}}. The format of this value is Execution Environment specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DiskSpaceInUse" access="readOnly" activeNotify="canDeny" dmr:version="2.1">
+        <description>
+          The amount of disk space measured in {{units}} currently being used by this {{object}}.  A value of -1 MUST be used for {{object}} instances where this parameter is not applicable.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="kilobytes"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="MemoryInUse" access="readOnly" activeNotify="canDeny" dmr:version="2.1">
+        <description>
+          The amount of physical RAM measured in {{units}} currently being used by this {{object}}.  A value of -1 MUST be used for {{object}} instances where this parameter is not applicable.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="kilobytes"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="References" access="readOnly" dmr:version="2.1">
+        <description>
+          Represents the instances of multi-instanced objects that are directly controlled by, and have come into existence because of, this {{object}}.  See {{bibref|TR-157a3|Appendix II.3.2}} for more description and some examples.
+          NOTE: All other objects and parameters (i.e. not multi-instanced objects) that this {{object}} has caused to come into existence can be discovered via the {{object|.DeviceInfo.SupportedDataModel.{i}.}} table.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedProcessList" access="readOnly" dmr:version="2.1">
+        <description>
+          Represents the system processes that are active in the system because of this {{object}}.
+          If {{param|Status}} is not {{enum|Active|Status}} it is expected that this list will be {{empty}}.  Some {{object}} instances MIGHT NOT have any system processes irrespective of the value of {{param|Status}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".DeviceInfo.ProcessStatus.Process." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorLogList" access="readOnly" dmr:version="2.1">
+        <description>
+          Represents the vendor log files that have come into existence because of this {{object}}.
+          When the {{object|#.DeploymentUnit}} (that caused this {{object}} to come into existence) is uninstalled the vendor log files referenced here SHOULD be removed from the CPE.
+          Not all {{object}} instances will actually have a corresponding vendor log file, in which case the value of this parameter will be {{empty}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".DeviceInfo.VendorLogFile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorConfigList" access="readOnly" dmr:version="2.1">
+        <description>
+          Represents the vendor config files that have come into existence because of this {{object}}.
+          When the {{object|#.DeploymentUnit}} (that caused this {{object}} to come into existence) is uninstalled the vendor config files referenced here SHOULD be removed from the CPE.
+          Not all {{object}} instances will actually have a corresponding vendor config file, in which case the value of this parameter will be {{empty}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".DeviceInfo.VendorConfigFile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedDataModelList" access="readOnly" dmr:version="2.1">
+        <description>
+          Represents the CWMP-DT schema instances that have been introduced to this device because of the existence of this {{object}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".DeviceInfo.SupportedDataModel." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutionEnvRef" access="readOnly" dmr:version="2.1">
+        <description>
+          Represents the {{object|#.ExecEnv}} that this {{object}} is associated with.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.ExecEnv." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.SoftwareModules.ExecutionUnit.{i}.Extensions." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.1">
+      <description>
+        This object proposes a general location for vendor extensions specific to this Execution Unit, which allows multiple Execution Units to expose parameters without the concern of conflicting parameter names.  These vendor extensions are related to displaying status and maintaining configuration for this Execution Unit.
+        It is also possible for the Execution Unit to expose status and configuration parameters within Service objects or as embedded objects and parameters directly within the root data model, in which case the combination of {{param|#.References}} and {{param|#.SupportedDataModelList}} will be used to determine their locations.
+        See {{bibref|TR-157a3|Appendix II.3.2}} for more description and some examples.
+      </description>
+    </object>
+    <object name="Device.ETSIM2M." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.6">
+      <description>
+        The {{object}} object represents the management object for the Remote Entity Functions (REM) functions defined in the M2M Functional Architecture {{bibref|ETSIM2MFA}}.
+      </description>
+      <parameter name="SCLNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}." access="readWrite" numEntriesParameter="SCLNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.6">
+      <description>
+        This object represents an instance of a Service Capability Layer (SCL) for a M2M device or gateway.
+        The {{object}} MAY be maintained by the ACS or by the CPE.
+        When the {{object}} provides the administration of an SCL that is represented as a {{object|.SoftwareModules.ExecutionUnit}} the {{object}} is maintained in the {{param|.SoftwareModules.ExecutionUnit.{i}.References}} parameter.
+        Section 5.1.2 of the M2M Functional Architecture {{bibref|ETSIM2MFA}} describes the high level event flows for SCL registration.
+        Section 9.3.2.6.2 of the M2M Functional Architecture {{bibref|ETSIM2MFA}} describes the creation/registration of SCLs.
+        Section 9.3.2.6.4 of the M2M Functional Architecture {{bibref|ETSIM2MFA}} describes the update/re-registration of SCLs.
+        Section 9.3.2.6.5 of the M2M Functional Architecture {{bibref|ETSIM2MFA}} describes the deletion/deregistration of SCLs.
+        {{keys}}
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.6">
+        <description>
+          Administratively enables or disables this instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.6">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="AnnouncedToSCLList" access="readWrite" dmr:version="2.6">
+        <description>
+          {{list}} The list represents an unordered set of URIs {{bibref|RFC3986}}.
+          A list item is a URI string that represents a SCL to which the this {{object}} will announce original (local) resources.
+          The AnnouncedToSCL has an interest in the discovery of the local resource. Section 9.2.1.14 Announced Resource of the M2M Functional Architecture {{bibref|ETSIM2MFA}} provides a description of this behavior of an Announced Resource.
+          Section 9.3.2.28 of the M2M Functional Architecture {{bibref|ETSIM2MFA}} and Section 10.3.2.7 of the M2M mIa, dIa and mId Interfaces {{bibref|ETSIM2MInterfaces}} describes the process of announcing and deannouncing of resources within a SCL.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SAFPolicySetNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AreaNwkInstanceNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AreaNwkDeviceInfoInstanceNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}.Discovery." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.6">
+      <description>
+        This object is represents the administration properties used when a NSCL requests discovery of resources within this {{object|##.SCL}} instance.
+        Section 9.3.2.27 of the M2M Functional Architecture {{bibref|ETSIM2MFA}} describes the process of discovery of resources within a SCL.
+      </description>
+      <parameter name="MaxNumberOfDiscovRecords" access="readWrite" dmr:version="2.6">
+        <description>
+          The maximum number of URIs {{bibref|RFC3986}} for discovered resources contained in a discovery result.
+          This parameter and the {{param|MaxSizeOfDiscovAnswer}} parameter are mutually exclusive in that a result can be limited due to the bounds of either parameter.
+          A value of 0 indicates that the SCL does not have a limit for this parameter.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxSizeOfDiscovAnswer" access="readWrite" dmr:version="2.6">
+        <description>
+          The maximum size in bytes of the Discovery Answer.
+          This parameter and the {{param|MaxNumberOfDiscovRecords}} parameter are mutually exclusive in that a result can be limited due to the bounds of either parameter.
+          A value of 0 indicates that the SCL does not have a limit for this parameter.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}.Reregistration." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.6">
+      <description>
+        This object represents the properties and status necessary for a SCL to reregister with one or more NSCLs.
+      </description>
+      <parameter name="RegTargetNSCLList" access="readWrite" dmr:version="2.6">
+        <description>
+          {{list}} The list represents a priority ordered set of URIs {{bibref|RFC3986}}. The item that is first in the list has the highest priority.
+          A list item is a URI {{bibref|RFC3986}} string that represents a NSCL that this {{object|##.SCL}} instance can use in order to attempt registration.
+          When modified the contents of this parameter replace the {{param}} received during the bootstrap procedure.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="RegSearchStrings" access="readWrite" dmr:version="2.6">
+        <description>
+          {{list}} The list represents the string tokens used as keys when searching for this {{object|##.SCL}} instance.
+          Sections 9.2.3.6.2 and 9.2.3.6.4 of the M2M Functional Architecture {{bibref|ETSIM2MFA}} describe the usage for this parameter.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="RegAccessRightID" access="readWrite" dmr:version="2.6">
+        <description>
+          URI {{bibref|RFC3986}} that represents the identifier of the access right resource. The value of this parameter is maintained by the NSCL and used by the SCL as a default access right identifier for re-registration to NSCLs.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="RegExpirationDuration" access="readWrite" dmr:version="2.6">
+        <description>
+          The duration, in {{units}}, that the SCL will use in its next re-registration attempt. Any negative value represents an infinite duration.
+        </description>
+        <syntax>
+          <int>
+            <units value="seconds"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="Reregistration" access="readWrite" dmr:version="2.6">
+        <description>
+          {{command}} When set to {{true}}, triggers an immediate re-registration action where the SCL re-registers with the SCLs in the {{param|RegTargetNSCLList}} .
+        </description>
+        <syntax command="true">
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}.Reregistration.ActionStatus." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.6">
+      <description>
+        This object represents the status of the Reregistration action.
+      </description>
+      <parameter name="Progress" access="readOnly" activeNotify="canDeny" dmr:version="2.6">
+        <description>
+          The progress, in {{units}}, of the Reregistration action. The progress is measured from 0-100%. A value of 0 indicates that the action has not started. A value of 100 indicates that the action has completed.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+            <units value="percent"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FinalStatus" access="readOnly" dmr:version="2.6">
+        <description>
+          The completion status of the Reregistration operation. Enumeration of:
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="SUCCESS"/>
+            <enumeration value="FAILURE"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}." access="readWrite" numEntriesParameter="SAFPolicySetNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.6">
+      <description>
+        This object describes the parameters necessary to administer the store-and-forward (SAF) handling policies applied to requests to access remotely hosted resources.
+        Policies are described by instances of {{object}}. Which instances of {{object}} are used by the SCL is determined by the {{param|PolicyScope}} parameter.
+        Section 9.3.1.5 of the M2M Functional Architecture {{bibref|ETSIM2MFA}} and Section 10.3.1.2.2 of the M2M mIa, dIa and mId Interfaces {{bibref|ETSIM2MInterfaces}} describe the behavior for SAF processing.
+        There is at most one {{object}} instance with the {{param|PolicyScope}} containing a specific application id (APP-ID) URI value within the list.
+        There is exactly one {{object}} instance with a {{param|PolicyScope}} value of "default".
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.6">
+        <description>
+          Administratively enables or disables this instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.6">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="PolicyScope" access="readWrite" dmr:version="2.6">
+        <description>
+          The parameter defines the scope of the policies contained in this instance of a {{object|#.SAFPolicySet}}.
+          The parameter value is:
+          *a list of unordered set of URIs {{bibref|RFC3986}} that represents an M2M application id (APP-ID)
+          *the value of  "default"
+          *{{empty}}
+          When this parameter is set to a list of application id (APP-ID) URIs {{bibref|RFC3986}}, the scope indicates that the policies are applicable to requests coming from any specific application on that list.
+          When this parameter is set to a string with the value "default", the scope indicates that the policies are the default policies for this {{object|##.SCL}} instance.
+          When this parameter is set to {{empty}}, the value represents an unknown {{object|#.SAFPolicySet}} and the {{object|#.SAFPolicySet}} is not to be used.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ANPPolicyNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.ANPPolicy.{i}." access="readWrite" numEntriesParameter="ANPPolicyNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.6">
+      <description>
+        This table contains the SAF-handling policies which are controlled by the Access Network Provider(s).
+        {{keys}}
+      </description>
+      <uniqueKey>
+        <parameter ref="ANName"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.6">
+        <description>
+          Administratively enables or disables this instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.6">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="ANName" access="readWrite" dmr:version="2.6">
+        <description>
+          This parameter is the name of the access network provider and used to determine for which access network the policies defined in the {{object|#.ANPPolicy}} table will apply.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="BlockPeriodNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RequestCategoryNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.ANPPolicy.{i}.BlockPeriod.{i}." access="readWrite" numEntriesParameter="BlockPeriodNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.6" dmr:noUniqueKeys="true">
+      <description>
+        This table contains a list of block periods for a {{object|##.ANPPolicy}}.
+        A block period defines how long the device will wait before re-trying to establish connectivity via the access network after the previous attempt has failed.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="FailedAttempts"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.6">
+        <description>
+          Administratively enables or disables this instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.6">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="FailedAttempts" access="readWrite" dmr:version="2.6">
+        <description>
+          Number of consecutively failed access attempts for which the {{param|BlockDuration}} will be used to block the next access attempt.
+          The SCL will apply the {{object}} entry with the largest number of consecutive failed attempts that is smaller or equal to the actual number of consecutive failed attempts.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="BlockDuration" access="readWrite" dmr:version="2.6">
+        <description>
+          The duration, in {{units}}, to which to block further access attempts.
+        </description>
+        <syntax>
+          <int>
+            <units value="seconds"/>
+          </int>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.ANPPolicy.{i}.RequestCategory.{i}." access="readWrite" numEntriesParameter="RequestCategoryNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.6">
+      <description>
+        This table contains the Request Category (RCAT) policy items for defining when it is appropriate to use the access network for processing requests.
+      </description>
+      <uniqueKey>
+        <parameter ref="RCAT"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.6">
+        <description>
+          Administratively enables or disables this instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.6">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="RCAT" access="readWrite" dmr:version="2.6">
+        <description>
+          An RCAT is a string that represents a request category used for policy enforcement.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.ANPPolicy.{i}.RequestCategory.{i}.Schedule.{i}." access="readWrite" numEntriesParameter="ScheduleNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.6">
+      <description>
+        This table contains the schedules that define when it is appropriate to use the access network for processing requests for the specified value of the {{param|#.RCAT}}.
+        The combination of all instances of the {{object|AbsTimeSpan}} along with the {{param|Schedules}} parameter makes up the complete schedule for this instance of a {{object}}.
+        The {{param|Schedules}} parameter defines a recurrence of the schedule. If instances of {{object|AbsTimeSpan}} exist, these instances places constraints on the schedule recurrence.
+        If the value of the {{param|Schedules}} parameter is {{empty}}, at least one enabled instance of {{object|AbsTimeSpan}} MUST exist.
+        Processing behavior for the use of RCAT Schedules is defined in section 10.3.1.2.2 of the M2M mIa, dIa and mId Interfaces {{bibref|ETSIM2MInterfaces}} document.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.6">
+        <description>
+          Administratively enables or disables this instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.6">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Schedules" access="readWrite" dmr:version="2.6">
+        <description>
+          The list is a set of schedule strings.
+          A schedule string is formatted according to the date and time fields defined CRONTAB input file definition in {{bibref|POSIXBase}}.
+          The {{param}} parameter is used to set the recurrence of the schedule.
+          The timezone used for this parameter is dependent upon the existence of instances of {{object|AbsTimeSpan}} for this {{object}}. If instances of {{object|AbsTimeSpan}} exist, then the timezone of the {{object|AbsTimeSpan}} is used otherwise the UTC timezone is used for this {{param}} parameter.
+          Note the command field is not used in this definition and any whitespace or comma characters within a Schedule string MUST be escaped using percent as defined in {{bibref|TR-106a5|section 3.2.3}}
+          Example of CRONTAB string:
+          *"* 0-6 * * 1-5" would mean every minute for the period from 0:00h to 6:00h (inclusive) on any week day (Monday through Friday) and would be represented as "*%200-6%20*%20*%201-5"
+          *"*/15 22-23,0-4 * * 1-5" would mean every 15 minutes for the period from 22:00h to 04:00h on any week day (Monday through Friday) and would be represented as "*/15%2022-23%2C0-4%20*%20*%201-5"
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AbsTimeSpanNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.ANPPolicy.{i}.RequestCategory.{i}.Schedule.{i}.AbsTimeSpan.{i}." access="readWrite" numEntriesParameter="AbsTimeSpanNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.6" dmr:noUniqueKeys="true">
+      <description>
+        This object defines an instance of a time span used for determining an RCAT schedule.
+        An instance of the {{object}} represents the time span in which the schedule recurrence defined in {{param|#.Schedules}} is constrained.
+        {{object}} instances with unknown values for the {{param|StartTime}} or {{param|EndTime}} are ignored.
+        All instances of the {{object}} within this {{object|##.Schedule}} MUST utilize the same time zone.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.6">
+        <description>
+          Administratively enables or disables this instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.6">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="StartTime" access="readWrite" dmr:version="2.6">
+        <description>
+          Date and time that represents the start of the time span.
+          The value 0001-01-01T00:00:00Z represents an unknown value.
+          The device MUST reject requests to set the {{param}} value greater than the {{param|EndTime}} value.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="0001-01-01T00:00:00Z"/>
+        </syntax>
+      </parameter>
+      <parameter name="EndTime" access="readWrite" dmr:version="2.6">
+        <description>
+          Date and time that represents the end of the time span.
+          The value 9999-12-31T23:59:59Z represents an infinite time span from the start time.
+          The value 0001-01-01T00:00:00Z represents an unknown value.
+          The device MUST reject requests to set the {{param}} value less than or equal the {{param|StartTime}} value.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="0001-01-01T00:00:00Z"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.M2MSPPolicy." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.6">
+      <description>
+        This object maintains the SAF handling policies' properties that are controlled by the M2M service provider for a request.
+      </description>
+      <parameter name="DefaultRCATValue" access="readWrite" dmr:version="2.6">
+        <description>
+          The default RCAT value to use for requests to remotely hosted resources during SAF-handling when no RCAT value was specified in the request.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="RequestCategoryNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.M2MSPPolicy.RequestCategory.{i}." access="readWrite" numEntriesParameter="RequestCategoryNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.6">
+      <description>
+        This object maintains a list of properties to be used for forwarding requests with a specified {{param|RCAT}}.
+        Processing behavior for the use of M2M Service Provider policies is defined in section 10.3.1.2.2.1 of the M2M mIa, dIa and mId Interfaces {{bibref|ETSIM2MInterfaces}} document.
+      </description>
+      <uniqueKey>
+        <parameter ref="RCAT"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.6">
+        <description>
+          Administratively enables or disables this instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.6">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="RCAT" access="readWrite" dmr:version="2.6">
+        <description>
+          An RCAT is a string that represents a request category used for policy enforcement.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="TolerableDelay" access="readWrite" dmr:version="2.6">
+        <description>
+          The tolerable duration, in {{units}}, that a request of the given RCAT category can be pending in SAF handling when a request from an M2M Application does not specify a tolerable delay.
+          A value of -1 represents an infinite duration.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Thresh" access="readWrite" dmr:version="2.6">
+        <description>
+          The threshold of maximum number of pending requests permitted to be held for a specified RCAT.
+          A value of 0 indicates that the request should be transmitted immediately.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Mem" access="readWrite" dmr:version="2.6">
+        <description>
+          This parameter defines the maximum size of the request queue for pending requests permitted to be held for a specified RCAT.
+          The format of the string is an integer with an appended memory unit (B - Bytes, K - 1024 Bytes, M - 1048576 Bytes, G -1073741824, T - 1099511627776 Bytes).
+          When the value is {{empty}}  the memory threshold criteria for the associated RCATList will be ignored in SAF handling.
+          {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <pattern value="([0-9]{1,15}?[BKMGT])"/>
+            <pattern value="">
+              <description>
+                {{empty}}
+              </description>
+            </pattern>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RankedANList" access="readWrite" dmr:version="2.6">
+        <description>
+          The list is a prioritized set of Access Networks where the preference of using an Access Network is based on order of the list items with the lowest order list item as the most preferred Access Network.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="##.ANPPolicy." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}.AreaNwkInstance.{i}." access="readOnly" numEntriesParameter="AreaNwkInstanceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.6" dmr:fixedObject="true">
+      <description>
+        The M2M Area Network information provides administration capabilities for remote management (REM) of M2M Devices (D', d) that are attached to this {{object|##.SCL}} instance.
+        This object provides the administration of the properties needed by the SCL to remotely manage M2M Devices within a specific type of M2M Area network as defined by {{param|AreaNwkType}}.
+        Multiple instances of {{object}} with the same {{param|AreaNwkType}} is permitted.
+        Section 5.3.5 of the M2M Functional Architecture {{bibref|ETSIM2MFA}} describes the REM functionality expected of a SCL for an M2M Device.
+      </description>
+      <uniqueKey>
+        <parameter ref="ID"/>
+      </uniqueKey>
+      <parameter name="ID" access="readOnly" dmr:version="2.6">
+        <description>
+          URI {{bibref|RFC3986}} that represents the identifier of the instance.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="AreaNwkType" access="readOnly" dmr:version="2.6">
+        <description>
+          Devices (D' and d) that connect to an SCL are said to be "attached devices" and are organized by M2M Area Networks within the {{object|##.SCL}} instance. The {{param}} is an implementation-chosen string that indicates the type of M2M Area Network.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ListOfDevices" access="readOnly" dmr:version="2.6">
+        <description>
+          {{list}} {{reference}}
+          The list represents the M2M Devices (D', d) that are attached to this {{object|##.SCL}} instance that are within this {{object}} instance. The list does not contain an instance for this CPE.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.AreaNwkDeviceInfoInstance." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PropertyNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}.AreaNwkInstance.{i}.Property.{i}." access="readOnly" numEntriesParameter="PropertyNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.6" dmr:noUniqueKeys="true">
+      <description>
+        This object contains an instance of a property extension (name value pair) for this {{object|##.AreaNwkInstance}} instance.
+        For example, if the {{param|#.AreaNwkType}} is ZigBee the {{object|##.AreaNwkInstance}} will contain ZigBee specific parameters that have not been modeled for the M2M Area network.
+        At a minimum, a property instance MUST exist that defines  an attribute that describes the IP layer address type (e.g., IPv4, IPv6, non-IP) of this M2M Area Network.
+      </description>
+      <parameter name="Name" access="readOnly" dmr:version="2.6">
+        <description>
+          The name of the property
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the property.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}.AreaNwkDeviceInfoInstance.{i}." access="readOnly" numEntriesParameter="AreaNwkDeviceInfoInstanceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.6" dmr:noUniqueKeys="true" dmr:fixedObject="true">
+      <description>
+        The M2M Area Network Device Information provides the administration capability to the SCL for maintenance of M2M Devices (D', d) that are attached to this {{object|##.SCL}} instance.
+        While discovery and identification of devices by the M2M Gateway or Device (CPE) is implementation specific, each device is represented by an instance of the {{object|.Hosts.Host}} table.
+        When the M2M Device is managed by the CWMP endpoint of the CPE, the {{object}} is expected to be referenced by an instance of one of the following tables:
+        *{{object|.ManagementServer.EmbeddedDevice}}
+        *{{object|.ManagementServer.VirtualDevice}}
+        Section 5.3.5 of the M2M Functional Architecture {{bibref|ETSIM2MFA}} describes the REM functionality expected of a SCL to a M2M Device.
+        This object instance provides the administration properties required by a SCL to remotely manage an instance of a M2M Device within a M2M area network.
+        A M2M Device is associated with an instance of a {{object|#.AreaNwkInstance}}.
+        This table contains parameters and information of the M2M Device related to each {{object|#.AreaNwkInstance}} instance.
+        Instances of this table are created and deleted by the CPE. The ACS MAY modify the writeable parameters of this object instance but  it is possible that the value set by the ACS is not retained between reboots of the M2M Device.
+      </description>
+      <parameter name="AreaNwkInstance" access="readOnly" dmr:version="2.6">
+        <description>
+          {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.AreaNwkInstance." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.6">
+        <description>
+          {{list}} {{reference|the {{object|.Hosts.Host}} table entry that represents an active or inactive M2M Device}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".Hosts.Host." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ListOfDeviceNeighbors" access="readOnly" dmr:version="2.6">
+        <description>
+          {{list}} {{reference}} References all the {{object|.Hosts.Host}} table entries, whether active or inactive, that represent the reachable neighbors of this M2M Device (D' or d).
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".Hosts.Host." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ListOfDeviceApplications" access="readOnly" dmr:version="2.6">
+        <description>
+          The list is an unordered set of URIs {{bibref|RFC3986}}.
+          A list item is an URI string that represents an application id (APP-ID) for the M2M D'A applications residing on the M2M Device for the associated {{object|#.AreaNwkInstance}}.
+          Table B.58 of the M2M Functional Architecture {{bibref|ETSIM2MFA}} describes this parameter.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SleepInterval" access="readWrite" dmr:version="2.6">
+        <description>
+          The interval, in {{units}}, between sleep periods for the device.
+          A value of 0 represents a device that does not sleep.
+          Note: When this value is modified, the CPE could modify the {{param}} for this M2M Device in other Area Networks.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SleepDuration" access="readWrite" dmr:version="2.6">
+        <description>
+          The duration, in {{units}}, of a sleep period.
+          The value 0 represents an unknown value.
+          Note: When this value is modified, the CPE could modify the {{param}} for this M2M Device in other Area Networks.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.6">
+        <description>
+          The sleep status of the device.
+          Enumeration of:
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ASLEEP"/>
+            <enumeration value="AWAKE"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.6">
+        <description>
+          Whether or not this M2M Device is currently attached to this {{object|##.SCL}} instance.
+          The ability to list inactive M2M Devices is OPTIONAL.  If the CPE includes inactive M2MDevices in this table, {{param}} is set to {{false}}  for each inactive M2M Device.  The length of time an inactive M2M Device remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PropertyNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ETSIM2M.SCL.{i}.AreaNwkDeviceInfoInstance.{i}.Property.{i}." access="readOnly" numEntriesParameter="PropertyNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.6" dmr:noUniqueKeys="true">
+      <description>
+        This object contains an instance of a property extension (name value pair) for this {{object|##.AreaNwkDeviceInfoInstance}} instance.
+        For example, if the {{param|##.AreaNwkInstance.{i}.AreaNwkType}} value is ZigBee, this {{object|##.AreaNwkDeviceInfoInstance}} contains ZigBee-specific parameters that are not formally modeled for this {{object|##.AreaNwkDeviceInfoInstance}} instance.
+      </description>
+      <parameter name="Name" access="readOnly" dmr:version="2.6">
+        <description>
+          The name of the property
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the property.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.GatewayInfo." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains information associated with a connected Internet Gateway Device.
+      </description>
+      <parameter name="ManufacturerOUI" access="readOnly" activeNotify="forceDefaultEnabled" dmr:version="2.0">
+        <description>
+          Organizationally unique identifier of the associated Internet Gateway Device.  {{pattern}}
+          {{empty}} indicates that there is  no associated Internet Gateway Device that has been detected.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="6"/>
+            <pattern value=""/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProductClass" access="readOnly" activeNotify="forceDefaultEnabled" dmr:version="2.0">
+        <description>
+          Identifier of the product class of the associated Internet Gateway Device.  {{empty}} indicates either that  there is no associated Internet Gateway Device that has been detected, or the Internet Gateway Device does not support the use of the  product-class parameter.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" activeNotify="forceDefaultEnabled" dmr:version="2.0">
+        <description>
+          Serial number of the associated Internet Gateway Device.  {{empty}} indicates that there is no associated  Internet Gateway Device that has been detected.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Time." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains parameters relating an NTP or SNTP time client in the CPE.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the NTP or SNTP time client.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Status of Time support on the CPE.  {{enum}}
+          The {{enum|Unsynchronized}} value indicates that the CPE's absolute time has not yet been set.
+          The {{enum|Synchronized}} value indicates that the CPE has acquired accurate absolute time; its current time is accurate.
+          The {{enum|Error_FailedToSynchronize}} value indicates that the CPE failed to acquire accurate absolute time; its current time is not  accurate.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Unsynchronized"/>
+            <enumeration value="Synchronized"/>
+            <enumeration value="Error_FailedToSynchronize"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NTPServer1" access="readWrite" dmr:version="2.0">
+        <description>
+          First NTP timeserver.  Either a host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NTPServer2" access="readWrite" dmr:version="2.0">
+        <description>
+          Second NTP timeserver.  Either a host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NTPServer3" access="readWrite" dmr:version="2.0">
+        <description>
+          Third NTP timeserver.  Either a host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NTPServer4" access="readWrite" dmr:version="2.0">
+        <description>
+          Fourth NTP timeserver.  Either a host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NTPServer5" access="readWrite" dmr:version="2.0">
+        <description>
+          Fifth NTP timeserver.  Either a host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentLocalTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current date and time in the CPE's local time zone.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LocalTimeZone" access="readWrite" dmr:version="2.0">
+        <description>
+          The local time zone definition, encoded according to IEEE 1003.1 (POSIX).  The following is an example value:
+          : EST+5 EDT,M4.1.0/2,M10.5.0/2
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UserInterface." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains parameters relating to the user interface of the CPE.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.11">
+        <description>
+          Enables and disables the CPE's user interface.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="PasswordRequired" access="readWrite" dmr:version="2.0">
+        <description>
+          Present only if the CPE provides a password-protected LAN-side user interface.
+          Indicates whether or not the local user interface MUST require a password to be chosen by the user.  If {{false}}, the choice of  whether or not a password is used is left to the user.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PasswordUserSelectable" access="readWrite" dmr:version="2.0">
+        <description>
+          Present only if the CPE provides a password-protected LAN-side user interface and supports LAN-side  Auto-Configuration.
+          Indicates whether or not a password to protect the local user interface of the CPE MAY be selected by the user directly (i.e. {{param|.Users.User.{i}.Password}}), or MUST be equal to the password used by the LAN-side Auto-Configuration protocol (i.e. {{param|.LANConfigSecurity.ConfigPassword}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PasswordReset" access="readWrite" dmr:version="2.0">
+        <description>
+          Present only if the CPE provides a password-protected LAN-side user interface and supports LAN-side Auto-Configuration.
+          When set to true, resets {{param|.LANConfigSecurity.ConfigPassword}} to its factory value.
+        </description>
+        <syntax command="true">
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UpgradeAvailable" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates that a CPE upgrade is available, allowing the CPE to display this information to the  user.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="WarrantyDate" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates the date and time in UTC that the warranty associated with the CPE is to expire.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ISPName" access="readWrite" dmr:version="2.0">
+        <description>
+          The name of the customer's ISP.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ISPHelpDesk" access="readWrite" dmr:version="2.0">
+        <description>
+          The help desk phone number of the ISP.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ISPHomePage" access="readWrite" dmr:version="2.0">
+        <description>
+          The URL of the ISP's home page.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ISPHelpPage" access="readWrite" dmr:version="2.0">
+        <description>
+          The URL of the ISP's on-line support page.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ISPLogo" access="readWrite" dmr:version="2.0">
+        <description>
+          Base64 encoded GIF or JPEG image. The binary image is constrained to 4095 bytes or less.
+        </description>
+        <syntax>
+          <base64>
+            <size minLength="0" maxLength="4095"/>
+          </base64>
+        </syntax>
+      </parameter>
+      <parameter name="ISPLogoSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Un-encoded binary image size in bytes.
+          If ISPLogoSize input value is 0 then the ISPLogo is cleared.
+          ISPLogoSize can also be used as a check to verify correct transfer and conversion of Base64 string to image size.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="4095"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ISPMailServer" access="readWrite" dmr:version="2.0">
+        <description>
+          The URL of the ISP's mail server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ISPNewsServer" access="readWrite" dmr:version="2.0">
+        <description>
+          The URL of the ISP's news server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TextColor" access="readWrite" dmr:version="2.0">
+        <description>
+          The color of text on the GUI screens in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="BackgroundColor" access="readWrite" dmr:version="2.0">
+        <description>
+          The color of the GUI screen backgrounds in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="ButtonColor" access="readWrite" dmr:version="2.0">
+        <description>
+          The color of buttons on the GUI screens in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="ButtonTextColor" access="readWrite" dmr:version="2.0">
+        <description>
+          The color of text on buttons on the GUI screens in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="AutoUpdateServer" access="readWrite" dmr:version="2.0">
+        <description>
+          The server the CPE can check to see if an update is available for direct download to it.
+          This MUST NOT be used by the CPE if the {{param|.ManagementServer.UpgradesManaged}} parameter is {{true}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UserUpdateServer" access="readWrite" dmr:version="2.0">
+        <description>
+          The server where a user can check via a web browser if an update is available for download to a PC.
+          This MUST NOT be used by the CPE if the {{param|.ManagementServer.UpgradesManaged}} parameter is {{true}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AvailableLanguages" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items represent user-interface languages that are available, where each language is specified according to {{bibref|RFC3066}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentLanguage" access="readWrite" dmr:version="2.0">
+        <description>
+          Current user-interface language, specified according to {{bibref|RFC3066}}. The value MUST be a member of the list reported by the {{param|AvailableLanguages}} parameter.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="16"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UserInterface.RemoteAccess." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains parameters relating to remotely accessing the CPE's user interface.
+        Remote access is defined as any entity not of a local subnet attempting to connect to the CPE.
+        Remote access requires user authentication.  To provide remote access authentication the CPE MUST support a "User" table with at least one instance that has "RemoteAccessCapable" set to {{true}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables remotely accessing the CPE's user interface.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.0">
+        <description>
+          Destination TCP port required for remote access connection.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedProtocols" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the protocols that are supported by the CPE for the purpose of remotely accessing the user interface.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="HTTP">
+              <description>
+                As defined in {{bibref|RFC2616}}
+              </description>
+            </enumeration>
+            <enumeration value="HTTPS">
+              <description>
+                As defined in {{bibref|RFC2818}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.0">
+        <description>
+          This is the protocol currently being used for remote access.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="SupportedProtocols"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UserInterface.LocalDisplay." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object describes how to remotely manage the initial positioning of a user interface on a device's local display.
+      </description>
+      <parameter name="Movable" access="readWrite" dmr:version="2.0">
+        <description>
+          Controls whether the user is allowed to change the GUI window position on the local CPE's display.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Resizable" access="readWrite" dmr:version="2.0">
+        <description>
+          Controls whether the user is allowed to resize the GUI window on the local CPE's display.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PosX" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The horizontal position of the User Interface's top left corner within the local CPE's display measured from the top left corner, expressed in {{units}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="pixels"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="PosY" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The vertical position of the User Interface's top left corner within the local CPE's display measured from the top left corner, expressed in {{units}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="pixels"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Width" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The width of the user interface within the local CPE's display, expressed in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="pixels"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Height" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The height of the user interface within the local CPE's display, expressed in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="pixels"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DisplayWidth" access="readOnly" dmr:version="2.0">
+        <description>
+          The width of the local CPE's display, expressed in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="pixels"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DisplayHeight" access="readOnly" dmr:version="2.0">
+        <description>
+          The height of the local CPE's display, expressed in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="pixels"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UserInterface.Messages." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        Definition of user information message displays.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.11">
+        <description>
+          Enables and displays the user information message.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="Title" access="readWrite" dmr:version="2.11">
+        <description>
+          Message title to be displayed.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SubTitle" access="readWrite" dmr:version="2.11">
+        <description>
+          Message sub title to be displayed.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Text" access="readWrite" dmr:version="2.11">
+        <description>
+          Message text.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="IconType" access="readWrite" dmr:version="2.11">
+        <description>
+          Icon to be displayed.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="Greeting"/>
+            <enumeration value="Information"/>
+            <enumeration value="Warning"/>
+            <enumeration value="Important"/>
+            <enumeration value="Urgent"/>
+            <enumeration value="Advertisement"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MessageColor" access="readWrite" dmr:version="2.11">
+        <description>
+          The color of message text in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="BackgroundColor" access="readWrite" dmr:version="2.11">
+        <description>
+          The color of the message screen background in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="TitleColor" access="readWrite" dmr:version="2.11">
+        <description>
+          The color of the message title in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="SubTitleColor" access="readWrite" dmr:version="2.11">
+        <description>
+          The color of the sub title in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="RequestedNumberOfRepetitions" access="readWrite" dmr:version="2.11">
+        <description>
+          The number of times the device SHOULD repeat the message.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutedNumberOfRepetitions" access="readOnly" dmr:version="2.11">
+        <description>
+          The number of times the device repeated the message.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.InterfaceStack.{i}." access="readOnly" numEntriesParameter="InterfaceStackNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This table contains information about the relationships between the multiple layers of interface objects ({{bibref|TR-181i2|Section 4.3}}). In particular, it contains information on which interfaces run ''on top of'' which other interfaces.
+        This table is auto-generated by the CPE based on the ''LowerLayers'' parameters on individual interface objects.
+        Each table row represents a "link" between two interface objects, a higher-layer interface object (referenced by {{param|HigherLayer}}) and a lower-layer interface object (referenced by {{param|LowerLayer}}). Consequently, if a referenced interface object is deleted, the CPE MUST delete the corresponding {{object}} row(s) that had referenced it.
+      </description>
+      <uniqueKey>
+        <parameter ref="HigherLayer"/>
+        <parameter ref="LowerLayer"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="HigherLayer" access="readOnly" dmr:version="2.0">
+        <description>
+          {{noreference}}A reference to the interface object corresponding to the higher layer of the relationship, i.e. the interface which runs on ''top'' of the interface identified by the corresponding instance of {{param|LowerLayer}}.
+          When the referenced higher layer interface is deleted, the CPE MUST delete the table row.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayer" access="readOnly" dmr:version="2.0">
+        <description>
+          {{noreference}}A reference to the interface object corresponding to the lower layer of the relationship, i.e. the interface which runs ''below'' the interface identified by the corresponding instance of {{param|HigherLayer}}.
+          When the referenced lower layer interface is deleted, the CPE MUST delete the table row.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="HigherAlias" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the ''Alias'' parameter for the interface object referenced by {{param|HigherLayer}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LowerAlias" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the ''Alias'' parameter for the interface object referenced by {{param|LowerLayer}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object models DSL lines, DSL channels, DSL bonding, and DSL diagnostics. The specific interface objects defined here are {{object|Line}}, {{object|Channel}}, and {{object|BondingGroup}}. Each {{object|Line}} models a layer 1 DSL Line interface, and each {{object|Channel}} models a layer 1 DSL Channel interface where multiple channels can run over a DSL line. In the case where bonding is configured, it is expected that {{object|BondingGroup}} is stacked above the {{object|Channel}} instances within its group.
+      </description>
+      <parameter name="LineNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ChannelNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BondingGroupNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}." access="readOnly" numEntriesParameter="LineNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        DSL Line table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+        This table models physical DSL lines.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the DSL line.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EnableDataGathering" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables data gathering on the DSL line.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the DSL line (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the DSL line as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the DSL line entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          A string identifying the version of the modem firmware currently installed for this interface. This is applicable only when the modem firmware is separable from the overall CPE software.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LinkStatus" access="readOnly" dmr:version="2.0">
+        <description>
+          Status of the DSL physical link. {{enum}}
+          When {{param}} is {{enum|Up}}, {{param|Status}} is expected to be {{enum|Up|Status}}. When {{param}} is {{enum|Initializing}} or {{enum|EstablishingLink}} or {{enum|NoSignal}} or {{enum|Disabled}}, {{param|Status}} is expected to be {{enum|Down|Status}}.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Initializing"/>
+            <enumeration value="EstablishingLink"/>
+            <enumeration value="NoSignal"/>
+            <enumeration value="Disabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="StandardsSupported" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate which DSL standards and recommendations are supported by the {{object}} instance. {{enum}}
+          Note: In G.997.1, this parameter is called "xDSL Transmission system capabilities". See ITU-T Recommendation {{bibref|G.997.1}}.
+          This parameter is DEPRECATED because its entries are out-of-date; {{param|XTSE}} points to a current list.  Therefore its value MAY be {{empty}} if (and only if) {{param|XTSE}} is supported.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="G.992.1_Annex_A"/>
+            <enumeration value="G.992.1_Annex_B"/>
+            <enumeration value="G.992.1_Annex_C"/>
+            <enumeration value="T1.413"/>
+            <enumeration value="T1.413i2"/>
+            <enumeration value="ETSI_101_388"/>
+            <enumeration value="G.992.2"/>
+            <enumeration value="G.992.3_Annex_A"/>
+            <enumeration value="G.992.3_Annex_B"/>
+            <enumeration value="G.992.3_Annex_C"/>
+            <enumeration value="G.992.3_Annex_I"/>
+            <enumeration value="G.992.3_Annex_J"/>
+            <enumeration value="G.992.3_Annex_L"/>
+            <enumeration value="G.992.3_Annex_M"/>
+            <enumeration value="G.992.4"/>
+            <enumeration value="G.992.5_Annex_A"/>
+            <enumeration value="G.992.5_Annex_B"/>
+            <enumeration value="G.992.5_Annex_C"/>
+            <enumeration value="G.992.5_Annex_I"/>
+            <enumeration value="G.992.5_Annex_J"/>
+            <enumeration value="G.992.5_Annex_M"/>
+            <enumeration value="G.993.1"/>
+            <enumeration value="G.993.1_Annex_A"/>
+            <enumeration value="G.993.2_Annex_A"/>
+            <enumeration value="G.993.2_Annex_B"/>
+            <enumeration value="G.993.2_Annex_C"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="XTSE" access="readOnly" dmr:version="2.8">
+        <description>
+          This configuration parameter defines the transmission system types to be allowed by the xTU on this {{object}} instance. Each bit is 0 if not allowed or 1 if allowed, as defined for the xTU transmission system enabling (XTSE) in ITU-T G.997.1.
+          Note: This parameter is defined as xDSL Transmission system enabling (XTSE) in ITU-T G.997.1. For a full definition, see Clause 7.3.1.1.1 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="8" maxLength="8"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="StandardUsed" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          Indicates the standard that the {{object}} instance is using for the connection.
+          Note: In G.997.1, this parameter is called "xDSL Transmission system". See ITU-T Recommendation {{bibref|G.997.1}}.
+          This parameter is DEPRECATED because its entries are out-of-date; {{param|XTSE}} points to a current list.  Therefore its value MAY be {{empty}} if (and only if) {{param|XTSUsed}} is supported.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="StandardsSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="XTSUsed" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter indicates which DSL standard and recommendation are currently in use by the {{object}} instance. Only one bit is set, as defined for the xTU transmission system enabling (XTSE) in ITU-T G.997.1.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="8" maxLength="8"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="LineEncoding" access="readOnly" dmr:version="2.0">
+        <description>
+          The line encoding method used in establishing the Layer 1 DSL connection between the CPE and the DSLAM.  {{enum}}
+          Note: Generally speaking, this variable does not change after provisioning.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DMT"/>
+            <enumeration value="CAP"/>
+            <enumeration value="2B1Q"/>
+            <enumeration value="43BT"/>
+            <enumeration value="PAM"/>
+            <enumeration value="QAM"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AllowedProfiles" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate which VDSL2 profiles are allowed on the line.  {{enum}}
+          Note:  In G.997.1, this parameter is called PROFILES.  See ITU-T Recommendation {{bibref|G.997.1}}.
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be {{empty}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="8a"/>
+            <enumeration value="8b"/>
+            <enumeration value="8c"/>
+            <enumeration value="8d"/>
+            <enumeration value="12a"/>
+            <enumeration value="12b"/>
+            <enumeration value="17a"/>
+            <enumeration value="17b" status="deleted"/>
+            <enumeration value="30a"/>
+            <enumeration value="35b"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentProfile" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates which VDSL2 profile is currently in use on the line.
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="AllowedProfiles" nullValue=""/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PowerManagementState" access="readOnly" dmr:version="2.0">
+        <description>
+          The power management state of the line. {{enum}}
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="L0"/>
+            <enumeration value="L1"/>
+            <enumeration value="L2"/>
+            <enumeration value="L3"/>
+            <enumeration value="L4"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessFailureCause" access="readOnly" dmr:version="2.0">
+        <description>
+          The success failure cause of the initialization. An enumeration of the following integer values:
+          * 0: Successful
+          * 1: Configuration error.  This error occurs with inconsistencies in configuration parameters, e.g. when the line is initialized in  an xDSL Transmission system where an xTU does not support the configured Maximum Delay or the configured Minimum or Maximum Data Rate  for one or more bearer channels.
+          * 2: Configuration not feasible on the line.  This error occurs if the Minimum Data Rate cannot be reached on the line with the  Minimum Noise Margin, Maximum PSD level, Maximum Delay and Maximum Bit Error Ratio for one or more bearer channels.
+          * 3: Communication problem.  This error occurs, for example, due to corrupted messages or bad syntax messages or if no common mode  can be selected in the G.994.1 handshaking procedure or due to a timeout.
+          * 4: No peer xTU detected.  This error occurs if the peer xTU is not powered or not connected or if the line is too long to allow  detection of a peer xTU.
+          * 5: Any other or unknown Initialization Failure cause.
+          * 6: ITU T G.998.4 retransmission mode was not selected while RTX_MODE = FORCED or with RTX_MODE = RTX_TESTMODE.
+          Note: In G.997.1, this parameter is called "Initialization success/failure cause". See Clause 7.5.1.6 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="6"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UPBOKLER" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter contains the estimated electrical loop length estimated by the VTU-R expressed in {{units}} at 1MHz (see O-UPDATE in section 12.2.4.2.1.2/G.993.2). The value is coded as an unsignedInt in the range 0 (coded as 0) to 128 dB (coded as 1280) in steps of {{units}}.
+          Note: This parameter is defined as UPBOKLE-R in Clause 7.5.1.23.2 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1280"/>
+            <units value="0.1 dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UPBOKLEPb" access="readOnly" dmr:version="2.8">
+        <description>
+          VTU-O estimated upstream power back-off electrical length per band.
+          This parameter is a vector of UPBO electrical length per-band estimates for each supported downstream band, expressed in {{units}} at 1 MHz (kl0) calculated by the VTU-R, based on separate measurements in the supported upstream bands. The value of each list element ranges from 0 to 128 dB in steps of {{units}}, with special value 204.7 which indicates that the estimate is greater than 128 dB. This parameter is required for the alternative electrical length estimation method (ELE-M1).
+          Note: This parameter is defined as UPBOKLE-pb in Clause 7.5.1.23.3 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1280"/>
+            <range minInclusive="2047" maxInclusive="2047"/>
+            <units value="0.1 dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UPBOKLERPb" access="readOnly" dmr:version="2.8">
+        <description>
+          VTU-R estimated upstream power back-off electrical length per band.
+          This parameter is a vector of UPBO electrical length per-band estimates for each supported downstream band, expressed in {{units}} at 1 MHz (kl0) calculated by the VTU-R, based on separate measurements in the supported downstream bands. The value of each list element ranges from 0 to 128 dB in steps of {{units}}, with special value 204.7 which indicates that the estimate is greater than 128 dB. This parameter is required for the alternative electrical length estimation method (ELE-M1).
+          The value of each list element is coded as an unsigned 16 bit number in the range 0 (coded as 0) to 128 dB (coded as 1280) in steps of {{units}}.
+          Note: This parameter is defined as UPBOKLE-R-pb in Clause 7.5.1.23.4 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1280"/>
+            <range minInclusive="2047" maxInclusive="2047"/>
+            <units value="0.1 dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RXTHRSHds" access="readOnly" dmr:version="2.8">
+        <description>
+          UPBO downstream receiver signal level threshold.
+          This parameter reports the downstream received signal level threshold value used in the alternative electrical length estimation method (ELE-M1). This parameter represents an offset from -100 dBm/Hz, and ranges from -64 dB to 0 dB in steps of {{units}}.
+          The value is coded as a 16 bit number in the range -64 (coded as -640) to 0 dB (coded as 0) in steps of {{units}}.
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-640" maxInclusive="0"/>
+            <units value="0.1 dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ACTRAMODEds" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter indicates the actual active rate adaptation mode in the downstream direction.
+          * If {{param}} equals 1, the link is operating in RA-MODE 1 (MANUAL).
+          * If {{param}} equals 2, the link is operating in RA-MODE 2 (AT_INIT).
+          * If {{param}} equals 3, the link is operating in RA-MODE 3 (DYNAMIC).
+          * If {{param}} equals 4, the link is operating in RA-MODE 4 (DYNAMIC with SOS).
+          Note: This parameter is defined as ACT-RA-MODEds in Clause 7.5.1.33.1 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="4"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ACTRAMODEus" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter indicates the actual active rate adaptation mode in the upstream direction.
+          * If {{param}} equals 1, the link is operating in RA-MODE 1 (MANUAL).
+          * If {{param}} equals 2, the link is operating in RA-MODE 2 (AT_INIT).
+          * If {{param}} equals 3, the link is operating in RA-MODE 3 (DYNAMIC).
+          * If {{param}} equals 4, the link is operating in RA-MODE 4 (DYNAMIC with SOS).
+          Note: This parameter is defined as ACT-RA-MODEus in Clause 7.5.1.33.2 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="4"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ACTINPROCds" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter reports the actual impulse noise protection (INP) of the robust overhead channel (ROC) in the downstream direction. The format and usage is identical to the channel status parameter {{param|#.Channel.{i}.ACTINP}}.
+          Note: This parameter is defined as ACTINP-ROC-ds in Clause 7.5.1.34.1 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ACTINPROCus" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter reports the actual impulse noise protection (INP) of the robust overhead channel (ROC) in the upstream direction. The format and usage is identical to the channel status parameter {{param|#.Channel.{i}.ACTINP}}.
+          Note: This parameter is defined as ACTINP-ROC-us in Clause 7.5.1.34.2 ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMROCds" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter reports the actual signal-to-noise margin of the robust overhead channel (ROC) in the downstream direction (expressed in {{units}}). The format is identical to the format of the line status parameter SNRM margin {{param|DownstreamNoiseMargin}}.
+          Note: This parameter is defined as SNRM-ROC-ds in Clause 7.5.1.35.1 ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="0.1 dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMROCus" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter reports the actual signal-to-noise margin of the robust overhead channel (ROC) in the upstream direction (expressed in {{units}}). The format is identical to the format of the line status parameter SNRM margin ({{param|UpstreamNoiseMargin}}).
+          Note: This parameter is defined as SNRM-ROC-us in Clause 7.5.1.35.2 ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="0.1 dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastStateTransmittedDownstream" access="readOnly" dmr:version="2.0">
+        <description>
+          This parameter represents the last successful transmitted initialization state in the downstream direction in  the last full initialization performed on the line.  Initialization states are defined in the individual xDSL Recommendations and are  counted from 0 (if G.994.1 is used) or 1 (if G.994.1 is not used) up to Showtime.  This parameter needs to be interpreted along with  the xDSL Transmission System.
+          This parameter is available only when, after a failed full initialization, the line diagnostics procedures are activated on the  line.
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LastStateTransmittedUpstream" access="readOnly" dmr:version="2.0">
+        <description>
+          This parameter represents the last successful transmitted initialization state in the upstream direction in the  last full initialization performed on the line.  Initialization states are defined in the individual xDSL Recommendations and are  counted from 0 (if G.994.1 is used) or 1 (if G.994.1 is not used) up to Showtime.  This parameter needs to be interpreted along with  the xDSL Transmission System.
+          This parameter is available only when, after a failed full initialization, the line diagnostics procedures are activated on the  line.
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPBOKLE" access="readOnly" dmr:version="2.0">
+        <description>
+          This parameter contains the estimated electrical loop length expressed in {{units}} at 1MHz (see O-UPDATE  in section 12.2.4.2.1.2/G.993.2).  The value SHALL be coded as an unsigned 16 bit number in the range 0 (coded as 0) to 128 dB (coded  as 1280) in steps of 0.1 dB.
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1280"/>
+            <units value="0.1dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MREFPSDds" access="readOnly" dmr:version="2.0">
+        <description>
+          This parameter SHALL contain the set of breakpoints exchanged in the MREFPSDds fields of the O-PRM message of  G.993.2. Base64 encoded of the binary representation defined in Table 12-19/G.993.2 (maximum length is 145 octets, which requires 196  bytes for Base64 encoding).
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <base64>
+            <size minLength="0" maxLength="145"/>
+          </base64>
+        </syntax>
+      </parameter>
+      <parameter name="MREFPSDus" access="readOnly" dmr:version="2.0">
+        <description>
+          This parameter SHALL contain the set of breakpoints exchanged in the MREFPSDus fields of the R-PRM message of  G.993.2. Base64 encoded of the binary representation defined in Table 12-19/G.993.2 (maximum length is 145 octets, which requires 196  bytes for Base64 encoding).
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <base64>
+            <size minLength="0" maxLength="145"/>
+          </base64>
+        </syntax>
+      </parameter>
+      <parameter name="LIMITMASK" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the enabled VDSL2 Limit PSD mask of the selected PSD mask class.  Bit mask as specified in ITU-T  Recommendation G.997.1.
+          Note:  For a VDSL2-capable multimode device operating in a mode other than VDSL2, the value of this parameter SHOULD be set to  0.
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="US0MASK" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the allowed VDSL2 US0 PSD masks for Annex A operation.  Bit mask as specified in see ITU-T  Recommendation G.997.1.
+          Note:  For a VDSL2-capable multimode device operating in a mode other than VDSL2, the value of this parameter SHOULD be set to  0.
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TRELLISds" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports whether trellis coding is enabled in the downstream direction.  A value of 1 indicates that trellis  coding is in use, and a value of 0 indicates that the trellis is disabled.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to -1.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="TRELLISus" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports whether trellis coding is enabled in the upstream direction.  A value of 1 indicates that trellis coding  is in use, and a value of 0 indicates that the trellis is disabled.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to -1.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="ACTSNRMODEds" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports whether the OPTIONAL virtual noise mechanism is in use in the downstream direction.  A value of 1  indicates the virtual noise mechanism is not in use, and a value of 2 indicates the virtual noise mechanism is in use.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ACTSNRMODEus" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports whether the OPTIONAL virtual noise mechanism is in use in the upstream direction.  A value of 1  indicates the virtual noise mechanism is not in use, and a value of 2 indicates the virtual noise mechanism is in use.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="VirtualNoisePSDds" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the virtual noise PSD for the downstream direction. Base64 encoded of the binary representation defined  in G.997.1 by the parameter called TXREFVNds (maximum length is 97 octets, which requires 132 bytes for Base64 encoding).
+          See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value of  this parameter SHOULD be set to {{empty}}.
+        </description>
+        <syntax>
+          <base64>
+            <size minLength="0" maxLength="97"/>
+          </base64>
+        </syntax>
+      </parameter>
+      <parameter name="VirtualNoisePSDus" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the virtual noise PSD for the upstream direction. Base64 encoded of the binary representation defined in  G.997.1by the parameter called TXREFVNus (maximum length is 49 octets, which requires 68 bytes for Base64 encoding).
+          See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value of  this parameter SHOULD be set to {{empty}}.
+        </description>
+        <syntax>
+          <base64>
+            <size minLength="0" maxLength="49"/>
+          </base64>
+        </syntax>
+      </parameter>
+      <parameter name="ACTUALCE" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the actual cyclic extension, as the value of m, in use for the connection.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 99.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LineNumber" access="readOnly" dmr:version="2.0">
+        <description>
+          Signifies the line pair that the modem is using to connection.  {{param}} = 1 is the innermost  pair.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="1"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamMaxBitRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current maximum attainable data rate upstream (expressed in {{units}}).
+          Note:  This parameter is related to the G.997.1 parameter ATTNDRus, which is measured in bits/s.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamMaxBitRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current maximum attainable data rate downstream (expressed in {{units}}).
+          Note:  This parameter is related to the G.997.1 parameter ATTNDRds, which is measured in bits/s.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamNoiseMargin" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current signal-to-noise ratio margin (expressed in {{units}}) in the upstream direction.
+          Note:  In G.997.1, this parameter is called SNRMus.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamNoiseMargin" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current signal-to-noise ratio margin (expressed in {{units}}) in the downstream direction.
+          Note:  In G.997.1, this parameter is called SNRMds.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMpbus" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the current signal-to-noise ratio margin of each upstream band.  Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="24"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMpbds" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the current signal-to-noise ratio margin of each band.  Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="24"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="INMIATOds" access="readOnly" dmr:version="2.0">
+        <description>
+          The Impulse Noise Monitoring (INM) Inter Arrival Time (IAT) Offset, measured in DMT symbols, that the xTU  receiver uses to determine in which bin of the IAT histogram the IAT is reported.
+          Note:  In G.997.1, this parameter is called INMIATO.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="3" maxInclusive="511"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="INMIATSds" access="readOnly" dmr:version="2.0">
+        <description>
+          The Impulse Noise Monitoring (INM)  Inter Arrival Time (IAT) Step that the xTU receiver uses to determine in  which bin of the IAT histogram the IAT is reported.
+          Note:  In G.997.1, this parameter is called INMIATS.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="INMCCds" access="readOnly" dmr:version="2.0">
+        <description>
+          The Impulse Noise Monitoring (INM) Cluster Continuation value, measured in DMT symbols, that the xTU receiver  uses in the cluster indication process.
+          Note:  In G.997.1, this parameter is called INMCC.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="64"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="INMINPEQMODEds" access="readOnly" dmr:version="2.0">
+        <description>
+          The Impulse Noise Monitoring (INM) Equivalent Impulse Noise Protection (INP) Mode that the xTU receiver uses in  the computation of the Equivalent INP.
+          Note:  In G.997.1, this parameter is called INM_INPEQ_MODE.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="3"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamAttenuation" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current upstream signal loss (expressed in {{units}}).
+          Doesn't apply to VDSL2 {{bibref|G.993.2}}. Otherwise has the same value as the single element of {{param|TestParams.SATNus}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamAttenuation" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current downstream signal loss (expressed in {{units}}).
+          Doesn't apply to VDSL2 {{bibref|G.993.2}}. Otherwise has the same value as the single element of {{param|TestParams.SATNds}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamPower" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current output power at the CPE's DSL line (expressed in {{units}}).
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dBmV"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamPower" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current received power at the CPE's DSL line (expressed in {{units}}).
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dBmV"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="XTURVendor" access="readOnly" dmr:version="2.0">
+        <description>
+          xTU-R vendor identifier as defined in G.994.1 and T1.413.  In the case of G.994.1 this corresponds to the four-octet provider code, which MUST be represented as eight hexadecimal digits.
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, it MUST have the value "00000000".
+          Note: In G.997.1, this parameter is called "xTU-R G.994.1 Vendor ID". See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="4" maxLength="4"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="XTURCountry" access="readOnly" dmr:version="2.0">
+        <description>
+          T.35 country code of the xTU-R vendor as defined in G.994.1, where the two-octet value defined in G.994.1 MUST be represented as four hexadecimal digits.
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, it MUST have the value "0000".
+          Note: In G.997.1, this parameter is called "xTU-R G.994.1 Vendor ID". See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="2" maxLength="2"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="XTURANSIStd" access="readOnly" dmr:version="2.0">
+        <description>
+          xTU-R T1.413 Revision Number as defined in T1.413 Issue 2.
+          When T1.413 modulation is not in use, the parameter value SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURANSIRev" access="readOnly" dmr:version="2.0">
+        <description>
+          xTU-R Vendor Revision Number as defined in T1.413 Issue 2.
+          When T1.413 modulation is not in use, the parameter value SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCVendor" access="readOnly" dmr:version="2.0">
+        <description>
+          xTU-C vendor identifier as defined in G.994.1 and T1.413.  In the case of G.994.1 this corresponds to the four-octet provider code, which MUST be represented as eight hexadecimal digits.
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, it MUST have the value "00000000".
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="4" maxLength="4"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCCountry" access="readOnly" dmr:version="2.0">
+        <description>
+          T.35 country code of the xTU-C vendor as defined in G.994.1, where the two-octet value defined in G.994.1 MUST be represented as four hexadecimal digits.
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, it MUST have the value "0000".
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="2" maxLength="2"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCANSIStd" access="readOnly" dmr:version="2.0">
+        <description>
+          xTU-C T1.413 Revision Number as defined in T1.413 Issue 2.
+          When T1.413 modulation is not in use, the parameter value SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCANSIRev" access="readOnly" dmr:version="2.0">
+        <description>
+          xTU-C Vendor Revision Number as defined in T1.413 Issue 2.
+          When T1.413 modulation is not in use, the parameter value SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|Total}} statistics.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ShowtimeStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the most recent DSL Showtime - the beginning of the period used for collection of {{object|Showtime}} statistics.
+          Showtime is defined as successful completion of the DSL link establishment process.  The ''Showtime'' statistics are those collected  since the most recent establishment of the DSL link.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastShowtimeStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the second most recent DSL Showtime-the beginning of the period used for collection of {{object|LastShowtime}} statistics.
+          If the CPE has not retained information about the second most recent Showtime (e.g., on reboot), the start of ''LastShowtime''  statistics MAY temporarily coincide with the start of ''Showtime'' statistics.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentDayStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|CurrentDay}} statistics.
+          The CPE MAY align the beginning of each ''CurrentDay'' interval with days in the UTC time zone, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QuarterHourStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|QuarterHour}} statistics.
+          The CPE MAY align the beginning of each ''QuarterHour'' interval with real-time quarter-hour intervals, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.Stats.Total." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL line total statistics. See {{bibref|G.997.1|Chapter 7.2.6}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of errored seconds (ES-L as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of severely errored seconds (SES-L as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.Stats.Showtime." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL line statistics accumulated since the most recent DSL Showtime. See {{bibref|G.997.1|Chapter 7.2.6}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of errored seconds since the most recent DSL Showtime (ES-L as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of severely errored seconds since the most recent DSL Showtime (SES-L as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.Stats.LastShowtime." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL line statistics accumulated since the second most recent DSL Showtime. See {{bibref|G.997.1|Chapter 7.2.6}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of errored seconds since the second most recent DSL Showtime (ES-L as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of severely errored seconds since the second most recent DSL Showtime (SES-L as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.Stats.CurrentDay." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL line statistics accumulated during the current day. See {{bibref|G.997.1|Chapter 7.2.6}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of errored seconds since the second most recent DSL Showtime (ES-L as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of severely errored seconds since the second most recent DSL Showtime (SES-L as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.Stats.QuarterHour." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL line statistics accumulated during the current quarter hour. See {{bibref|G.997.1|Chapter 7.2.6}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of errored seconds since the second most recent DSL Showtime (ES-L as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of severely errored seconds since the second most recent DSL Showtime (SES-L as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.TestParams." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains the DSL line test parameters that are available during the L0 (i.e., Showtime)  state.
+      </description>
+      <parameter name="HLOGGds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the downstream direction for {{param|HLOGpsds}}. Valid values are 1, 2, 4, 8, and 16.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGGus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the upstream direction for {{param|HLOGpsus}}.  Valid values are  1, 2, 4, and 8.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGpsds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the downstream logarithmic line characteristics per sub-carrier group.  The maximum number of elements is 256 for G.992.3, and 512 for G.992.5.  For G.993.2, the number of elements will depend on the value of  {{param|HLOGGds}} but will not exceed 512. Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+          Note: {{param}} is measured during initialization and is not updated during Showtime.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2559"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGpsus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the upstream logarithmic line characteristics per sub-carrier group.  The maximum number of elements is 64 for G.992.3 and G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|HLOGGus}} but will not exceed 512. Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+          Note: {{param}} is measured during initialization and is not updated during Showtime.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2559"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGMTds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|HLOGpsds}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGMTus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|HLOGpsus}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNGds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the downstream direction for {{param|QLNpsds}}. Valid values are 1, 2, 4, 8, and 16.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNGus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the upstream direction for {{param|QLNpsus}}.  Valid values are  1, 2, 4, and 8.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNpsds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the downstream quiet line noise per subcarrier group.  The maximum number of elements is 256 for G.992.3 and G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|QLNGds}} but will not exceed 512.  Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+          Note: {{param}} is measured during initialization and is not updated during Showtime.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2047"/>
+          </list>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNpsus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the upstream quiet line noise per subcarrier group.  The maximum number of elements is 64 for  G.992.3 and G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|QLNGus}} but will not exceed 512.  Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+          Note: {{param}} is measured during initialization and is not updated during Showtime.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2047"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNMTds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|QLNpsds}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNMTus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|QLNpsus}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRGds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the downstream direction for {{param|SNRpsds}}. Valid values are 1, 2, 4, 8, and 16.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRGus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the upstream direction for {{param|SNRpsus}}.  Valid values are  1, 2, 4, and 8.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRpsds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the downstream SNR per subcarrier group.  The maximum number of elements is 256 for G.992.3, and 512 for G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|SNRGds}} but will not exceed 512.  Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+          Note: {{param}} is first measured during initialization and is updated during Showtime.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2047"/>
+          </list>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRpsus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the upstream SNR per subcarrier group.  The maximum number of elements is 64 for G.992.3 and  G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|SNRGus}} but will not exceed 512. Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+          Note: {{param}} is first measured during initialization and is updated during Showtime.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2047"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMTds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|SNRpsds}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMTus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|SNRpsus}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LATNds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the downstream line attenuation averaged across all sub-carriers in the frequency band, as computed during initialization.  Number  of elements is dependent on the number of downstream bands but will exceed one only for ITU-T G.993.2. Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="35"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="LATNus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the upstream line attenuation averaged across all sub-carriers in the frequency band, as computed during initialization.  Number of  elements is dependent on the number of upstream bands but will exceed one only for ITU-T G.993.2.  Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="35"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SATNds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the downstream signal attenuation averaged across all active sub-carriers in the frequency band, as computed during the L0 (i.e., Showtime)  state.  Number of elements is dependent on the number of downstream bands but will exceed one only for ITU-T G.993.2.  Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="35"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SATNus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the upstream signal attenuation averaged across all active sub-carriers in the frequency band, as computed during the L0 (i.e., Showtime) state.  Number of elements is dependent on the number of downstream bands but will exceed one only for ITU-T G.993.2.  Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="35"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.DataGathering." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object models the DSL data gathering function at the VTU-R. This only applies to VDSL2.
+        Note: see ITU-T Recommendation {{bibref|G.993.2}}.
+      </description>
+      <parameter name="LoggingDepthR" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter is the maximum depth of the entire data gathering event buffer at the VTU-R, in number of {{units}}, where each of the {{units}} consists of 6 bytes indicating a data gathering event as defined in {{bibref|G.993.2}}.
+          Note: This parameter is defined as LOGGING_DEPTH_R in Clause 7.5.3.2 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="records"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ActLoggingDepthReportingR" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter is actual logging depth that is used for reporting the VTU-R event trace buffer over the eoc channel, in number of {{units}}, where each of the {{units}} consists of 6 bytes indicating a data gathering event as defined in {{bibref|G.993.2}}.
+          Note: This parameter is defined as ACT_LOGGING_DEPTH_REPORTING_R in Clause 7.5.3.4 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="records"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="EventTraceBufferR" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter identifies the log file of the the data gathering event trace buffer containing the event records that originated at the VTU-R.
+          This indicates the table entry that represents a Vendor Log File that contains the data gathering buffer at the VTU-R in the {{object|###.DeviceInfo.VendorLogFile}} table.
+          This data gathering buffer MAY be retrieved wia an upload RPC of the identified Vendor Log File.
+          Note: This parameter is defined as EVENT_TRACE_BUFFER_R in Clause 7.5.3.6 of ITU-T Recommendation {{bibref|G.997.1}} and Clause 11.5 of ITU-T Recommendation {{bibref|G.993.2}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".DeviceInfo.VendorLogFile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Channel.{i}." access="readOnly" numEntriesParameter="ChannelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        DSL Channel table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+        This table models DSL channel(s) on top of physical DSL lines.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the channel.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the channel (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the channel as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the channel entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LinkEncapsulationSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate which link encapsulation standards and recommendations are supported by the {{object}} instance.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="G.992.3_Annex_K_ATM"/>
+            <enumeration value="G.992.3_Annex_K_PTM"/>
+            <enumeration value="G.993.2_Annex_K_ATM"/>
+            <enumeration value="G.993.2_Annex_K_PTM"/>
+            <enumeration value="G.994.1">
+              <description>
+                Auto
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LinkEncapsulationUsed" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the link encapsulation standard that the {{object}} instance is using for the connection.  {{enum}}
+          When ATM encapsulation is identified then an upper-layer {{object|.ATM.Link}} interface MUST be used.
+          When PTM encapsulation is identified then an upper-layer {{object|.PTM.Link}} interface MUST be used.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="G.992.3_Annex_K_ATM"/>
+            <enumeration value="G.992.3_Annex_K_PTM"/>
+            <enumeration value="G.993.2_Annex_K_ATM"/>
+            <enumeration value="G.993.2_Annex_K_PTM"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LPATH" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the index of the latency path supporting the bearer channel.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1|Section 7.5.2.7}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="3"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="INTLVDEPTH" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the interleaver depth D for the latency path indicated in {{param|LPATH}}.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.  For a multimode device operating in a mode in which this parameter does not apply, the value of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="INTLVBLOCK" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the interleaver block length in use on the latency path indicated in {{param|LPATH}}.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to -1.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="ActualInterleavingDelay" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the actual delay, in {{units}}, of the latency path due to interleaving.
+          Note:  In G.997.1, this parameter is called "Actual Interleaving Delay." See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ACTINP" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the actual impulse noise protection (INP) provided by the latency path indicated in {{param|LPATH}}.  The value is  the actual INP in the L0 (i.e., Showtime) state.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to -1.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="INPREPORT" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports whether the value reported in ACTINP was computed assuming the receiver does not use erasure decoding.   Valid values are 0 (computed per the formula assuming no erasure decoding) and 1 (computed by taking into account erasure decoding  capabilities of receiver).
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.  For a multimode device operating in a mode in which this parameter does not apply, the  value of this parameter SHOULD be set to {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="NFEC" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the size, in {{units}}, of the Reed-Solomon codeword in use on the latency path indicated in {{param|LPATH}}.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to -1.
+        </description>
+        <syntax>
+          <int>
+            <units value="octets"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="RFEC" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the number of redundancy bytes per Reed-Solomon codeword on the latency path indicated in {{param|LPATH}}.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to -1.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="LSYMB" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the number of bits per symbol assigned to the latency path indicated in {{param|LPATH}}.  This value does not  include overhead due to trellis coding.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to -1.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamCurrRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current physical layer aggregate data rate (expressed in {{units}}) of the upstream DSL connection.
+          Note: If the parameter is implemented but no value is  available, it MUST have the value 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamCurrRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current physical layer aggregate data rate (expressed in {{units}}) of the downstream DSL connection.
+          Note: If the parameter is implemented but no value is  available, it MUST have the value 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ACTNDR" access="readOnly" dmr:version="2.8">
+        <description>
+          Actual net data rate expressed in {{units}}. Independent whether retransmission is used or not in a given transmit direction:
+          * In L0 state, this parameter reports the net data rate (as specified in [ITU T G.992.3], [ITU T G.992.5] or [ITU T G.993.2]) at which the bearer channel is operating.
+          * In L2 state, the parameter contains the net data rate (as specified in [ITU T G.992.3], [ITU T G.992.5] or [ITU T G.993.2]) in the previous L0 state.
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ACTINPREIN" access="readOnly" dmr:version="2.8">
+        <description>
+          Actual impulse noise protection against REIN, expressed in {{units}}.
+          If retransmission is used in a given transmit direction, this parameter reports the actual impulse noise protection (INP) against REIN (under specific conditions detailed in [ITU T G.998.4]) on the bearer channel in the L0 state. In the L2 state, the parameter contains the INP in the previous L0 state.
+          The value is coded in fractions of DMT symbols with a granularity of 0.1 symbols.
+          The range is from 0 to 25.4. A special value of 25.5 indicates an ACTINP_REIN of 25.5 or higher.
+          Note: This parameter is defined as ACTINP_REIN in Clause 7.5.2.9 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+            <units value="0.1 DMT symbols"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Channel.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|Total}} statistics.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ShowtimeStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the most recent DSL Showtime - the beginning of the period used for collection of {{object|Showtime}} statistics.
+          Showtime is defined as successful completion of the DSL link establishment process.  The ''Showtime'' statistics are those collected  since the most recent establishment of the DSL link.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastShowtimeStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the second most recent DSL Showtime-the beginning of the period used for collection of {{object|LastShowtime}} statistics.
+          If the CPE has not retained information about the second most recent Showtime (e.g., on reboot), the start of ''LastShowtime''  statistics MAY temporarily coincide with the start of ''Showtime'' statistics.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentDayStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|CurrentDay}} statistics.
+          The CPE MAY align the beginning of each ''CurrentDay'' interval with days in the UTC time zone, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QuarterHourStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|QuarterHour}} statistics.
+          The CPE MAY align the beginning of each ''QuarterHour'' interval with real-time quarter-hour intervals, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Channel.{i}.Stats.Total." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL channel total statistics {{bibref|G.997.1}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="XTURFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of FEC errors detected (FEC-C as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of FEC errors detected by the ATU-C (FEC-CFE as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of HEC errors detected (HEC-P as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of HEC errors detected by the ATU-C (HEC-PFE as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of CRC errors detected (CV-C as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of CRC errors detected by the ATU-C (CV-CFE as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Channel.{i}.Stats.Showtime." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL channel statistics accumulated since the most recent DSL Showtime {{bibref|G.997.1}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="XTURFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected since the most recent DSL Showtime (FEC-C as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected by the ATU-C since the most recent DSL Showtime (FEC-CFE as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected since the most recent DSL Showtime (HEC-P as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected by the ATU-C since the most recent DSL Showtime (HEC-PFE as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected since the most recent DSL Showtime (CV-C as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected by the ATU-C since the most recent DSL Showtime (CV-CFE as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Channel.{i}.Stats.LastShowtime." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL channel statistics accumulated since the second most recent DSL Showtime {{bibref|G.997.1}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="XTURFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected since the second most recent DSL Showtime (FEC-C as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected by the ATU-C since the second most recent DSL Showtime (FEC-CFE as defined in  ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected since the second most recent DSL Showtime (HEC-P as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected by the ATU-C since the second most recent DSL Showtime (HEC-PFE as defined in  ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected since the second most recent DSL Showtime (CV-C as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected by the ATU-C since the second most recent DSL Showtime (CV-CFE as defined in ITU-T  Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Channel.{i}.Stats.CurrentDay." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL channel statistics accumulated during the current day {{bibref|G.997.1}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="XTURFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected since the second most recent DSL Showtime (FEC-C as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected by the ATU-C since the second most recent DSL Showtime (FEC-CFE as defined in  ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected since the second most recent DSL Showtime (HEC-P as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected by the ATU-C since the second most recent DSL Showtime (HEC-PFE as defined in  ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected since the second most recent DSL Showtime (CV-C as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected by the ATU-C since the second most recent DSL Showtime (CV-CFE as defined in ITU-T  Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Channel.{i}.Stats.QuarterHour." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL channel statistics accumulated during the current quarter hour {{bibref|G.997.1}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="XTURFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected since the second most recent DSL Showtime (FEC-C as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected by the ATU-C since the second most recent DSL Showtime (FEC-CFE as defined in  ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected since the second most recent DSL Showtime (HEC-P as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected by the ATU-C since the second most recent DSL Showtime (HEC-PFE as defined in  ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected since the second most recent DSL Showtime (CV-C as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected by the ATU-C since the second most recent DSL Showtime (CV-CFE as defined in ITU-T  Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}." access="readOnly" numEntriesParameter="BondingGroupNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        DSL bonding group table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Each instance is a bonding group, and is expected to be stacked above a {{object|.DSL.Channel}} instance or a {{object|.FAST.Line}} instance for each bonded channel in the group.
+        Many of the parameters within this object, including {{param|LowerLayers}}, are read-only because bonding is not expected to be configured via {{bibref|TR-069}}.
+        The DSL bonding data model is closely aligned with {{bibref|TR-159}}. Corresponds to {{bibref|TR-159}} ''oBondingGroup''.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="GroupID"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the bonding group.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the bonding group (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the bonding group as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the bonding group entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          {{param}} is read-only for this object because bonding is expected to be configured by the CPE, not by the ACS.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GroupStatus" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}}  Indicates the current fault status of the DSL bonding group.  {{enum}}
+          Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupStatus''.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="NoPeer">
+              <description>
+                Peer physical layer is unreachable
+              </description>
+            </enumeration>
+            <enumeration value="PeerPowerLoss">
+              <description>
+                Local device received a "dying gasp" message (preceding a loss-of-power) from the peer  device
+              </description>
+            </enumeration>
+            <enumeration value="PeerBondSchemeMismatch">
+              <description>
+                Operating bonding scheme of the peer port is different from the local one
+              </description>
+            </enumeration>
+            <enumeration value="LowRate">
+              <description>
+                Upstream or downstream data rate is at or below threshold
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GroupID" access="readOnly" dmr:version="2.0">
+        <description>
+          DSL bonding group ID.  Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupID''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BondSchemesSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Supported DSL bonding schemes. {{enum}}
+          Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupBondSchemesSupported''.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="ATM">
+              <description>
+                {{bibref|G.998.1}} ATM-based bonding
+              </description>
+            </enumeration>
+            <enumeration value="Ethernet">
+              <description>
+                {{bibref|G.998.2}} Ethernet-based bonding
+              </description>
+            </enumeration>
+            <enumeration value="TDIM">
+              <description>
+                {{bibref|G.998.3}} TDIM-based bonding
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BondScheme" access="readOnly" dmr:version="2.0">
+        <description>
+          Currently operating bonding scheme.  Corresponds to {{bibref|TR-159}} ''aGroupOperBondScheme''.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="BondSchemesSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GroupCapacity" access="readOnly" dmr:version="2.0">
+        <description>
+          DSL bonding group capacity, i.e. the maximum number of channels that can be bonded in this group. Corresponds to  {{bibref|TR-159}} ''oBondingGroup.aGroupCapacity''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="32"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RunningTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} for which this bonding group has been operationally up.  Corresponds to  {{bibref|G.998.1|section 11.4.2}} ''Group Running Time''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TargetUpRate" access="readOnly" dmr:version="2.0">
+        <description>
+          Desired upstream data rate in {{units}} for this DSL bonding group (zero indicates best effort). Corresponds to  {{bibref|TR-159}} ''oBondingGroup.aGroupTargetUpRate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TargetDownRate" access="readOnly" dmr:version="2.0">
+        <description>
+          Desired downstream data rate in {{units}} for DSL bonding group (zero indicates best effort). Corresponds to  {{bibref|TR-159}} ''oBondingGroup.aGroupTargetDownRate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ThreshLowUpRate" access="readOnly" dmr:version="2.0">
+        <description>
+          Threshold upstream data rate in {{units}} for this DSL bonding group.  {{param|GroupStatus}} will include  {{enum|LowRate|GroupStatus}} whenever the upstream rate is less than this threshold.  Corresponds to {{bibref|TR-159}}  ''oBondingGroup.aGroupThreshLowUpRate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ThreshLowDownRate" access="readOnly" dmr:version="2.0">
+        <description>
+          Threshold downstream data rate in {{units}} for this DSL bonding group.  {{param|GroupStatus}} will include  {{enum|LowRate|GroupStatus}} whenever the downstream rate is less than this threshold.  Corresponds to {{bibref|TR-159}}  ''oBondingGroup.aGroupThreshLowDownRate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamDifferentialDelayTolerance" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum upstream differential delay in {{units}} among member links in a bonding group.  Corresponds to  {{bibref|G.998.1|section 11.4.1}} ''Differential Delay Tolerance''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamDifferentialDelayTolerance" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum downstream differential delay in {{units}} among member links in a bonding group.  Corresponds to  {{bibref|G.998.1|section 11.4.1}} ''Differential Delay Tolerance''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="BondedChannelNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}} Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupNumChannels''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="32"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.BondedChannel.{i}." access="readOnly" numEntriesParameter="BondedChannelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        DSL bonded channel table. Each table entry represents a bonded channel within the bonding group, and is associated with exactly one {{object|.DSL.Channel}} instance or one {{object|.FAST.Line}} instance. There MUST be an instance of {{object}} for each DSL channel or FAST line that is bonded.
+        When a {{object|.DSL.Channel}} or {{object|.FAST.Line}} is no longer bonded, then the CPE MUST delete the corresponding {{object}} instance. However, when a bonded {{object|.DSL.Channel}} or {{object|.FAST.Line}} becomes disabled, the channel remains bonded and so the corresponding {{object}} instance MUST NOT be deleted.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Channel"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Channel" access="readOnly" dmr:version="2.0">
+        <description>
+          {{reference}}This is the channel that is being bonded.
+          This is read-only because bonding is expected to be configured by the CPE, not by the ACS.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".DSL.Channel. .FAST.Line." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.BondedChannel.{i}.Ethernet." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Per-channel {{bibref|G.998.2}} Ethernet-based bonding parameters.
+        This object MUST be present if, and only if, {{param|##.BondScheme}} is  {{enum|Ethernet|##.BondScheme}}.
+      </description>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.BondedChannel.{i}.Ethernet.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Per-channel {{bibref|G.998.2}} Ethernet-based bonding statistics.
+        These relate to the {{bibref|G.998.2}} PME (Physical Medium Entity) Aggregation Function (PAF) lower layer (per-channel) interfaces.
+        The CPE MUST reset the Stats parameters either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|###.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|###.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="UnderflowErrorsSent" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of underflow errors sent, i.e. on the transmit side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CRCErrorsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of CRC errors received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AlignmentErrorsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of alignment errors received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ShortPacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of short packets received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LongPacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of long packets received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OverflowErrorsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of overflow errors received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PauseFramesReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of pause frames received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FramesDropped" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of frames dropped, e.g. because the receive queue is full.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|Total}} statistics.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentDayStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|CurrentDay}} statistics.
+          The CPE MAY align the beginning of each CurrentDay interval with days in the UTC time zone, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QuarterHourStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|QuarterHour}} statistics.
+          The CPE MAY align the beginning of each QuarterHour interval with real-time quarter-hour intervals, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.Stats.Total." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Total statistics for this bonding group.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="FailureReasons" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}}  Indicates the failure conditions that have occurred during the accumulation period.  {{enum}}
+          Corresponds to {{bibref|G.998.1|section 11.4.3}} ''Current Group Failure Reason''.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="LowRate">
+              <description>
+                Minimum data rate not met
+              </description>
+            </enumeration>
+            <enumeration value="ExcessiveDelay">
+              <description>
+                Differential delay tolerance exceeded
+              </description>
+            </enumeration>
+            <enumeration value="InsufficientBuffers">
+              <description>
+                Insufficient buffers on receiver
+              </description>
+            </enumeration>
+            <enumeration value="Other">
+              <description>
+                Other failure occurred
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved upstream data rate in {{units}} (which might change subject to dynamic link usage conditions).  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Achieved Aggregate Data Rate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved downstream data rate in {{units}} (which might change subject to dynamic link usage conditions).   Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Achieved Aggregate Data Rate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamPacketLoss" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of upstream packets that were lost at aggregation output from a bonding group during the  accumulation period.  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Group Rx Cell Loss Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamPacketLoss" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of downstream packets that were lost at aggregation output from a bonding group during the  accumulation period.  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Group Rx Cell Loss Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamDifferentialDelay" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved upstream differential delay in {{units}} (which might change subject to dynamic link usage  conditions).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamDifferentialDelay" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved downstream differential delay in {{units}} (which might change subject to dynamic link usage  conditions).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FailureCount" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of times that the group was declared ''Unavailable'' during the accumulation period.  Corresponds to  {{bibref|G.998.1|Section 11.4.3}} ''Group Failure Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErroredSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''Errored'' during the accumulation period. Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**ES''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''SeverelyErrored'' during the accumulation period.  Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**SES''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UnavailableSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''Unavailable'' during the accumulation period.  Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**UAS''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.Stats.CurrentDay." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Current day statistics for this bonding group.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="FailureReasons" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}}  Indicates the failure conditions that have occurred during the accumulation period.  {{enum}}
+          Corresponds to {{bibref|G.998.1|section 11.4.3}} ''Current Group Failure Reason''.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="LowRate">
+              <description>
+                Minimum data rate not met
+              </description>
+            </enumeration>
+            <enumeration value="ExcessiveDelay">
+              <description>
+                Differential delay tolerance exceeded
+              </description>
+            </enumeration>
+            <enumeration value="InsufficientBuffers">
+              <description>
+                Insufficient buffers on receiver
+              </description>
+            </enumeration>
+            <enumeration value="Other">
+              <description>
+                Other failure occurred
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved upstream data rate in {{units}} (which might change subject to dynamic link usage conditions).  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Achieved Aggregate Data Rate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved downstream data rate in {{units}} (which might change subject to dynamic link usage conditions).   Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Achieved Aggregate Data Rate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamPacketLoss" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of upstream packets that were lost at aggregation output from a bonding group during the  accumulation period.  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Group Rx Cell Loss Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamPacketLoss" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of downstream packets that were lost at aggregation output from a bonding group during the  accumulation period.  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Group Rx Cell Loss Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamDifferentialDelay" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved upstream differential delay in {{units}} (which might change subject to dynamic link usage  conditions).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamDifferentialDelay" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved downstream differential delay in {{units}} (which might change subject to dynamic link usage  conditions).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FailureCount" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of times that the group was declared ''Unavailable'' during the accumulation period.  Corresponds to  {{bibref|G.998.1|Section 11.4.3}} ''Group Failure Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErroredSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''Errored'' during the accumulation period. Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**ES''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''SeverelyErrored'' during the accumulation period.  Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**SES''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UnavailableSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''Unavailable'' during the accumulation period.  Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**UAS''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.Stats.QuarterHour." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Current quarter hour statistics for this bonding group.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="FailureReasons" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}}  Indicates the failure conditions that have occurred during the accumulation period.  {{enum}}
+          Corresponds to {{bibref|G.998.1|section 11.4.3}} ''Current Group Failure Reason''.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="LowRate">
+              <description>
+                Minimum data rate not met
+              </description>
+            </enumeration>
+            <enumeration value="ExcessiveDelay">
+              <description>
+                Differential delay tolerance exceeded
+              </description>
+            </enumeration>
+            <enumeration value="InsufficientBuffers">
+              <description>
+                Insufficient buffers on receiver
+              </description>
+            </enumeration>
+            <enumeration value="Other">
+              <description>
+                Other failure occurred
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved upstream data rate in {{units}} (which might change subject to dynamic link usage conditions).  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Achieved Aggregate Data Rate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved downstream data rate in {{units}} (which might change subject to dynamic link usage conditions).   Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Achieved Aggregate Data Rate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamPacketLoss" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of upstream packets that were lost at aggregation output from a bonding group during the  accumulation period.  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Group Rx Cell Loss Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamPacketLoss" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of downstream packets that were lost at aggregation output from a bonding group during the  accumulation period.  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Group Rx Cell Loss Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamDifferentialDelay" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved upstream differential delay in {{units}} (which might change subject to dynamic link usage  conditions).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamDifferentialDelay" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved downstream differential delay in {{units}} (which might change subject to dynamic link usage  conditions).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FailureCount" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of times that the group was declared ''Unavailable'' during the accumulation period.  Corresponds to  {{bibref|G.998.1|Section 11.4.3}} ''Group Failure Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErroredSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''Errored'' during the accumulation period. Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**ES''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''SeverelyErrored'' during the accumulation period.  Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**SES''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UnavailableSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''Unavailable'' during the accumulation period.  Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**UAS''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.Ethernet." access="readOnly" minEntries="0" maxEntries="1" dmr:version="2.0">
+      <description>
+        Ethernet-based bonding parameters {{bibref|G.998.2}}.
+        This object MUST be present if, and only if, {{param|#.BondScheme}} is {{enum|Ethernet|#.BondScheme}}.
+      </description>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.Ethernet.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        {{bibref|G.998.2}} Ethernet-based bonding statistics.
+        These relate to the {{bibref|G.998.2}} PME (Physical Medium Entity) Aggregation Function (PAF) and to its upper layer interface.  PAF  lower layer interface statistics are in the {{object|##.BondedChannel.{i}.Ethernet.Stats}} objects.
+        The CPE MUST reset the Stats parameters either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|##.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|##.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="PAFErrors" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF errors.  Corresponds to {{bibref|TR-159}} ''oBondETH.aEthRxErrors''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFSmallFragments" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Small Fragment events.  Corresponds to {{bibref|TR-159}}  ''oBondETH.aEthRxSmallFragments''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFLargeFragments" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Large Fragment events. Corresponds to {{bibref|TR-159}}  ''oBondETH.aEthRxLargeFragments''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFBadFragments" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Bad Fragment events. Corresponds to {{bibref|TR-159}}  ''oBondETH.aEthRxBadFragments''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFLostFragments" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Lost Fragment events. Corresponds to {{bibref|TR-159}}  ''oBondETH.aEthRxLostFragments''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFLateFragments" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Late Fragment events.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFLostStarts" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Lost Start events. Corresponds to {{bibref|TR-159}} ''oBondETH.aEthRxLostStarts''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFLostEnds" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Lost End events. Corresponds to {{bibref|TR-159}} ''oBondETH.aEthRxLostEnds''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFOverflows" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Overflow events. Corresponds to {{bibref|TR-159}} ''oBondETH.aEthRxOverflows''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PauseFramesSent" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of pause frames sent, i.e. on the transmit side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CRCErrorsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of CRC errors received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AlignmentErrorsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of alignment errors received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ShortPacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of short packets received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LongPacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of long packets received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OverflowErrorsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of overflow errors received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FramesDropped" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of frames dropped, e.g. because the receive queue is full.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Diagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The DSL Diagnostics object.
+      </description>
+    </object>
+    <object name="Device.DSL.Diagnostics.ADSLLineTest." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object is to provide diagnostic information for a CPE with an ADSL2 or ADSL2+ modem WAN interface, but MAY also be used for ADSL.
+      </description>
+      <parameter name="DiagnosticsState" access="readWrite" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="DiagnosticsState">
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Canceled" optional="true"/>
+            <enumeration value="Complete" access="readOnly"/>
+            <enumeration value="Error" access="readOnly" optional="true"/>
+            <enumeration value="Error_Internal" access="readOnly"/>
+            <enumeration value="Error_Other" access="readOnly"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}  This is the interface over which the test is to be performed.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetParent=".DSL.Channel." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ACTPSDds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Downstream actual power spectral density.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="ACTPSDus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Upstream actual power spectral density.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="ACTATPds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Downstream actual aggregate transmitter power.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="ACTATPus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Upstream actual aggregate transmitter power.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="HLINSCds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Downstream linear representation scale.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="HLINSCus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Scaling used to represent the upstream linear channel characteristics.  Interpretation of the value is as  defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="HLINGds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the downstream direction for {{param|HLINpsds}}.  Valid values  are 1, 2, 4, and 8.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="HLINGus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the downstream direction for {{param|HLINpsus}}.  Valid values  are 1, 2, 4, and 8.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGGds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the downstream direction for {{param|HLOGpsds}}.  Valid values  are 1, 2, 4, and 8.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGGus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the upstream direction for {{param|HLOGpsus}}.  Valid values are  1, 2, 4, and 8.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGpsds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent downstream logarithmic channel characteristics per sub-carrier group.  The maximum  number of elements is 256 for G.992.3, and 512 for G.992.5.  For G.993.2, the number of elements will depend on the value of  {{param|HLOGGds}} but will not exceed 512. Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+          Note: {{param}} is measured during initialization and is not updated during Showtime.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2559"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGpsus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent upstream logarithmic channel characteristics per sub-carrier group.  The maximum number of elements is 64 for G.992.3 and G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|HLOGGus}} but will not exceed 512. Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+          Note: {{param}} is measured during initialization and is not updated during Showtime.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2559"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGMTds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|HLOGpsds}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGMTus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|HLOGpsus}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LATNpbds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent downstream line attenuation per usable band, as computed during initialization.  Number of elements is dependent on the number of downstream bands but will exceed one only for G.993.2. Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="24"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="LATNpbus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent upstream line attenuation per usable band, as computed during initialization.  Number of elements is dependent on the number of upstream bands but will exceed one only for G.993.2.  Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="24"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SATNds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent downstream signal attenuation per usable band, as computed during the L0 (i.e., Showtime) state.  Number of elements is dependent on the number of downstream bands but will exceed one only for G.993.2.  Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="24"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SATNus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent upstream signal attenuation per usable band, as computed during the L0 (i.e., Showtime) state.  Number of elements is dependent on the number of downstream bands but will exceed one only for G.993.2.  Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="24"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="HLINpsds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent downstream linear channel characteristics per subcarrier group.  Maximum number of  complex pairs is 256 for G.992.3, and 512 for G.992.5.  For G.993.2, the number of pairs will depend on the value of {{param|HLINGds}} but will not exceed 512.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+          Note: HLIN is not applicable in PLOAM for G.992.1 or G.992.2.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="61430"/>
+          </list>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="HLINpsus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent upstream linear channel characteristics per sub-carrier group.  Maximum number of  complex pairs is 64 for G.992.3, and G.992.5.  For G.993.2, the number of pairs will depend on the value of {{param|HLINGus}} but  will not exceed 512.  Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  HLIN is not applicable in PLOAM for G.992.1 or G.992.2.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="61430"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNGds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the downstream direction for {{param|QLNpsds}}.  Valid values  are 1, 2, 4, and 8.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNGus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the upstream direction for {{param|QLNpsus}}.  Valid values are  1, 2, 4, and 8.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNpsds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent downstream quiet line noise per subcarrier group.  Maximum number of elements is  256 for G.992.3, 512 for G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|QLNGds}} but will not  exceed 512.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+          Note:  QLN is not applicable in PLOAM for G.992.1 or G.992.2.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="61430"/>
+          </list>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNpsus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent upstream quiet line noise per subcarrier group.  The maximum number of elements is  64 for G.992.3, and G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|QLNGus}} but will not exceed  512. Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  QLN is not applicable in PLOAM for G.992.1 or G.992.2.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="61430"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNMTds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|QLNpsds}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNMTus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|QLNpsus}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRGds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the downstream direction for {{param|SNRpsds}}.  Valid values  are 1, 2, 4, and 8.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRGus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the upstream direction for {{param|SNRpsus}}.  Valid values are  1, 2, 4, and 8.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRpsds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent downstream SNR per subcarrier group.  Maximum number of elements is 256 for  G.992.3, 512 for G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|SNRGds}} but will not exceed 512.    Interpretation of the value is as defined in ITU-T Rec. G.997.1.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+          Note:  SNRps is not applicable in PLOAM for G.992.1 or G.992.2.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="61430"/>
+          </list>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRpsus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent upstream SNR per subcarrier group.  The maximum number of elements is 64 for  G.992.3, and G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|SNRGus}} but will not exceed 512.  Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  SNRps is not applicable in PLOAM for G.992.1 or G.992.2.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="61430"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMTds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|SNRpsds}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMTus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|SNRpsus}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BITSpsds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent downstream bit allocation per subcarrier group.  Maximum number of elements is 256 for G.992.3, 512 for G.992.5.  Interpretation of the value is as defined in ITU-T Rec. {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="61430"/>
+          </list>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="BITSpsus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent upstream bit allocation per subcarrier group.  Maximum number of elements is 256 for G.992.3, 512 for G.992.5.  Interpretation of the value is as defined in ITU-T Rec. {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="61430"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object models FAST (defined in ITU Recommendation {{bibref|G.9701}}) lines. Each {{object|Line}} models a layer 1 FAST Line interface.
+      </description>
+      <parameter name="LineNumberOfEntries" access="readOnly" dmr:version="2.11">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}." access="readOnly" numEntriesParameter="LineNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.11">
+      <description>
+        FAST Line table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+        This table models physical FAST lines.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.11">
+        <description>
+          Enables or disables the FAST line. This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.11">
+        <description>
+          The current operational state of the FAST line (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.11">
+        <description>
+          The textual name of the FAST line as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The accumulated time in {{units}} since the FAST line entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.11">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.11">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.11">
+        <description>
+          A string identifying the version of the modem firmware currently installed for this interface. This is applicable only when the modem firmware is separable from the overall CPE software.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LinkStatus" access="readOnly" dmr:version="2.11">
+        <description>
+          Status of the FAST physical link. {{enum}}
+          When {{param}} is {{enum|Up}}, {{param|Status}} is expected to be {{enum|Up|Status}}. When {{param}} is {{enum|Initializing}} or {{enum|EstablishingLink}} or {{enum|NoSignal}} or {{enum|Disabled}}, {{param|Status}} is expected to be {{enum|Down|Status}}.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Initializing"/>
+            <enumeration value="EstablishingLink"/>
+            <enumeration value="NoSignal"/>
+            <enumeration value="Disabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AllowedProfiles" access="readOnly" dmr:version="2.11">
+        <description>
+          {{list}} List items indicate which FAST profiles are allowed on the line. {{enum}}
+          Note:  In G.997.2, this parameter is called PROFILES. See ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="106a"/>
+            <enumeration value="212a"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentProfile" access="readOnly" dmr:version="2.11">
+        <description>
+          Indicates which FAST profile is currently in use on the line.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="AllowedProfiles" nullValue=""/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PowerManagementState" access="readOnly" dmr:version="2.11">
+        <description>
+          The power management state of the line. {{enum}}
+          Note: See ITU-T Recommendation {{bibref|G.9701}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="L0"/>
+            <enumeration value="L2.1"/>
+            <enumeration value="L2.2"/>
+            <enumeration value="L3"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessFailureCause" access="readOnly" dmr:version="2.11">
+        <description>
+          The success failure cause of the initialization. An enumeration of the following integer values:
+          * 0: Successful
+          * 1: Configuration error. Configuration error. This error occurs if the line cannot reach L0 state due to a mismatch of configuration and FTU capabilities.
+          * 2: Configuration not feasible on the line. This error occurs if the line cannot reach the L0 state due to a mismatch of configuration of line and noise characteristics.
+          * 3: Communication problem. This error occurs, for example, due to corrupted messages or bad syntax messages or if no common mode can be selected in the G.994.1 handshaking procedure or due to a timeout.
+          * 4: No far-end FTU detected. This error occurs if the far-end FTU is not powered or not connected or if the line is too long to allow detection of a far-end FTU.
+          * 5: Any other or unknown initialization failure cause.
+          Note: In G.997.2, this parameter is called "Initialization success/failure cause". See Clause 7.20.2.1 of ITU-T
+          Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="5"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UPBOKLER" access="readOnly" dmr:version="2.11">
+        <description>
+          This parameter reports the estimate of the electrical length expressed in {{units}}, as determined by the FTU-R (see clause 7.3.1.4.2.1/{{bibref|G.9701}}) and conveyed in the R-MSG1 initialization message (see clause 12.3.3.2.3/{{bibref|G.9701}}). The value is coded as an unsignedInt in the range 0 (coded as 0) to 128 dB (coded as 1280) in steps of {{units}}.
+          Note: This parameter is defined as UPBOKLE-R in Clause 7.10.4.2 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1280"/>
+            <units value="0.1 dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastTransmittedDownstreamSignal" access="readOnly" dmr:version="2.11">
+        <description>
+          This parameter reports the downstream signal count of the last transmitted initialization signal in the last full or short initialization performed on the line. The valid values are 0..21. The downstream signal count is defined in clause 12.3.1/{{bibref|G.9701}}.
+          Note: See clause 7.10.2.2 ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="21"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastTransmittedUpstreamSignal" access="readOnly" dmr:version="2.11">
+        <description>
+          This parameter reports the upstream signal count of the last transmitted initialization signal in the last full or short initialization performed on the line. The valid values are 0..21. The upstream signal count is defined in clause 12.3.1/{{bibref|G.9701}}.
+          Note: See clause 7.10.2.3 ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="21"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UPBOKLE" access="readOnly" dmr:version="2.11">
+        <description>
+          This parameter reports the electrical length that would have been sent from the FTU-O to the FTU-R if the electrical length was not forced by the DPU-MIB. If the electrical length is not forced by the DPU-MIB, then this object reports the final electrical length, as determined by the FTU-O (see clause 7.3.1.4.2.1/{{bibref|G.9701}}) and conveyed in the O-UPDATE initialization message (see clause 12.3.3.2.4/{{bibref|G.9701}}).
+          Note: See clause 7.10.4.1 in ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1280"/>
+            <units value="0.1dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LineNumber" access="readOnly" dmr:version="2.11">
+        <description>
+          Signifies the line pair that the modem is using to connection. {{param}} = 1 is the innermost  pair.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="1"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamMaxBitRate" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the attainable net data rate expressed in {{units}} as defined in clause 11.4.1.1.2/{{bibref|G.9701}}.
+          Note: This parameter is related to the G.997.2 parameter ATTNDRus. See clause 7.11.2.1 ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamMaxBitRate" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the attainable net data rate expressed in {{units}} as defined in clause 11.4.1.1.2/{{bibref|G.9701}}.
+          Note: This parameter is related to the G.997.2 parameter ATTNDRds. See clause 7.11.2.1 ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamNoiseMargin" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the signal-to-noise ratio margin (as defined in clause 9.8.3.2/{{bibref|G.9701}} and 11.4.1.3/{{bibref|G.9701}}) in the upstream direction. A special value indicates that the signal-to-noise ratio margin is out of the range to be represented. The parameter is expressed in {{units}}.
+          Note: In G.997.2, this parameter is called SNRMus. See ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamNoiseMargin" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the signal-to-noise ratio margin (as defined in clause 9.8.3.2/{{bibref|G.9701}} and 11.4.1.3/{{bibref|G.9701}}) in the upstream direction. A special value indicates that the signal-to-noise ratio margin is out of the range to be represented. The parameter is expressed in {{units}}.
+          Note: In G.997.2, this parameter is called SNRMds. See ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamAttenuation" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The current upstream signal loss (expressed in {{units}}).
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamAttenuation" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The current downstream signal loss (expressed in {{units}}).
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamPower" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The current output power at the CPE's FAST line (expressed in {{units}}).
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dBmV"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamPower" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The current received power at the CPE's FAST line (expressed in {{units}}).
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dBmV"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMRMCds" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the signal-to-noise margin for the robust management channel (RMC) in the downstream direction (express in {{units}}). A special value (-512)  indicates that the signal-to-noise ratio margin for the RMC is out of the range to be represented. This parameter is defined in clauses 7.10.12.1 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMRMCus" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the signal-to-noise margin for the robust management channel (RMC) in the upstream direction (express in {{units}}). A special value (-512)  indicates that the signal-to-noise ratio margin for the RMC is out of the range to be represented. This parameter is defined in clauses 7.10.12.2 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="BITSRMCpsds" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{list}} List items report the bit allocation values on RMC sub-carriers in RMC symbols in the downstream direction. Each pair composes of a sub-carrier index from 0..4095 and an 8 bit allocation value. There are maximum 512 pairs. This parameter is defined in clause 7.10.12.3 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="4610"/>
+          </list>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="BITSRMCpsus" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{list}} List items report the bit allocation values on RMC sub-carriers in RMC symbols in the upstream direction. Each pair composes of a sub-carrier index from 0..4095 and an 8 bit allocation value. There are maximum 512 pairs. This parameter is defined in clause 7.10.12.4 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="4610"/>
+          </list>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="FEXTCANCELds" access="readOnly" dmr:version="2.11">
+        <description>
+          This indicates whether FEXT cancellation in the downstream direction from all the other vectored lines into the line in the vectored group is enabled (TRUE) or disabled (FALSE). This parameter is defined as FEXT_TO_CANCEL_ENABLEds in clause 7.1.7.1 of ITU Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FEXTCANCELus" access="readOnly" dmr:version="2.11">
+        <description>
+          This indicates whether FEXT cancellation in the upstream direction from all the other vectored lines into the line in the vectored group is enabled (TRUE) or disabled (FALSE). This parameter is defined as FEXT_TO_CANCEL_ENABLEds in clause 7.1.7.1 of ITU Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ETRds" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the expected throughput rate expressed in {{units}} as defined in clause 7.11.1.2 of ITU-T Recommendation {{bibref|G.997.2}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ETRus" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the expected throughput rate expressed in {{units}} as defined in clause 7.11.1.2 of ITU-T Recommendation {{bibref|G.997.2}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ATTETRds" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the attainable expected throughput expressed in {{units}} as defined in clause 7.11.2.2 of ITU-T Recommendation {{bibref|G.997.2}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ATTETRus" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the attainable expected throughput expressed in {{units}} as defined in clause 7.11.2.2 of ITU-T Recommendation {{bibref|G.997.2}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MINEFTR" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the minimum error free throughput value expressed in {{units}} computed from power up as defined in clause 11.4.1.1.3 of ITU-T Recommendation {{bibref|G.9701}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalStart" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          FAST-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|Total}} statistics.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ShowtimeStart" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          FAST-specific statistic. The Number of {{units}} since the most recent DSL Showtime - the beginning of the period used for collection of {{object|Showtime}} statistics.
+          Showtime is defined as successful completion of the DSL link establishment process. The ''Showtime'' statistics are those collected  since the most recent establishment of the DSL link.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastShowtimeStart" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          FAST-specific statistic. The Number of {{units}} since the second most recent DSL Showtime-the beginning of the period used for collection of {{object|LastShowtime}} statistics.
+          If the CPE has not retained information about the second most recent Showtime (e.g., on reboot), the start of ''LastShowtime''  statistics MAY temporarily coincide with the start of ''Showtime'' statistics.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentDayStart" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          FAST-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|CurrentDay}} statistics.
+          The CPE MAY align the beginning of each ''CurrentDay'' interval with days in the UTC time zone, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QuarterHourStart" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          FAST-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|QuarterHour}} statistics.
+          The CPE MAY align the beginning of each ''QuarterHour'' interval with real-time quarter-hour intervals, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}.Stats.Total." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object contains DSL line total statistics.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}. An errored second (ES) is declared if, during a 1-second interval, there are one or more crc anomalies, or one or more los defects, or one or more lor defects, or one or more lpr primitives.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of severely errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LOSS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of signal seconds (LOSS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LOSS is declared if, during a 1-second interval, there are one or more los defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LORS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of RMC seconds (LORS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LORS is declared if, during a 1-second interval, there are one or more lor defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UAS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of unavailable seconds (UAS) as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXUC" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of uncorrected DTU anomalies (rtx_uc). This parameter is defined in clause 7.8.5 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXTX" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of retransmitted DTU anomalies (rtx_tx). This parameter is defined in clause 7.8.6 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessBSW" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful bit swap (BSW) primitives. This parameter is defined as success_BSW in clause 7.7.20 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessSRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful autonomous SRA (seamless rate adaptation) primitives. This parameter is defined as success_SRA in clause 7.7.21 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessFRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful FRA (fast rate adaptation)  primitives. This parameter is defined as success_FRA in clause 7.7.22 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessRPA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful RPA (RMC parameter adjustment)  primitives. This parameter is defined as success_RPA in clause 7.7.23 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessTIGA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful TIGA (transmitter initiated gain adjustment)  primitives. This parameter is defined as success_TIGA in clause 7.7.24 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}.Stats.Showtime." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object contains FAST line statistics since the most recent showtime.
+        Note: The Total parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}. An errored second (ES) is declared if, during a 1-second interval, there are one or more crc anomalies, or one or more los defects, or one or more lor defects, or one or more lpr primitives.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of severely errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LOSS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of signal seconds (LOSS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LOSS is declared if, during a 1-second interval, there are one or more los defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LORS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of RMC seconds (LORS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LORS is declared if, during a 1-second interval, there are one or more lor defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UAS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of unavailable seconds (UAS) as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXUC" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of uncorrected DTU anomalies (rtx_uc). This parameter is defined in clause 7.8.5 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXTX" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of retransmitted DTU anomalies (rtx_tx). This parameter is defined in clause 7.8.6 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessBSW" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful bit swap (BSW) primitives. This parameter is defined as success_BSW in clause 7.7.20 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessSRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful autonomous SRA (seamless rate adaptation) primitives. This parameter is defined as success_SRA in clause 7.7.21 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessFRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful FRA (fast rate adaptation)  primitives. This parameter is defined as success_FRA in clause 7.7.22 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessRPA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful RPA (RMC parameter adjustment)  primitives. This parameter is defined as success_RPA in clause 7.7.23 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessTIGA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful TIGA (transmitter initiated gain adjustment)  primitives. This parameter is defined as success_TIGA in clause 7.7.24 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}.Stats.LastShowtime." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object contains FAST line statistics since the second most recent showtime.
+        Note: The Total parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}. An errored second (ES) is declared if, during a 1-second interval, there are one or more crc anomalies, or one or more los defects, or one or more lor defects, or one or more lpr primitives.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of severely errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LOSS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of signal seconds (LOSS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LOSS is declared if, during a 1-second interval, there are one or more los defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LORS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of RMC seconds (LORS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LORS is declared if, during a 1-second interval, there are one or more lor defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UAS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of unavailable seconds (UAS) as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXUC" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of uncorrected DTU anomalies (rtx_uc). This parameter is defined in clause 7.8.5 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXTX" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of retransmitted DTU anomalies (rtx_tx). This parameter is defined in clause 7.8.6 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessBSW" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful bit swap (BSW) primitives. This parameter is defined as success_BSW in clause 7.7.20 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessSRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful autonomous SRA (seamless rate adaptation) primitives. This parameter is defined as success_SRA in clause 7.7.21 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessFRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful FRA (fast rate adaptation)  primitives. This parameter is defined as success_FRA in clause 7.7.22 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessRPA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful RPA (RMC parameter adjustment)  primitives. This parameter is defined as success_RPA in clause 7.7.23 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessTIGA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful TIGA (transmitter initiated gain adjustment)  primitives. This parameter is defined as success_TIGA in clause 7.7.24 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}.Stats.CurrentDay." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object contains FAST line statistics accumulated during the current day.
+        Note: The Total parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}. An errored second (ES) is declared if, during a 1-second interval, there are one or more crc anomalies, or one or more los defects, or one or more lor defects, or one or more lpr primitives.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of severely errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LOSS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of signal seconds (LOSS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LOSS is declared if, during a 1-second interval, there are one or more los defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LORS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of RMC seconds (LORS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LORS is declared if, during a 1-second interval, there are one or more lor defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UAS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of unavailable seconds (UAS) as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXUC" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of uncorrected DTU anomalies (rtx_uc). This parameter is defined in clause 7.8.5 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXTX" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of retransmitted DTU anomalies (rtx_tx). This parameter is defined in clause 7.8.6 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessBSW" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful bit swap (BSW) primitives. This parameter is defined as success_BSW in clause 7.7.20 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessSRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful autonomous SRA (seamless rate adaptation) primitives. This parameter is defined as success_SRA in clause 7.7.21 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessFRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful FRA (fast rate adaptation)  primitives. This parameter is defined as success_FRA in clause 7.7.22 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessRPA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful RPA (RMC parameter adjustment)  primitives. This parameter is defined as success_RPA in clause 7.7.23 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessTIGA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful TIGA (transmitter initiated gain adjustment)  primitives. This parameter is defined as success_TIGA in clause 7.7.24 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}.Stats.QuarterHour." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object contains FAST line statistics accumulated during the current quarter hour.
+        Note: The Total parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}. An errored second (ES) is declared if, during a 1-second interval, there are one or more crc anomalies, or one or more los defects, or one or more lor defects, or one or more lpr primitives.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of severely errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LOSS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of signal seconds (LOSS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LOSS is declared if, during a 1-second interval, there are one or more los defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LORS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of RMC seconds (LORS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LORS is declared if, during a 1-second interval, there are one or more lor defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UAS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of unavailable seconds (UAS) as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXUC" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of uncorrected DTU anomalies (rtx_uc). This parameter is defined in clause 7.8.5 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXTX" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of retransmitted DTU anomalies (rtx_tx). This parameter is defined in clause 7.8.6 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessBSW" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful bit swap (BSW) primitives. This parameter is defined as success_BSW in clause 7.7.20 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessSRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful autonomous SRA (seamless rate adaptation) primitives. This parameter is defined as success_SRA in clause 7.7.21 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessFRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful FRA (fast rate adaptation)  primitives. This parameter is defined as success_FRA in clause 7.7.22 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessRPA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful RPA (RMC parameter adjustment)  primitives. This parameter is defined as success_RPA in clause 7.7.23 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessTIGA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful TIGA (transmitter initiated gain adjustment)  primitives. This parameter is defined as success_TIGA in clause 7.7.24 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}.TestParams." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object contains the FAST line test parameters that are available during the L0 (i.e., Showtime)  state.
+      </description>
+      <parameter name="SNRGds" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the number of sub-carriers in any one sub-carrier group used to represent the downstream SNR(f) values. Valid values are 1, 2, 4, and 8.
+          Note: In ITU-T G.9701-2014, the only valid value is G = 1. See clause 7.10.8.2 ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRGus" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the number of sub-carriers in any one sub-carrier group used to represent the upstream SNR(f) values. Valid values are 1, 2, 4, and 8.
+          Note: In ITU-T G.9701-2014, the only valid value is G = 1. See clause 7.10.8.5 ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRpsds" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{list}} Reports the downstream SNR(f) values. A special value indicates that no measurement could be done for this sub-carrier group because it is out of the downstream MEDLEY set or its transmit power is zero. The number of elements will depend on the value of SNRGds. Interpretation of the values is as defined in clause 11.4.1.2.2.of ITU-T Rec. {{bibref|G.9701}}.
+          Note: See clause 7.10.8.3 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2047"/>
+          </list>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRpsus" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{list}} Reports the upstream SNR(f) values. A special value indicates that no measurement could be done for this sub-carrier group because it is out of the downstream MEDLEY set or its transmit power is zero. The number of elements will depend on the value of SNRGds. Interpretation of the values is as defined in clause 11.4.1.2.2.of ITU-T Rec. {{bibref|G.9701}}.
+          Note: See clause 7.10.8.6 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2047"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMTds" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the number of symbols used to measure the downstream SNR(f) values. The valid values 0..65535.
+          Note: See clause 7.10.8.1 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMTus" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the number of symbols used to measure the upstream SNR(f) values. The valid values 0..65535.
+          Note: See clause 7.10.8.4 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ACTINP" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the actual INP against SHINE as defined in clause 11.4.1.1.7/{{bibref|G.9701}}. A special value indicates an actual INP against SHINE of 2047 symbols or higher. The valid values are 0..2046 and 2047 is the special value.
+          Note: See ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="NFEC" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the DTU FEC codeword length (expressed in 1 byte unit) as defined in clause 9.3/{{bibref|G.9701}}. The valid range is 32..255.
+          Note: See clause 7.11.4.1 ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RFEC" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the DTU FEC codeword redundancy as defined in clause 9.3/{{bibref|G.9701}}.
+          Note: See ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamCurrRate" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the current physical layer aggregate data rate (expressed in {{units}}) of the upstream FAST as defined in clause 11.4.1.1.1/{{bibref|G.9701}}.
+          The current physical layer aggregate data rate (expressed in Kbps) of the upstream FAST connection. The valid values are 0..4294967295(0 to 232-1 kbit/s).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamCurrRate" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the current physical layer aggregate data rate (expressed in {{units}}) of the upstream FAST as defined in clause 11.4.1.1.1/{{bibref|G.9701}}.
+          The current physical layer aggregate data rate (expressed in Kbps) of the downstream FAST connection. The valid values are 0..4294967295(0 to 232-1 kbit/s).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ACTINPREIN" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the actual INP against REIN as defined in clause 11.4.1.1.8/{{bibref|G.9701}}. A special value indicates an actual INP against REIN of 63 symbols or higher. The valid range is 0..62 symbols, and 63 is the special value.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Optical." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object models optical interface technologies.  It defines an {{object|Interface}} object that models a layer 1 optical interface that is capable of transporting Ethernet packets.  The data model definition is based on parts of {{bibref|G.988}}.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Optical.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4" dmr:fixedObject="true">
+      <description>
+        Optical interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).  This table models physical optical interfaces.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables the optical interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.4">
+        <description>
+          The current operational state of the optical interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.4">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.4">
+        <description>
+          The textual name of the optical interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The accumulated time in {{units}} since the optical interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.4">
+        <description>
+          {{list}}  {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="OpticalSignalLevel" access="readOnly" dmr:version="2.4">
+        <description>
+          Current measurement of total downstream optical signal level.
+          {{datatype|expand}}
+          Valid values are -65.536 dBm (coded as -65536), to 65.534 dBm (coded as 65534) in 0.002 dB increments.
+          This parameter is based on ''Optical signal level'' from {{bibref|G.988|Section 9.2.1}}.
+        </description>
+        <syntax>
+          <dataType ref="Dbm1000">
+            <range minInclusive="-65536" maxInclusive="65534" step="2"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="LowerOpticalThreshold" access="readOnly" dmr:version="2.4">
+        <description>
+          Optical level that is used to declare the downstream low received optical power alarm.
+          {{datatype|expand}}
+          Valid values are -127.5 dBm (coded as -127500) to 0 dBm (coded as 0) in 0.5 dB increments.  The value -127500 indicates the device's internal policy.
+          This parameter is based on ''Lower optical threshold'' from {{bibref|G.988|section 9.2.1}}.
+        </description>
+        <syntax>
+          <dataType ref="Dbm1000">
+            <range minInclusive="-127000" maxInclusive="0" step="500"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="UpperOpticalThreshold" access="readOnly" dmr:version="2.4">
+        <description>
+          Optical level that is used to declare the downstream high received optical power alarm.
+          {{datatype|expand}}
+          Valid values are -127.5 dBm (coded as -127500) to 0 dBm (coded as 0) in 0.5 dB increments.  The value -127500 indicates the device's internal policy.
+          This parameter is based on ''Upper optical threshold'' from {{bibref|G.988|section 9.2.1}}.
+        </description>
+        <syntax>
+          <dataType ref="Dbm1000">
+            <range minInclusive="-127000" maxInclusive="0" step="500"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="TransmitOpticalLevel" access="readOnly" dmr:version="2.4">
+        <description>
+          Current measurement of mean optical launch power.
+          {{datatype|expand}}
+          Valid values are -127.5 dBm (coded as -127500) to 0 dBm (coded as 0) in 0.5 dB increments.  The value -127500 indicates the device's internal policy.
+          This parameter is based on ''Transmit optical level'' from {{bibref|G.988|section 9.2.1}}.
+        </description>
+        <syntax>
+          <dataType ref="Dbm1000">
+            <range minInclusive="-127000" maxInclusive="0" step="500"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="LowerTransmitPowerThreshold" access="readOnly" dmr:version="2.4">
+        <description>
+          Minimum mean optical launch power that is used to declare the low transmit optical power alarm.
+          {{datatype|expand}}
+          Valid values are -63.5 dBm (coded as -63500) to +63.5 dBm (coded as 63500) in 0.5 dB increments.  The value -63500 indicates the device's internal policy.
+          This parameter is based on ''Lower transmit power threshold'' from {{bibref|G.988|section 9.2.1}}.
+        </description>
+        <syntax>
+          <dataType ref="Dbm1000">
+            <range minInclusive="-63500" maxInclusive="63500" step="500"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="UpperTransmitPowerThreshold" access="readOnly" dmr:version="2.4">
+        <description>
+          Maximum mean optical launch power that is used to declare the high transmit optical power alarm.
+          {{datatype|expand}}
+          Valid values are -63.5 dBm (coded as -63500) to +63.5 dBm (coded as 63500) in 0.5 dB increments.  The value -63500 indicates the device's internal policy.
+          This parameter is based on ''Upper transmit power threshold'' from {{bibref|G.988|section 9.2.1}}.
+        </description>
+        <syntax>
+          <dataType ref="Dbm1000">
+            <range minInclusive="-63500" maxInclusive="63500" step="500"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Optical.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Cellular." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object models cellular interfaces and access points.
+      </description>
+      <parameter name="RoamingEnabled" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables roaming.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RoamingStatus" access="readOnly" dmr:version="2.8">
+        <description>
+          Current roaming status.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Home"/>
+            <enumeration value="Roaming"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AccessPointNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Cellular.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8" dmr:fixedObject="true">
+      <description>
+        Cellular interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).  Each instance of this object models a cellular modem with a single radio and a single {{object|USIM}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}}
+          * SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic.
+          * SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed)
+          * SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface
+          * SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          Because the interface includes layer 1 the {{enum|LowerLayerDown}} value SHOULD never be used.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up">
+              <description>
+                Corresponds to {{enum|GPRS|CurrentAccessTechnology}}, {{enum|UMTS|CurrentAccessTechnology}}, {{enum|LTE|CurrentAccessTechnology}} etc ''ATTACHED'' status
+              </description>
+            </enumeration>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent">
+              <description>
+                Corresponds to {{enum|GPRS|CurrentAccessTechnology}}, {{enum|UMTS|CurrentAccessTechnology}}, {{enum|LTE|CurrentAccessTechnology}} etc ''DETACHED'' status
+              </description>
+            </enumeration>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.8">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.8">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IMEI" access="readOnly" dmr:version="2.8">
+        <description>
+          International Mobile Station Equipment Identity number, represented as a 15 digit string (digits 0-9).
+        </description>
+        <syntax>
+          <string>
+            <size minLength="15" maxLength="15"/>
+            <pattern value="[0-9]{15,15}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedAccessTechnologies" access="readOnly" dmr:version="2.8">
+        <description>
+          Access technologies supported by the interface.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="GPRS">
+              <description>
+                GSM with GPRS
+              </description>
+            </enumeration>
+            <enumeration value="EDGE">
+              <description>
+                GSM with EDGE
+              </description>
+            </enumeration>
+            <enumeration value="UMTS"/>
+            <enumeration value="UMTSHSPA">
+              <description>
+                UMTS with High Speed Packet Access (HSPA {{bibref|3GPP-HSPA}})
+              </description>
+            </enumeration>
+            <enumeration value="CDMA2000OneX"/>
+            <enumeration value="CDMA2000HRPD"/>
+            <enumeration value="LTE"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredAccessTechnology" access="readWrite" dmr:version="2.8">
+        <description>
+          Preferred access technology.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="SupportedAccessTechnologies" nullValue="Auto"/>
+          </string>
+          <default type="factory" value="Auto"/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentAccessTechnology" access="readOnly" dmr:version="2.8">
+        <description>
+          Access technology that is currently in use.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="SupportedAccessTechnologies"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AvailableNetworks" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          List of available networks.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkRequested" access="readWrite" dmr:version="2.8">
+        <description>
+          Name of the network which will be used, or {{empty}} if the network is selected automatically.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="factory" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkInUse" access="readOnly" dmr:version="2.8">
+        <description>
+          The value is {{empty}} if no network is found, or if the network specified in {{param|NetworkRequested}} is not found.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <enumerationRef targetParam="AvailableNetworks" nullValue=""/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RSSI" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The received signal strength in {{units}}. The allowed values depend on {{param|CurrentAccessTechnology}}:
+          * For {{enum|GPRS|SupportedAccessTechnologies}}, {{enum|EDGE|SupportedAccessTechnologies}} the range is -111 {{units}} to -49 {{units}}
+          * For {{enum|UMTS|SupportedAccessTechnologies}}, {{enum|UMTSHSPA|SupportedAccessTechnologies}} the range is -117 {{units}} to -54 {{units}}
+          * For {{enum|LTE|SupportedAccessTechnologies}} the range is -117 {{units}} to -25 {{units}}
+          Note: An undetectable signal is indicated by the appropriate lower limit, e.g. -117 {{units}} for LTE.
+        </description>
+        <syntax>
+          <int>
+            <units value="dBm"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamMaxBitRate" access="readOnly" dmr:version="2.8">
+        <description>
+          The current maximum attainable data rate upstream (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamMaxBitRate" access="readOnly" dmr:version="2.8">
+        <description>
+          The current maximum attainable data rate downstream (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Cellular.Interface.{i}.USIM." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        USIM (Universal Subscriber Identity Module or SIM card) parameters for the interface.
+      </description>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The current status of the USIM card.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None">
+              <description>
+                No card available
+              </description>
+            </enumeration>
+            <enumeration value="Available">
+              <description>
+                Card is available but not verified
+              </description>
+            </enumeration>
+            <enumeration value="Valid">
+              <description>
+                Card can be used; either valid PIN was entered, or PIN check is deactivated
+              </description>
+            </enumeration>
+            <enumeration value="Blocked">
+              <description>
+                USIM is blocked because the maximum number of invalid PIN entries was exceeded
+              </description>
+            </enumeration>
+            <enumeration value="Error" optional="true">
+              <description>
+                An error was detected with the card
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IMSI" access="readOnly" dmr:version="2.8">
+        <description>
+          International Mobile Subscriber Identity represented as a string with either 14 or 15 digits (digits 0-9). The first 3 digits are the mobile country code (MCC), which are followed by the mobile network code (MNC), either 2 digits (European standard) or 3 digits (North American standard), followed by the mobile subscription identification number (MSIN).
+        </description>
+        <syntax>
+          <string>
+            <size minLength="14" maxLength="15"/>
+            <pattern value="[0-9]{14,15}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ICCID" access="readOnly" dmr:version="2.8">
+        <description>
+          Integrated Circuit Card Identifier represented as a string of up to 20 digits (digits 0-9). The number is composed of the following parts:
+          * Major industry identifier (MII), 2 fixed digits, 89 for telecommunication purposes.
+          * Country code, 1–3 digits, as defined by ITU-T recommendation {{bibref|ITU-E.164}}.
+          * identifier, 1–4 digits.
+          * Individual account identification number. Its length is variable, but every number under one IIN will have the same length.
+          * Single check digit calculated from the other digits using the Luhn algorithm.
+          For cards using an ICCID according to {{bibref|ITU-E.118}} the maximum length is 19 Digits, for GSM cards 20 digits.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="20"/>
+            <pattern value="[0-9]{6,20}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MSISDN" access="readOnly" dmr:version="2.8">
+        <description>
+          Mobile Subscriber Integrated Service Digital Network Number, a number uniquely identifying a subscription in a GSM, UMTS, or LTE mobile network. {{bibref|ITU-E.164}}
+        </description>
+        <syntax>
+          <string>
+            <size minLength="14" maxLength="15"/>
+            <pattern value="[0-9]{14,15}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PINCheck" access="readWrite" dmr:version="2.8">
+        <description>
+          Controls the PIN verification of the USIM card.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="OnNetworkAccess">
+              <description>
+                Check the PIN with each access to a new network
+              </description>
+            </enumeration>
+            <enumeration value="Reboot">
+              <description>
+                Check the PIN with first access after (re)boot
+              </description>
+            </enumeration>
+            <enumeration value="Off">
+              <description>
+                Disable the PIN check
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PIN" access="readWrite" dmr:version="2.8">
+        <description>
+          Allows the ACS to change the USIM PIN used for SIM card activation.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="4"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Cellular.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Cellular.AccessPoint.{i}." access="readWrite" numEntriesParameter="AccessPointNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        Cellular Access Point table. Each entry is identified by an {{param|APN}} (Access Point Name) that identifies a gateway between the mobile network and another computer network.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="APN"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the Access Point.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="APN" access="readWrite" dmr:version="2.8">
+        <description>
+          Access Point Name.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.8">
+        <description>
+          Username used to authenticate the CPE when making a connection to the Access Point.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.8">
+        <description>
+          Password used to authenticate the CPE when making a connection to the Access Point.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Proxy" access="readWrite" dmr:version="2.8">
+        <description>
+          Proxy server IP address.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProxyPort" access="readWrite" dmr:version="2.8">
+        <description>
+          Proxy server port.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.8">
+        <description>
+          Reference to the interface with which the access point is associated.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".Cellular.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ATM." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Asynchronous Transfer Mode (ATM) object that contains the {{object|Link}} interface and {{object|Diagnostics.F5Loopback}} diagnostics.
+      </description>
+      <parameter name="LinkNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ATM.Link.{i}." access="readWrite" numEntriesParameter="LinkNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        ATM link-layer table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Models an ATM PVC virtual circuit and the ATM Adaption Layer (AAL). An ATM Link entry is typically stacked on top of either a {{object|.DSL.Channel.}} or a {{object|.DSL.BondingGroup.}} object.
+        When an ''ATM Link'' interface is used, a lower-layer {{object|.DSL.Channel}} interface MUST be configured with ATM encapsulation (see {{param|.DSL.Channel.{i}.LinkEncapsulationUsed}}).
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the link.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the link (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the link as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the link entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="LinkType" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates the type of connection and refers to the complete stack of protocol used for this connection.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="EoA">
+              <description>
+                {{bibref|RFC2684}} bridged Ethernet over ATM
+              </description>
+            </enumeration>
+            <enumeration value="IPoA">
+              <description>
+                {{bibref|RFC2684}} routed IP over ATM
+              </description>
+            </enumeration>
+            <enumeration value="PPPoA">
+              <description>
+                {{bibref|RFC2364}} PPP over ATM
+              </description>
+            </enumeration>
+            <enumeration value="CIP">
+              <description>
+                {{bibref|RFC2225}} Classical IP over ATM
+              </description>
+            </enumeration>
+            <enumeration value="Unconfigured"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AutoConfig" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates if the CPE is currently using some auto configuration mechanisms for this connection.  If this  variable is {{true}}, all writable variables in this connection instance become read-only. Any attempt to change one of these variables SHOULD fail and an error SHOULD be returned.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="DestinationAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          Destination address of this link, in the form "VPI/VCI" (e.g. "8/23" or "0/35").
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pattern value="\d+/\d+"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Encapsulation" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifies the connection encapsulation that will be used.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="LLC"/>
+            <enumeration value="VCMUX"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FCSPreserved" access="readWrite" dmr:version="2.0">
+        <description>
+          This flag tells if a checksum SHOULD be added in the ATM payload. It does not refer to the checksum of one of  the ATM cells or AALX packets. In case of LLC or VCMUX encapsulation, this ATM checksum is the FCS field described in {{bibref|RFC2684}}. It is only applicable in the upstream direction.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="VCSearchList" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} Ordered list of VPI/VCI pairs to search if a link using the {{param|DestinationAddress}} cannot be  established.  In the form "VPI1/VCI1, VPI2/VCI2, ...".  {{pattern}}
+          Example:
+          : ''0/35, 8/35, 1/35''
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string>
+            <pattern value="\d+/\d+"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AAL" access="readOnly" dmr:version="2.0">
+        <description>
+          Describes the ATM Adaptation Layer (AAL) currently in use on the PVC.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AAL1"/>
+            <enumeration value="AAL2"/>
+            <enumeration value="AAL3"/>
+            <enumeration value="AAL4"/>
+            <enumeration value="AAL5"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ATM.Link.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedBlocks" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current count of successfully transmitted cells.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedBlocks" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current count of successfully received cells.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Count of the ATM layer cyclic redundancy check (CRC) errors.
+          This refers to CRC errors at the ATM adaptation layer (AAL). The AAL in use is indicated by the {{param|#.AAL}} parameter. The value  of the {{param}} parameter MUST be 0 for AAL types that have no CRCs.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="HECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Count of the number of Header Error Check related errors at the ATM layer.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ATM.Link.{i}.QoS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The ATM Link QoS object.
+      </description>
+      <parameter name="QoSClass" access="readWrite" dmr:version="2.0">
+        <description>
+          Describes the ATM Quality Of Service (QoS) being used on the VC.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="UBR"/>
+            <enumeration value="CBR"/>
+            <enumeration value="GFR"/>
+            <enumeration value="VBR-nrt"/>
+            <enumeration value="VBR-rt"/>
+            <enumeration value="UBR+"/>
+            <enumeration value="ABR"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PeakCellRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies the upstream peak cell rate in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="cells per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumBurstSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies the upstream maximum burst size in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="cells"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SustainableCellRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies the upstream sustainable cell rate, in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="cells per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ATM.Diagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The ATM Diagnostics object.
+      </description>
+    </object>
+    <object name="Device.ATM.Diagnostics.F5Loopback." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object provides access to an ATM-layer F5 OAM loopback test.
+      </description>
+      <parameter name="DiagnosticsState" access="readWrite" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="DiagnosticsState">
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Canceled" optional="true"/>
+            <enumeration value="Complete" access="readOnly"/>
+            <enumeration value="Error" access="readOnly" optional="true"/>
+            <enumeration value="Error_Internal" access="readOnly"/>
+            <enumeration value="Error_Other" access="readOnly"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}  This is the interface over which the test is to be performed.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetParent=".ATM.Link." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfRepetitions" access="readWrite" dmr:version="2.0">
+        <description>
+          Number of repetitions of the ping test to perform before reporting the results.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Timeout" access="readWrite" dmr:version="2.0">
+        <description>
+          Timeout in {{units}} for the ping test.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessCount" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result parameter indicating the number of successful pings (those in which a successful response was received  prior to the timeout) in the most recent ping test.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FailureCount" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result parameter indicating the number of failed pings in the most recent ping test.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AverageResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result parameter indicating the average response time in {{units}} over all repetitions with successful  responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MinimumResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result parameter indicating the minimum response time in {{units}} over all repetitions with successful  responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result parameter indicating the maximum response time in {{units}} over all repetitions with successful  responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PTM." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Packet Transfer Mode ({{bibref|G.993.1|Annex H}}). This object contains the {{object|Link}} interface.
+      </description>
+      <parameter name="LinkNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PTM.Link.{i}." access="readWrite" numEntriesParameter="LinkNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        PTM link-layer table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Models a layer 2 variable-sized packet interface. A PTM Link entry is typically stacked on top of either a {{object|.FAST.Line.}}, {{object|.DSL.Channel.}}, or a {{object|.DSL.BondingGroup.}} object.
+        When a ''PTM Link'' interface is used, a lower-layer {{object|.DSL.Channel}} interface MUST be configured with PTM encapsulation (see {{param|.DSL.Channel.{i}.LinkEncapsulationUsed}}).
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the link.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the link (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the link as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the link entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC Address of the interface.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PTM.Link.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Ethernet object. This object models several Ethernet interface objects, each representing a different stack layer, including: {{object|Interface}}, {{object|Link}}, and {{object|VLANTermination}}. {{object|Interface}} is media-specific and models a port, the PHY layer, and the MAC layer. {{object|Link}} is media-independent and models the Logical Link Control (LLC) layer. An "outer" {{object|VLANTermination}}, when present, is expected to be stacked on top of {{object|Link}} objects to receive and send frames with a configured VLANID.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LinkNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANTerminationNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RMONStatsNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LAGNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        Ethernet interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). This table models physical Ethernet ports, but in terms of the interface stack it also models the PHY and MAC level Ethernet interface.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC Address of the interface.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readWrite" dmr:version="2.0">
+        <description>
+          The maximum upstream and downstream PHY bit rate supported by this interface (expressed in {{units}}).
+          A value of -1 indicates automatic selection of the maximum bit rate.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="Mbps"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentBitRate" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The current upstream and downstream PHY bit rate on this interface (expressed in {{units}}).
+          A value of 0 indicates that the current bit rate is unknown.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DuplexMode" access="readWrite" dmr:version="2.0">
+        <description>
+          The duplex mode available to this connection.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Half"/>
+            <enumeration value="Full"/>
+            <enumeration value="Auto"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EEECapability" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates whether this physical ethernet port supports Energy Efficient Ethernet as specified in {{bibref|802.3-2012_section6|Section 78}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EEEEnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Whether Energy Efficient Ethernet {{bibref|802.3-2012_section6|Section 78}} support is currently enabled. When enabled, this ethernet port will be capable of entering or exiting Low Power Idle (LPI) mode.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.Link.{i}." access="readWrite" numEntriesParameter="LinkNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Ethernet link layer table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Table entries model the Logical Link Control (LLC) layer. It is expected that an ''Ethernet Link'' interface can be stacked above any lower-layer interface object capable of carrying Ethernet frames.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the link.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the link (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the link as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the link entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC address used for packets sent via this interface. Provides the source MAC address for outgoing traffic and the destination MAC address for incoming traffic.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="PriorityTagging" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables priority tagging on this Ethernet Link.
+          When {{true}}, egress frames leaving this interface will be priority tagged with the frame's associated priority value, which will either be derived directly from the ingress frame or else set via {{param|.QoS.Classification.{i}.EthernetPriorityMark}} or {{param|.QoS.Classification.{i}.InnerEthernetPriorityMark}}.
+          When {{false}}, egress frames leaving this interface will be untagged.
+          The parameter does not affect reception of ingress frames.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.Link.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.VLANTermination.{i}." access="readWrite" numEntriesParameter="VLANTerminationNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        VLAN Termination table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). A VLAN Termination entry is typically stacked on top of a {{object|#.Link}} object to receive and send frames with the configured {{param|VLANID}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the VLANTermination entry.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the VLANTermination entry (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the VLANTermination entry as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the VLANTermination entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANID" access="readWrite" dmr:version="2.0">
+        <description>
+          The VLAN ID for this {{object}} entry (as defined in {{bibref|802.1Q-2011}}). Only ingress frames with this VLAN ID will be passed to higher protocol layers; frames sent from higher protocol layers will be tagged with this VLAN ID.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="4094"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TPID" access="readWrite" dmr:version="2.7">
+        <description>
+          The Tag Protocol Identifier (TPID) assigned to this {{object}}. The TPID is an EtherType value used to identify the frame as a tagged frame.
+          Standard {{bibref|802.1Q-2011|Table 9.1}} TPID values are:
+          *S-TAG 0x88A8 = 34984
+          *C-TAG 0x8100 = 33024
+          Non-Standard TPID values are:
+          *S-TAG 0x9100 = 37120
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="33024"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.VLANTermination.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.RMONStats.{i}." access="readWrite" numEntriesParameter="RMONStatsNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        Ethernet statistics based on the {{bibref|RFC2819}} ''RMON-MIB'' ''etherStatsTable'', with some extensions inspired by {{bibref|G.988|Section 9.3.32}}.
+        Each instance is associated with an interface capable of transporting Ethernet-encapsulated packets, and contains a set of unidirectional Ethernet statistics.
+        The statistics are sampled either on ingress or on egress.  This is determined as follows:
+        * If the instance is associated with an egress queue (or queues) via the {{param|Queue}} parameter or by setting {{param|AllQueues}} to {{true}} then data is sampled on egress.  In this case {{param|Bytes}} etc measure the data that has been sent on the interface, possibly filtered by {{param|Queue}} or {{param|VLANID}}.
+        * Otherwise data is sampled on ingress.  In this case {{param|Bytes}} etc measure the data that has been received on the interface, possibly filtered by {{param|VLANID}}.
+        When sampling on egress, the term ''received'' means ''received by the queuing sub-system''.
+        Multiple instances can be associated with a single interface: individual instances can be configured to collect data associated with the entire interface, or with a particular VLAN and/or queue.
+        The CPE MUST reset each instances's Stats parameters whenever the instance is disabled and re-enabled.  Whether this reset occurs when the instance becomes operationally disabled ({{param|Status}} = {{enum|Disabled|Status}}) or administratively enabled ({{param|Enable}} = {{true}}) is a local matter to the CPE.  This is similar to the behavior of interface statistics, e.g. as specified for {{object|Device.Ethernet.Interface.{i}.Stats}}.  Furthermore, this instance's Stats parameters MUST be reset whenever the referenced interface's Stats parameters are reset, or when the referenced queue or VLAN is disabled and re-enabled.
+        For enabled table entries, if {{param|Interface}} references an interface that is not capable of transporting Ethernet-encapsulated packets, or if {{param|Queue}} references a queue that is not instantiated on {{param|Interface}}, or if {{param|Queue}} is not a valid reference and {{param|AllQueues}} is {{false}}, the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes unique key parameters that are strong references. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+        <parameter ref="VLANID"/>
+        <parameter ref="Queue"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables this instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.4">
+        <description>
+          The status of this instance.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.4">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.4">
+        <description>
+          The textual name of the {{object}} entry as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.4">
+        <description>
+          The interface associated with this instance.  {{reference|an interface that is capable of transporting Ethernet-encapsulated packets}}
+          The term "capable of transporting Ethernet-encapsulated packets" means "has an Ethernet header" and therefore refers to any interface that is at or below an ''Ethernet''.{{object|#.Link}} instance in the interface stack.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANID" access="readWrite" dmr:version="2.4">
+        <description>
+          Filter criterion.
+          The VLAN ID for which statistics are to be collected.
+          A zero value indicates that all packets, whether or not they have a VLAN header, will be considered.
+          A non-zero value indicates that only packets that have the the specified VLAN ID will be considered.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="4094"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Queue" access="readWrite" dmr:version="2.4">
+        <description>
+          Filter criterion.
+          The egress queue with which this instance is associated.
+          Only packets that are sent to the referenced queue will be considered.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="Device.QoS.Queue." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllQueues" access="readWrite" dmr:version="2.4">
+        <description>
+          Indicates whether this instance applies to all queues.  If {{true}}, the value of {{param|Queue}} is ignored since all egress queues are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DropEvents" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of events in which packets were dropped due to lack of resources.  Note that this number is not necessarily the number of packets dropped; it is just the number of times this condition has been detected.
+          This parameter is based on ''etherStatsDropEvents'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Bytes" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including those in bad packets) received (excluding framing bits but including FCS bytes).
+          This parameter is based on ''etherStatsOctets'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="bytes"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Packets" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including bad packets, broadcast packets, and multicast packets) received.
+          This parameter is based on ''etherStatsPkts'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of good {{units}} received that were directed to the broadcast address.  Note that this does not include multicast packets.
+          This parameter is based on ''etherStatsBroadcastPkts'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of good {{units}} received that were directed to a multicast address.  Note that this number does not include packets directed to the broadcast address.
+          This parameter is based on ''etherStatsMulticastPkts'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="CRCErroredPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} received that had a length (excluding framing bits, but including FCS bytes) of between 64 and 1518 bytes, inclusive, but had either a bad Frame Check Sequence (FCS) with an integral number of bytes (FCS Error) or a bad FCS with a non-integral number of bytes (Alignment Error).
+          This parameter is based on ''etherStatsCRCAlignErrors'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="packets"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="UndersizePackets" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} received that were less than 64 bytes long (excluding framing bits, but including FCS bytes) and were otherwise well formed.
+          This parameter is based on ''etherStatsUndersizePkts'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="packets"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="OversizePackets" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} received that were longer than 1518 bytes (excluding framing bits, but including FCS bytes) and were otherwise well formed.
+          This parameter is based on ''etherStatsOversizePkts'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="packets"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Packets64Bytes" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including bad packets) received that were 64 bytes in length (excluding framing bits but including FCS bytes).
+          This parameter is based on ''etherStatsPkts64Octets'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Packets65to127Bytes" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including bad packets) received that were between 65 and 127 bytes in length inclusive (excluding framing bits but including FCS bytes).
+          This parameter is based on ''etherStatsPkts65to127Octets'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Packets128to255Bytes" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including bad packets) received that were between 128 and 255 bytes in length inclusive (excluding framing bits but including FCS bytes).
+          This parameter is based on ''etherStatsPkts6128to255Octets'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Packets256to511Bytes" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including bad packets) received that were between 256 and 511 bytes in length inclusive (excluding framing bits but including FCS bytes).
+          This parameter is based on ''etherStatsPkts256to511Octets'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Packets512to1023Bytes" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including bad packets) received that were between 512 and 1023 bytes in length inclusive (excluding framing bits but including FCS bytes).
+          This parameter is based on ''etherStatsPkts512to1023Octets'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Packets1024to1518Bytes" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including bad packets) received that were between 1024 and 1518 bytes in length inclusive (excluding framing bits but including FCS bytes).
+          This parameter is based on ''etherStatsPkts1024to1518Octets'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.LAG.{i}." access="readWrite" numEntriesParameter="LAGNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        Ethernet Link Aggregation Group (LAG) table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Table entries model the Link Aggregation Sub-Layer as defined in {{bibref|802.3-2015}} and {{bibref|802.1AX-2014}}. It is expected that a {{object}} interface can only be stacked above {{object|.Ethernet.Interface}} interfaces. The CPE can reject creation of additional LAG instances if this would exceed its capabilities.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface). 
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.12">
+        <description>
+          The textual name of the LAG interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}.  See {{bibref|TR-181i2|Section 4.2.1}}.
+          {{param}} must reference to Device.Ethernet.Interface instances where  Link Aggregation Group is configured by the CPE.
+          For example, "Device.Ethernet.Interface.1, Device.Ethernet.Interface.2"
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readWrite" dmr:version="2.12">
+        <description>
+          MAC address of the Link Aggregation Interface.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.LAG.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Universal Serial Bus ({{bibref|USB1.0}}, {{bibref|USB2.0}}, {{bibref|USB3.0}}). This object contains the {{object|Interface}}, {{object|Port}}, and {{object|USBHosts}} objects.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PortNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        USB interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). This table models master and slave USB physical interfaces that support carrying Ethernet frames, e.g. via the USB Communication Device Class.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC Address of the interface.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum PHY bit rate supported by this interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readOnly" dmr:version="2.0">
+        <description>
+          {{reference}} This is the USB port associated with this interface object.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Port." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB.Port.{i}." access="readOnly" numEntriesParameter="PortNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        USB Port table. This table models master and slave USB physical ports on the device.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the port.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Standard" access="readOnly" dmr:version="2.0">
+        <description>
+          USB specification version supported by the Port. Example: "1.1"
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="4"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.0">
+        <description>
+          Type of the USB connection.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Host"/>
+            <enumeration value="Hub"/>
+            <enumeration value="Device"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Receptacle" access="readOnly" dmr:version="2.0">
+        <description>
+          Receptacle of the port.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Standard-A"/>
+            <enumeration value="Standard-B"/>
+            <enumeration value="Powered-B"/>
+            <enumeration value="Micro-AB"/>
+            <enumeration value="Micro-B"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Rate" access="readOnly" dmr:version="2.0">
+        <description>
+          Current speed of the USB connection. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Low">
+              <description>
+                1.5 Mbits/sec (187.5 KB/sec) defined in {{bibref|USB1.0}}
+              </description>
+            </enumeration>
+            <enumeration value="Full">
+              <description>
+                12 Mbits/sec (1.5 MB/sec) defined in {{bibref|USB1.0}}
+              </description>
+            </enumeration>
+            <enumeration value="High">
+              <description>
+                480 Mbits/sec (60 MB/sec) defined in {{bibref|USB2.0}}
+              </description>
+            </enumeration>
+            <enumeration value="Super">
+              <description>
+                5.0 Gbits/sec (625 MB/sec) defined in {{bibref|USB3.0}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Power" access="readOnly" dmr:version="2.0">
+        <description>
+          Power configuration of the USB connection. {{enum}}
+          Only applies when {{param|Type}} is {{enum|Device|Type}}. In other cases value is {{enum|Unknown}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Self"/>
+            <enumeration value="Bus"/>
+            <enumeration value="Unknown"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB.USBHosts." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object models the CPE's USB Host controllers.
+        See {{bibref|TR-157|Appendix I}} for Theory of Operation.
+      </description>
+      <parameter name="HostNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB.USBHosts.Host.{i}." access="readOnly" numEntriesParameter="HostNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Table of CPE USB Host controllers.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the USB Host controller.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          User-readable host controller name.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.0">
+        <description>
+          Type of USB Host
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="OHCI">
+              <description>
+                Open Host Controller Interface
+              </description>
+            </enumeration>
+            <enumeration value="EHCI">
+              <description>
+                Enhanced Host Controller Interface
+              </description>
+            </enumeration>
+            <enumeration value="UHCI">
+              <description>
+                Universal Host Controller Interface
+              </description>
+            </enumeration>
+            <enumeration value="xHCI">
+              <description>
+                Extensible Host Controller Interface
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Reset" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, 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.
+          The value is not saved in the device's state and setting it to {{false}} has no effect.
+        </description>
+        <syntax command="true">
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PowerManagementEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, {{param}} enables the Host Controller to invoke Power Management policy, i.e. controlled Suspend (see {{bibref|USB2.0}}, Chapters 4.3.2, 7.1.7.6, and 11.9).
+          When set to {{false}} {{param}} immediately disables the Host controller Power Management policy.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="USBVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          USB specification version with which the controller complies.  Example: "1.1"
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="4"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB.USBHosts.Host.{i}.Device.{i}." access="readOnly" numEntriesParameter="DeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Table of connected USB devices.
+      </description>
+      <uniqueKey>
+        <parameter ref="DeviceNumber"/>
+      </uniqueKey>
+      <parameter name="DeviceNumber" access="readOnly" dmr:version="2.0">
+        <description>
+          Device number on USB bus.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="USBVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          USB specification version with which the device complies.  Example: "1.1"
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="4"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceClass" access="readOnly" dmr:version="2.0">
+        <description>
+          Class Code as assigned by USB-IF.
+          When 0x00, each device specifies its own class code.  When 0xFF, the class code is vendor specified.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceSubClass" access="readOnly" dmr:version="2.0">
+        <description>
+          Subclass code (assigned by USB-IF).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          Device release number.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceProtocol" access="readOnly" dmr:version="2.0">
+        <description>
+          Protocol code (assigned by USB-IF).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="ProductID" access="readOnly" dmr:version="2.0">
+        <description>
+          Product ID (assigned by manufacturer).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="VendorID" access="readOnly" dmr:version="2.0">
+        <description>
+          Vendor ID (assigned by USB-IF).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Manufacturer" access="readOnly" dmr:version="2.0">
+        <description>
+          Device Manufacturer string descriptor.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProductClass" access="readOnly" dmr:version="2.0">
+        <description>
+          Device Product Class string descriptor.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="2.0">
+        <description>
+          Device SerialNumber string descriptor.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readOnly" dmr:version="2.0">
+        <description>
+          Hub port on parent device.
+          0 when no parent.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="USBPort" access="readOnly" dmr:version="2.0">
+        <description>
+          {{reference}} This is a reference to the USB host device to which this (external) USB device is connected.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".USB.Port." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Rate" access="readOnly" dmr:version="2.0">
+        <description>
+          Speed of the USB device. {{enum}}
+          Internal signaling between the connected USB device and the USB Host Controller provide the information needed to determine the negotiated rate.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Low">
+              <description>
+                1.5 Mbits/sec (187.5 KB/sec) defined in {{bibref|USB1.0}}
+              </description>
+            </enumeration>
+            <enumeration value="Full">
+              <description>
+                12 Mbits/sec (1.5 MB/sec) defined in {{bibref|USB1.0}}
+              </description>
+            </enumeration>
+            <enumeration value="High">
+              <description>
+                480 Mbits/sec (60 MB/sec) defined in {{bibref|USB2.0}}
+              </description>
+            </enumeration>
+            <enumeration value="Super">
+              <description>
+                5.0 Gbits/sec (625 MB/sec) defined in {{bibref|USB3.0}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Parent" access="readOnly" dmr:version="2.0">
+        <description>
+          {{reference}} This is a reference to the parent USB device (e.g. hub device).
+          This is {{empty}} for a device connected to the Host controller (root hub).
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.Device." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxChildren" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of ports.  Only applies for hub device, equal to 0 for other devices.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IsSuspended" access="readOnly" dmr:version="2.0">
+        <description>
+          When {{true}} the associated Device is in a suspended (i.e. low-power) state (see {{bibref|USB2.0|Chapter 11.9}}).
+          When {{false}} the associated Device is in any of the other states specified by the USB 2.0 Device State Machine (see {{bibref|USB2.0|Chapter 9.1.1}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IsSelfPowered" access="readOnly" dmr:version="2.0">
+        <description>
+          When {{true}} the associated device is at least partly powered by a local source (see {{bibref|USB2.0|Chapter 9.4.5}}).
+          When {{false}} the associated device draws all the current it needs from the USB bus.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ConfigurationNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}." access="readOnly" numEntriesParameter="ConfigurationNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Table of device configurations.
+      </description>
+      <uniqueKey>
+        <parameter ref="ConfigurationNumber"/>
+      </uniqueKey>
+      <parameter name="ConfigurationNumber" access="readOnly" dmr:version="2.0">
+        <description>
+          The identifier for each Device Configuration.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Table of device interface descriptors.
+      </description>
+      <uniqueKey>
+        <parameter ref="InterfaceNumber"/>
+      </uniqueKey>
+      <parameter name="InterfaceNumber" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of this interface (from USB interface descriptor).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceClass" access="readOnly" dmr:version="2.0">
+        <description>
+          Class Code as assigned by USB-IF.
+          When 0x00, each interface specifies its own class code.  When 0xFF, the class code is vendor specified.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceSubClass" access="readOnly" dmr:version="2.0">
+        <description>
+          Subclass code (assigned by USB-IF).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceProtocol" access="readOnly" dmr:version="2.0">
+        <description>
+          Protocol code (assigned by USB-IF).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        HPNA object that contains the {{object|Interface}} and {{object|Diagnostics}} objects. The HPNA (also known as HomePNA) industry standard {{bibref|G.9954}} defines peer to peer communication for home networking over existing coax cables and telephone wiring within the home.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        HPNA interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Each table entry models the PHY and MAC levels of an HPNA interface {{bibref|G.9954}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC Address of the interface.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          This interface's firmware version.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NodeID" access="readOnly" dmr:version="2.0">
+        <description>
+          The Node ID of this interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IsMaster" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether this interface is the HPNA network master.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Synced" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether this interface is synchronized with the HPNA network master. If this interface is the HPNA network master, {{param}} MUST be {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalSyncTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total time in {{units}} (since device reset) that this interface has been up and synchronized to the HPNA network master.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum HPNA PHY bit rate (expressed in {{units}}) of this interface.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkUtilization" access="readOnly" dmr:version="2.0">
+        <description>
+          Current HPNA network utilization (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1000"/>
+            <units value="0.1%"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PossibleConnectionTypes" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate the types of connections possible for this interface. {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="Phone"/>
+            <enumeration value="Coax"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionType" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} Connection type(s) for which the HPNA protocol is active.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam="PossibleConnectionTypes"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PossibleSpectralModes" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate the spectral modes possible for this interface. {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="A">
+              <description>
+                4-20MHz - Phone / Coax
+              </description>
+            </enumeration>
+            <enumeration value="B">
+              <description>
+                12-28MHz - Phone / Coax
+              </description>
+            </enumeration>
+            <enumeration value="C">
+              <description>
+                36-52MHz - Coax only
+              </description>
+            </enumeration>
+            <enumeration value="D">
+              <description>
+                4-36MHz - Coax only
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SpectralMode" access="readWrite" dmr:version="2.0">
+        <description>
+          Spectral mode for which the HPNA protocol is active.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="PossibleSpectralModes"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MTU" access="readWrite" dmr:version="2.0">
+        <description>
+          Maximum Transmission Unit for this HPNA interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NoiseMargin" access="readWrite" dmr:version="2.0">
+        <description>
+          The desired noise margin for which the local HPNA interface has been configured (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="0.1dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultNonLARQPER" access="readWrite" dmr:version="2.0">
+        <description>
+          The desired packet error rate for which the local HPNA interface has been configured (expressed in 1E-8, e.g. PER of 1.27E-6 will be presented as 127).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LARQEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enable or disable the Limited Automatic Repeat Request (LARQ) mechanism.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MinMulticastRate" access="readWrite" dmr:version="2.0">
+        <description>
+          The minimum multicast (and broadcast) rate that can be negotiated on the HPNA network directly accessible via this interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NegMulticastRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The negotiated multicast (and broadcast) rate on the HPNA network directly accessible via this interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MasterSelectionMode" access="readWrite" dmr:version="2.0">
+        <description>
+          Master selection mode. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Automatic">
+              <description>
+                Automatic master selection
+              </description>
+            </enumeration>
+            <enumeration value="ForceEndpoint">
+              <description>
+                Force local HPNA interface to be end point
+              </description>
+            </enumeration>
+            <enumeration value="ForceMaster">
+              <description>
+                Force local HPNA interface to be master
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}} This is the number of HPNA nodes that are directly accessible via this interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Interface.{i}.QoS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        QoS configuration object.
+      </description>
+      <parameter name="FlowSpecNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Interface.{i}.QoS.FlowSpec.{i}." access="readWrite" numEntriesParameter="FlowSpecNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Flow specification table.
+        The {{object|.QoS.Classification}} table is used to classify ingress traffic, where {{param|.QoS.Classification.{i}.TrafficClass}} is one of the classification result outputs. This ''TrafficClass'' value can be used to look up the appropriate {{object}} entry (i.e. the {{object}} entry whose {{param|TrafficClasses}} list contains a matching traffic class).
+        For enabled table entries, if {{param|TrafficClasses}} is {{empty}} then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="TrafficClasses" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} This list identifies the set of traffic classes associated with this flow spec.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <unsignedInt/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="FlowType" access="readWrite" dmr:version="2.0">
+        <description>
+          Flow type. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="CBR">
+              <description>
+                Constant Bit Rate
+              </description>
+            </enumeration>
+            <enumeration value="VBR">
+              <description>
+                Variable Bit Rate
+              </description>
+            </enumeration>
+            <enumeration value="VBR-NRT">
+              <description>
+                Variable Bit Rate - Non Real Time
+              </description>
+            </enumeration>
+            <enumeration value="BE">
+              <description>
+                Best Effort
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="BE"/>
+        </syntax>
+      </parameter>
+      <parameter name="Priority" access="readWrite" dmr:version="2.0">
+        <description>
+          Flow queue network priority.
+          Priority 0 is the lowest priority.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Latency" access="readWrite" dmr:version="2.0">
+        <description>
+          Maximum latency of the flow (expressed in {{units}}).
+          Value 0 means no latency requirements.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="999"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Jitter" access="readWrite" dmr:version="2.0">
+        <description>
+          Maximum jitter of the flow (expressed in {{units}}).
+          Value 0 means no jitter requirements.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="999"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Typical packet size.
+          Value 0 means undefined packet size.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="MinRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Minimum required rate in Kbps.
+          Value 0 means no MinRate requirements.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="AvgRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Average required rate in Kbps.
+          Value 0 means no AvgRate requirements.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Maximum required rate in Kbps.
+          Value 0 means no MaxRate requirements.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PER" access="readWrite" dmr:version="2.0">
+        <description>
+          The desired packet error rate (expressed in 1E-8, e.g. PER of 1.27E-6 will be presented as 127).
+          Value 0 means no PER requirements.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Timeout" access="readWrite" dmr:version="2.0">
+        <description>
+          Flow inactivity tear down timeout (expressed in {{units}}).
+          Value 0 means unlimited timeout.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Interface.{i}.AssociatedDevice.{i}." access="readOnly" numEntriesParameter="AssociatedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This table provides information about other HPNA devices that are directly accessible via this HPNA interface.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The physical address of this node.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeID" access="readOnly" dmr:version="2.0">
+        <description>
+          The Node ID of this node.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IsMaster" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether this node is the HPNA network master.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Synced" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether this node is synchronized with the HPNA network master. If this node is the HPNA network master, {{param}} MUST be {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalSyncTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total time in {{units}} (since device reset) that this node has been up and synchronized to the HPNA network master.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.0">
+        <description>
+          This node's maximum HPNA PHY bit rate (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PHYDiagnosticsEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enable / disable PHY throughput diagnostics mode on this node. All devices that are enabled will participate in the HPNA network PHY throughput diagnostics process.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether or not this node is currently present in the HPNA network.
+          The ability to list inactive nodes is OPTIONAL.  If the CPE includes inactive nodes in this table, {{param}} MUST be set to {{false}}  for each inactive node.  The length of time an inactive node remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Diagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The HPNA Diagnostics object.
+      </description>
+    </object>
+    <object name="Device.HPNA.Diagnostics.PHYThroughput." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <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>
+      <parameter name="DiagnosticsState" access="readWrite" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="DiagnosticsState">
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Canceled" optional="true"/>
+            <enumeration value="Complete" access="readOnly"/>
+            <enumeration value="Error" access="readOnly" optional="true"/>
+            <enumeration value="Error_FailToEnableCert" access="readOnly"/>
+            <enumeration value="Error_CertCmdTimeout" access="readOnly"/>
+            <enumeration value="Error_UnknownErr" access="readOnly"/>
+            <enumeration value="Error_UnsupportedOpcode" access="readOnly"/>
+            <enumeration value="Error_InvalidParam" access="readOnly"/>
+            <enumeration value="Error_UnsupportedCmdSegment" access="readOnly"/>
+            <enumeration value="Error_UnsupportedDataGen" access="readOnly"/>
+            <enumeration value="Error_InvalidSequence" access="readOnly"/>
+            <enumeration value="Error_InvalidFrame" access="readOnly"/>
+            <enumeration value="Eror_InvalidOpcode" access="readOnly"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}  This is the interface over which the test is to be performed.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetParent=".HPNA.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NumPacketsInBurst" access="readWrite" dmr:version="2.0">
+        <description>
+          Number of test packet in burst to be send during PHY diagnostics test from each HPNA device to other HPNA device  in the HPNA network.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BurstInterval" access="readWrite" dmr:version="2.0">
+        <description>
+          Test packet burst interval length (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TestPacketPayloadLength" access="readWrite" dmr:version="2.0">
+        <description>
+          Payload length in the test packets.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1480"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PayloadEncoding" access="readWrite" dmr:version="2.0">
+        <description>
+          HPNA payload encoding in PHY diagnostics. 0 is used for negotiated payload between devices according to line  conditions.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PayloadDataGen" access="readWrite" dmr:version="2.0">
+        <description>
+          Test packets payload data generator value.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PayloadType" access="readWrite" dmr:version="2.0">
+        <description>
+          Test packets payload type. {{enum}}
+          In Pattern mode the PayloadDataGen value is repeated pattern in the payload.
+          In IncrementByte mode LSByte in PayloadDataGen is used as first payload  and next bytes in payload are incremented.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Pattern"/>
+            <enumeration value="IncrementByte"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PriorityLevel" access="readWrite" dmr:version="2.0">
+        <description>
+          Priority level of PHY diagnostics packets (0 lowest -7 highest).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ResultNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}} This is the number of PHY diagnostics results.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Diagnostics.PHYThroughput.Result.{i}." access="readOnly" numEntriesParameter="ResultNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        PHY throughput diagnostics results.
+        Each result object corresponds to unidirectional traffic between two PHY diagnostics-enabled nodes (so there are two such objects for  each such pair).
+      </description>
+      <uniqueKey>
+        <parameter ref="SrcMACAddress"/>
+        <parameter ref="DestMACAddress"/>
+      </uniqueKey>
+      <parameter name="SrcMACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          HPNA source MAC address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          HPNA destination MAC address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="PHYRate" access="readOnly" dmr:version="2.0">
+        <description>
+          PHY diagnostics HPNA PHY rate (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="BaudRate" access="readOnly" dmr:version="2.0">
+        <description>
+          PHY Baud rate (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbaud"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SNR" access="readOnly" dmr:version="2.0">
+        <description>
+          PHY diagnostics SNR (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="0.1dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of received packets in PHY diagnostics mode.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Attenuation" access="readOnly" dmr:version="2.0">
+        <description>
+          Measured attenuation (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="0.1dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Diagnostics.PerformanceMonitoring." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <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>
+      <parameter name="DiagnosticsState" access="readWrite" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="DiagnosticsState">
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Canceled" optional="true"/>
+            <enumeration value="Complete" access="readOnly"/>
+            <enumeration value="Error" access="readOnly" optional="true"/>
+            <enumeration value="Error_SampleIntervalTooSmall" access="readOnly"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} This is the interface over which the test is to be performed.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetParent=".HPNA.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SampleInterval" access="readWrite" dmr:version="2.0">
+        <description>
+          Time in {{units}} between automatic collection of performance monitoring data.  A value of zero disables automatic collection of data.
+          The CPE MAY impose a minimum sample interval, in which case an attempt to set a (non-zero) interval that is less than this minimum MUST set the interval to the minimum and MUST NOT be regarded as an error.
+          If SampleInterval is a simple fraction of a day, e.g. 900 (a quarter of an hour) or 3600 (an hour), the CPE MAY choose to align sample intervals with time of day, but is not required to do so.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Diagnostics.PerformanceMonitoring.Nodes." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Per-node HPNA performance monitoring results.
+        When automatic collection is enabled, i.e. {{param|#.SampleInterval}} is non-zero, the "current" interval is defined by the most recent automatic sample and the most recent subsequent manual sample, if any.
+        When automatic collection is disabled, i.e. SampleInterval is zero, the "current" interval is defined by the three most recent manual  samples.
+        Note: Packets in statistics counters are Ethernet packets.
+      </description>
+      <parameter name="CurrentStart" access="readOnly" dmr:version="2.0">
+        <description>
+          Start time for the current interval.
+          When automatic collection is enabled, i.e. SampleInterval is non-zero, the current interval started at the most recent automatic  sample.
+          When automatic collection is disabled, i.e. SampleInterval is zero, the current interval started two manual samples  ago.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentEnd" access="readOnly" dmr:version="2.0">
+        <description>
+          End time for the current interval.
+          When automatic collection is enabled, i.e. SampleInterval is non-zero, the current interval ended at the most recent manual sample  since the most recent automatic sample.  If there has been no such manual sample, the current interval is empty.
+          When automatic collection is disabled, i.e. SampleInterval is zero, the current interval ended at the most recent manual  sample.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}} This is the number of HPNA nodes for which performance monitoring results were collected during the current sample interval.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Diagnostics.PerformanceMonitoring.Nodes.Node.{i}." access="readOnly" numEntriesParameter="NodeNumberOfEntries" minEntries="1" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Per-node HPNA performance monitoring results during the current sample interval. Each table entry contains the results collected between an HPNA node (as indicated by {{param|MACAddress}}) and the local HPNA interface (as indicated by {{param|##.Interface}}).
+        Note: Packet counters indicate the number of packets received between {{param|#.CurrentStart}} and {{param|#.CurrentEnd}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC address of the HPNA node.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of bytes sent by host equipment for transmission on the HPNA interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of received bytes on the HPNA interface destined for the host equipment.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of packets sent by host equipment for transmission on the HPNA interface. Number includes also short error packets and control packets.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of good packets received on the HPNA interface destined for the host equipment.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of broadcast packets transmitted on the HPNA interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of broadcast packets received on the HPNA interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of multicast packets transmitted on the HPNA interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of multicast packets received on the HPNA interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsCrcErrored" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of packets received on the HPNA interface with CRC errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsCrcErroredHost" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of CRC error packets received on the HPNA interface destined for the host equipment.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsShortErrored" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of packets received on the HPNA interface that are too short to be valid.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsShortErroredHost" access="readOnly" dmr:version="2.0">
+        <description>
+          The number packets sent by the host equipment that are too short to be valid.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RxPacketsDropped" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of received packets dropped due to lack of resources.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TxPacketsDropped" access="readOnly" dmr:version="2.0">
+        <description>
+          The number packets sent by the host equipment for transmission on the HPNA interface but dropped due to lack of resources.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ControlRequestLocal" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of HPNA control request packets from local host.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ControlReplyLocal" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of HPNA control reply packets to local host.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ControlRequestRemote" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of HPNA control request packets from remote host.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ControlReplyRemote" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of HPNA control reply packets to remote host.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSentWire" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted to wire.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSentWire" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of broadcast packets transmitted to wire.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSentWire" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of multicast packets transmitted to wire.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsInternalControl" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of HPNA control request packets from internal node.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsInternalControl" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of HPNA broadcast control request packets from internal node.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceivedQueued" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of received packets queued on host output queues.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceivedForwardUnknown" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of packets received and forwarded to unknown hosts.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeUtilization" access="readOnly" dmr:version="2.0">
+        <description>
+          The node utilization (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1000"/>
+            <units value="0.1%"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Diagnostics.PerformanceMonitoring.Channels." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Per-channel HPNA performance monitoring results.
+        Note: channels are unidirectional.
+      </description>
+      <parameter name="TimeStamp" access="readOnly" dmr:version="2.0">
+        <description>
+          Time at which channel data was last collected.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ChannelNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}} This is the number of HPNA channels for which performance monitoring results have been collected.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Diagnostics.PerformanceMonitoring.Channels.Channel.{i}." access="readOnly" numEntriesParameter="ChannelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Per-channel HPNA performance monitoring results.
+      </description>
+      <uniqueKey>
+        <parameter ref="HostSrcMACAddress"/>
+        <parameter ref="HostDestMACAddress"/>
+      </uniqueKey>
+      <parameter name="HostSrcMACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The host source MAC address associated with the channel.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="HostDestMACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The host destination MAC address associated with the channel.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="HPNASrcMACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The HPNA source MAC address associated with the channel.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="HPNADestMACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The HPNA destination MAC address associated with the channel.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="PHYRate" access="readOnly" dmr:version="2.0">
+        <description>
+          Channel PHY rate (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="BaudRate" access="readOnly" dmr:version="2.0">
+        <description>
+          PHY Baud rate (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbaud"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SNR" access="readOnly" dmr:version="2.0">
+        <description>
+          Channel actual SNR measured in receiver side (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="0.1dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of packets sent in the channel.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Pre-LARQ number of packets received in the channel.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LARQPacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Post-LARQ number of packets received in the channel. Valid only if LARQ is enabled.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FlowSpec" access="readOnly" dmr:version="2.0">
+        <description>
+          {{reference}} Identifies the ''FlowSpec'' associated with the channel. This parameter is only used for channels that correspond to egress traffic from the local HPNA interface.
+          {{null}} means that the channel is not associated with any specified flow specification in the QoS object.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".HPNA.Interface.{i}.QoS.FlowSpec." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MoCA." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        MoCA object that contains the {{object|Interface}} table {{bibref|MoCAv1.0}} {{bibref|MoCAv1.1}}.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MoCA.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        MoCA interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Each table entry models the PHY and MAC levels of a MoCA interface {{bibref|MoCAv1.0}} {{bibref|MoCAv1.1}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC Address of the interface.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          This interface's firmware version.
+          This parameter is based on ''mocaIfSoftwareVersion'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum MoCA PHY bit rate (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxIngressBW" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum bandwidth of this interface for flows onto the MoCA network in {{units}}.
+          This parameter is based on ''mocaIfMaxIngressNodeBw'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxEgressBW" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum bandwidth of this interface for flows from the MoCA network in {{units}}.
+          This parameter is based on ''mocaIfMaxEgressNodeBw'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="HighestVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          Identifies the highest MoCA version that this interface supports.
+          This element MUST be in the form of dot-delimited integers, where each successive integer represents a more minor category of variation. For example, 1.0, where the components mean major.minor revision number. {{pattern}}
+          This parameter is based on ''mocaIfMocaVersion'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <pattern value="\d+(\.\d+)*"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          Identifies the MoCA version that the MoCA network is currently running.
+          This element MUST be in the form of dot-delimited integers, where each successive integer represents a more minor category of variation. For example, 1.0, where the components mean major.minor revision number. {{pattern}}
+          This parameter is based on ''mocaIfNetworkVersion'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <pattern value="\d+(\.\d+)*"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkCoordinator" access="readOnly" dmr:version="2.0">
+        <description>
+          The Node ID of the current Network Coordinator (NC) for the MoCA network.
+          This parameter is based on ''mocaIfNC'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeID" access="readOnly" dmr:version="2.0">
+        <description>
+          The Node ID of this interface.
+          This parameter is based on ''mocaIfNodeID'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxNodes" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum network node capability supported by the interface. If {{param}} is {{true}} then the interface supports 16 nodes (the maximum for a MoCA 1.1 network). If {{param}} is false then the interface supports 8 nodes (the maximum for a MoCA 1.0 network).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredNC" access="readWrite" dmr:version="2.0">
+        <description>
+          Whether this interface is a preferred Network Coordinator (NC).
+          This parameter is based on ''mocaIfPreferredNC'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="BackupNC" access="readOnly" dmr:version="2.0">
+        <description>
+          The Node ID of the backup Network Coordinator node.
+          This parameter is based on ''mocaIfBackupNC'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PrivacyEnabledSetting" access="readWrite" dmr:version="2.0">
+        <description>
+          The configured privacy mode. This indicates whether link-layer security is enabled ({{true}}) or disabled ({{false}}) for network admission.
+          The configured privacy setting MAY NOT match the current operational state ({{param|PrivacyEnabled}}), since this setting is only applied during network formation or admission.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PrivacyEnabled" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether link-layer security is enabled or disabled.
+          This parameter is based on ''mocaIfPrivacyEnable'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FreqCapabilityMask" access="readOnly" dmr:version="2.0">
+        <description>
+          Hexadecimal encoded 64-bit mask of supported frequencies. This is the bit map of the spectrum that the interface supports, and each bit represents 25 MHz of spectrum. The least significant bit of the rightmost character corresponds to 800MHz, which is the lowest frequency.
+          For example, an interface that supports 1150 MHz through 1500 MHz would have a value of 0x000000001FFFC000.
+          This parameter is based on ''mocaIfCapabilityMask'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="8" maxLength="8"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="FreqCurrentMaskSetting" access="readWrite" dmr:version="2.0">
+        <description>
+          The configured hexadecimal encoded 64-bit mask of enabled frequencies for network admission.
+          The configured frequencies MAY NOT match the current operational state ({{param|FreqCurrentMask}}), since this setting is only applied during network formation or admission.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="8" maxLength="8"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="FreqCurrentMask" access="readOnly" dmr:version="2.0">
+        <description>
+          Hexadecimal encoded 64-bit mask of used frequencies. This is the bit map of the spectrum that can be used and is a subset of the {{param|FreqCapabilityMask}}. Each bit represents 25 MHz of spectrum. The least significant bit of the rightmost character corresponds to 800MHz, which is the lowest frequency.
+          This parameter is based on ''mocaIfChannelMask'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="8" maxLength="8"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentOperFreq" access="readOnly" dmr:version="2.0">
+        <description>
+          Current Operational Frequency.  The RF frequency in Hz to which the MoCA interface is currently  tuned. This parameter is only valid when {{param|Status}} is {{enum|Up|Status}}.
+          This parameter is based on ''mocaIfRFChannel'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LastOperFreq" access="readOnly" dmr:version="2.0">
+        <description>
+          Last Operational Frequency.  The RF frequency in Hz to which the MoCA interface was tuned when last in the {{enum|Up|Status}} state.
+          This parameter is based on ''mocaIfLOF'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="KeyPassphrase" access="readWrite" dmr:version="2.0">
+        <description>
+          MoCA Password. The value consists of numeric characters (0-9). {{pattern}}
+          This parameter is based on ''mocaIfPassword'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size minLength="12" maxLength="17"/>
+            <pattern value="\d+"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TxPowerLimit" access="readWrite" dmr:version="2.0">
+        <description>
+          Transmit Power attenuation in dB relative to the maximum transmit power.
+          The MoCA interface SHOULD have {{param|Enable}} set to {{false}} for any change in this configuration. If the parameter is modified when {{param|Enable}} is {{true}} then this change might take several minutes to complete.
+          This parameter is based on ''mocaIfTxPowerLimit'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PowerCntlPhyTarget" access="readWrite" dmr:version="2.0">
+        <description>
+          Target PHY rate in Mbps for the power control algorithm.
+          The MoCA interface SHOULD have {{param|Enable}} set to {{false}} for any change in this configuration. If the parameter is modified when {{param|Enable}} is {{true}} then this change might take several minutes to complete.
+          This parameter is based on ''mocaIfPowerControlTargetRate'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BeaconPowerLimit" access="readWrite" dmr:version="2.0">
+        <description>
+          Beacon Transmit Power attenuation in {{units}} relative to the maximum transmit power.
+          The MoCA interface SHOULD have {{param|Enable}} set to {{false}} for any change in this configuration. If the parameter is modified when {{param|Enable}} is {{true}} then this change might take several minutes to complete.
+          This parameter is based on ''mocaIfBeaconPowerLimit'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkTabooMask" access="readOnly" dmr:version="2.0">
+        <description>
+          Hexadecimal encoded 64-bit mask of MoCA taboo channels identified for the home network. This is the bit map of the spectrum that the interface supports, and each bit represents 25 MHz of spectrum. The least significant bit of the rightmost character corresponds to 800MHz, which is the lowest frequency.
+          This parameter is based on ''mocaIfTabooChannelMask'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="8" maxLength="8"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="NodeTabooMask" access="readOnly" dmr:version="2.0">
+        <description>
+          Hexadecimal encoded 64-bit mask of supported frequencies. This is the bit map of the spectrum that the interface supports, and each bit represents 25 MHz of spectrum. The least significant bit of the rightmost character corresponds to 800MHz, which is the lowest frequency.
+          This parameter is based on ''mocaIfNodeTabooChannelMask'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="8" maxLength="8"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="TxBcastRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The broadcast PHY transmit rate in {{units}} for this interface.
+          This parameter is based on ''mocaIfTxGcdRate'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TxBcastPowerReduction" access="readOnly" dmr:version="2.0">
+        <description>
+          Transmit Power attenuation in {{units}} relative to the maximum transmit power for broadcast transmissions.
+          This parameter is based on ''mocaIfTxGcdPowerReduction'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QAM256Capable" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether this interface supports the 256 QAM feature.
+          This parameter is based on ''mocaIfQAM256Capable'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketAggregationCapability" access="readOnly" dmr:version="2.0">
+        <description>
+          The packet aggregation capability supported by the interface. Standard values are 0 (no support), 6 (6 {{units}}) or 10 (10 {{units}}).
+          This parameter is based on ''mocaIfPacketsAggrCapability'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="10"/>
+            <units value="packets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MoCA.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MoCA.Interface.{i}.QoS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The QoS object provides information on MoCA parameterized QoS for this interface {{bibref|MoCAv1.1}}.
+      </description>
+      <parameter name="EgressNumFlows" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of QoS flows that this interface has from the MoCA network.
+          This parameter is based on ''mocaIfEgressNodeNumFlows'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IngressNumFlows" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of QoS flows that this interface has onto the MoCA network.
+          This parameter is based on ''mocaIfIngressNodeNumFlows'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FlowStatsNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MoCA.Interface.{i}.QoS.FlowStats.{i}." access="readOnly" numEntriesParameter="FlowStatsNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        The flow statistics table provides information on the MoCA parameterized QoS flows this interface has allocated onto the MoCA network.
+      </description>
+      <uniqueKey>
+        <parameter ref="FlowID"/>
+      </uniqueKey>
+      <parameter name="FlowID" access="readOnly" dmr:version="2.0">
+        <description>
+          The flow ID used to identify a flow in the network.
+          This parameter is based on ''mocaIfFlowID'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketDA" access="readOnly" dmr:version="2.0">
+        <description>
+          The Destination Address (DA) for the packets in this flow.
+          This parameter is based on ''mocaIfPacketDA'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxRate" access="readOnly" dmr:version="2.0">
+        <description>
+          Maximum required rate in {{units}}.
+          This parameter is based on ''mocaIfPeakDataRate'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBurstSize" access="readOnly" dmr:version="2.0">
+        <description>
+          Maximum burst size.
+          This parameter is based on ''mocaIfBurstSize'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTime" access="readOnly" dmr:version="2.0">
+        <description>
+          Flow lease time (expressed in {{units}}).
+          A {{param}} of 0 means unlimited lease time.
+          This parameter is based on ''mocaIfLeaseTime'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTimeLeft" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Flow lease time remaining (expressed in {{units}}).
+          If {{param|LeaseTime}} is 0 then a {{param}} of 0 means unlimited lease time; otherwise, a {{param}} of 0 means expired.
+          This parameter is based on ''mocaIfLeaseTimeLeft'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FlowPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The number of packets transmitted for this flow.
+          This parameter is based on ''mocaIfTxPacketsFlow'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MoCA.Interface.{i}.AssociatedDevice.{i}." access="readOnly" numEntriesParameter="AssociatedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This table contains information about other MoCA devices currently associated with this MoCA interface.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC address of the associated device's MoCA interface.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeID" access="readOnly" dmr:version="2.0">
+        <description>
+          The Node ID of this remote device.
+          This parameter is based on ''mocaNodeIndex'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredNC" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether this remote device is a preferred Network Coordinator (NC).
+          This parameter is based on ''mocaNodePreferredNC'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="HighestVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          Identifies the highest MoCA version that this remote device supports.
+          This element MUST be in the form of dot-delimited integers, where each successive integer represents a more minor category of variation. For example, 1.0, where the components mean major.minor revision number. {{pattern}}
+          This parameter is based on ''mocaNodeMocaVersion'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <pattern value="\d+(\.\d+)*"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PHYTxRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The PHY transmit rate (in {{units}}) to this remote device.
+          This parameter is based on ''mocaMeshTxRate'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PHYRxRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The PHY receive rate (in {{units}}) from this remote device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TxPowerControlReduction" access="readOnly" dmr:version="2.0">
+        <description>
+          The reduction in transmitter level (in {{units}}) due to power control.
+          This parameter is based on ''mocaNodeTxPowerReduction'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RxPowerLevel" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The power level (in {{units}}) received at the MoCA interface from this remote device.
+          This parameter is based on ''mocaNodeRxPower'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dBm"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TxBcastRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The broadcast PHY transmit rate (in {{units}}) from this remote device.
+          This parameter is based on ''mocaNodeTxGcdRate'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RxBcastPowerLevel" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The power level (in {{units}}) received at the MoCA interface from this remote device.
+          This parameter is based on ''mocaNodeRxGcdPower'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dBm"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TxPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The number of packets transmitted to this remote device (Note: Includes Broadcast, Multicast and Unicast packets).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RxPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The number of packets received from this remote device (Note: Includes Broadcast, Multicast and Unicast packets).
+          This parameter is based on ''mocaNodeRxPackets'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RxErroredAndMissedPackets" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of errored and missed packets received from this remote device.
+          This parameter is based on ''mocaNodeRxDrops'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QAM256Capable" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether this remote device supports the 256 QAM feature.
+          This parameter is based on ''mocaNodeQAM256Capable'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketAggregationCapability" access="readOnly" dmr:version="2.0">
+        <description>
+          The packet aggregation capability supported by the remote device. Standard values are 0 (no support), 6 (6 {{units}}) or 10 (10 {{units}}).
+          This parameter is based on ''mocaNodePacketsAggrCapability'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="10"/>
+            <units value="packets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RxSNR" access="readOnly" dmr:version="2.0">
+        <description>
+          The signal to noise level (in {{units}}) received at this interface from this remote device.
+          This parameter is based on ''mocaNodeSNR'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dBm"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether or not this remote device is currently present in the MoCA network.
+          The ability to list inactive nodes is OPTIONAL.  If the CPE includes inactive nodes in this table, {{param}} MUST be set to {{false}}  for each inactive node.  The length of time an inactive node remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        G.hn object that contains an {{object|Interface}} table for G.hn supported CPE. The ITU-T G.hn specifications {{bibref|G.9960}} and {{bibref|G.9961}} define Physical and MAC Layers for communication between two or more G.hn nodes in the home network over multiple wired media such as power line, phone line and coaxial cable.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4" dmr:fixedObject="true">
+      <description>
+        G.hn interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Each table entry models the PHY {{bibref|G.9960}} and MAC {{bibref|G.9961}} layers of a G.hn interface.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.4">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.4">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.4">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.4">
+        <description>
+          {{list}}  {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.4">
+        <description>
+          The MAC Address of the interface, denoted as node MAC address or REGID in {{bibref|G.9961}}.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.4">
+        <description>
+          The firmware version of the interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionType" access="readOnly" status="deprecated" dmr:version="2.4">
+        <description>
+          This parameter is DEPRECATED because it has been replaced by {{param|MediumType}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Powerline"/>
+            <enumeration value="Phone"/>
+            <enumeration value="Coax"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxTransmitRate" access="readOnly" dmr:version="2.8">
+        <description>
+          The maximum PHY data rate that the interface is capable of transmitting (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TargetDomainNames" access="readWrite" dmr:version="2.4">
+        <description>
+          {{list}}  Identifies the target domains configured by the user, as described in {{bibref|G.9961|Section 8.6.1}}. When registering or re-registering, the G.hn interface SHOULD try to register to one of these domains in the given order.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DomainName" access="readOnly" dmr:version="2.4">
+        <description>
+          This is the domain name to which the interface is currently registered.
+          {{empty}} indicates that the interface is currently not registered.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DomainNameIdentifier" access="readOnly" dmr:version="2.4">
+        <description>
+          The Domain Name Identifier, a shortened version of {{param|DomainName}}, denoted as DNI in {{bibref|G.9961|Section 8.6.11.2.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DomainId" access="readOnly" dmr:version="2.4">
+        <description>
+          The Domain Identifier of the domain to which the interface is registered, denoted as DOD in {{bibref|G.9961}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceId" access="readOnly" dmr:version="2.4">
+        <description>
+          The Device Identifier assigned by the Domain Master, denoted as DEVICE_ID in {{bibref|G.9961}}.
+          The value 0 indicates that the device is not currently registered.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.4">
+        <description>
+          The maximum PHY bit rate supported by this interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NodeTypeDMCapable" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates whether this interface has the capability to act as Domain Master in the G.hn domain.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="DMRequested" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates a request to force the role of the G.hn interface to Domain Master (DM) for the G.hn domain it is connected to. The selection of the Domain Master follows the procedures described in {{bibref|G.9961|Clause 8.6.6}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IsDM" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates whether this G.hn interface is currently the Domain Master (DM) for the G.hn domain it is connected to, as described in {{bibref|G.9961|Clause 8.6}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeTypeSCCapable" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates whether this interface has the capability to act as Security Controller in the G.hn domain.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SCRequested" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates a request to force the role of the G.hn interface to Security Controller (SC) for the G.hn domain it is connected to. The selection of the Security Controller follows the procedures described in {{bibref|G.9961|Clause 9.2}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IsSC" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates whether this G.hn interface is currently the Security Controller (SC) for the G.hn domain it is connected to, as described in {{bibref|G.9961|Clause 9.2}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="StandardVersions" access="readOnly" dmr:version="2.8">
+        <description>
+          The standard versions that the interface supports. The list MUST have an even number of items.  The first item of each pair represents an ITU-T G.hn Recommendation while the second element of each pair represents the amendment version of the indicated Recommendation that this interface supports (the value 0 corresponds to the base Recommendation).
+          For example, to indicate support for the G.9960 base document and G.9961 amendment 1, the corresponding list would be "G9960,0,G9961,1".
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBandPlan" access="readOnly" dmr:version="2.8">
+        <description>
+          The largest bandplan that the interface can support, as defined in {{bibref|G.9961|Clause 8.8.5.5}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MediumType" access="readOnly" dmr:version="2.8">
+        <description>
+          The medium type that the interface currently operates on.  Refer to {{bibref|G.9962|Table 7-5}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="PowerLineBaseband"/>
+            <enumeration value="PhoneLineBaseband"/>
+            <enumeration value="CoaxBaseband"/>
+            <enumeration value="CoaxRF"/>
+            <enumeration value="PlasticOpticalFiber"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TAIFG" access="readOnly" dmr:version="2.8">
+        <description>
+          The Acknowledgement InterFrame Gap, or TAIFG, as defined in {{bibref|G.9961|Clause 8.4}}. It is represented as multiples of {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="1.28 microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NotchedAmateurRadioBands" access="readWrite" dmr:version="2.8">
+        <description>
+          A bit map representing usage of international amateur bands (0 = masked, 1 = unmasked). The LSB represents the lowest band (1.8-2.0 MHz), the second LSB represents the second lowest band (3.5-4.0 MHz), and so on. The maximum value for this parameter is 0x03FF, i.e. it is a 10-bit quantity represented in 16 bits and the top 6 bits are always zero.
+          International Radio amateur bands are described in {{bibref|G.9964|Table D-1}} and conveyed by the Domain Master in the Amateur radio band descriptor (see {{bibref|G.9961|Table 8-77}}).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="2"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="PHYThroughputDiagnosticsEnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Comma-separated list of DeviceIDs of nodes that need to enable their PHY throughput diagnostics mode. All devices that are enabled will participate in the G.hn network PHY throughput diagnostics process.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="PerformanceMonitoringDiagnosticsEnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Comma-separated list of DeviceIDs of nodes that need to enable their Performance Monitoring diagnostics mode on this node. All devices that are enabled will participate in the G.hn network Performance Monitoring diagnostics process.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SMMaskedBandNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeTypeDMConfig" access="readWrite" dmr:version="2.4">
+        <description>
+          Requests the interface to become the Domain Master in the G.hn domain.
+          This parameter is valid only if {{param|NodeTypeDMCapable}} is {{true}}.
+          Note that, if more than one node is configured to act as Domain Master, G.hn specifies a protocol to ensure only one device actually becomes DM.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeTypeDMStatus" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates whether the interface is acting as Domain Master ({{true}}) or not ({{false}}).
+          See Note in {{param|NodeTypeDMConfig}} regarding the possibility of more than one node being configured with {{param|NodeTypeDMConfig}} = {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeTypeSCStatus" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates whether the interface is acting as Security Controller ({{true}}) or not ({{false}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDeviceNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PSM" access="readWrite" dmr:version="2.12">
+        <description>
+          Specifies the list of PSD shaping mask (PSM) breakpoints to be applied to the G.hn interface.
+          {{list|with each list item consisting of:}}
+          {{datatype|expand}}
+          The PSM level is 0.1*(the value of the level of the PSM) - 140 dBm/Hz.
+          For example, a PSM defined by two breakpoints (subcarrier 450, PSM level -80 dBm/Hz) and (subcarrier 1050, PSM level -90 dBm/Hz) is represented by PSM [450,600],[1050,500] .
+        </description>
+        <syntax>
+          <list minItems="2" maxItems="32"/>
+          <dataType ref="PSMBreakPointIndexAndLevel"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        Throughput statistics for this interface at the different G.hn reference points described in {{bibref|G.9961|Clause 8.1}}.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+          More specifically, this is the total number of MPDU bytes transmitted or retransmitted by the node through a physical medium (i.e., PMI defined in {{bibref|G.9960|Clause 5.2.1}}), which correspond to data LPDUs (i.e., data packets) and framing overhead (e.g., LFH, LPH, LPCS defined in {{bibref|G.9961|Clause 8.1}}). It does not include transmitted bytes contributed by management LPDUs (i.e., management packets).
+          Note: LPDUs in mixed LLC frame blocks are considered data LPDUs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+          More specifically, this is the total number of MPDU bytes received by the node through a physical medium, which correspond to data LPDUs and framing overhead. It does not include received bytes contributed by management LPDUs. It can include blocks with errors.
+          Note: LPDUs in mixed LLC frame blocks are considered data LPDUs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets transmitted out of the interface.
+          More specifically, this is the total number of APDUs requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point defined in {{bibref|G.9960|Clause 5.2.1}}) that were transmitted by the node through the physical medium. It does not include transmitted LCDUs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets received on the interface.
+          More specifically, this is the total number of APDUs delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) that were received by the node through the physical medium. It does not include received LCDUs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+          More specifically, this is the total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point defined in {{bibref|G.9960|Clause 5.2.1}}) but could not be transmitted because of errors (e.g., APDUs containing CRC errors).
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+          More specifically, this is the total number of received APDUs that contained errors preventing them from being delivered to a higher layer (i.e., inbound APDUs at the x1 reference point defined in {{bibref|G.9960|Clause 5.2.1}}). The possible causes of error are: incorrect CRC, incorrect MIC, incorrect MIC size, and incorrect size of packet.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+          More specifically, this is the total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) and which were addressed to a unicast address at this layer. It includes APDUs that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+          More specifically, this is the total number of received APDUs that were delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) and which were addressed to a unicast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+          More specifically, this is the total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) but chosen to be discarded even though no errors had been detected to prevent their being transmitted (e.g., buffer overflow).
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+          More specifically, this is the total number of received APDUs that were chosen to be discarded even though no errors had been detected to prevent their being delivered.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+          More specifically, this is the total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) and which were addressed to a multicast address at this layer. It includes APDUs that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+          More specifically, this is the total number of received APDUs that were delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) and which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+          More specifically, this is the total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) and which were addressed to a broadcast address at this layer. It includes APDUs that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+          More specifically, this is the total number of received APDUs that were delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) and which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+          More specifically, this is the total number of APDUs received by the management that were discarded because of an unknown or unsupported protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="MgmtBytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of MPDU bytes transmitted by the node through a physical medium, which correspond to management LPDUs and framing overhead.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MgmtBytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of MPDU bytes received by the node through a physical medium, which correspond to management LPDUs and framing overhead.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MgmtPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of LCDUs requested for transmission by a management layer (i.e., outbound LCDUs generated in LLC defined in {{bibref|G.9961|Clause 8.1.3}}) that were transmitted by the node through a physical medium.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MgmtPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of LCDUs delivered to a management layer (i.e., inbound LCDUs) that were received by the node through a physical medium.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BlocksSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of LPDUs that were transmitted by the node through a physical medium, regardless of new or retransmitted LPDUs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BlocksReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of LPDUs that were received by the node through a physical medium, with or without errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BlocksResent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of LPDUs that were retransmitted.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="BlocksErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received LPDUs that contained errors.
+          Note the following relationships hold:
+          * PacketsSent + ErrorsSent + DiscardPacketsSent = UnicastPacketsSent + MulticastPacketsSent + BroadcastPacketsSent.
+          * PacketsReceived = UnicastPacketsReceived + MulticastPacketsReceived + BroadcastPacketsReceived.
+          * Retransmission rate = BlocksResent / BlocksSent.
+          * Block error rate = BlocksErrorReceived / BlocksReceived.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Interface.{i}.AssociatedDevice.{i}." access="readOnly" numEntriesParameter="AssociatedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        This table contains information about other G.hn devices connected to this G.hn interface.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.4">
+        <description>
+          MAC address of remote G.hn device.
+          This is denoted as REGID in {{bibref|G.9961}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceId" access="readOnly" dmr:version="2.4">
+        <description>
+          Device Id (as defined in G.hn) for the remote G.hn device, denoted as DEVICE_ID in {{bibref|G.9961}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TxPhyRate" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The PHY transmit Rate (expressed in {{units}}) to this remote device, denoted as PHY data rate in {{bibref|G.9961}}.
+          Refer to Note 1 of {{bibref|G.9961|Table 8-48}}.  To convert from the value in the table, divide by 32K (32768) and round down.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RxPhyRate" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The PHY receive Rate (expressed in {{units}}) from this remote device, denoted as PHY data rate in {{bibref|G.9961}}.
+          Refer to Note 1 of {{bibref|G.9961|Table 8-48}}.  To convert from the value in the table, divide by 32K (32768) and round down.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.4">
+        <description>
+          Whether or not this device is currently present in the G.hn domain.
+          The ability to list inactive nodes is OPTIONAL. If the CPE includes inactive nodes in this table, {{param}} MUST be set to {{false}} for each inactive node. The length of time an inactive node remains listed in this table is a local matter to the CPE.
+          If {{param}} is {{true}}, it indicates that the Status of the remote device is 0, 1, or 2 (see {{bibref|G.9961|Table 7-3}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Interface.{i}.DMInfo." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object specifies management parameters pertaining to the domain functionality (Domain Master function; see {{bibref|G.9961|Clause 8.6}}). The object exists only on G.hn interfaces that are currently the Domain Master, i.e. for which parameter {{param|#.IsDM}} is {{true}}.
+      </description>
+      <parameter name="DomainName" access="readWrite" dmr:version="2.8">
+        <description>
+          This is the domain name to which the interface is currently registered. {{empty}} indicates that the interface is currently not registered.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="32"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="DomainNameIdentifier" access="readOnly" dmr:version="2.8">
+        <description>
+          The Domain Name Identifier, a shortened version of {{param|DomainName}}, denoted as DNI in {{bibref|G.9961|Section 8.6.11.2.1}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="2"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="DomainId" access="readOnly" dmr:version="2.8">
+        <description>
+          The Domain Identifier of the domain to which the interface is registered, denoted as DOD in {{bibref|G.9961}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MACCycleDuration" access="readWrite" dmr:version="2.8">
+        <description>
+          The MAC cycle duration, as specified in {{bibref|G.9961|Clause 8.4}}. It is represented as multiples of {{units}}. In the case of power line, writing to this parameter has no effect and it reads back as 0, which is a special value indicating that the MAC cycle is synchronized with 2 AC cycles as defined in {{bibref|G.9961|Clause 8.6.3.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="0"/>
+            <range minInclusive="10" maxInclusive="200"/>
+            <units value="0.5 msec"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SCDeviceId" access="readWrite" dmr:version="2.8">
+        <description>
+          The DEVICE_ID of the Security Controller selected by the Domain Master.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SCMACAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          The REGID of the Security Controller selected by the Domain Master.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReregistrationTimePeriod" access="readWrite" dmr:version="2.8">
+        <description>
+          The time interval for periodic re-registration, as specified in {{bibref|G.9961|Clause 8.8.5.8}}. It is represented as multiples of {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="5" maxInclusive="63"/>
+            <units value="2 seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TopologyPeriodicInterval" access="readWrite" dmr:version="2.8">
+        <description>
+          The time interval that a node sends out the periodic topology update using TM_NodeTopologyChange.ind message, as specified in {{bibref|G.9961|Clause 8.8.5.8.1}}. It is represented as multiples of {{units}}. The special value 0 represents an infinite interval (i.e., no periodic topology update).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+            <units value="0.1 sec"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MinSupportedBandplan" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates the value of the minimal bandplan capability for a node that is allowed to register to the domain.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxSupportedBandplan" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates the value of the minimal bandplan capability for a node that is allowed to register to the domain.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Interface.{i}.SCInfo." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object specifies management parameters pertaining to the Security Controller functionality (Security Controller function; see {{bibref|G.9961|Clause 9.2}}). The object exists only on G.hn interfaces that are currently the Security Controller, i.e. for which parameter {{param|#.IsSC}} is {{true}}.
+      </description>
+      <parameter name="ModesSupported" access="readOnly" dmr:version="2.8">
+        <description>
+          The security modes that the Security Controller can support.  Refer to {{bibref|G.9961|Clause 9.2}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="NN">
+              <description>
+                Node-to-Node
+              </description>
+            </enumeration>
+            <enumeration value="NMK">
+              <description>
+                Network Membership Key
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModeEnabled" access="readWrite" dmr:version="2.8">
+        <description>
+          The security mode in which the Security Controller is operating.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="ModesSupported" nullValue="Disabled"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MICSize" access="readWrite" dmr:version="2.8">
+        <description>
+          The selected MIC size used in the domain.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="4-byte MIC"/>
+            <enumeration value="8-byte MIC"/>
+            <enumeration value="16-byte MIC"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Location" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates whether the Security Controller is above the L1 reference point. It is set to {{true}} if the Security Controller is above the L1 reference point, and set to {{false}} otherwise.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Interface.{i}.SMMaskedBand.{i}." access="readWrite" numEntriesParameter="SMMaskedBandNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="32" dmr:version="2.8">
+      <description>
+        Specifies the list of masked bands to be applied to the G.hn interface.  This information is conveyed by the Domain Master in the SM descriptor as specified in {{bibref|G.9961|Table 8-77}}.
+        Instances of this object are expected to exist only on G.hn interfaces that are currently the Domain Master, i.e. for which parameter {{param|#.IsDM}} is {{true}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="BandNumber"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the {{object}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="BandNumber" access="readWrite" dmr:version="2.8">
+        <description>
+          The masked band number.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="StartSubCarrier" access="readWrite" dmr:version="2.8">
+        <description>
+          Index of the lowest frequency sub-carrier in the band to be masked as specified in {{bibref|G.9961|Table 8-79}}. This parameter is writable only on the interface which acts as the Domain Master.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="StopSubCarrier" access="readWrite" dmr:version="2.8">
+        <description>
+          Index of the highest frequency sub-carrier in the band to be masked as specified in Table 8-79 in {{bibref|G.9961}}. This parameter is writable only on the interface which acts as the Domain Master.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Diagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        The G.hn Diagnostics object.
+      </description>
+    </object>
+    <object name="Device.Ghn.Diagnostics.PHYThroughput." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <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>
+      <parameter name="DiagnosticsState" access="readWrite" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="DiagnosticsState">
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Canceled" optional="true"/>
+            <enumeration value="Complete" access="readOnly"/>
+            <enumeration value="Error" access="readOnly" optional="true"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.8">
+        <description>
+          The interface over which the test is to be performed.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".Ghn.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DiagnoseMACAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          The MAC address of the originating G.hn interface of the link that is being diagnosed.
+          Note: This MAC address might belong to another node of the domain.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="PHYThroughputResultNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Diagnostics.PHYThroughput.Result.{i}." access="readOnly" numEntriesParameter="PHYThroughputResultNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        PHY throughput diagnostics results.
+      </description>
+      <uniqueKey>
+        <parameter ref="DestinationMACAddress"/>
+      </uniqueKey>
+      <parameter name="DestinationMACAddress" access="readOnly" dmr:version="2.8">
+        <description>
+          MAC address of the destination node of the link being measured.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="LinkState" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates the state of the link between the G.hn Interface with MAC address {{param|#.DiagnoseMACAddress}} and the G.hn Interface with MAC address {{param|DestinationMACAddress}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Direct">
+              <description>
+                There is a direct link between G.hn Interface with MAC address {{param|#.DiagnoseMACAddress}} and G.hn Interface with MAC address {{param|DestinationMACAddress}}
+              </description>
+            </enumeration>
+            <enumeration value="NonDirect">
+              <description>
+                There is no direct link between G.hn Interface with MAC address {{param|#.DiagnoseMACAddress}} and G.hn Interface with MAC address {{param|DestinationMACAddress}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TxPhyRate" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          PHY data rate in transmit direction in the link between the G.hn Interface with MAC address {{param|#.DiagnoseMACAddress}} and the G.hn Interface with MAC address {{param|DestinationMACAddress}}. It is represented in {{units}} as defined in Note 1 to {{bibref|G.9961|Table 8-48}}.  To convert from the value in the table, divide by 32K (32768) and round down.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RxPhyRate" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          PHY data rate in receive direction in the link between the G.hn Interface with MAC address {{param|#.DiagnoseMACAddress}}  and the G.hn Interface with MAC address {{param|DestinationMACAddress}}. It is represented in {{units}} as defined in Note 1 to {{bibref|G.9961|Table 8-48}}.  To convert from the value in the table, divide by 32K (32768) and round down.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Diagnostics.PerformanceMonitoring." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <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>
+      <parameter name="DiagnosticsState" access="readWrite" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="DiagnosticsState">
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Canceled" optional="true"/>
+            <enumeration value="Complete" access="readOnly"/>
+            <enumeration value="Error" access="readOnly" optional="true"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.8">
+        <description>
+          The interface over which the test is to be performed.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".Ghn.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DiagnoseMACAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          The MAC address of the originating G.hn interface of the link that is being diagnosed.
+          Note: This MAC address might belong to another node of the domain.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="SampleInterval" access="readWrite" dmr:version="2.8">
+        <description>
+          Time in {{units}} between automatic collection of performance monitoring data. A value of zero disables automatic collection of data.
+          The node MAY impose a minimum sample interval, in which case an attempt to set a (non-zero) interval that is less than this minimum MUST set the interval to the minimum and MUST NOT be regarded as an error.
+          If SampleInterval is a simple fraction of a day, e.g. 900 (a quarter of an hour) or 3600 (an hour), the device MAY choose to align sample intervals with time of day, but is not required to do so.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SNRGroupLength" access="readWrite" dmr:version="2.8">
+        <description>
+          The number of sub-carriers in a group to be used for averaging SNR values when providing SNR information for a channel.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="1"/>
+            <range minInclusive="2" maxInclusive="2"/>
+            <range minInclusive="4" maxInclusive="4"/>
+            <range minInclusive="8" maxInclusive="8"/>
+            <range minInclusive="16" maxInclusive="16"/>
+            <range minInclusive="32" maxInclusive="32"/>
+            <range minInclusive="64" maxInclusive="64"/>
+            <range minInclusive="128" maxInclusive="128"/>
+            <range minInclusive="256" maxInclusive="256"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Diagnostics.PerformanceMonitoring.Nodes." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Per-node G.hn performance monitoring results.
+        When automatic collection is enabled, i.e. {{param|#.SampleInterval}} is non-zero, the "current" interval is defined by the most recent automatic sample and the most recent subsequent manual sample, if any.
+        When automatic collection is disabled, i.e. SampleInterval is zero, the "current" interval is defined by the three most recent manual  samples.
+        Note: Packets in statistics counters are Ethernet packets.
+      </description>
+      <parameter name="CurrentStart" access="readOnly" dmr:version="2.8">
+        <description>
+          Start time for the current interval.
+          When automatic collection is enabled, i.e. SampleInterval is non-zero, the current interval started at the most recent automatic sample.
+          When automatic collection is disabled, i.e. SampleInterval is zero, the current interval started two manual samples ago.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentEnd" access="readOnly" dmr:version="2.8">
+        <description>
+          End time for the current interval.
+          When automatic collection is enabled, i.e. SampleInterval is non-zero, the current interval ended at the most recent manual sample since the most recent automatic sample.  If there has been no such manual sample, the current interval is empty.
+          When automatic collection is disabled, i.e. SampleInterval is zero, the current interval ended at the most recent manual sample.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}} This is the number of G.hn nodes for which performance monitoring results were collected during the current sample interval.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Diagnostics.PerformanceMonitoring.Nodes.Node.{i}." access="readOnly" numEntriesParameter="NodeNumberOfEntries" minEntries="1" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        Per-node G.hn performance monitoring results during the current sample interval. Each table entry contains the results collected between the G.hn nodes with MAC addresses {{param|##.DiagnoseMACAddress}}) and {{param|DestinationMACAddress}}).
+        Note: Packet counters indicate the number of packets received between {{param|#.CurrentStart}} and {{param|#.CurrentEnd}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="DestinationMACAddress"/>
+      </uniqueKey>
+      <parameter name="DestinationMACAddress" access="readOnly" dmr:version="2.8">
+        <description>
+          MAC address of the destination node of the link being measured.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of MPDU bytes transmitted or retransmitted by the node through a physical medium (i.e., PMI defined in {{bibref|G.9960|Clause 5.2.1}}), which correspond to data LPDUs (i.e., data packets) and framing overhead (e.g., LFH, LPH, LPCS defined in {{bibref|G.9961|Clause 8.1}}). It does not include transmitted bytes contributed by management LPDUs (i.e., management packets).
+          Note: LPDUs in mixed LLC frame blocks are considered data LPDUs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of MPDU bytes received by the node through a physical medium, which correspond to data LPDUs and framing overhead. It does not include received bytes contributed by management LPDUs. It might include blocks with errors.
+          Note: LPDUs in mixed LLC frame blocks are considered data LPDUs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of APDUs requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point defined in {{bibref|G.9960|Clause 5.2.1}}) that were transmitted by the node through the physical medium. It does not include transmitted LCDUs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of APDUs delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) that were received by the node through the physical medium. It does not include received LCDUs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point defined in {{bibref|G.9960|Clause 5.2.1}}).  This parameter represents the total number of LCDUs requested for transmission by a management layer (i.e., outbound LCDUs generated in LLC defined in in {{bibref|G.9961|Clause 8.1.3}}) that were transmitted by the node through a physical medium) but could not be transmitted because of errors (e.g., APDUs containing CRC errors).
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received APDUs that contained errors preventing them from being delivered to a higher layer (i.e., inbound APDUs at the x1 reference point defined in {{bibref|G.9960|Clause 5.2.1}}). The possible causes of error are: incorrect CRC, incorrect MIC, incorrect MIC size, and incorrect size of packet.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) and which were addressed to a unicast address at this layer. It includes APDUs that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received APDUs that were delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) and which were addressed to a unicast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) but chosen to be discarded even though no errors had been detected to prevent their being transmitted (e.g., buffer overflow).
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received APDUs that were chosen to be discarded even though no errors had been detected to prevent their being delivered.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) and which were addressed to a multicast address at this layer. It includes APDUs that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received APDUs that were delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) and which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) and which were addressed to a broadcast address at this layer. It includes APDUs that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received APDUs that were delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) and which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of APDUs received by the management that were discarded because of an unknown or unsupported protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="MgmtBytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of MPDU bytes transmitted by the node through a physical medium, which correspond to management LPDUs and framing overhead.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MgmtBytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of MPDU bytes received by the node through a physical medium, which correspond to management LPDUs and framing overhead.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MgmtPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of LCDUs requested for transmission by a management layer (i.e., outbound LCDUs generated in LLC defined in {{bibref|G.9961|Clause 8.1.3}}) that were transmitted by the node through a physical medium.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MgmtPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of LCDUs delivered to a management layer (i.e., inbound LCDUs) that were received by the node through a physical medium.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BlocksSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of LPDUs that were transmitted by the node through a physical medium, regardless of new or retransmitted LPDUs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BlocksReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of LPDUs that were received by the node through a physical medium, with or without errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BlocksResent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of LPDUs that were retransmitted.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="BlocksErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received LPDUs that contained errors.
+          Note the following relationships hold:
+          * PacketsSent + ErrorsSent + DiscardPacketsSent = UnicastPacketsSent + MulticastPacketsSent + BroadcastPacketsSent.
+          * PacketsReceived = UnicastPacketsReceived + MulticastPacketsReceived + BroadcastPacketsReceived.
+          * Retransmission rate = BlocksResent / BlocksSent.
+          * Block error rate = BlocksErrorReceived / BlocksReceived.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Diagnostics.PerformanceMonitoring.Channels." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Per-channel G.hn performance monitoring results.
+        Note: channels are unidirectional.
+      </description>
+      <parameter name="TimeStamp" access="readOnly" dmr:version="2.8">
+        <description>
+          Time at which channel data was last collected.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ChannelNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Diagnostics.PerformanceMonitoring.Channels.Channel.{i}." access="readOnly" numEntriesParameter="ChannelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        Per-channel G.hn performance monitoring results during the current sample interval. Each table entry contains the results collected from the channel between a G.hn interface (as indicated by {{param|##.DiagnoseMACAddress}}) and a G.hn interface indicated by {{param|DestinationMACAddress}})
+      </description>
+      <uniqueKey>
+        <parameter ref="DestinationMACAddress"/>
+      </uniqueKey>
+      <parameter name="DestinationMACAddress" access="readOnly" dmr:version="2.8">
+        <description>
+          MAC address of the destination node of the link being measured.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="SNR" access="readOnly" dmr:version="2.8">
+        <description>
+          The result of an SNR test performed over the channel. It is formatted as a comma-separated list of N/M unsigned integers that represents the result of Signal-to-Noise-Ratio measurement averaging in groups of M subcarriers. The number N depends on the bandplan used by the node and corresponds to the OFDM control parameter N of each medium as defined in {{bibref|G.9964}}. The number M corresponds to the parameter {{param|##.SNRGroupLength}}.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <units value="0.1 dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HomePlug." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        HomePlug object that contains the {{object|Interface}} table. The HomePlug industry standard {{bibref|HPAV1.1}} defines peer to peer communication over powerline medium.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HomePlug.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        HomePlug interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Each table entry models the PHY and MAC levels of a HomePlug interface {{bibref|HPAV1.1}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC Address of the interface.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="LogicalNetwork" access="readWrite" dmr:version="2.0">
+        <description>
+          The textual name of the HomePlug Logical Network.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the HomePlug version of the interface. This element SHOULD be in the form of dot-delimited integers, where each successive integer represents a more minor category of variation. For example:
+          : "1.0"
+          : "1.1"
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="16"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          The firmware version of the interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ForceCCo" access="readWrite" dmr:version="2.0">
+        <description>
+          Central Coordinator (CCo) selection mode.
+          If {{false}}, CCo selection is automatic. If {{true}}, the local HomePlug interface is forced to be CCo and all other devices in the Logical Network MUST be set to automatic CCo selection.
+          Typically {{param}} is set to automatic CCo selection ({{false}}).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkPassword" access="readWrite" dmr:version="2.0">
+        <description>
+          The network password of the device. This is a human readable ASCII string that is hashed per the HomePlug specification to generate the Network Membership Key (NMK). Note that care needs to be taken when setting this parameter as it might prohibit communication with other adapters or equipment connected via the powerline network.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="OtherNetworksPresent" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates whether any other HomePlug networks are currently visible via this interface. Examples of valid list items include, but are not limited to:
+          : "HomePlugAV"
+          : "HomePlug1.0"
+          : "Other"
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="64"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum PHY bit rate supported by this interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HomePlug.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MPDUTxAck" access="readOnly" dmr:version="2.0">
+        <description>
+          HomePlug-specific statistic. The Number of MAC Protocol Data Units (MPDUs) Transmitted and Acknowledged.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MPDUTxCol" access="readOnly" dmr:version="2.0">
+        <description>
+          HomePlug-specific statistic. The Number of MAC Protocol Data Units (MPDUs) Transmitted and Collided
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MPDUTxFailed" access="readOnly" dmr:version="2.0">
+        <description>
+          HomePlug-specific statistic. The Number of MAC Protocol Data Units (MPDUs) Transmitted and Failed
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MPDURxAck" access="readOnly" dmr:version="2.0">
+        <description>
+          HomePlug-specific statistic. The Number of MAC Protocol Data Units (MPDUs) Received and Acknowledged
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MPDURxFailed" access="readOnly" dmr:version="2.0">
+        <description>
+          HomePlug-specific statistic. The Number of MAC Protocol Data Units (MPDUs) Received and Failed
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HomePlug.Interface.{i}.AssociatedDevice.{i}." access="readOnly" numEntriesParameter="AssociatedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This table contains information about other HomePlug devices connected to this HomePlug interface.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          MAC address of remote HomePlug device. It is used to uniquely identify and easily correlate with the connected remote HomePlug device.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="TxPhyRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The PHY transmit Rate (expressed in {{units}}) to this remote device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RxPhyRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The PHY receive Rate (expressed in {{units}}) from this remote device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SNRPerTone" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate Signal to Noise Ratio (SNR) per tone from this remote device (expressed in {{units}}).
+        </description>
+        <syntax>
+          <list maxItems="1155"/>
+          <unsignedInt>
+            <units value="0.1dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AvgAttenuation" access="readOnly" dmr:version="2.0">
+        <description>
+          Average attenuation from this remote device (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="0.1dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="EndStationMACs" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items represent MAC addresses of end stations bridged by the remote HomePlug device.
+          For example: "11:22:33:AA:BB:CC, 22:33:44:DD:EE:66"
+        </description>
+        <syntax>
+          <list maxItems="16"/>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether or not this device is currently present in the HomePlug network.
+          The ability to list inactive nodes is OPTIONAL. If the CPE includes inactive nodes in this table, {{param}} MUST be set to {{false}} for each inactive node. The length of time an inactive node remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPA." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Universal Powerline Association {{bibref|UPA-PLC}}. This object contains the {{object|Interface}} and {{object|Diagnostics}} objects.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPA.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        UPA interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Each table entry models the PHY and MAC levels of a UPA interface {{bibref|UPA-PLC}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC Address of the interface.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          This interface's firmware version.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum PHY bit rate supported by this interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NodeType" access="readWrite" dmr:version="2.0">
+        <description>
+          Type of UPA device role. It can be Fixed Access Point (master) or End Point (slave) of the PLC network.  {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AP"/>
+            <enumeration value="EP"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LogicalNetwork" access="readWrite" dmr:version="2.0">
+        <description>
+          The name (network ID) of the logical PLC network in which the local interface is a member (human readable string).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="20"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EncryptionMethod" access="readWrite" dmr:version="2.0">
+        <description>
+          Encryption Method used by UPA device. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="6"/>
+            <enumeration value="None"/>
+            <enumeration value="DES"/>
+            <enumeration value="3DES"/>
+            <enumeration value="AES128"/>
+            <enumeration value="AES256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EncryptionKey" access="readWrite" dmr:version="2.0">
+        <description>
+          Encryption key for secure PLC communications.
+          This a human readable string used by the system to generate the encryption key to encrypt communications in powerline. It takes non extended ASCII characters (i.e. printable 7-bit ASCII character codes 32-126, which includes SPACE but excludes TAB, LF and CR). For example: bvjPekZiYUf9kjNKJASkgJ09adfoP01Fjvgd
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="36"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PowerBackoffEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          Power back-off management feature status in the UPA device. Boolean can be {{true}} for "enabled" and {{false}}  for "disabled".
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PowerBackoffMechanismActive" access="readOnly" dmr:version="2.0">
+        <description>
+          Show if power back-off mechanism is active at that time in the UPA device. Boolean can be {{true}} for "active"  and {{false}} for "not active".
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EstApplicationThroughput" access="readOnly" dmr:version="2.0">
+        <description>
+          The estimated application throughput (expressed in {{units}}), received from the PLC link. This value can be  used to indicate link quality.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ActiveNotchEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the {{object|ActiveNotch}} table for this interface.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ActiveNotchNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BridgeForNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPA.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPA.Interface.{i}.AssociatedDevice.{i}." access="readOnly" numEntriesParameter="AssociatedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This table contains information about PLC connections running between this UPA interface and other UPA devices.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          Remote UPA device MAC address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readOnly" dmr:version="2.0">
+        <description>
+          The PLC port number.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LogicalNetwork" access="readOnly" dmr:version="2.0">
+        <description>
+          The name of the logical PLC network (human readable string).
+          In the case where the associated device belongs to a different powerline network than the UPA interface, the actual network identifier of the neighboring network is not shown in {{param}}. Rather, only a generic string, e.g. "Network 1", "Network 2", etc is stored here due to security/privacy implications.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="20"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PhyTxThroughput" access="readOnly" dmr:version="2.0">
+        <description>
+          Physical transmission throughput (in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PhyRxThroughput" access="readOnly" dmr:version="2.0">
+        <description>
+          Physical reception throughput (in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RealPhyRxThroughput" access="readOnly" dmr:version="2.0">
+        <description>
+          Real Physical reception throughput (in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="EstimatedPLR" access="readOnly" dmr:version="2.0">
+        <description>
+          Estimated PDU Loss Rate measurement between two devices (i.e. estimated {{units}} of MPDUs that have been  received with errors).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+            <units value="percent"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MeanEstimatedAtt" access="readOnly" dmr:version="2.0">
+        <description>
+          Mean estimated attenuation (i.e. channel loss between the local interface and the remote device). It is measured  in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SmartRouteIntermediatePLCMAC" access="readOnly" dmr:version="2.0">
+        <description>
+          Intermediate UPA adapter MAC address of the device that is acting as a relay to increase coverage in mesh scenarios. This is the MAC address of a third UPA device, with which the UPA interface is doing smart repeating in order to transmit data to the associated {{param|MACAddress}} UPA device. {{param}} will be empty when {{param|DirectRoute}} is {{true}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="DirectRoute" access="readOnly" dmr:version="2.0">
+        <description>
+          Route status, where {{true}} indicates ''direct'' and {{false}} indicates ''indirect''.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether or not this node is currently present in the UPA network.
+          The ability to list inactive nodes is OPTIONAL.  If the CPE includes inactive nodes in this table, {{param}} MUST be set to {{false}}  for each inactive node.  The length of time an inactive node remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPA.Interface.{i}.ActiveNotch.{i}." access="readWrite" numEntriesParameter="ActiveNotchNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object contains the list of active notches of the UPA interface.
+        A UPA device can have notches in its spectrum, where no power is transmitted in a given part of the spectrum. These notches are typically located in amateur radio bands, to avoid interference.
+        Note: All {{object}} entries can be enabled/disabled as a group using the {{param|#.ActiveNotchEnable}} parameter.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the active notch entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="StartFreq" access="readWrite" dmr:version="2.0">
+        <description>
+          The initial frequency (in {{units}}) of a notch enabled in the spectrum of the local interface.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="kHz"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="StopFreq" access="readWrite" dmr:version="2.0">
+        <description>
+          The final frequency (in {{units}}) of a notch enabled in the spectrum of the local interface.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="kHz"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Depth" access="readWrite" dmr:version="2.0">
+        <description>
+          The depth (in {{units}}) of a notch enabled in the spectrum of the local interface.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPA.Interface.{i}.BridgeFor.{i}." access="readOnly" numEntriesParameter="BridgeForNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object represents the bridge table of the UPA interface. Each instance is a bridge table entry.
+        It shows the MAC addresses of the remote UPA devices with their associated port number, and the MAC addresses of the end-devices (PCs, STBs, routers, etc) connected to Ethernet port of the powerline adapters with their associated logical port. In this way the system identifies to which UPA device an external device is connected to.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          MAC address of the device.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readOnly" dmr:version="2.0">
+        <description>
+          Internal bridge associated port.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPA.Diagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The UPA Diagnostics object.
+      </description>
+    </object>
+    <object name="Device.UPA.Diagnostics.InterfaceMeasurement." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object 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>
+      <parameter name="DiagnosticsState" access="readWrite" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="DiagnosticsState">
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Canceled" optional="true"/>
+            <enumeration value="Complete" access="readOnly"/>
+            <enumeration value="Error" access="readOnly" optional="true"/>
+            <enumeration value="Error_InvalidPort" access="readOnly"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates the type of port measurement test to be carried out.  {{enum}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="SNR">
+              <description>
+                Signal-to-Noise-Ratio
+              </description>
+            </enumeration>
+            <enumeration value="CFR">
+              <description>
+                Channel Frequency Response
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}  This is the local UPA interface from which the test is to be performed.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetParent=".UPA.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.0">
+        <description>
+          PLC port being measured. This identifies which PLC connection to measure between the local interface (indicated by {{param|Interface}}) and the remote device (implied by {{param}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Measurements" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Result of Signal-to-Noise-Ratio measurement (if {{param|Type}} is {{enum|SNR|Type}}) or Channel Frequency Response measurement (if {{param|Type}} is {{enum|CFR|Type}}).
+          List items indicate measurements per carrier for a PLC port (expressed in {{units}}).
+        </description>
+        <syntax>
+          <list maxItems="1536"/>
+          <unsignedInt>
+            <units value="0.1dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RxGain" access="readOnly" dmr:version="2.0">
+        <description>
+          Reception gain of the adapter (expresssed in {{units}}).
+        </description>
+        <syntax>
+          <int>
+            <units value="dB"/>
+          </int>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The WiFi object is based on the WiFi Alliance 802.11 specifications ({{bibref|802.11-2007}}). It defines interface objects ({{object|Radio}} and {{object|SSID}}), and application objects ({{object|AccessPoint}} and {{object|EndPoint}}).
+      </description>
+      <parameter name="RadioNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SSIDNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AccessPointNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="EndPointNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ResetCounter" access="readOnly" dmr:version="2.12">
+        <description>
+          This parameter counts the number of WiFi host or driver resets since the last device reset. This parameter is reset to zero after the device resets, and increments with each successive WiFi host or driver reset.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="Reset" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter represents a request to reset or reboot the WiFi sub-system without resetting or rebooting the device.
+        </description>
+        <syntax command="true">
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.Radio.{i}." access="readOnly" numEntriesParameter="RadioNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        This object models an 802.11 wireless radio on a device (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+        If the device can establish more than one connection simultaneously (e.g. a dual radio device), a separate {{object}} instance MUST be used for each physical radio of the device. See {{bibref|TR-181i2|Appendix III.1}} for additional information.
+        Note: A dual-band single-radio device (e.g. an 802.11a/b/g radio) can be configured to operate at 2.4 or 5 GHz frequency bands, but only a single frequency band is used to transmit/receive at a given time. Therefore, a single {{object}} instance is used even for a dual-band radio.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the radio.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the radio (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the radio as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the radio entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+          This parameter is DEPRECATED because it gives a wrong indication for multiple SSIDs. Use the {{param|#.SSID.{i}.Upstream}} parameter instead.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum PHY bit rate supported by this interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedFrequencyBands" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate the frequency bands at which the radio can operate.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="2.4GHz"/>
+            <enumeration value="5GHz"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="OperatingFrequencyBand" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates the frequency band at which the radio is operating.
+          If the radio supports multiple bands, and {{param}} is changed, then all parameters whose value is not valid for the new frequency band (e.g. {{param|Channel}}) MUST be set to a valid value (according to some CPE vendor-specific behavior).
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="SupportedFrequencyBands"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedStandards" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate which IEEE 802.11 standards this {{object}} instance can support simultaneously, in the frequency band specified by {{param|OperatingFrequencyBand}}.  {{enum}}
+          Each value indicates support for the indicated standard.
+          If {{param|OperatingFrequencyBand}} is set to {{enum|2.4GHz|OperatingFrequencyBand}}, only values {{enum|b}}, {{enum|g}}, {{enum|n}} are allowed.
+          If {{param|OperatingFrequencyBand}} is set to {{enum|5GHz|OperatingFrequencyBand}}, only values {{enum|a}}, {{enum|n}}, {{enum|ac}} are allowed.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="a">
+              <description>
+                {{bibref|802.11a-1999}}
+              </description>
+            </enumeration>
+            <enumeration value="b">
+              <description>
+                {{bibref|802.11b-1999}}
+              </description>
+            </enumeration>
+            <enumeration value="g">
+              <description>
+                {{bibref|802.11g-2003}}
+              </description>
+            </enumeration>
+            <enumeration value="n">
+              <description>
+                {{bibref|802.11n-2009}}
+              </description>
+            </enumeration>
+            <enumeration value="ac">
+              <description>
+                {{bibref|802.11ac-2013}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="OperatingStandards" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate which IEEE 802.11 standard this {{object}} instance is configured for.
+          Each value indicates support for the indicated standard.
+          If {{param|OperatingFrequencyBand}} is set to {{enum|2.4GHz|OperatingFrequencyBand}}, only values {{enum|b}}, {{enum|g}}, {{enum|n}} are allowed.
+          If {{param|OperatingFrequencyBand}} is set to {{enum|5GHz|OperatingFrequencyBand}}, only values {{enum|a}}, {{enum|n}}, {{enum|ac}} are allowed.
+          For example, a value of "g,b" (or "b,g" - order is not important) means that the 802.11g standard {{bibref|802.11g-2003}} is used with a backwards-compatible mode for 802.11b {{bibref|802.11b-1999}}. A value of "g" means that only the 802.11g standard can be used.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam="SupportedStandards"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PossibleChannels" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items represent possible radio channels for the wireless standard (a, b, g, n) and the regulatory domain.
+          Ranges in the form "n-m" are permitted.
+          For example, for 802.11b and North America, would be "1-11".
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ChannelsInUse" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent channels that the radio determines to be currently in use (including any that it is using itself).
+          Ranges in the form "n-m" are permitted.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Channel" access="readWrite" dmr:version="2.0">
+        <description>
+          The current radio channel used by the connection. To request automatic channel selection, set {{param|AutoChannelEnable}} to {{true}}.
+          Whenever {{param|AutoChannelEnable}} is {{true}}, the value of the {{param}} parameter MUST be the channel selected by the automatic channel selection procedure.
+          Note: Valid {{param}} values depend on the {{param|OperatingFrequencyBand}} and {{param|RegulatoryDomain}} values specified.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AutoChannelSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether automatic channel selection is supported by this radio. If {{false}}, then {{param|AutoChannelEnable}} MUST be {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoChannelEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enable or disable automatic channel selection.
+          Set to {{false}} to disable the automatic channel selection procedure, in which case the currently selected channel remains selected.
+          Set to {{true}} to enable the automatic channel selection procedure. This procedure MUST automatically select the channel, and MAY also change it subsequently.
+          {{param}} MUST automatically change to {{false}} whenever the channel is manually selected, i.e. whenever the {{param|Channel}} parameter is written.
+          Whenever {{param}} is {{true}}, the value of the {{param|Channel}} parameter MUST be the channel selected by the automatic channel selection procedure.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoChannelRefreshPeriod" access="readWrite" dmr:version="2.0">
+        <description>
+          The time period in {{units}} between two consecutive automatic channel selections. A value of 0 means that the automatic channel selection is done only at boot time.
+          This parameter is significant only if {{param|AutoChannelEnable}} is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ChannelLastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The accumulated time in {{units}} since the current {{param|Channel}} came into use.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ChannelLastSelectionReason" access="readOnly" dmr:version="2.12">
+        <description>
+          The cause of the last channel selection.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Manual">
+              <description>
+                Manual selection of the {{param|Channel}}.
+              </description>
+            </enumeration>
+            <enumeration value="Auto_Startup">
+              <description>
+                Automatic channel selection procedure launched at radio startup.
+              </description>
+            </enumeration>
+            <enumeration value="Auto_User">
+              <description>
+                Automatic channel selection procedure triggered by the user (e.g. via a GUI).
+              </description>
+            </enumeration>
+            <enumeration value="Auto_Refresh">
+              <description>
+                Automatic channel selection procedure triggered by the {{param|AutoChannelRefreshPeriod}} timer.
+              </description>
+            </enumeration>
+            <enumeration value="Auto_Dynamic">
+              <description>
+                Automatic channel selection procedure dynamically triggered to adjust to environmental interference.
+              </description>
+            </enumeration>
+            <enumeration value="Auto_DFS">
+              <description>
+                Automatic channel selection procedure triggered by Dynamic Frequency Selection (DFS) {{bibref|ETSIBRAN}}.
+              </description>
+            </enumeration>
+            <enumeration value="Unknown"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxSupportedSSIDs" access="readOnly" dmr:version="2.12">
+        <description>
+          Maximum number of SSIDs supported on this radio.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxSupportedAssociations" access="readOnly" dmr:version="2.12">
+        <description>
+          Maximum number of associated devices supported.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.12">
+        <description>
+          This radio's WiFi firmware version.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedOperatingChannelBandwidths" access="readOnly" dmr:version="2.12">
+        <description>
+          {{list}}  These are the valid writable values for {{param|OperatingChannelBandwidth}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="20MHz"/>
+            <enumeration value="40MHz">
+              <description>
+                wide mode
+              </description>
+            </enumeration>
+            <enumeration value="80MHz">
+              <description>
+                802.11ac only
+              </description>
+            </enumeration>
+            <enumeration value="160MHz">
+              <description>
+                802.11ac only
+              </description>
+            </enumeration>
+            <enumeration value="Auto"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="OperatingChannelBandwidth" access="readWrite" dmr:version="2.0">
+        <description>
+          The preferred channel bandwidth to be used (applicable to 802.11n and 802.11ac specifications only).
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="SupportedOperatingChannelBandwidths"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentOperatingChannelBandwidth" access="readOnly" dmr:version="2.11">
+        <description>
+          The channel bandwidth currently in use.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="20MHz"/>
+            <enumeration value="40MHz"/>
+            <enumeration value="80MHz"/>
+            <enumeration value="160MHz"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ExtensionChannel" access="readWrite" dmr:version="2.0">
+        <description>
+          The secondary extension channel position, applicable when operating in wide channel mode (i.e. when {{param|OperatingChannelBandwidth}} is set to {{enum|40MHz|OperatingChannelBandwidth}} or {{enum|Auto|OperatingChannelBandwidth}}).
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AboveControlChannel"/>
+            <enumeration value="BelowControlChannel"/>
+            <enumeration value="Auto"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GuardInterval" access="readWrite" dmr:version="2.0">
+        <description>
+          The guard interval value between OFDM symbols (applicable to 802.11n and 802.11ac specifications only).
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="400nsec"/>
+            <enumeration value="800nsec"/>
+            <enumeration value="Auto"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MCS" access="readWrite" dmr:version="2.0">
+        <description>
+          The Modulation Coding Scheme index (applicable to 802.11n and 802.11ac specifications only). Values from 0 to 15 MUST be supported ({{bibref|802.11n-2009}}). Values from 0 to 9 MUST be supported for {{bibref|802.11ac-2013}}.  A value of -1 indicates automatic selection of the MCS index.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="15"/>
+            <range minInclusive="16" maxInclusive="31"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="TransmitPowerSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items represent supported transmit power levels as {{units}} of full power. For example, "0,25,50,75,100".
+          A -1 item indicates auto mode (automatic decision by CPE). Auto mode allows the ''Radio'' to adjust transmit power accordingly. For example, this can be useful for power-save modes such as EU-CoC, where the ''Radio'' can adjust power according to activity in the CPE.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="64"/>
+          </list>
+          <int>
+            <range minInclusive="-1" maxInclusive="100"/>
+            <units value="percentage"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="TransmitPower" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates the current transmit power level as a {{units}} of full power. The value MUST be one of the values reported by the {{param|TransmitPowerSupported}} parameter. A value of -1 indicates auto mode (automatic decision by CPE).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="100"/>
+            <units value="percentage"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="IEEE80211hSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether IEEE 802.11h {{bibref|802.11h-2003}} functionality is supported by this radio. The value can be {{true}} only if the 802.11a or the 802.11n@5GHz standard is supported (i.e. {{param|SupportedFrequencyBands}} includes {{enum|5GHz|SupportedFrequencyBands}} and {{param|SupportedStandards}} includes {{enum|a|SupportedStandards}} and/or {{enum|n|SupportedStandards}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IEEE80211hEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates whether IEEE 802.11h functionality is enabled on this radio. The value can be {{true}} only if the 802.11a or the 802.11n@5GHz standard is supported and enabled (i.e. {{param|OperatingFrequencyBand}} is {{enum|5GHz|OperatingFrequencyBand}} and {{param|OperatingStandards}} includes {{enum|a|OperatingStandards}} and/or {{enum|n|OperatingStandards}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RegulatoryDomain" access="readWrite" dmr:version="2.0">
+        <description>
+          The 802.11d Regulatory Domain. First two octets are {{bibref|ISO3166-1}} two-character country code. The third octet is either " " (all environments), "O" (outside) or "I" (inside).
+        </description>
+        <syntax>
+          <string>
+            <size minLength="3" maxLength="3"/>
+            <pattern value="[A-Z][A-Z][ OI]"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RetryLimit" access="readWrite" dmr:version="2.8">
+        <description>
+          The maximum number of retransmissions of a short packet i.e. a packet that is no longer than the {{param|RTSThreshold}}. This corresponds to IEEE 802.11 parameter ''dot11ShortRetryLimit''  {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CCARequest" access="readWrite" dmr:version="2.8">
+        <description>
+          A request for the clear channel assessment (CCA) report in the format specified in {{bibref|802.11-2012|Clause 8.4.2.23.3}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="11" maxLength="11"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="CCAReport" access="readOnly" dmr:version="2.8">
+        <description>
+          The clear channel assessment (CCA) report in the format specified in {{bibref|802.11-2012|Clause 8.4.2.24.3}}.
+          When read, the value of this parameter MUST correspond to {{param|CCARequest}}.  How this is achieved is a local matter to the CPE.
+          If this parameter is read before a CCARequest has been issued, then its value is {{empty}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="12" maxLength="12"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="RPIHistogramRequest" access="readWrite" dmr:version="2.8">
+        <description>
+          A request for a received power indicator (RPI) histogram in the format specified in {{bibref|802.11-2012|Clause 8.4.2.23.4}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="11" maxLength="11"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="RPIHistogramReport" access="readOnly" dmr:version="2.8">
+        <description>
+          Received power indicator (RPI) histogram report in the format specified in {{bibref|802.11-2012|Clause 8.4.2.24.4}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="19" maxLength="19"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="FragmentationThreshold" access="readWrite" dmr:version="2.8">
+        <description>
+          This specifies the current maximum size, in {{units}}, of the MPDU that can be delivered to the PHY. This parameter is based on ''dot11FragmentationThreshold'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="octets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RTSThreshold" access="readWrite" dmr:version="2.8">
+        <description>
+          This indicates the number of {{units}} in an MPDU, below which an RTS/CTS handshake is not performed. This parameter is based on ''dot11RTSThreshold'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="octets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LongRetryLimit" access="readWrite" dmr:version="2.8">
+        <description>
+          This indicates the maximum number of transmission attempts of a frame, the length of which is greater than {{param|RTSThreshold}}, that will be made before a failure condition is indicated. This parameter is based on ''dot11LongRetryLimit'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BeaconPeriod" access="readWrite" dmr:version="2.8">
+        <description>
+          Time interval between transmitting beacons (expressed in {{units}}). This parameter is based on ''dot11BeaconPeriod'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DTIMPeriod" access="readWrite" dmr:version="2.8">
+        <description>
+          This specifies the number of beacon intervals that elapse between transmission of Beacon frames containing a TIM element whose DTIM Count field is 0. This parameter is based on ''dot11DTIMPeriod'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketAggregationEnable" access="readWrite" dmr:version="2.8">
+        <description>
+          This determines whether or not packet aggregation (commonly called "frame aggregation") is enabled. This applies only to 802.11n.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PreambleType" access="readWrite" dmr:version="2.8">
+        <description>
+          The type of preamble. Longer preambles (more overhead) are needed by 802.11g to coexist with legacy systems 802.11 and 802.11b.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="short"/>
+            <enumeration value="long"/>
+            <enumeration value="auto"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BasicDataTransmitRates" access="readWrite" dmr:version="2.8">
+        <description>
+          {{list}} The set of data rates, in ''Mbps'', that have to be supported by all stations that desire to join this BSS. The stations have to be able to receive and transmit at each of the data rates listed in {{param}}. For example, a value of "1,2", indicates that stations support 1 Mbps and 2 Mbps. Most control packets use a data rate in {{param}}.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="OperationalDataTransmitRates" access="readWrite" dmr:version="2.8">
+        <description>
+          {{list}} Maximum access point data transmit rates in ''Mbps'' for unicast frames (a superset of {{param|BasicDataTransmitRates}}). Given the value of {{param|BasicDataTransmitRates}} from the example above, {{param}} might be "1,2,5.5,11", indicating that unicast frames can additionally be transmitted at 5.5 Mbps and 11 Mbps.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedDataTransmitRates" access="readOnly" dmr:version="2.8">
+        <description>
+          {{list}} Data transmit rates in ''Mbps'' for unicast frames at which the access point will permit a station to connect (a subset of {{param|OperationalDataTransmitRates}}). Given the values of {{param|BasicDataTransmitRates}} and {{param|OperationalDataTransmitRates}} from the examples above, {{param}} might be "1,2,5.5", indicating that the AP will only permit connections at 1 Mbps, 2 Mbps and 5.5 Mbps, even though it could theoretically accept connections at 11 Mbps.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.Radio.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface. Packet counters here count 802.11 WiFi frames. See {{bibref|TR-181i2a5|Appendix III}} for further details. The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2a5|Section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PLCPErrorCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of packets that were received with a detected Physical Layer Convergence Protocol (PLCP) header error.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FCSErrorCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of packets that were received with a detected FCS error. This parameter is based on dot11FCSErrorCount from {{bibref|802.11-2012|Annex C}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="InvalidMACCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of packets that were received with a detected invalid MAC header error.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsOtherReceived" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of packets that were received, but which were destined for a MAC address that is not associated with this interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Noise" access="readOnly" dmr:version="2.8">
+        <description>
+          An indicator of average noise strength received at this radio, measured in {{units}}. This measurement of non-IEEE 802.11 noise power is made by sampling the channel when virtual carrier sense indicates idle and this radio is neither transmitting nor receiving a frame.
+        </description>
+        <syntax>
+          <int>
+            <units value="dBm"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="TotalChannelChangeCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of times that the {{param|#.Channel}} has changed since the {{object|.WiFi.Radio}} entered its current operating state.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ManualChannelChangeCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The number of times that the {{param|#.Channel}} has changed due to manual channel selection since the {{object|.WiFi.Radio}} entered its current operating state.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoStartupChannelChangeCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The number of times that the {{param|#.Channel}} has changed due to automatic channel selection procedure launched at radio startup since the {{object|.WiFi.Radio}} entered its current operating state.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoUserChannelChangeCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The number of times that the {{param|#.Channel}} has changed due to automatic channel selection procedure triggered by the user (e.g. via a GUI) since the {{object|.WiFi.Radio}} entered its current operating state.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoRefreshChannelChangeCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The number of times that the {{param|#.Channel}} has changed due to automatic channel selection procedure triggered by the {{param|#.AutoChannelRefreshPeriod}} timer since the {{object|.WiFi.Radio}} entered its current operating state.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoDynamicChannelChangeCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The number of times that the {{param|#.Channel}} has changed due to automatic channel selection procedure dynamically triggered to adjust to environmental interference since the {{object|.WiFi.Radio}} entered its current operating state.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoDFSChannelChangeCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The number of times that the {{param|#.Channel}} has changed due to automatic channel selection procedure triggered by DFS {{bibref|ETSIBRAN}} since the {{object|.WiFi.Radio}} entered its current operating state.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.NeighboringWiFiDiagnostic." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        This object defines access to other WiFi SSIDs that this device is able to receive.
+      </description>
+      <parameter name="DiagnosticsState" access="readWrite" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="DiagnosticsState">
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Canceled" optional="true"/>
+            <enumeration value="Complete" access="readOnly"/>
+            <enumeration value="Error" access="readOnly" optional="true"/>
+            <enumeration value="Completed" access="readOnly" status="deprecated"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ResultNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.NeighboringWiFiDiagnostic.Result.{i}." access="readOnly" numEntriesParameter="ResultNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        Neighboring SSID table. This table models the other WiFi SSIDs that this device is able to receive.
+      </description>
+      <uniqueKey>
+        <parameter ref="BSSID"/>
+      </uniqueKey>
+      <parameter name="Radio" access="readOnly" dmr:version="2.7">
+        <description>
+          The Radio that detected the neighboring WiFi SSID.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="Device.WiFi.Radio." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SSID" access="readOnly" dmr:version="2.7">
+        <description>
+          The current service set identifier in use by the neighboring WiFi SSID. The value MAY be empty for hidden SSIDs.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BSSID" access="readOnly" dmr:version="2.7">
+        <description>
+          The BSSID used for the neighboring WiFi SSID.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Mode" access="readOnly" dmr:version="2.7">
+        <description>
+          The mode the neighboring WiFi radio is operating in.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AdHoc"/>
+            <enumeration value="Infrastructure"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Channel" access="readOnly" dmr:version="2.7">
+        <description>
+          The current radio channel used by the neighboring WiFi radio.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SignalStrength" access="readOnly" dmr:version="2.7">
+        <description>
+          An indicator of radio signal strength (RSSI) of the neighboring WiFi radio measured in {{units}}, as an average of the last 100 packets received.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-200" maxInclusive="0"/>
+            <units value="dBm"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="SecurityModeEnabled" access="readOnly" dmr:version="2.7">
+        <description>
+          The type of encryption the neighboring WiFi SSID advertises.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="WEP"/>
+            <enumeration value="WPA"/>
+            <enumeration value="WPA2"/>
+            <enumeration value="WPA-WPA2"/>
+            <enumeration value="WPA-Enterprise"/>
+            <enumeration value="WPA2-Enterprise"/>
+            <enumeration value="WPA-WPA2-Enterprise"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EncryptionMode" access="readOnly" dmr:version="2.7">
+        <description>
+          The type of encryption the neighboring WiFi SSID advertises.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="TKIP"/>
+            <enumeration value="AES"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="OperatingFrequencyBand" access="readOnly" dmr:version="2.7">
+        <description>
+          Indicates the frequency band at which the radio this SSID instance is operating.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="2.4GHz"/>
+            <enumeration value="5GHz"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedStandards" access="readOnly" dmr:version="2.7">
+        <description>
+          {{list}} List items indicate which IEEE 802.11 standards this {{object}} instance can support simultaneously, in the frequency band specified by {{param|OperatingFrequencyBand}}. {{enum}}
+          Each value indicates support for the indicated standard.
+          If {{param|OperatingFrequencyBand}} is set to {{enum|2.4GHz|OperatingFrequencyBand}}, only values {{enum|b}}, {{enum|g}}, {{enum|n}} are allowed.
+          If {{param|OperatingFrequencyBand}} is set to {{enum|5GHz|OperatingFrequencyBand}}, only values {{enum|a}}, {{enum|n}}, {{enum|ac}} are allowed.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="a">
+              <description>
+                {{bibref|802.11a-1999}}
+              </description>
+            </enumeration>
+            <enumeration value="b">
+              <description>
+                {{bibref|802.11b-1999}}
+              </description>
+            </enumeration>
+            <enumeration value="g">
+              <description>
+                {{bibref|802.11g-2003}}
+              </description>
+            </enumeration>
+            <enumeration value="n">
+              <description>
+                {{bibref|802.11n-2009}}
+              </description>
+            </enumeration>
+            <enumeration value="ac">
+              <description>
+                {{bibref|802.11ac-2013}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="OperatingStandards" access="readOnly" dmr:version="2.7">
+        <description>
+          {{list}} List items indicate which IEEE 802.11 standard that is detected for this {{object}}.
+          Each value indicates support for the indicated standard.
+          If {{param|OperatingFrequencyBand}} is set to {{enum|2.4GHz|##.Radio.{i}.SupportedFrequencyBands}}, only values {{enum|b}}, {{enum|g}}, {{enum|n}} are allowed.
+          If {{param|OperatingFrequencyBand}} is set to {{enum|5GHz|##.Radio.{i}.SupportedFrequencyBands}}, only values {{enum|a}}, {{enum|n}}, {{enum|ac}} are allowed.
+          For example, a value of "g,b" (or "b,g" - order is not important) means that the 802.11g standard {{bibref|802.11g-2003}} is used with a backwards-compatible mode for 802.11b {{bibref|802.11b-1999}}. A value of "g" means that only the 802.11g standard can be used.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam="SupportedStandards"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="OperatingChannelBandwidth" access="readOnly" dmr:version="2.7">
+        <description>
+          Indicates the bandwidth at which the channel is operating.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="20MHz"/>
+            <enumeration value="40MHz"/>
+            <enumeration value="80MHz"/>
+            <enumeration value="160MHz"/>
+            <enumeration value="Auto"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BeaconPeriod" access="readOnly" dmr:version="2.7">
+        <description>
+          Time interval (in {{units}}) between transmitting beacons.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="ms"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Noise" access="readOnly" dmr:version="2.7">
+        <description>
+          Indicator of average noise strength (in {{units}}) received from the neighboring WiFi radio.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-200" maxInclusive="0"/>
+            <units value="dBm"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="BasicDataTransferRates" access="readOnly" dmr:version="2.7">
+        <description>
+          {{list}} Basic data transmit rates (in Mbps) for the SSID.  For example, if {{param}} is "1,2", this indicates that the SSID is operating with basic rates of 1 Mbps and 2 Mbps.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedDataTransferRates" access="readOnly" dmr:version="2.7">
+        <description>
+          {{list}} Data transmit rates (in Mbps) for unicast frames at which the SSID will permit a station to connect. For example, if {{param}} is "1,2,5.5", this indicates that the SSID will only permit connections at 1 Mbps, 2 Mbps and 5.5 Mbps.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="DTIMPeriod" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of beacon intervals that elapse between transmission of Beacon frames containing a TIM element whose DTIM count field is 0. This value is transmitted in the DTIM Period field of beacon frames. {{bibref|802.11-2012}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="ms"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.SSID.{i}." access="readWrite" numEntriesParameter="SSIDNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        WiFi SSID table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}), where table entries model the MAC layer. A WiFi SSID entry is typically stacked on top of a {{object|#.Radio}} object.
+        WiFi SSID is also a multiplexing layer, i.e. more than one {{object}} can be stacked above a single {{object|#.Radio}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="BSSID"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the SSID entry.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the SSID entry (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the SSID entry as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the SSID entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="BSSID" access="readOnly" dmr:version="2.0">
+        <description>
+          The Basic Service Set ID.
+          This is the MAC address of the access point, which can either be local (when this instance models an access point SSID) or remote (when this instance models an end point SSID).
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC address of this interface.
+          If this instance models an access point SSID, {{param}} is the same as {{param||BSSID}}.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="SSID" access="readWrite" dmr:version="2.0">
+        <description>
+          The current service set identifier in use by the connection. The SSID is an identifier that is attached to packets sent over the wireless LAN that functions as an ID for joining a particular radio network (BSS).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.12">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+          This parameter supersedes the deprecated {{param|#.Radio.{i}.Upstream}} parameter. If both exist, the parameter {{param|#.Radio.{i}.Upstream}} is ignored.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.SSID.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface. Packet counters here count 802.11 WiFi frames. See {{bibref|TR-181i2a5|Appendix III}} for further details. The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2a5|Section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors. These can be due to the number of retransmissions exceeding the retry limit, or from other causes.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RetransCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The total number of transmitted packets which were retransmissions. Two retransmissions of the same packet results in this counter incrementing by two.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FailedRetransCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of packets that were not transmitted successfully due to the number of retransmission attempts exceeding an 802.11 retry limit. This parameter is based on dot11FailedCount from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RetryCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of packets that were successfully transmitted after one or more retransmissions. This parameter is based on dot11RetryCount from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MultipleRetryCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of packets that were successfully transmitted after more than one retransmission. This parameter is based on dot11MultipleRetryCount from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ACKFailureCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of expected ACKs that were never received. This parameter is based on dot11ACKFailureCount from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AggregatedPacketCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of aggregated packets that were transmitted. This applies only to 802.11n and 802.11ac.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}." access="readWrite" numEntriesParameter="AccessPointNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object models an 802.11 connection from the perspective of a wireless access point. Each {{object}} entry is associated with a particular {{object|#.SSID}} interface instance via the {{param|SSIDReference}} parameter.
+        For enabled table entries, if {{param|SSIDReference}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="SSIDReference"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this access point.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the status of this access point.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="SSIDReference" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.SSID." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SSIDAdvertisementEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates whether or not beacons include the SSID name.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RetryLimit" access="readWrite" status="deprecated" dmr:version="2.0">
+        <description>
+          The maximum number of retransmission for a packet. This corresponds to IEEE 802.11 parameter ''dot11ShortRetryLimit''.
+          This parameter is DEPRECATED because it is really a {{object|#.Radio}} attribute.  Use {{param|#.Radio.{i}.RetryLimit}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="WMMCapability" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether this access point supports WiFi Multimedia (WMM) Access Categories (AC).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UAPSDCapability" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether this access point supports WMM Unscheduled Automatic Power Save Delivery (U-APSD).
+          Note: U-APSD support implies WMM support.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="WMMEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          Whether WMM support is currently enabled. When enabled, this is indicated in beacon frames.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UAPSDEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          Whether U-APSD support is currently enabled. When enabled, this is indicated in beacon frames.
+          Note: U-APSD can only be enabled if WMM is also enabled.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAssociatedDevices" access="readWrite" dmr:version="2.4">
+        <description>
+          The maximum number of devices that can simultaneously be connected to the access point.
+          A value of 0 means that there is no specific limit.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="IsolationEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables device isolation.
+          A value of {{true}} means that the devices connected to the Access Point are isolated from all other devices within the home network (as is typically the case for a Wireless Hotspot).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddressControlEnabled" access="readWrite" dmr:version="2.9">
+        <description>
+          Indicates whether or not MAC Address Control is enabled on this {{object|#}}.  MAC Address Control limits client devices to those whose hardware addresses match the {{param|AllowedMACAddress}} list.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="AllowedMACAddress" access="readWrite" dmr:version="2.9">
+        <description>
+          Hardware addresses of client devices that are allowed to associate with this {{object|#}} if {{param|MACAddressControlEnabled}} is {{true}}.
+        </description>
+        <syntax>
+          <list/>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAllowedAssociations" access="readWrite" dmr:version="2.12">
+        <description>
+          Maximum number of associated devices allowed for this SSID. If the number is reached new device connections to this access point will be rejected.
+          If the number is changed to a value less than the actual number of associated devices, new device connections will be rejected until the number of devices is below this number. It is not expected that any connections are dropped.
+          If the parameter {{param|#.Radio.{i}.MaxSupportedAssociations}} exists, the value MUST be less than or equal to the maximum number specified in {{param|#.Radio.{i}.MaxSupportedAssociations}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}.Security." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains security related parameters that apply to a CPE acting as an Access Point {{bibref|802.11-2007}}.
+      </description>
+      <parameter name="ModesSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates which security modes this {{object|#}} instance is capable of supporting.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="WEP-64"/>
+            <enumeration value="WEP-128"/>
+            <enumeration value="WPA-Personal"/>
+            <enumeration value="WPA2-Personal"/>
+            <enumeration value="WPA-WPA2-Personal"/>
+            <enumeration value="WPA-Enterprise"/>
+            <enumeration value="WPA2-Enterprise"/>
+            <enumeration value="WPA-WPA2-Enterprise"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModeEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates which security mode is enabled.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="ModesSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="WEPKey" access="readWrite" dmr:version="2.0">
+        <description>
+          A WEP key expressed as a hexadecimal string.
+          {{param}} is used only if {{param|ModeEnabled}} is set to {{enum|WEP-64|ModeEnabled}} or {{enum|WEP-128|ModeEnabled}}.
+          A 5 byte {{param}} corresponds to security mode {{enum|WEP-64|ModeEnabled}} and a 13 byte {{param}} corresponds to security mode {{enum|WEP-128|ModeEnabled}}.
+        </description>
+        <syntax hidden="true">
+          <hexBinary>
+            <size minLength="5" maxLength="5"/>
+            <size minLength="13" maxLength="13"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="PreSharedKey" access="readWrite" dmr:version="2.0">
+        <description>
+          A literal PreSharedKey (PSK) expressed as a hexadecimal string.
+          {{param}} is only used if {{param|ModeEnabled}} is set to {{enum|WPA-Personal|ModeEnabled}} or {{enum|WPA2-Personal|ModeEnabled}} or {{enum|WPA-WPA2-Personal|ModeEnabled}}.
+          If {{param|KeyPassphrase}} is written, then {{param}} is immediately generated. The ACS SHOULD NOT set both the {{param|KeyPassphrase}} and the {{param}} directly (the result of doing this is undefined).
+        </description>
+        <syntax hidden="true">
+          <hexBinary>
+            <size maxLength="32"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="KeyPassphrase" access="readWrite" dmr:version="2.0">
+        <description>
+          A passphrase from which the {{param|PreSharedKey}} is to be generated, for {{enum|WPA-Personal|ModeEnabled}} or {{enum|WPA2-Personal|ModeEnabled}} or {{enum|WPA-WPA2-Personal|ModeEnabled}} security modes.
+          If {{param}} is written, then {{param|PreSharedKey}} is immediately generated. The ACS SHOULD NOT set both the {{param}} and the {{param|PreSharedKey}} directly (the result of doing this is undefined). The key is generated as specified by WPA, which uses PBKDF2 from PKCS #5: Password-based Cryptography Specification Version 2.0 ({{bibref|RFC2898}}).
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size minLength="8" maxLength="63"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RekeyingInterval" access="readWrite" dmr:version="2.0">
+        <description>
+          The interval (expressed in {{units}}) in which the keys are re-generated.
+          This is applicable to WPA, WPA2 and Mixed (WPA-WPA2) modes in Personal or Enterprise mode (i.e. when {{param|ModeEnabled}} is set to a value other than {{enum|None|ModeEnabled}} or {{enum|WEP-64|ModeEnabled}} or {{enum|WEP-128|ModeEnabled}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="3600"/>
+        </syntax>
+      </parameter>
+      <parameter name="RadiusServerIPAddr" access="readWrite" dmr:version="2.0">
+        <description>
+          The IP Address of the RADIUS server used for WLAN security. {{param}} is only applicable when {{param|ModeEnabled}} is an Enterprise type (i.e. {{enum|WPA-Enterprise|ModeEnabled}}, {{enum|WPA2-Enterprise|ModeEnabled}} or {{enum|WPA-WPA2-Enterprise|ModeEnabled}}).
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="SecondaryRadiusServerIPAddr " access="readWrite" dmr:version="2.5">
+        <description>
+          The IP Address of a secondary RADIUS server used for WLAN security. {{param}} is only applicable when {{param|ModeEnabled}} is an Enterprise type (i.e. {{enum|WPA-Enterprise|ModeEnabled}}, {{enum|WPA2-Enterprise|ModeEnabled}} or {{enum|WPA-WPA2-Enterprise|ModeEnabled}}).
+          The client can forward requests to the secondary server in the event that the primary server is down or unreachable, or after a number of tries to the primary server fail, or in a round-robin fashion {{bibref|RFC2865}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="RadiusServerPort" access="readWrite" dmr:version="2.0">
+        <description>
+          The port number of the RADIUS server used for WLAN security. {{param}} is only applicable when {{param|ModeEnabled}} is an Enterprise type (i.e. {{enum|WPA-Enterprise|ModeEnabled}}, {{enum|WPA2-Enterprise|ModeEnabled}} or {{enum|WPA-WPA2-Enterprise|ModeEnabled}}).
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="1812"/>
+        </syntax>
+      </parameter>
+      <parameter name="SecondaryRadiusServerPort" access="readWrite" dmr:version="2.5">
+        <description>
+          The port number of the secondary RADIUS server used for WLAN security. {{param}} is only applicable when {{param|ModeEnabled}} is an Enterprise type (i.e. {{enum|WPA-Enterprise|ModeEnabled}}, {{enum|WPA2-Enterprise|ModeEnabled}} or {{enum|WPA-WPA2-Enterprise|ModeEnabled}}).
+          If this parameter is not implemented, the secondary RADIUS server will use the same port number as the primary RADIUS server.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="1812"/>
+        </syntax>
+      </parameter>
+      <parameter name="RadiusSecret" access="readWrite" dmr:version="2.0">
+        <description>
+          The secret used for handshaking with the RADIUS server {{bibref|RFC2865}}.
+        </description>
+        <syntax hidden="true">
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SecondaryRadiusSecret" access="readWrite" dmr:version="2.5">
+        <description>
+          The secret used for handshaking with the secondary RADIUS server {{bibref|RFC2865}}.
+          If this parameter is not implemented, the secondary RADIUS server will use the same secret as the primary RADIUS server.
+        </description>
+        <syntax hidden="true">
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="MFPConfig" access="readWrite" dmr:version="2.11">
+        <description>
+          Management Frame Protection configuration applicable when {{param|ModeEnabled}} is set to {{enum|WPA2-Personal|ModeEnabled}} or {{enum|WPA2-Enterprise|ModeEnabled}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Optional"/>
+            <enumeration value="Required"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Reset" access="readWrite" dmr:version="2.4">
+        <description>
+          When set to {{true}}, this {{object|#}} instance's WiFi security settings are reset to their factory default values. The affected settings include {{param|ModeEnabled}}, {{param|WEPKey}}, {{param|PreSharedKey}} , {{param|KeyPassphrase}} and {{param|#.WPS.PIN}} (if applicable).
+          If the parameter cannot be set, the CPE MUST reject the request as an invalid parameter value. Possible failure reasons include a lack of default values or if {{param|ModeEnabled}} is an Enterprise type, i.e. {{enum|WPA-Enterprise|ModesSupported}}, {{enum|WPA2-Enterprise|ModesSupported}} or {{enum|WPA-WPA2-Enterprise|ModesSupported}}.
+        </description>
+        <syntax command="true">
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}.WPS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains parameters related to Wi-Fi Protected Setup for this access point (as specified in {{bibref|WPSv1.0}} or {bibref|WPSv2.0}}).
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables WPS functionality for this access point.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConfigMethodsSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          WPS configuration methods supported by the device. {{enum}}
+          This parameter corresponds directly to the "Config Methods" attribute of {{bibref|WPS 2.0}}.
+          The {{enum|USBFlashDrive}} and {{enum|Ethernet}} are only applicable in WPS 1.0 and are deprecated in WPS 2.x. The {{enum|PhysicalPushButton}}, {{enum|VirtualPushButton}}, {{enum|PhysicalDisplay}} and {{enum|VirtualDisplay}} are applicable to WPS 2.x only.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="USBFlashDrive"/>
+            <enumeration value="Ethernet"/>
+            <enumeration value="Label"/>
+            <enumeration value="Display"/>
+            <enumeration value="ExternalNFCToken"/>
+            <enumeration value="IntegratedNFCToken"/>
+            <enumeration value="NFCInterface"/>
+            <enumeration value="PushButton"/>
+            <enumeration value="PIN"/>
+            <enumeration value="PhysicalPushButton"/>
+            <enumeration value="PhysicalDisplay"/>
+            <enumeration value="VirtualPushButton"/>
+            <enumeration value="VirtualDisplay"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConfigMethodsEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} Indicates WPS configuration methods enabled on the device.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam="ConfigMethodsSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.11">
+        <description>
+          {{list}} Indicates the current status of WPS. If the device goes to {{enum|SetupLocked}} the WPS needs to be disabled and re-enabled to come out of state.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Error"/>
+            <enumeration value="Unconfigured"/>
+            <enumeration value="Configured"/>
+            <enumeration value="SetupLocked"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.11">
+        <description>
+          The Wi-Fi Simple Configuration version supported by the device, a string of the form ''m.n'' where ''m'' is the major version and ''n'' is the minor version.
+          For example, a value of ''1.0'' denotes WSC 1.0 and a value of ''2.0'' denotes WSC 2.0.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="PIN" access="readWrite" dmr:version="2.11">
+        <description>
+          Represents the Device PIN used for PIN based pairing between WPS peers. This PIN is either a four digit number or an eight digit number.
+          {{hidden}}
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="8"/>
+            <pattern value="\d{4}|\d{8}"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}.AssociatedDevice.{i}." access="readOnly" numEntriesParameter="AssociatedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        A table of the devices currently associated with the access point.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The MAC address of an associated device.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="OperatingStandard" access="readOnly" dmr:version="2.10">
+        <description>
+          The operating standard that this associated device is connected with.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="a">
+              <description>
+                {{bibref|802.11a-1999}}
+              </description>
+            </enumeration>
+            <enumeration value="b">
+              <description>
+                {{bibref|802.11b-1999}}
+              </description>
+            </enumeration>
+            <enumeration value="g">
+              <description>
+                {{bibref|802.11g-2003}}
+              </description>
+            </enumeration>
+            <enumeration value="n">
+              <description>
+                {{bibref|802.11n-2009}}
+              </description>
+            </enumeration>
+            <enumeration value="ac">
+              <description>
+                {{bibref|802.11ac-2013}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AuthenticationState" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Whether an associated device has authenticated ({{true}}) or not ({{false}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="LastDataDownlinkRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The data transmit rate in {{units}} that was most recently used for transmission from the access point to the associated device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1000"/>
+            <units value="kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastDataUplinkRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The data transmit rate in {{units}} that was most recently used for transmission from the associated device to the access point.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1000"/>
+            <units value="kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AssociationTime" access="readOnly" dmr:version="2.12">
+        <description>
+          Date and time in UTC when the device was associated
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="SignalStrength" access="readOnly" dmr:version="2.0">
+        <description>
+          An indicator of radio signal strength of the uplink from the associated device to the access point, measured in {{units}}, as an average of the last 100 packets received from the device.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-200" maxInclusive="0"/>
+            <units value="dBm"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Noise" access="readOnly" dmr:version="2.12">
+        <description>
+          An indicator of radio noise on the uplink from the associated device to the access point, measured in {{units}}, as an average of the last 100 packets received from the device (see ANPI definition in {{bibref|802.11-2012|Clause 10.11.9.4}})
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-200" maxInclusive="0"/>
+            <units value="dBm"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Retransmissions" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of {{units}} that had to be re-transmitted, from the last 100 packets sent to the associated device. Multiple re-transmissions of the same packet count as one.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+            <units value="packets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether or not this node is currently present in the WiFi AccessPoint network.
+          The ability to list inactive nodes is OPTIONAL. If the CPE includes inactive nodes in this table, {{param}} MUST be set to {{false}} for each inactive node. The length of time an inactive node remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}.AssociatedDevice.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        These count bytes or packets sent to, or received from, this Associated Device, which is a WiFi station associated to this access point. Packet counters here count 802.11 WiFi frames.
+        The CPE MUST reset these {{object}} parameters (unless otherwise stated in individual object or parameter descriptions) either when the {{param|##.Status}} of the parent {{object|##}} object transitions from {{enum|Disabled|##.Status}} to {{enum|Enabled|##.Status}}, or when it transitions from {{enum|Enabled|##.Status}} to {{enum|Disabled|##.Status}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of bytes transmitted to the Associated Device, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of bytes received from the Associated Device, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of packets transmitted to the Associated Device.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of packets received from the Associated Device.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors. These might be due to the number of retransmissions exceeding the retry limit, or from other causes.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="RetransCount" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of transmitted packets which were retransmissions. Two retransmissions of the same packet results in this counter incrementing by two.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="FailedRetransCount" access="readOnly" dmr:version="2.8">
+        <description>
+          The number of packets that were not transmitted successfully due to the number of retransmission attempts exceeding an 802.11 retry limit. This parameter is based on ''dot11FailedCount'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="RetryCount" access="readOnly" dmr:version="2.8">
+        <description>
+          The number of packets that were successfully transmitted after one or more retransmissions. This parameter is based on ''dot11RetryCount'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="MultipleRetryCount" access="readOnly" dmr:version="2.8">
+        <description>
+          The number of packets that were successfully transmitted after more than one retransmission. This parameter is based on ''dot11MultipleRetryCount'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}.AC.{i}." access="readOnly" minEntries="4" maxEntries="4" dmr:version="2.8">
+      <description>
+        This object contains parameters related to WiFi QoS for different 802.11e access categories (priorities). Access categories are: BE, BK, VI, and VO. These parameters can help control and monitor 802.11e Enhanced distributed channel access (EDCA). The size of this table is fixed, with four entries which are identified by the {{param|AccessCategory}} parameter as follows:
+        * BE (Best Effort)
+        * BK (Background)
+        * VI (Video)
+        * VO (Voice)
+      </description>
+      <uniqueKey>
+        <parameter ref="AccessCategory"/>
+      </uniqueKey>
+      <parameter name="AccessCategory" access="readOnly" dmr:version="2.8">
+        <description>
+          This identifies the access category.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="BE"/>
+            <enumeration value="BK"/>
+            <enumeration value="VI"/>
+            <enumeration value="VO"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="AIFSN" access="readWrite" dmr:version="2.8">
+        <description>
+          Arbitration Inter Frame Spacing (Number). This is the number of time slots in the arbitration interframe space.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="2" maxInclusive="15"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ECWMin" access="readWrite" dmr:version="2.8">
+        <description>
+          Exponent of Contention Window (Minimum). This encodes the values of CWMin as an exponent: CWMin = 2^ECWMin - 1. For example, if ECWMin is 8, then CWMin is 2^8 - 1, or 255, (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="15"/>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ECWMax" access="readWrite" dmr:version="2.8">
+        <description>
+          Exponent of Contention Window (Maximum). This encodes the values of CWMax as an exponent: CWMax = 2^ECWMax - 1. For example, if ECWMax is 8, then CWMax is 2^8 - 1, or 255, (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="15"/>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TxOpMax" access="readWrite" dmr:version="2.8">
+        <description>
+          Maximum transmit opportunity, in multiples of {{units}}. A TXOP time interval of 0 means it is limited to a single MAC protocol data unit (MPDU).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+            <units value="32 microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AckPolicy" access="readWrite" dmr:version="2.8">
+        <description>
+          Ack Policy, where False="Do Not Acknowledge" and True="Acknowledge"
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="OutQLenHistogramIntervals" access="readWrite" dmr:version="2.8">
+        <description>
+          {{list}} Definition of the histogram intervals for counting the transmit queue length in packets. Each value indicates the maximum value of the interval. For example, "0,1,4,8," defines the five intervals: 0 packets in queue, 1 packet in queue, 2 to 4 packets in queue, 5 to 8 packets in queue, and 9 or more packets in queue. (No value after the last comma means no upper bound.) If this parameter is set to {{empty}}, no {{param|Stats.OutQLenHistogram}} stats will be collected.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="OutQLenHistogramSampleInterval" access="readWrite" dmr:version="2.8">
+        <description>
+          The time between recording samples of the current transmit queue in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}.AC.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object contains statistics for different 802.11e access categories (priorities).
+        Packet counters here count 802.11 WiFi frames.
+        If there are not separate stats for each access category, (e.g., 802.11e is not used and there is only one queue), then only access category 0 = BE applies (e.g., the statistics for the single queue are in access category 0 = BE).
+        The CPE MUST reset the Access Point's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the Access Point becomes operationally down due to a previous administrative down (i.e. the Access Point's Status parameter transitions to a Diasbled state) or when the Access Point becomes administratively up (i.e. the Access Point's Enable parameter transitions from false to true). Administrative and operational status is discussed in [Section 4.2.2/TR-181i2].
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} transmitted in this access category, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received in this access category, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} transmitted in this access category.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received in this access category.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of outbound {{units}} in this access category that could not be transmitted because of errors. These might be due to the number of retransmissions exceeding the retry limit, or from other causes.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of inbound {{units}} in this access category that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of outbound {{units}} in this access category which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of inbound {{units}} in this access category which were chosen to be discarded even though no errors had been detected to prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="RetransCount" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of transmitted {{units}} in this access category which were retransmissions. Two retransmissions of the same packet results in this counter incrementing by two.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="OutQLenHistogram" access="readOnly" dmr:version="2.8">
+        <description>
+          {{list}} Histogram of the total length of the transmit queue of this access category in packets (1 packet, 2 packets, etc.) according to the intervals defined by {{param|#.OutQLenHistogramIntervals}}, with samples taken each {{param|#.OutQLenHistogramSampleInterval}}. Example: "12,5,1,0,2,0,0,1".
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}.Accounting." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.5">
+      <description>
+        This object contains the parameters related to RADIUS accounting functionality for the access point.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.5">
+        <description>
+          Enables or disables accounting functionality for the access point.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerIPAddr" access="readWrite" dmr:version="2.5">
+        <description>
+          The IP Address of the RADIUS accounting server.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="SecondaryServerIPAddr" access="readWrite" dmr:version="2.5">
+        <description>
+          The IP Address of a secondary RADIUS accounting server.
+          The client can forward requests to the secondary server in the event that the primary server is down or unreachable, or after a number of tries to the primary server fail, or in a round-robin fashion. {{bibref|RFC2866}}
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerPort" access="readWrite" dmr:version="2.5">
+        <description>
+          The port number of the RADIUS server used for accounting. The default port is 1813 as defined in {{bibref|RFC2866}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="1813"/>
+        </syntax>
+      </parameter>
+      <parameter name="SecondaryServerPort" access="readWrite" dmr:version="2.5">
+        <description>
+          The port number of the secondary RADIUS server used for accounting. The default port is 1813 as defined in {{bibref|RFC2866}}.
+          If this parameter is not implemented, the secondary RADIUS server will use the same port number as the primary RADIUS server.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="1813"/>
+        </syntax>
+      </parameter>
+      <parameter name="Secret" access="readWrite" dmr:version="2.5">
+        <description>
+          The secret used for handshaking with the RADIUS accounting server {{bibref|RFC2865}}.
+        </description>
+        <syntax hidden="true">
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SecondarySecret" access="readWrite" dmr:version="2.5">
+        <description>
+          The secret used for handshaking with the secondary RADIUS accounting server {{bibref|RFC2865}}.
+          If this parameter is not implemented, the secondary RADIUS server will use the same secret as the primary RADIUS server.
+        </description>
+        <syntax hidden="true">
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="InterimInterval" access="readWrite" dmr:version="2.5">
+        <description>
+          Specifies the default interim accounting interval in {{units}}, which is used for service accounting when the ''Acct-Interim-Interval'' attribute is not configured. {{bibref|RFC2869|Section 2.1}}
+          The value MUST NOT be smaller than 60.  The value SHOULD NOT be smaller than  600, and careful consideration should be given to its impact on network traffic {{bibref|RFC2869|Section 5.16}}.
+          A value of 0 means no interim accounting messages are sent.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="0"/>
+            <range minInclusive="60"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}." access="readWrite" numEntriesParameter="EndPointNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object models an 802.11 connection from the perspective of a wireless end point. Each {{object}} entry is associated with a particular {{object|#.SSID}} interface instance via the {{param|SSIDReference}} parameter, and an associated active {{object|Profile}} instance via the {{param|ProfileReference}} parameter. The active profile is responsible for specifying the actual SSID and security settings used by the end point.
+        For enabled table entries, if {{param|SSIDReference}} or {{param|ProfileReference}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="SSIDReference"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this end point.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the status of this end point.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProfileReference" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} This is the currently active profile, which specifies the SSID and security settings to be used by the end point.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="Profile." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SSIDReference" access="readOnly" dmr:version="2.0">
+        <description>
+          {{reference}} {{param}} is determined based on the {{param|Profile.{i}.SSID}} within the associated {{param|ProfileReference}}) endpoint profile. {{param}} MUST be {{empty}} if {{param|ProfileReference}} is {{empty}} (i.e. only when an active profile is assigned can the associated SSID interface be determined).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.SSID." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ProfileNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this end point.
+      </description>
+      <parameter name="LastDataDownlinkRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The data transmit rate in {{units}} that was most recently used for transmission from the access point to the end point device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1000" maxInclusive="600000"/>
+            <units value="kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastDataUplinkRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The data transmit rate in {{units}} that was most recently used for transmission from the end point to the access point device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1000" maxInclusive="600000"/>
+            <units value="kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SignalStrength" access="readOnly" dmr:version="2.0">
+        <description>
+          An indicator of radio signal strength of the downlink from the access point to the end point, measured in {{units}}, as an average of the last 100 packets received from the device.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-200" maxInclusive="0"/>
+            <units value="dBm"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Retransmissions" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of {{units}} that had to be re-transmitted, from the last 100 packets sent to the access point. Multiple re-transmissions of the same packet count as one.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+            <units value="packets"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}.Security." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains security related parameters that apply to a WiFi end point {{bibref|802.11-2007}}.
+      </description>
+      <parameter name="ModesSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates which security modes this {{object|#}} instance is capable of supporting.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="WEP-64"/>
+            <enumeration value="WEP-128"/>
+            <enumeration value="WPA-Personal"/>
+            <enumeration value="WPA2-Personal"/>
+            <enumeration value="WPA-WPA2-Personal"/>
+            <enumeration value="WPA-Enterprise"/>
+            <enumeration value="WPA2-Enterprise"/>
+            <enumeration value="WPA-WPA2-Enterprise"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}.Profile.{i}." access="readWrite" numEntriesParameter="ProfileNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        EndPoint Profile table.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="SSID"/>
+        <parameter ref="Location"/>
+        <parameter ref="Priority"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this Profile.
+          When there are multiple WiFi EndPoint Profiles, e.g. each instance supports a different SSID and/or different security configuration, this parameter can be used to control which of the instances are currently enabled.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the status of this Profile.  {{enum}}
+          The {{enum|Active}} value is reserved for the instance that is actively connected. The {{enum|Available}} value represents an instance that is not currently active, but is also not disabled or in error. The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Active"/>
+            <enumeration value="Available"/>
+            <enumeration value="Error" optional="true"/>
+            <enumeration value="Disabled"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="SSID" access="readWrite" dmr:version="2.0">
+        <description>
+          The profile identifier in use by the connection. The SSID is an identifier that is attached to packets sent over the wireless LAN that functions as an ID for joining a particular radio network (BSS).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Location" access="readWrite" dmr:version="2.0">
+        <description>
+          Location of the profile. This value serves as a reminder from the user, describing the location of the profile. For example: "Home", "Office", "Neighbor House", "Airport", etc. An empty string is also valid.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Priority" access="readWrite" dmr:version="2.0">
+        <description>
+          The profile Priority defines one of the criteria used by the End Point to automatically select the "best" AP when several APs with known profiles are simultaneously available for association.
+          In this situation, the End Point has to select the AP with the higher priority in its profile. If there are several APs with the same priority, providing different SSID or the same SSID, then the wireless end point has to select the APs according to other criteria like signal quality, SNR, etc.
+          0 is the highest priority.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}.Profile.{i}.Security." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains security related parameters that apply to a WiFi End Point profile {{bibref|802.11-2007}}.
+      </description>
+      <parameter name="ModeEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates which security mode is enabled.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="##.Security.ModesSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="WEPKey" access="readWrite" dmr:version="2.0">
+        <description>
+          A WEP key expressed as a hexadecimal string.
+          {{param}} is used only if {{param|ModeEnabled}} is set to {{enum|WEP-64|ModeEnabled}} or {{enum|WEP-128|ModeEnabled}}.
+          A 5 byte {{param}} corresponds to security mode {{enum|WEP-64|ModeEnabled}} and a 13 byte {{param}} corresponds to security mode {{enum|WEP-128|ModeEnabled}}.
+        </description>
+        <syntax hidden="true">
+          <hexBinary>
+            <size minLength="5" maxLength="5"/>
+            <size minLength="13" maxLength="13"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="PreSharedKey" access="readWrite" dmr:version="2.0">
+        <description>
+          A literal PreSharedKey (PSK) expressed as a hexadecimal string.
+          {{param}} is only used if {{param|ModeEnabled}} is set to {{enum|WPA-Personal|ModeEnabled}} or {{enum|WPA2-Personal|ModeEnabled}} or {{enum|WPA-WPA2-Personal|ModeEnabled}}.
+          If {{param|KeyPassphrase}} is written, then {{param}} is immediately generated. The ACS SHOULD NOT set both the {{param|KeyPassphrase}} and the {{param}} directly (the result of doing this is undefined).
+        </description>
+        <syntax hidden="true">
+          <hexBinary>
+            <size maxLength="32"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="KeyPassphrase" access="readWrite" dmr:version="2.0">
+        <description>
+          A passphrase from which the {{param|PreSharedKey}} is to be generated, for {{enum|WPA-Personal|ModeEnabled}} or {{enum|WPA2-Personal|ModeEnabled}} or {{enum|WPA-WPA2-Personal|ModeEnabled}} security modes.
+          If {{param}} is written, then {{param|PreSharedKey}} is immediately generated. The ACS SHOULD NOT set both the {{param}} and the {{param|PreSharedKey}} directly (the result of doing this is undefined). The key is generated as specified by WPA, which uses PBKDF2 from PKCS #5: Password-based Cryptography Specification Version 2.0 {{bibref|RFC2898}}.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size minLength="8" maxLength="63"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MFPConfig" access="readWrite" dmr:version="2.11">
+        <description>
+          Management Frame Protection configuration applicable when {{param|ModeEnabled}} is set to {{enum|WPA2-Personal|ModeEnabled}} or {{enum|WPA2-Enterprise|ModeEnabled}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Optional"/>
+            <enumeration value="Required"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}.WPS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains parameters related to Wi-Fi Protected Setup {{bibref|WPSv1.0}} for this end point.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables WPS functionality for this end point.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConfigMethodsSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          WPS configuration methods supported by the device. {{enum}}
+          This parameter corresponds directly to the "Config Methods" attribute of {{bibref|WPS 2.0}}.
+          The {{enum|USBFlashDrive}} and {{enum|Ethernet}} are only applicable in WPS 1.0 and are deprecated in WPS 2.x. The {{enum|PhysicalPushButton}}, {{enum|VirtualPushButton}}, {{enum|PhysicalDisplay}} and {{enum|VirtualDisplay}} are applicable to WPS 2.x only.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="USBFlashDrive"/>
+            <enumeration value="Ethernet"/>
+            <enumeration value="Label"/>
+            <enumeration value="Display"/>
+            <enumeration value="ExternalNFCToken"/>
+            <enumeration value="IntegratedNFCToken"/>
+            <enumeration value="NFCInterface"/>
+            <enumeration value="PushButton"/>
+            <enumeration value="PIN"/>
+            <enumeration value="PhysicalPushButton"/>
+            <enumeration value="PhysicalDisplay"/>
+            <enumeration value="VirtualPushButton"/>
+            <enumeration value="VirtualDisplay"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConfigMethodsEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the WPS configuration methods enabled on the device.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam="ConfigMethodsSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.11">
+        <description>
+          {{list}} Indicates the current status of WPS in EndPoint.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Error"/>
+            <enumeration value="Unconfigured"/>
+            <enumeration value="Configured"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.11">
+        <description>
+          The Wi-Fi Simple Configuration version supported by the device, a string of the form ''m.n'' where ''m'' is the major version and ''n'' is the minor version.
+          For example, a value of ''1.0'' denotes WSC 1.0 and a value of ''2.0'' denotes WSC 2.0.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="PIN" access="readWrite" dmr:version="2.11">
+        <description>
+          Represents the Device PIN used for PIN based pairing between WPS peers. This PIN is either a four digit number or an eight digit number.
+          {{hidden}}
+        </description>
+        <syntax hidden="true">
+          <unsignedInt>
+            <range minInclusive="4" maxInclusive="4"/>
+            <range minInclusive="8" maxInclusive="8"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}.AC.{i}." access="readOnly" minEntries="4" maxEntries="4" dmr:version="2.8">
+      <description>
+        This object contains parameters related to WiFi QoS for different 802.11e access categories (priorities). Access categories are: BE, BK, VI, and VO. These parameters can help control and monitor 802.11e Enhanced distributed channel access (EDCA). The size of this table is fixed, with four entries which are identified by the {{param|AccessCategory}} parameter as follows:
+        * BE (Best Effort)
+        * BK (Background)
+        * VI (Video)
+        * VO (Voice)
+      </description>
+      <uniqueKey>
+        <parameter ref="AccessCategory"/>
+      </uniqueKey>
+      <parameter name="AccessCategory" access="readOnly" dmr:version="2.8">
+        <description>
+          This identifies the access category.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="BE"/>
+            <enumeration value="BK"/>
+            <enumeration value="VI"/>
+            <enumeration value="VO"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="AIFSN" access="readWrite" dmr:version="2.8">
+        <description>
+          Arbitration Inter Frame Spacing (Number). This is the number of time slots in the arbitration interframe space.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="2" maxInclusive="15"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ECWMin" access="readWrite" dmr:version="2.8">
+        <description>
+          Exponent of Contention Window (Minimum). This encodes the values of CWMin as an exponent: CWMin = 2^ECWMin - 1. For example, if ECWMin is 8, then CWMin is 2^8 - 1, or 255, (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="15"/>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ECWMax" access="readWrite" dmr:version="2.8">
+        <description>
+          Exponent of Contention Window (Maximum). This encodes the values of CWMax as an exponent: CWMax = 2^ECWMax - 1. For example, if ECWMax is 8, then CWMax is 2^8 - 1, or 255, (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="15"/>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TxOpMax" access="readWrite" dmr:version="2.8">
+        <description>
+          Maximum transmit opportunity, in multiples of {{units}}. A TXOP time interval of 0 means it is limited to a single MAC protocol data unit (MPDU).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+            <units value="32 microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AckPolicy" access="readWrite" dmr:version="2.8">
+        <description>
+          Ack Policy, where False="Do Not Acknowledge" and True="Acknowledge"
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="OutQLenHistogramIntervals" access="readWrite" dmr:version="2.8">
+        <description>
+          {{list}} Definition of the histogram intervals for counting the transmit queue length in packets. Each value indicates the maximum value of the interval. For example, "0,1,4,8," defines the five intervals: 0 packets in queue, 1 packet in queue, 2 to 4 packets in queue, 5 to 8 packets in queue, and 9 or more packets in queue. (No value after the last comma means no upper bound.) If this parameter is set to an empty string, no {{param|Stats.OutQLenHistogram}} stats will be collected.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="OutQLenHistogramSampleInterval" access="readWrite" dmr:version="2.8">
+        <description>
+          The time between recording samples of the current transmit queue {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}.AC.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object contains statistics for different 802.11e access categories (priorities).
+        Packet counters here count 802.11 WiFi frames.
+        If there are not separate stats for each access category, (e.g., 802.11e is not used and there is only one queue), then only access category 0 = BE applies (e.g., the statistics for the single queue are in access category 0 = BE).
+        The CPE MUST reset the EndPoint's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the EndPoint becomes operationally down due to a previous administrative down (i.e. the EndPoint's Status parameter transitions to a Diasbled state) or when the EndPoint becomes administratively up (i.e. the EndPoint's Enable parameter transitions from false to true). Administrative and operational status is discussed in [Section 4.2.2/TR-181i2].
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} transmitted in this access category, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received in this access category, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} transmitted in this access category.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received in this access category.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of outbound {{units}} in this access category that could not be transmitted because of errors. These might be due to the number of retransmissions exceeding the retry limit, or from other causes.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of inbound {{units}} in this access category that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of outbound {{units}} in this access category which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of inbound {{units}} in this access category which were chosen to be discarded even though no errors had been detected to prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="RetransCount" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of transmitted {{units}} in this access category which were retransmissions. Two retransmissions of the same packet results in this counter incrementing by two.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="OutQLenHistogram" access="readOnly" dmr:version="2.8">
+        <description>
+          {{list}} Histogram of the total length of the transmit queue of this access category in packets (1 packet, 2 packets, etc.) according to the intervals defined by {{param|#.OutQLenHistogramIntervals}}, with samples taken each {{param|#.OutQLenHistogramSampleInterval}}. Example: "12,5,1,0,2,0,0,1"
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        Top level object for ZigBee capabilities based on the {{bibref|ZigBee2007}} specification.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ZDONumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        ZigBee interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). This table models the ZigBee interface of a ZigBee end device, ZigBee router or ZigBee coordinator.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="ZDOReference"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables the interface. This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.7">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.7">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.7">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IEEEAddress" access="readOnly" activeNotify="forceDefaultEnabled" dmr:version="2.7">
+        <description>
+          The IEEE address assigned to this interface.  A value of "FF:FF:FF:FF:FF:FF:FF:FF"  indicates that this address is unknown.  This parameter has the same value as the {{param|.ZigBee.ZDO.{i}.IEEEAddress}} parameter of the ZDO instance {{param|ZDOReference}} is pointing to.
+        </description>
+        <syntax>
+          <dataType ref="IEEE_EUI64"/>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkAddress" access="readOnly" dmr:version="2.7">
+        <description>
+          The ZigBee network address assigned to this interface.  This parameter has the same value as the {{param|.ZigBee.ZDO.{i}.NetworkAddress}} parameter of the ZDO instance {{param|ZDOReference}} is pointing to.
+        </description>
+        <syntax>
+          <dataType ref="ZigBeeNetworkAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ZDOReference" access="readOnly" dmr:version="2.7">
+        <description>
+          The ZigBee Device Object assigned to this interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".ZigBee.ZDO." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDeviceNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}}  received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} sent transmitted out of the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} received by the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} discarded by interface due to any error.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} received that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} received which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} requested for transmission which were chosen to be discarded even though no errors had been detected to prevent the {{units}} being transmitted.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} received which were chosen to be discarded even though no errors had been detected to prevent their being delivered.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} requested for transmission which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} received which were addressed to a multicast address at this layer and delivered by this layer to a higher layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} requested for transmission which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} received which were addressed to a broadcast address at this layer and delivered by this layer to a higher layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} received which were discarded because of an unknown or unsupported protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.Interface.{i}.AssociatedDevice.{i}." access="readOnly" numEntriesParameter="AssociatedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        This table provides information about other ZigBee devices that are directly accessible via this interface.
+        {{keys}}
+        It is possible that instances of this object have the same key value when the value of {{param|IEEEAddress}} parameter is "FF:FF:FF:FF:FF:FF:FF:FF" and the ZigBee Coordinators on two or more separate area networks assign the same value for the {{param|NetworkAddress}}. This is because the ZigBee specification describes only intra-area network topologies {{bibref|ZigBee2007|Section 1.1.4 Network Topology}}. As such if two or more {{object}} instances have the same key value the implemenation is undefined.
+      </description>
+      <uniqueKey>
+        <parameter ref="IEEEAddress"/>
+        <parameter ref="NetworkAddress"/>
+      </uniqueKey>
+      <parameter name="IEEEAddress" access="readOnly" dmr:version="2.7">
+        <description>
+          The IEEE address assigned to this device. A value of "FF:FF:FF:FF:FF:FF:FF:FF"  indicates that this address is unknown.
+        </description>
+        <syntax>
+          <dataType ref="IEEE_EUI64"/>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkAddress" access="readOnly" dmr:version="2.7">
+        <description>
+          The ZigBee network address assigned to this device.
+        </description>
+        <syntax>
+          <dataType ref="ZigBeeNetworkAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.7">
+        <description>
+          Whether or not this device is currently present in the ZigBee network as defined in {{bibref|ZigBee2007|section 2.4.4.1}}.
+          The ability to list inactive devices is OPTIONAL. If the CPE includes inactive devices in this table, {{param}} MUST be set to {{false}}  for each inactive device. The length of time an inactive device remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ZDOReference" access="readOnly" dmr:version="2.7">
+        <description>
+          The ZigBee Device Object assigned to this interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".ZigBee.ZDO." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}." access="readOnly" numEntriesParameter="ZDONumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        ZigBee Device Object (ZDO) provides management capabilities of the ZigBee Application Support  (APS) and Network (NWK) layers of a ZigBee Device as defined in {{bibref|ZigBee2007|section 2.5}}.
+        {{keys}}
+        It is possible that instances of this object have the same key value when the value of {{param|IEEEAddress}} parameter is "FF:FF:FF:FF:FF:FF:FF:FF" and the ZigBee Coordinators on two or more separate area networks assign the same value for the {{param|NetworkAddress}}. This is because the ZigBee specification describes only intra-area network topologies {{bibref|ZigBee2007|Section 1.1.4 Network Topology}}. As such if two or more {{object}} instances have the same key value the implemenation is undefined
+      </description>
+      <uniqueKey>
+        <parameter ref="IEEEAddress"/>
+        <parameter ref="NetworkAddress"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="IEEEAddress" access="readOnly" dmr:version="2.7">
+        <description>
+          The IEEE address assigned to this device. A value of "FF:FF:FF:FF:FF:FF:FF:FF"  indicates that this address is unknown.
+        </description>
+        <syntax>
+          <dataType ref="IEEE_EUI64"/>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkAddress" access="readOnly" dmr:version="2.7">
+        <description>
+          The ZigBee network address assigned to this device.
+        </description>
+        <syntax>
+          <dataType ref="ZigBeeNetworkAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="BindingTableNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="GroupNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ApplicationEndpointNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.NodeDescriptor." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        The {{object}} object describes the node capabilities of the ZigBee device as defined in {{bibref|ZigBee2007|section 2.3.2.3 Node Descriptor}}.
+      </description>
+      <parameter name="LogicalType" access="readOnly" dmr:version="2.7">
+        <description>
+          The type of ZigBee device that is extracted from the Logical Type Field as defined in {{bibref|ZigBee2007|Table 2.29}}.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ZC">
+              <description>
+                ZigBee Coordinator
+              </description>
+            </enumeration>
+            <enumeration value="ZR">
+              <description>
+                ZigBee Router
+              </description>
+            </enumeration>
+            <enumeration value="ZED">
+              <description>
+                ZigBee End Device
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ComplexDescriptorSupported" access="readOnly" dmr:version="2.7">
+        <description>
+          When {{true}}, specifies that the {{object|#.ComplexDescriptor}} object is supported for this ZigBee device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UserDescriptorSupported" access="readOnly" dmr:version="2.7">
+        <description>
+          When {{true}}, specifies that the {{object|#.UserDescriptor}} object is supported for this ZigBee device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FrequencyBand" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the frequency bands that are supported by the underlying IEEE 802.15.4 radio utilized by the ZigBee device.
+          {{list}} {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="868-868.6">
+              <description>
+                The 868-868.6 MHz Band
+              </description>
+            </enumeration>
+            <enumeration value="902-928">
+              <description>
+                The 902-928 MHz Band
+              </description>
+            </enumeration>
+            <enumeration value="2400-2483.5">
+              <description>
+                The 2400-2483.5 MHz Band
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MACCapability" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies  the IEEE 802.15.4-2003 MAC sub-layer capabilities for this ZigBee device.
+          {{list}} {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="AlternatePANCoordinator">
+              <description>
+                Alternate PAN Coordinator
+              </description>
+            </enumeration>
+            <enumeration value="FFD">
+              <description>
+                Full Function Device
+              </description>
+            </enumeration>
+            <enumeration value="MainsPowerSource">
+              <description>
+                The current power source is mains power
+              </description>
+            </enumeration>
+            <enumeration value="OnWhenIdle">
+              <description>
+                The receiver is on when idle
+              </description>
+            </enumeration>
+            <enumeration value="SecureCommunication">
+              <description>
+                Secure communication is enabled
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManufactureCode" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies a manufacturer code that is allocated by the ZigBee Alliance, relating the manufacturer to the device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumBufferSize" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the maximum buffer size, in {{units}}, of the network sub-layer data unit (NSDU) for this ZigBee device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="128"/>
+            <units value="octets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumIncomingTransferSize" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the maximum size, in {{units}}, of the application sub-layer data unit (ASDU) that can be transferred to this ZigBee device in one single message transfer.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="32768"/>
+            <units value="octets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumOutgoingTransferSize" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the maximum size, in {{units}}, of the application sub-layer data unit (ASDU) that can be transferred from this ZigBee device in one single message transfer.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="32768"/>
+            <units value="octets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ServerMask" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the system server capabilities of this ZigBee device.
+          {{list}} {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="PrimaryTrustCenter"/>
+            <enumeration value="PrimaryBindingTableCache"/>
+            <enumeration value="BackupBindingTableCache"/>
+            <enumeration value="PrimaryDiscoveryCache"/>
+            <enumeration value="BackupDiscoveryCache"/>
+            <enumeration value="NetworkManager"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DescriptorCapability" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the descriptor capabilities of this ZigBee device.
+          {{list}} {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="ExtendedActiveEndpointListAvailable"/>
+            <enumeration value="ExtendedSimpleDescriptorListAvailable"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.PowerDescriptor." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        The {{object}} object describes the power capabilities of the ZigBee device as defined in {{bibref|ZigBee2007|section 2.3.2.4 Node Power Descriptor}}.
+      </description>
+      <parameter name="CurrentPowerMode" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the current sleep/power-saving mode of the ZigBee device.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Synchronized"/>
+            <enumeration value="Periodic"/>
+            <enumeration value="Manual"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AvailablePowerSource" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the power sources available on this ZigBee device.
+          {{list}} {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="Constant">
+              <description>
+                Constant (mains) power
+              </description>
+            </enumeration>
+            <enumeration value="Rechargeable">
+              <description>
+                Rechargable battery
+              </description>
+            </enumeration>
+            <enumeration value="Disposable">
+              <description>
+                Disposable battery
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentPowerSource" access="readOnly" dmr:version="2.7">
+        <description>
+          The current power source field specifies the current power source being utilized by the node.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Constant">
+              <description>
+                Constant (mains) power
+              </description>
+            </enumeration>
+            <enumeration value="Rechargeable">
+              <description>
+                Rechargable battery
+              </description>
+            </enumeration>
+            <enumeration value="Disposable">
+              <description>
+                Disposable battery
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentPowerSourceLevel" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the level of charge of the current power source.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Critical">
+              <description>
+                Critical battery state
+              </description>
+            </enumeration>
+            <enumeration value="33">
+              <description>
+                Battery state is 33 percent
+              </description>
+            </enumeration>
+            <enumeration value="66">
+              <description>
+                Battery state is 66 percent
+              </description>
+            </enumeration>
+            <enumeration value="100">
+              <description>
+                Battery state is 100 percent
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.UserDescriptor." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7" dmr:noUniqueKeys="true">
+      <description>
+        The {{object}} object is an optional descriptor that describes user defined capabilities of the ZigBee device as defined in {{bibref|ZigBee2007|section 2.3.2.7 User Descriptor}}. The {{object}} object contains information that allows the user to identify the device using a user-friendly character string, such as "Bedroom TV" or "Stairs Light".
+      </description>
+      <parameter name="DescriptorAvailable" access="readOnly" dmr:version="2.7">
+        <description>
+          When {{true}}, the User Descriptor recorded has been received from the target device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the information that allows the user to identify the ZigBee device using a user-friendly character string, such as "Bedroom TV" or "Stairs light".
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="16"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.ComplexDescriptor." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7" dmr:noUniqueKeys="true">
+      <description>
+        The {{object}} object is an optional descriptor that describes extended capabilities of the ZigBee device as defined in {{bibref|ZigBee2007|section 2.3.2.6 Complex Descriptor}}.
+      </description>
+      <parameter name="DescriptorAvailable" access="readOnly" dmr:version="2.7">
+        <description>
+          When {{true}}, the Complex Descriptor recorded has been received from the target device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Language" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the ISO 639-1 language code as defined in {{bibref|ISO639-1}}.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="CharacterSet" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the ISO 646 character set as defined in {{bibref|ISO646-1991}}.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerName" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the name of the manufacturer of the ZigBee device.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ModelName" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the name of the manufacturer's model of the ZigBee device.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the manufacturer's serial number of the ZigBee device.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceURL" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the URL through which more information relating to the ZigBee device can be obtained.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Icon" access="readOnly" dmr:version="2.7">
+        <description>
+          The icon field contains an octet string which carries the data for an icon that can represent the ZigBee device.  The format of the icon MUST be a 32-by-32-pixel PNG image.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="IconURL" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the URL through which the icon for the ZigBee device can be obtained.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.Security." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        The {{object}} object provides the configuration capabilities needed to perform the Security Management functionality defined in {{bibref|ZigBee2007|section 4 Security Management}}.
+      </description>
+      <parameter name="TrustCenterAddress" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the IEEE address of a special device trusted by devices within a ZigBee network to distribute keys for the purpose of network and end-to-end application configuration management.
+        </description>
+        <syntax>
+          <dataType ref="IEEE_EUI64"/>
+        </syntax>
+      </parameter>
+      <parameter name="SecurityLevel" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies how an outgoing frame is to be secured, how an incoming frame purportedly has been secured; it also indicates whether or not the payload is encrypted and to what extent data authenticity over the frame is provided, as reflected by the length of the message integrity code (MIC).
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="MIC-32"/>
+            <enumeration value="MIC-64"/>
+            <enumeration value="MIC-128"/>
+            <enumeration value="ENC"/>
+            <enumeration value="ENC-MIC-32"/>
+            <enumeration value="ENC-MIC-64"/>
+            <enumeration value="ENC-MIC-128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TimeOutPeriod" access="readOnly" dmr:version="2.7">
+        <description>
+          The period of time, in {{units}}, that this ZigBee device will wait for an expected security protocol frame.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.Network." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        The {{object}} object provides the configuration capabilities needed to by a ZigBee Device to operate within a ZigBee Area Network as defined in {{bibref|ZigBee2007|section 2.5.2.4 Network Manager}}.
+      </description>
+      <parameter name="NeighborNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.Network.Neighbor.{i}." access="readOnly" numEntriesParameter="NeighborNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        The {{object}} object provides the configuration capabilities needed to by a ZigBee Device to operate within a ZigBee Area Network as defined in {{bibref|ZigBee2007|section 2.5.2.4 Network Manager}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="Neighbor"/>
+      </uniqueKey>
+      <parameter name="Neighbor" access="readOnly" dmr:version="2.7">
+        <description>
+          Neighbor of this ZigBee device. The value MUST be the path name of a row in the ZigBee.ZDO table. If the referenced row is deleted then this entry MUST be deleted.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".ZigBee.ZDO." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LQI" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The LQI field specified link quality identification (LQI) for neighbor ZigBee device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Relationship" access="readOnly" dmr:version="2.7">
+        <description>
+          The relationship between the neighbor and this device.{{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Parent"/>
+            <enumeration value="Child"/>
+            <enumeration value="PrevChild"/>
+            <enumeration value="Sibling"/>
+            <enumeration value="None"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PermitJoin" access="readOnly" dmr:version="2.7">
+        <description>
+          An indication of whether the neighbor device is accepting join requests.{{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Accepting"/>
+            <enumeration value="NotAccepting"/>
+            <enumeration value="Unknown"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Depth" access="readOnly" dmr:version="2.7">
+        <description>
+          The tree depth of the neighbor device. A value of 0x00 indicates that the device is the ZigBee coordinator for the network.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.NodeManager." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        The {{object}} object describes the configuration capabilities related for remote management of the ZigBee Area Network as defined in {{bibref|ZigBee2007|section 2.5.2.6 Node Manager}}.
+      </description>
+      <parameter name="RoutingTableNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.NodeManager.RoutingTable.{i}." access="readOnly" numEntriesParameter="RoutingTableNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.7" dmr:noUniqueKeys="true">
+      <description>
+        The {{object}} object describes the route table as defined in {{bibref|ZigBee2007|table 3.51 Routing Table Entry}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="DestinationAddress"/>
+      </uniqueKey>
+      <parameter name="DestinationAddress" access="readOnly" dmr:version="2.7">
+        <description>
+          The ZigBee network address of this route.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="4"/>
+            <pattern value="([0-9A-Fa-f]){4}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NextHopAddress" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          Specifies the network address of the next hop ZigBee device on the way to the destination ZigBee device.
+        </description>
+        <syntax>
+          <dataType ref="ZigBeeNetworkAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The status of the route entry. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Active"/>
+            <enumeration value="DiscoveryUnderway"/>
+            <enumeration value="DiscoveryFailed"/>
+            <enumeration value="Inactive"/>
+            <enumeration value="ValidationUnderway"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MemoryConstrained" access="readOnly" dmr:version="2.7">
+        <description>
+          A flag indicating whether the device is a memory constrained concentrator.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ManyToOne" access="readOnly" dmr:version="2.7">
+        <description>
+          A flag indicating that the destination is a concentrator that issued a many to-one request.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RouteRecordRequired" access="readOnly" dmr:version="2.7">
+        <description>
+          A flag indicating that a route record command frame should be sent to the destination prior to the next data packet.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.Binding.{i}." access="readWrite" numEntriesParameter="BindingTableNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        The {{object}} object describes the configuration capabilities related to maintaining a ZigBee Device's Binding Table as defined in {{bibref|ZigBee2007|section 2.2.8.2 Binding}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables the use of this binding on the device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceEndpoint" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the source endpoint used in this binding entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="240"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SourceAddress" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the source address used in this binding entry.
+        </description>
+        <syntax>
+          <dataType ref="IEEE_EUI64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ClusterId" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the cluster identifier used in this binding entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DestinationAddressMode" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the type of destination address used for this binding entry. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Group"/>
+            <enumeration value="Endpoint"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DestinationEndpoint" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the destination endpoint for the binding entry. The value of this field is valid when the value of the {{param|DestinationAddressMode}} is {{enum|Endpoint|DestinationAddressMode}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="240"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="IEEEDestinationAddress" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the IEEE destination address for this binding entry. The value of this field is valid when the value of the {{param|DestinationAddressMode}} is {{enum|Endpoint|DestinationAddressMode}}.
+        </description>
+        <syntax>
+          <dataType ref="IEEE_EUI64"/>
+        </syntax>
+      </parameter>
+      <parameter name="GroupDestinationAddress" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the group destination address for this binding entry. The value of this field is valid when the value of the {{param|DestinationAddressMode}} is {{enum|Group|DestinationAddressMode}}.
+        </description>
+        <syntax>
+          <dataType ref="ZigBeeNetworkAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.Group.{i}." access="readWrite" numEntriesParameter="GroupNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        The {{object}} object describes the configuration capabilities related to maintaining a ZigBee Device's Group Table as defined in {{bibref|ZigBee2007|section 2.5.2.7 Group Manager}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="GroupId"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables the use of this group on the device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="GroupId" access="readWrite" dmr:version="2.7">
+        <description>
+          The Group Identifier for this object as defined in {{bibref|ZigBee2007|table 2.25 Group Table Entry Format}}.
+        </description>
+        <syntax>
+          <dataType ref="ZigBeeNetworkAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="EndpointList" access="readWrite" dmr:version="2.7">
+        <description>
+          The list of application endpoints assigned as a member of this {{object}} object.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".ZigBee.ZDO.{i}.ApplicationEndpoint." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.ApplicationEndpoint.{i}." access="readWrite" numEntriesParameter="ApplicationEndpointNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        The {{object}} object describes the application endpoint as defined in {{bibref|ZigBee2007|section 2.1.2 Application Framework}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="EndpointId"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables the use of this application endpoint on the device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="EndpointId" access="readWrite" dmr:version="2.7">
+        <description>
+          The Endpoint Identifier for this object as defined in {{bibref|ZigBee2007|section 2.1.2 Application Framework}}.
+          An {{object}} with an {{param}} value of 0 is designated as the device application: This is a special application that is responsible for device operation and contains logic to manage the device's networking and general maintenance features.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="240"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.ApplicationEndpoint.{i}.SimpleDescriptor." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        The {{object}} object contains the attributes of the Simple Descriptor of an application endpoint, as defined in {{bibref|ZigBee2007|section 2.3.2.5 Simple Descriptor}}.
+      </description>
+      <parameter name="ProfileId" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the application profile that is supported on this endpoint. Application profiles are agreements for messages, message formats, andprocessing actions that enable developers to create an interoperable, distributed application employing application entities that reside on separate ZigBee devices. These application profiles enable applications to send commands, request data, and process commands and requests as defined in {{bibref|ZigBee2007|section 2.1.2.1 Application Profiles}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceId" access="readOnly" dmr:version="2.7">
+        <description>
+          Application device identifier, as defined in {{bibref|ZigBee2007|section 2.3.2.5.3 Application Device Identifier Field}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceVersion" access="readOnly" dmr:version="2.7">
+        <description>
+          Application device version, as defined in {{bibref|ZigBee2007|section 2.3.2.5.4 Application Device Version Field}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="15"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="InputClusterList" access="readWrite" dmr:version="2.7">
+        <description>
+          {{list}} Specifies the input cluster identifiers to be matched by the ZigBee coordinator by remote Zigbee device's output cluster list for this {{object}} object.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="OutputClusterList" access="readWrite" dmr:version="2.7">
+        <description>
+          {{list}} Specifies the output cluster identifiers to be matched by the ZigBee coordinator by remote Zigbee device's input cluster list for this {{object}} object.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.Discovery." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        This object is used for managing the discovery of ZigBee devices within a ZigBee Area Network. ZigBee Devices are discovered via the {{object|#.ZDO}} instance associated with the ZigBee Coordinator of an Area Network.
+      </description>
+      <parameter name="AreaNetworkNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.Discovery.AreaNetwork.{i}." access="readWrite" numEntriesParameter="AreaNetworkNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        This object specifies the ZigBee devices that are discovered by the {{param|Coordinator}}.
+        As the ZigBee specification does not provide a discovery protocol between the CWMP proxy and the ZigBee coordinator, the {{object}} object is provisioned and not discovered.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Coordinator"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables discovery of the ZigBee devices in this {{object}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" dmr:version="2.7">
+        <description>
+          The date and time when this {{object}} or its member devices (i.e., the devices with ZDOs listed in {{param|ZDOList}}) were updated due to a discovery operation.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.7">
+        <description>
+          The status of the current discovery operation.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Indeterminate">
+              <description>
+                The discovery operation has not been executed and there are no valid discovery results available)
+              </description>
+            </enumeration>
+            <enumeration value="InProgress"/>
+            <enumeration value="Success"/>
+            <enumeration value="Error"/>
+            <enumeration value="Error_Timeout" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Coordinator" access="readWrite" dmr:version="2.7">
+        <description>
+          The Fully Qualified Domain Name (FQDN) or IP address of the ZigBee Coordinator.  The coordinator MAY be located within the CPE. In this scenario the ACS or CPE MAY use the value of "localhost".
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ZDOReference" access="readOnly" dmr:version="2.7">
+        <description>
+          The ZDO object for this device that is used to discover the ZigBee capabilities of attached devices.
+          {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".ZigBee.ZDO." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ZDOList" access="readOnly" dmr:version="2.7">
+        <description>
+          The list of ZDO objects discovered in this Area Network by the ZigBee Coordinator.
+          {{reference}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".ZigBee.ZDO." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Layer 2 bridging configuration. Specifies bridges between different layer 2 interfaces. Bridges can be defined to include layer 2 filter criteria to selectively bridge traffic between interfaces.
+        This object can be used to configure both 802.1D {{bibref|802.1D-2004}} and 802.1Q {{bibref|802.1Q-2011}} bridges.
+        Not all 802.1D and 802.1Q features are modeled, and some additional features not present in either 802.1D or 802.1Q are modeled.
+        802.1Q {{bibref|802.1Q-2011}} bridges incorporate 802.1Q {{bibref|802.1Q-2005}} customer and 802.1ad {{bibref|802.1ad-2005}} provider bridges.
+      </description>
+      <parameter name="MaxBridgeEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the {{object|.Bridging.Bridge}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxDBridgeEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum number of 802.1D {{bibref|802.1D-2004}} entries available in the {{object|.Bridging.Bridge}} table.  A positive value for this parameter implies support for 802.1D.
+          There is no guarantee that this many 802.1D Bridges can be configured. For example, the CPE might not be able simultaneously to  support both 802.1D and 802.1Q Bridges.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxQBridgeEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum number of 802.1Q {{bibref|802.1Q-2011}} entries available in the {{object|.Bridging.Bridge}} table. A non-zero value for this parameter implies support for 802.1Q.
+          There is no guarantee that this many 802.1Q Bridges can be configured. For example, the CPE might not be able simultaneously to support both 802.1D and 802.1Q Bridges.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxVLANEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum number of 802.1Q {{bibref|802.1Q-2011}} VLANs supported per {{object|.Bridging.Bridge}} table entry.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxProviderBridgeEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          The maximum number of entries available in the {{object|.Bridging.ProviderBridge}} table. A non-zero value for this parameter implies support for 802.1Q Provider Bridges.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ProviderBridgeNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxFilterEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the {{object|Filter}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BridgeNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FilterNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.Bridge.{i}." access="readWrite" numEntriesParameter="BridgeNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Bridge table.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this {{object}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this {{object}}.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Standard" access="readWrite" dmr:version="2.0">
+        <description>
+          Selects the standard supported by this Bridge table entry.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="802.1D-2004">
+              <description>
+                {{bibref|802.1D-2004}}
+              </description>
+            </enumeration>
+            <enumeration value="802.1Q-2005">
+              <description>
+                {{bibref|802.1Q-2005}}
+              </description>
+            </enumeration>
+            <enumeration value="802.1Q-2011">
+              <description>
+                The {{object}} provides support for at least one feature defined in {{bibref|802.1Q-2011}} that was not defined in {{bibref|802.1Q-2005}}.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PortNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANPortNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.Bridge.{i}.Port.{i}." access="readWrite" numEntriesParameter="PortNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Bridge Port table, which MUST contain an entry for each bridge port (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+        There are two types of bridge ports: management (upward facing) and non-management (downward facing). This is determined by configuring the Boolean {{param|ManagementPort}} parameter. The CPE will automatically configure each management bridge port to appear in the interface stack above all non-management bridge ports that share the same {{object|##.Bridge}} instance.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the bridge port.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the bridge port (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then this parameter SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then this parameter SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the bridge port as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the bridge port entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          When {{param|ManagementPort}} is set to {{true}} the CPE MUST set {{param}} to reference all non-management bridge ports that are within the same {{object|##.Bridge}} instance (and update {{param}} when subsequent non-management bridge ports are added or deleted on that ''Bridge''). The ACS SHOULD NOT set {{param}} in this case.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ManagementPort" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{true}} then the entry is a management (upward facing) bridge port rather than a non-management (downward facing) bridge port. For a given {{object|##.Bridge}} instance, each management bridge port appears in the interface stack above all non-management bridge ports. The concept of Management Port is discussed in {{bibref|802.1Q-2005|chapter 8}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readWrite" dmr:version="2.7">
+        <description>
+          The type of bridge port as defined in 802.1Q {{bibref|802.1Q-2011|Section 17 IEEE8021BridgePortType}}.
+          Enumeration of:
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ProviderNetworkPort">
+              <description>
+                Indicates this {{object}} is an S-TAG aware port of a {{object|##.ProviderBridge}}.
+              </description>
+            </enumeration>
+            <enumeration value="CustomerNetworkPort">
+              <description>
+                Indicates this {{object}} is an S-TAG aware port of a {{object|##.ProviderBridge}}.
+              </description>
+            </enumeration>
+            <enumeration value="CustomerEdgePort">
+              <description>
+                Indicates this {{object}} is an C-TAG aware port of a {{object|##.ProviderBridge}}.
+              </description>
+            </enumeration>
+            <enumeration value="CustomerVLANPort">
+              <description>
+                Indicates this {{object}} is an C-TAG aware port of a Customer Bridge.
+              </description>
+            </enumeration>
+            <enumeration value="VLANUnawarePort">
+              <description>
+                Indicates this {{object}} is a VLAN unaware member of an {{enum|802.1D-2004|#.Standard}} bridge.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultUserPriority" access="readWrite" dmr:version="2.0">
+        <description>
+          Bridge Port Default User Priority.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PriorityRegeneration" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} List items represent user priority regeneration values for each ingress user priority on this Bridge  Port.
+        </description>
+        <syntax>
+          <list minItems="8" maxItems="8"/>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+          <default type="object" value="0,1,2,3,4,5,6,7"/>
+        </syntax>
+      </parameter>
+      <parameter name="PortState" access="readOnly" dmr:version="2.0">
+        <description>
+          Bridge Port state as defined in 802.1D {{bibref|802.1D-2004}} and 802.1Q {{bibref|802.1Q-2011}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Blocking"/>
+            <enumeration value="Listening"/>
+            <enumeration value="Learning"/>
+            <enumeration value="Forwarding"/>
+            <enumeration value="Broken"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="PVID" access="readWrite" dmr:version="2.0">
+        <description>
+          PVID (or Port VID) is the VLAN ID with which an untagged or priority tagged frame that arrives on this port will be associated (i.e. default Port VLAN ID as defined in 802.1Q {{bibref|802.1Q-2011}}).
+          For an 802.1D Bridge {{bibref|802.1D-2004}}, this parameter MUST be ignored.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="1" maxInclusive="4094"/>
+          </int>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+      <parameter name="TPID" access="readWrite" dmr:version="2.7">
+        <description>
+          The Tag Protocol Identifier (TPID) assigned to this {{object}}. The TPID is an EtherType value used to identify the frame as a tagged frame.
+          Standard {{bibref|802.1Q-2011|Table 9.1}} TPID values are:
+          *S-TAG 0x88A8 = 34984
+          *C-TAG 0x8100 = 33024
+          Non-Standard TPID values are:
+          *S-TAG 0x9100 = 37120
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="33024"/>
+        </syntax>
+      </parameter>
+      <parameter name="AcceptableFrameTypes" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates which types of frame arriving on this port will be admitted to the bridge (i.e. Bridge Port acceptable frame types as defined in 802.1Q {{bibref|802.1Q-2011}}).  {{enum}}
+          For an 802.1D {{bibref|802.1D-2004}} Bridge, the value of this parameter MUST be {{enum|AdmitAll}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AdmitAll"/>
+            <enumeration value="AdmitOnlyVLANTagged" optional="true"/>
+            <enumeration value="AdmitOnlyPrioUntagged" optional="true"/>
+          </string>
+          <default type="object" value="AdmitAll"/>
+        </syntax>
+      </parameter>
+      <parameter name="IngressFiltering" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables Ingress Filtering as defined in 802.1Q {{bibref|802.1Q-2011}}. If enabled ({{true}}), causes frames arriving on this port to be discarded if the port is not in the VLAN ID's member set (which is configured via the {{object|#.VLANPort}} table).
+          For an 802.1D {{bibref|802.1D-2004}} Bridge, the value of this parameter MUST be {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceAccessPrioritySelection" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter controls the Service Access Priority selection function as described in {{bibref|802.1Q-2011|section 6.13}}.
+          The parameter is applicable to deployments of {{object|##.Bridge}} instances that are referenced by {{param|###.Bridging.ProviderBridge.{i}.SVLANcomponent}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceAccessPriorityTranslation" access="readWrite" dmr:version="2.7">
+        <description>
+          {{list}} List items represent service access priority translation values for each ingress priority on this {{object}} as described in {{bibref|802.1Q-2011|section 6.13}}.
+          The parameter is applicable to deployments of {{object|##.Bridge}} instances that are referenced by {{param|###.Bridging.ProviderBridge.{i}.SVLANcomponent}}.
+        </description>
+        <syntax>
+          <list minItems="8" maxItems="8"/>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+          <default type="object" value="0,1,2,3,4,5,6,7"/>
+        </syntax>
+      </parameter>
+      <parameter name="PriorityTagging" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables priority tagging on this Bridge Port.
+          When {{true}}, egress frames leaving this interface will be priority tagged with the frame's associated priority value, which will either be derived directly from the ingress frame or else set via {{param|.QoS.Classification.{i}.EthernetPriorityMark}}.
+          When {{false}}, egress frames leaving this interface will be untagged.
+          The parameter does not affect reception of ingress frames.
+          Only applies on bridge ports that are untagged member of one or more VLAN's.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.Bridge.{i}.Port.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.Bridge.{i}.Port.{i}.PriorityCodePoint." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        {{object}} provides the management control for the processing of the Priority Code Point (PCP) field for the 802.1Q header as defined in {{bibref|802.1Q-2011|section 6.9.3 Priority Code Point Encoding}}.
+        The object is applicable to deployments of  {{object|####.Bridging.ProviderBridge}} where the {{object|###.Bridge}} instance is referenced by {{param|####.Bridging.ProviderBridge.{i}.SVLANcomponent}} or {{param|####.Bridging.ProviderBridge.{i}.CVLANcomponents}} parameters.
+      </description>
+      <parameter name="PCPSelection" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter identifies the row in the {{param|PCPEncoding}} and {{param|PCPDecoding}} parameter lists. The value of 1 points to the 8P0D row in the corresponding parameter lists.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="4"/>
+          </unsignedInt>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+      <parameter name="UseDEI" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter controls the processing of the drop_eligible field and is described in {{bibref|802.1Q-2011|section 6.9.3}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="RequireDropEncoding" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter controls the processing of the encoding or decoding of the drop_eligible component in the PCP field and is described in {{bibref|802.1Q-2011|section 8.6.7}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PCPEncoding" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter provides the management control for the processing of the encoding of the Priority Code Point (PCP) field for the 802.1Q header as defined in {{bibref|802.1Q-2011|section 6.9.3 Priority Code Point Encoding}} and {{bibref|802.1Q-2011|Table 6-3}}.
+          The list is an ordered list that contains entries for the following 4 PCP Values: "8P0D","7P1D", "6P2D" "5P3D".  Each list entry matches the following pattern:
+          {{pattern}}
+          The value of this parameter MUST use square brackets to protect comma separators within nested lists.  For example, this corresponds to Table 6-3 (mentioned above):
+          : [7,7,6,6,5,5,4,4,3,3,2,2,1,1,0,0],[7,7,6,6,5,4,5,4,3,3,2,2,1,1,0,0],[7,7,6,6,5,4,5,4,3,2,3,2,1,1,0,0],[7,7,6,6,5,4,5,4,3,2,3,2,1,0,1,0]
+        </description>
+        <syntax>
+          <list minItems="4" maxItems="4"/>
+          <string>
+            <size minLength="31" maxLength="31"/>
+            <pattern value="([0-7],){15}[0-7]">
+              <description>
+                PCP for each priority and drop_eligible field (7, 7DE, 6, 6DE, ..., 1, 1DE, 0, 0DE)
+              </description>
+            </pattern>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PCPDecoding" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter provides the management control for the processing of the decoding of the Priority Code Point (PCP) field for the 802.1Q header as defined in {{bibref|802.1Q-2011|section 6.9.3 Priority Code Point Encoding}} and {{bibref|802.1Q-2011|Table 6-4}}.
+          The list is an ordered list that contains entries for the following 4 PCP Values: "8P0D","7P1D", "6P2D" "5P3D".  Each list entry matches the following pattern:
+          {{pattern}}
+          The value of this parameter MUST use square brackets to protect comma separators within nested lists.  For example, this corresponds to Table 6-4 (mentioned above):
+          : [7,0,6,0,5,0,4,0,3,0,2,0,1,0,0,0],[7,0,6,0,4,0,4,1,3,0,2,0,1,0,0,0],[7,0,6,0,4,0,4,1,2,0,2,1,1,0,0,0],[7,0,6,0,4,0,4,1,2,0,2,1,0,0,0,1]
+        </description>
+        <syntax>
+          <list minItems="4" maxItems="4"/>
+          <string>
+            <size minLength="15" maxLength="15"/>
+            <pattern value="([0-7],[0-1],){7}[0-7],[0-1]">
+              <description>
+                Priority (0-7) and drop_eligible field (0-1) for each PCP value (7, 6, ..., 1, 0).
+              </description>
+            </pattern>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.Bridge.{i}.VLAN.{i}." access="readWrite" numEntriesParameter="VLANNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Bridge VLAN table.  If this table is supported, if MUST contain an entry for each VLAN known to the Bridge.
+        This table only applies to an 802.1Q {{bibref|802.1Q-2011}} Bridge.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="VLANID"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this VLAN table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.0">
+        <description>
+          Human-readable name for this VLAN table entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANID" access="readWrite" dmr:version="2.0">
+        <description>
+          VLAN ID of the entry.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="1" maxInclusive="4094"/>
+          </int>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.Bridge.{i}.VLANPort.{i}." access="readWrite" numEntriesParameter="VLANPortNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Bridge VLAN egress port and untagged port membership table.
+        This table only applies to an 802.1Q {{bibref|802.1Q-2011}} Bridge.
+        Note: The {{object}} table includes unique key parameters that are strong references. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="VLAN"/>
+        <parameter ref="Port"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLAN" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}  Specifies the VLAN for which port membership is expressed.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.VLAN." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}  Specifies the bridge port that is member of the VLAN.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Port." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Untagged" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables untagged port membership to the VLAN and determines whether egress frames for this VLAN are sent untagged or tagged.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.Filter.{i}." access="readWrite" numEntriesParameter="FilterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Filter table containing classification filter entries, each of which expresses a set of classification criterion to classify ingress frames as member of a {{object|#.Bridge}} instance or a {{object|#.Bridge.{i}.VLAN}} instance.
+        Bridge VLAN classification only applies for 802.1Q {{bibref|802.1Q-2011}} Bridges.
+        For enabled table entries, if {{param|Bridge}} or {{param|Interface}} is {{empty}} then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Several of this object's parameters specify DHCP option values. Some cases are version neutral (the parameter can apply to both DHCPv4 and DHCPv6), but in other cases the representation of the option is different for DHCPv4 and DHCPv6, so it is necessary to define separate DHCPv4-specific and DHCPv6-specific parameters. Therefore, an instance of this object that uses DHCP option values as filter criteria will be associated with either DHCPv4 or DHCPv6, as indicated by the {{param|DHCPType}} parameter.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this Filter table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this Filter table entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+          If the Bridge Port table is supported, but none of its entries correspond to {{param|Interface}}, or if such an entry exists  but is disabled, {{param}} MUST NOT indicate {{enum|Enabled}}.
+          If the Bridge VLAN table is supported, but none of its entries correspond to {{param|VLANIDFilter}}, or if such an entry exists but is disabled, {{param}} MUST NOT indicate {{enum|Enabled}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Bridge" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference|a {{object|.Bridging.Bridge}} object in case of a 802.1D bridge or a {{object|.Bridging.Bridge.{i}.VLAN}} object in case of a 802.1Q bridge}}  Note: either way, this identifies the bridge (because each bridge has a VLAN table).
+          Defines the Bridge or Bridge VLAN to which ingress frames will be classified based upon matches of the classification criteria.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Bridge. #.Bridge.{i}.VLAN." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.0">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each ingress frame on the {{param|Interface}}, the highest ordered entry that matches the filter criteria is applied. All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value.  A deletion causes {{param}} values to be compacted.  When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}  This MUST relate to the same bridge as does {{param|Bridge}}.
+          Defines the Bridge Port on which ingress frame classification will occur.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Bridge.{i}.Port." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DHCPType" access="readWrite" dmr:version="2.2">
+        <description>
+          The DHCP protocol associated with the {{object}} instance. Affects only parameters that specify DHCP option values as filter criteria (all such parameter descriptions note this fact).  {{enum}}
+          If {{param}} is {{enum|DHCPv4}}, then {{object}} parameters that are DHCPv6-specific are ignored. If {{param}} is {{enum|DHCPv6}}, then {{object}} parameters that are DHCPv4-specific are ignored.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv4"/>
+            <enumeration value="DHCPv6"/>
+          </string>
+          <default type="object" value="DHCPv4"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          The 802.1Q {{bibref|802.1Q-2011}} VLAN ID.
+          For an 802.1D {{bibref|802.1D-2004}} Bridge, which has no concept of VLANs, the VLAN ID MUST be ''0''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="4094"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthertypeFilterList" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          {{list}} Each list item represents an Ethertype value.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on  Ethertype.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <unsignedInt/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="EthertypeFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge is defined to admit only those packets that match one of the {{param|EthertypeFilterList}} entries (in either the Ethernet or SNAP Type header).  If the {{param|EthertypeFilterList}} is empty, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge is defined to admit all packets except those  packets that match one of the {{param|EthertypeFilterList}} entries (in either the Ethernet or SNAP Type header).  If the  {{param|EthertypeFilterList}} is empty, packets are admitted regardless of Ethertype.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on  Ethertype.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACAddressFilterList" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          {{list|each representing a MAC Address}}
+          Each list entry MAY optionally specify a bit-mask, where matching of a packet's MAC address is only to be done for bit positions set  to one in the mask.  If no mask is specified, all bits of the MAC Address are to be used for matching.
+          For example, the list might be: ''01:02:03:04:05:06, 1:22:33:00:00:00/FF:FF:FF:00:00:00, 88:77:66:55:44:33''
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC  address.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="512"/>
+          </list>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACAddressFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets  whose source MAC Address matches one of the {{param|SourceMACAddressFilterList}} entries.  If the  {{param|SourceMACAddressFilterList}} is empty, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose  source MAC Address matches one of the {{param|SourceMACAddressFilterList}} entries.  If the {{param|SourceMACAddressFilterList}} is empty, packets are admitted regardless of MAC address.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC  address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACAddressFilterList" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          {{list}} Each list item specifies a MAC Address. List items MAY optionally specify a bit-mask after the MAC Address, where matching  of a packet's MAC address is only to be done for bit positions set to one in the mask.  If no mask is specified, all bits of the MAC  Address are to be used for matching.
+          For example, the list might be: ''01:02:03:04:05:06, 1:22:33:00:00:00/FF:FF:FF:00:00:00, 88:77:66:55:44:33''
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="512"/>
+          </list>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACAddressFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets  whose destination MAC Address matches one of the {{param|DestMACAddressFilterList}} entries.  If the  {{param|DestMACAddressFilterList}} is empty, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose  destination MAC Address matches one of the {{param|DestMACAddressFilterList}} entries.  If the {{param|DestMACAddressFilterList}} is  empty, packets are admitted regardless of MAC address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromVendorClassIDFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply. A device is considered matching if its DHCPv4 Vendor Class Identifier (Option 60 as defined in {{bibref|RFC2132}}) in the most recent DHCP lease acquisition or renewal matches the specified value according to the match criterion in {{param|SourceMACFromVendorClassIDMode}}. Case sensitive.
+          This is a normal string, e.g. "abc" is represented as "abc" and not "616263" hex. However, if the value includes non-printing characters then such characters have to be represented using XML escapes, e.g. #x0a for line-feed.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC address.
+          Note: This parameter is DHCPv4-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv4|DHCPType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromVendorClassIDFilterv6" access="readWrite" dmr:version="2.2">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply. A device is considered matching if the most recent DHCPv6 Vendor Class Identifier (Option 16 as defined in {{bibref|RFC3315}}) was equal to the specified value. The option value is binary, so an exact match is REQUIRED.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC address.
+          Note: This parameter is DHCPv6-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv6|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromVendorClassIDFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets whose source MAC Address matches that of a LAN device previously identified as described in {{param|SourceMACFromVendorClassIDFilter}} (for {{enum|DHCPv4|DHCPType}}) or {{param|SourceMACFromVendorClassIDFilterv6}} (for {{enum|DHCPv6|DHCPType}}). If this corresponding filter parameter is {{empty}}, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose source MAC Address matches that of a LAN device previously identified as described in {{param|SourceMACFromVendorClassIDFilter}} (for {{enum|DHCPv4|DHCPType}}) or {{param|SourceMACFromVendorClassIDFilterv6}} (for {{enum|DHCPv6|DHCPType}}). If this corresponding filter parameter is {{empty}}, packets are admitted regardless of MAC address.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC address
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromVendorClassIDMode" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|SourceMACFromVendorClassIDFilter}} pattern match criterion.  {{enum}}
+          For example, if {{param|SourceMACFromVendorClassIDFilter}} is "Example" then an Option 60 value of "Example device" will match with this parameter values of {{enum|Prefix}} or {{enum|Substring}}, but not with {{enum|Exact}} or {{enum|Suffix}}.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC  address.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Exact"/>
+            <enumeration value="Prefix"/>
+            <enumeration value="Suffix"/>
+            <enumeration value="Substring"/>
+          </string>
+          <default type="object" value="Exact"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromVendorClassIDFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply.  A device is considered matching if its DHCPv4 Vendor Class Identifier (Option 60 as defined in {{bibref|RFC2132}}) in the most recent DHCP lease acquisition or renewal matches the specified value according to the match criterion in {{param|DestMACFromVendorClassIDMode}}. Case sensitive.
+          This is a normal string, e.g. "abc" is represented as "abc" and not say "616263" hex. However, if the value includes non-printing characters then such characters have to be represented using XML escapes, e.g. #x0a for line-feed.
+          Note: This parameter is DHCPv4-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv4|DHCPType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromVendorClassIDFilterv6" access="readWrite" dmr:version="2.2">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply. A device is considered matching if the most recent DHCPv6 Vendor Class Identifier (Option 16 as defined in {{bibref|RFC3315}}) was equal to the specified value. The option value is binary, so an exact match is REQUIRED.
+          Note: This parameter is DHCPv6-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv6|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromVendorClassIDFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets whose destination MAC Address matches that of a LAN device previously identified as described in {{param|DestMACFromVendorClassIDFilter}} (for {{enum|DHCPv4|DHCPType}}) or {{param|DestMACFromVendorClassIDFilterv6}} (for {{enum|DHCPv6|DHCPType}}). If this corresponding filter parameter is {{empty}}, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose destination MAC Address matches that of a LAN device previously identified as described in {{param|DestMACFromVendorClassIDFilter}} (for {{enum|DHCPv4|DHCPType}}) or {{param|DestMACFromVendorClassIDFilterv6}} (for {{enum|DHCPv6|DHCPType}}). If this corresponding filter parameter is {{empty}}, packets are admitted regardless of MAC address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromVendorClassIDMode" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|DestMACFromVendorClassIDFilter}} pattern match criterion.  {{enum}}
+          For example, if {{param|DestMACFromVendorClassIDFilter}} is ''Example'' then an Option 60 value of "Example device" will match with  {{param}} values of {{enum|Prefix}} or {{enum|Substring}}, but not with {{enum|Exact}} or {{enum|Suffix}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Exact"/>
+            <enumeration value="Prefix"/>
+            <enumeration value="Suffix"/>
+            <enumeration value="Substring"/>
+          </string>
+          <default type="object" value="Exact"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromClientIDFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply. A device is considered matching if the most recent DHCP Client Identifier (via DHCP lease acquisition or renewal for DHCPv4) was equal to the specified value. The DHCP Client Identifier is Option 61 (as defined in {{bibref|RFC2132}}) for {{enum|DHCPv4|DHCPType}}, or is Option 1 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC address.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+          Note: DHCPv6 Option 1 (Client Identifier) is sometimes referred to as ''DUID''.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromClientIDFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets  whose source MAC Address matches that of a LAN device previously identified as described in {{param|SourceMACFromClientIDFilter}}.   If {{param|SourceMACFromClientIDFilter}} is {{empty}}, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose  source MAC Address matches that of a LAN device previously identified as described in {{param|SourceMACFromClientIDFilter}}.  If the  {{param|SourceMACFromClientIDFilter}} is {{empty}}, packets are admitted regardless of MAC address.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC  address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromClientIDFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply. A device is considered matching if the most recent DHCP Client Identifier (via DHCP lease acquisition or renewal for DHCPv4) was equal to the specified value. The DHCP Client Identifier is Option 61 (as defined in {{bibref|RFC2132}}) for {{enum|DHCPv4|DHCPType}}, or is Option 1 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+          Note: DHCPv6 Option 1 (Client Identifier) is sometimes referred to as ''DUID''.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromClientIDFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets whose destination MAC Address matches that of a LAN device previously identified as described in {{param|DestMACFromClientIDFilter}}.   If {{param|DestMACFromClientIDFilter}} is {{empty}}, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose destination MAC Address matches that of a LAN device previously identified as described in {{param|DestMACFromClientIDFilter}}.  If  the {{param|DestMACFromClientIDFilter}} is {{empty}}, packets are admitted regardless of MAC address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromUserClassIDFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply. A device is considered matching if the most recent DHCP User Class Identifier (via DHCP lease acquisition or renewal for DHCPv4) was equal to the specified value. The DHCP User Class Identifier is Option 77 (as defined in {{bibref|RFC3004}}) for {{enum|DHCPv4|DHCPType}}, or is Option 15 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC address.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromUserClassIDFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets whose source MAC Address matches that of a LAN device previously identified as described in {{param|SourceMACFromUserClassIDFilter}}.  If {{param|SourceMACFromUserClassIDFilter}} is {{empty}}, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose source MAC Address matches that of a LAN device previously identified as described in {{param|SourceMACFromUserClassIDFilter}}.  If the {{param|SourceMACFromUserClassIDFilter}} is {{empty}}, packets are admitted regardless of MAC address.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromUserClassIDFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply. A device is considered matching if the most recent DHCP User Class Identifier (via DHCP lease acquisition or renewal for DHCPv4) was equal to the specified value. The DHCP User Class Identifier is Option 77 (as defined in {{bibref|RFC3004}}) for {{enum|DHCPv4|DHCPType}}, or is Option 15 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromUserClassIDFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets whose destination MAC Address matches that of a LAN device previously identified as described in {{param|DestMACFromUserClassIDFilter}}.  If {{param|DestMACFromUserClassIDFilter}} is {{empty}}, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose destination MAC Address matches that of a LAN device previously identified as described in {{param|DestMACFromUserClassIDFilter}}.  If the {{param|DestMACFromUserClassIDFilter}} is {{empty}}, packets are admitted regardless of MAC address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIP" access="readWrite" dmr:version="2.6">
+        <description>
+          Classification criterion.
+          Destination IP address.  {{empty}} indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMask" access="readWrite" dmr:version="2.6">
+        <description>
+          Destination IP address mask, represented as an IP routing prefix using CIDR notation [RFC4632]. The IP address part MUST be {{empty}} (and, if specified, MUST be ignored).
+        </description>
+        <syntax>
+          <dataType ref="IPPrefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIPExclude" access="readWrite" dmr:version="2.6">
+        <description>
+          If {{false}}, the class includes only those packets that match the (masked) DestIP entry, if specified.
+          If {{true}}, the class includes all packets except those that match the (masked) DestIP entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIP" access="readWrite" dmr:version="2.6">
+        <description>
+          Classification criterion.
+          Source IP address. {{empty}} indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMask" access="readWrite" dmr:version="2.6">
+        <description>
+          Source IP address mask, represented as an IP routing prefix using CIDR notation [RFC4632]. The IP address part MUST be an empty string (and, if specified, MUST be ignored).
+        </description>
+        <syntax>
+          <dataType ref="IPPrefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIPExclude" access="readWrite" dmr:version="2.6">
+        <description>
+          If {{false}}, the class includes only those packets that match the (masked) {{param|SourceIP}} entry, if  specified.
+          If {{true}}, the class includes all packets except those that match the (masked) {{param|SourceIP}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.6">
+        <description>
+          Classification criterion.
+          Protocol number.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="255"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolExclude" access="readWrite" dmr:version="2.6">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|Protocol}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|Protocol}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPort" access="readWrite" dmr:version="2.6">
+        <description>
+          Classification criterion.
+          Destination port number.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortRangeMax" access="readWrite" dmr:version="2.6">
+        <description>
+          Classification criterion.
+          If specified, indicates the classification criterion is to include the port range from {{param|DestPort}} through {{param}} (inclusive).  If specified, {{param}} MUST be greater than or equal to {{param|DestPort}}.
+          A value of -1 indicates that no port range is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortExclude" access="readWrite" dmr:version="2.6">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|DestPort}} entry (or port range), if  specified.
+          If {{true}}, the class includes all packets except those that match the {{param|DestPort}} entry (or port range), if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePort" access="readWrite" dmr:version="2.6">
+        <description>
+          Classification criterion.
+          Source port number.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortRangeMax" access="readWrite" dmr:version="2.6">
+        <description>
+          Classification criterion.
+          If specified, indicates the classification criterion is to include the port range from {{param|SourcePort}} through {{param}} (inclusive).  If specified, {{param}} MUST be greater than or equal to SourcePort.
+          A value of -1 indicates that no port range is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortExclude" access="readWrite" dmr:version="2.6">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|SourcePort}} entry (or port range), if  specified.
+          If {{true}}, the class includes all packets except those that match the {{param|SourcePort}} entry (or port range), if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.ProviderBridge.{i}." access="readWrite" numEntriesParameter="ProviderBridgeNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        Provider Bridge table.
+        A Provider Bridge is described in {{bibref|802.1Q-2011|section 5.10 Provider Bridge conformance}} as an entity that is comprised of one S-VLAN component and zero or more C-VLAN components. S-VLAN and C-VLAN components are modelled as instances of {{object|#.Bridge}} objects.
+        When {{param|Type}} is configured with value of {{enum|PE|Type}} VLAN tags from the S-VLAN component (outer of 2 VLAN tags) are stacked on top of the VLAN tag from the C-VLAN component (inner of 2 VLAN tags).
+        When {{param|Type}} is configured with value of {{enum|S-VLAN|Type}} only VLAN tags from the S-VLAN component are utilized.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables this {{object}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.7">
+        <description>
+          The status of this {{object}}. {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid. For example when the {{param|Type}} is configured with value of {{enum|PE|Type}} but {{param|CVLANcomponents}} is {{empty}}.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.7">
+        <description>
+          A non-volatile handle used to reference this instance. This parameter provides a mechanism for an ACS to label this instance for future reference. An initial unique value MUST be assigned when the CPE creates an instance of this object.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readWrite" dmr:version="2.7">
+        <description>
+          Selects the standard supported by this {{object}} table entry.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="S-VLAN">
+              <description>
+                Provider Bridge conforming to {{bibref|802.1Q-2011|5.10.1 S-VLAN Bridge conformance}}
+              </description>
+            </enumeration>
+            <enumeration value="PE">
+              <description>
+                Provider Bridge conforming to {{bibref|802.1Q-2011|5.10.2 Provider Edge Bridge conformance}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SVLANcomponent" access="readWrite" dmr:version="2.7">
+        <description>
+          {{reference|a {{object|#.Bridge}} instance that specifies the S-VLAN component for the {{object}}}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Bridge." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="CVLANcomponents" access="readWrite" dmr:version="2.7">
+        <description>
+          {{list}} {{reference|a {{object|#.Bridge}} instance that specifies a C-VLAN component for the {{object}}}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Bridge." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PPP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Point-to-Point Protocol {{bibref|RFC1661}}. This object contains the {{object|Interface}} table.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedNCPs" access="readOnly" dmr:version="2.2">
+        <description>
+          The Network Control Protocols (NCPs) that are supported by the device. {{enum}}
+          Note that {{enum|IPv6CP}} is an IPv6 capability.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="ATCP">
+              <description>
+                AppleTalk Control Protocol {{bibref|RFC1378}}
+              </description>
+            </enumeration>
+            <enumeration value="IPCP">
+              <description>
+                {{bibref|RFC1332}}
+              </description>
+            </enumeration>
+            <enumeration value="IPXCP">
+              <description>
+                {{bibref|RFC1552}}
+              </description>
+            </enumeration>
+            <enumeration value="NBFCP">
+              <description>
+                {{bibref|RFC2097}}
+              </description>
+            </enumeration>
+            <enumeration value="IPv6CP">
+              <description>
+                {{bibref|RFC5072}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PPP.Interface.{i}." access="readWrite" numEntriesParameter="InterfaceNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        PPP interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Reset" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, the device MUST tear down the existing PPP connection represented by this object and establish a new one.
+          The device MUST initiate the reset after completion of the current CWMP session.  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>
+        <syntax command="true">
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionStatus" access="readOnly" dmr:version="2.0">
+        <description>
+          Current status of the connection.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Unconfigured"/>
+            <enumeration value="Connecting"/>
+            <enumeration value="Authenticating"/>
+            <enumeration value="Connected"/>
+            <enumeration value="PendingDisconnect"/>
+            <enumeration value="Disconnecting"/>
+            <enumeration value="Disconnected"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastConnectionError" access="readOnly" dmr:version="2.0">
+        <description>
+          The cause of failure for the last connection setup attempt.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ERROR_NONE"/>
+            <enumeration value="ERROR_ISP_TIME_OUT"/>
+            <enumeration value="ERROR_COMMAND_ABORTED"/>
+            <enumeration value="ERROR_NOT_ENABLED_FOR_INTERNET"/>
+            <enumeration value="ERROR_BAD_PHONE_NUMBER"/>
+            <enumeration value="ERROR_USER_DISCONNECT"/>
+            <enumeration value="ERROR_ISP_DISCONNECT"/>
+            <enumeration value="ERROR_IDLE_DISCONNECT"/>
+            <enumeration value="ERROR_FORCED_DISCONNECT"/>
+            <enumeration value="ERROR_SERVER_OUT_OF_RESOURCES"/>
+            <enumeration value="ERROR_RESTRICTED_LOGON_HOURS"/>
+            <enumeration value="ERROR_ACCOUNT_DISABLED"/>
+            <enumeration value="ERROR_ACCOUNT_EXPIRED"/>
+            <enumeration value="ERROR_PASSWORD_EXPIRED"/>
+            <enumeration value="ERROR_AUTHENTICATION_FAILURE"/>
+            <enumeration value="ERROR_NO_DIALTONE"/>
+            <enumeration value="ERROR_NO_CARRIER"/>
+            <enumeration value="ERROR_NO_ANSWER"/>
+            <enumeration value="ERROR_LINE_BUSY"/>
+            <enumeration value="ERROR_UNSUPPORTED_BITSPERSECOND"/>
+            <enumeration value="ERROR_TOO_MANY_LINE_ERRORS"/>
+            <enumeration value="ERROR_IP_CONFIGURATION"/>
+            <enumeration value="ERROR_UNKNOWN"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AutoDisconnectTime" access="readWrite" dmr:version="2.0">
+        <description>
+          The time in {{units}} since the establishment of the connection after which connection termination is automatically initiated by the CPE.  This occurs irrespective of whether the connection is being used or not.  A value of 0 (zero) indicates that the connection is not to be shut down automatically.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="IdleDisconnectTime" access="readWrite" dmr:version="2.0">
+        <description>
+          The time in {{units}} that if the connection remains idle, the CPE automatically terminates the connection.  A  value of 0 (zero) indicates that the connection is not to be shut down automatically.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="WarnDisconnectDelay" access="readWrite" dmr:version="2.0">
+        <description>
+          Time in {{units}} the {{param|ConnectionStatus}} remains in the {{enum|PendingDisconnect|ConnectionStatus}} state  before transitioning to disconnecting state to drop the connection.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.0">
+        <description>
+          Username to be used for authentication.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.0">
+        <description>
+          Password to be used for authentication.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EncryptionProtocol" access="readOnly" dmr:version="2.0">
+        <description>
+          Describes the PPP encryption protocol.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="MPPE"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CompressionProtocol" access="readOnly" dmr:version="2.0">
+        <description>
+          Describes the PPP compression protocol.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="Van Jacobson">
+              <description>
+                {{bibref|RFC1332}}
+              </description>
+            </enumeration>
+            <enumeration value="STAC LZS">
+              <description>
+                {{bibref|RFC1974}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AuthenticationProtocol" access="readOnly" dmr:version="2.0">
+        <description>
+          Describes the PPP authentication protocol.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="PAP"/>
+            <enumeration value="CHAP"/>
+            <enumeration value="MS-CHAP"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxMRUSize" access="readWrite" dmr:version="2.0">
+        <description>
+          The maximum allowed size of frames sent from the remote peer.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="64" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="1500"/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentMRUSize" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current MRU in use over this connection.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="64" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionTrigger" access="readWrite" dmr:version="2.0">
+        <description>
+          Trigger used to establish the PPP connection.  {{enum}}
+          Note that the reason for a PPP connection becoming disconnected to begin with might be either external to the CPE, such as  termination by the BRAS or momentary disconnection of the physical interface, or internal to the CPE, such as use of the  {{param|IdleDisconnectTime}} and/or {{param|AutoDisconnectTime}} parameters in this object.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="OnDemand">
+              <description>
+                If this PPP connection is disconnected for any reason, it is to remain disconnected until the CPE has one  or more packets to communicate over this connection, at which time the CPE automatically attempts to reestablish the  connection.
+              </description>
+            </enumeration>
+            <enumeration value="AlwaysOn">
+              <description>
+                If this PPP connection is disconnected for any reason, the CPE automatically attempts to reestablish the  connection (and continues to attempt to reestablish the connection as long it remains disconnected).
+              </description>
+            </enumeration>
+            <enumeration value="Manual">
+              <description>
+                If this PPP connection is disconnected for any reason, it is to remain disconnected until the user of the  CPE explicitly instructs the CPE to reestablish the connection.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LCPEcho" access="readOnly" dmr:version="2.0">
+        <description>
+          PPP LCP Echo period in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LCPEchoRetry" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PPP LCP Echo retries within an echo period.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPCPEnable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables IPCP ({{bibref|RFC1332}}) on this interface.  If this parameter is present, {{enum|IPCP|#.SupportedNCPs}} MUST be included in {{param|#.SupportedNCPs}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6CPEnable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables IPv6CP ({{bibref|RFC5072}}) on this interface.  If this parameter is present, {{enum|IPv6CP|#.SupportedNCPs}} MUST be included in {{param|#.SupportedNCPs}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PPP.Interface.{i}.PPPoE." access="readOnly" minEntries="0" maxEntries="1" dmr:version="2.0">
+      <description>
+        PPPoE object that functionally groups PPPoE related parameters.
+        PPPoE is only applicable when the lower layer provides Ethernet frames, e.g. ATM with EoA, PTM, or anything else that supports an Ethernet MAC.
+      </description>
+      <parameter name="SessionID" access="readOnly" dmr:version="2.0">
+        <description>
+          Represents the PPPoE Session ID.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ACName" access="readWrite" dmr:version="2.0">
+        <description>
+          PPPoE Access Concentrator.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceName" access="readWrite" dmr:version="2.0">
+        <description>
+          PPPoE Service Name.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PPP.Interface.{i}.IPCP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        IP Control Protocol (IPCP) client object for this PPP interface {{bibref|RFC1332}}. {{object}} only applies to IPv4.
+      </description>
+      <parameter name="LocalIPAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The local IPv4 address for this connection received via IPCP.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteIPAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The remote IPv4 address for this connection received via IPCP.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DNSServers" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Items represent DNS Server IPv4 address(es) received via IPCP {{bibref|RFC1877}}.
+        </description>
+        <syntax>
+          <list maxItems="2"/>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="PassthroughEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the PPP Interface retrieved information is configured on the IP Interface stacked on top of this PPP Interface.
+          If {{true}}, the PPP Interface retrieved information is propagated to the parameters in the referenced {{param|PassthroughDHCPPool}} object, replacing any existing configuration (including ''MinAddress'', ''MaxAddress'', ''SubnetMask'', ''IPRouters'', and ''DNSServers'').
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PassthroughDHCPPool" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}When {{param}} is set to {{empty}}, {{param|PassthroughEnable}} MUST be set to {{false}} (i.e. passthrough can not be enabled without a pool reference specified).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".DHCPv4.Server.Pool." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PPP.Interface.{i}.IPv6CP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        IPv6 Control Protocol (IPv6CP) client object for this PPP interface {{bibref|RFC5072}}. {{object}} only applies to IPv6.
+      </description>
+      <parameter name="LocalInterfaceIdentifier" access="readOnly" dmr:version="2.2">
+        <description>
+          The interface identifier for the local end of the PPP link, negotiated using the IPv6CP ''Interface-Identifier'' option {{bibref|RFC5072|Section 4.1}}.
+          The identifier is represented as the rightmost 64 bits of an IPv6 address (the leftmost 64 bits MUST be zero and MUST be ignored by the recipient).
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteInterfaceIdentifier" access="readOnly" dmr:version="2.2">
+        <description>
+          The interface identifier for the remote end of the PPP link, negotiated using the IPv6CP ''Interface-Identifier'' option {{bibref|RFC5072|Section 4.1}}.
+          The identifier is represented as the rightmost 64 bits of an IPv6 address (the leftmost 64 bits MUST be zero and MUST be ignored by the recipient).
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PPP.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PPP.Interface.{i}.PPPoA." access="readOnly" minEntries="0" maxEntries="1" dmr:version="2.2">
+      <description>
+        PPPoA object that functionally groups PPPoA related parameters.
+        This object is OBSOLETED because it contains no standard parameters and its existence causes confusion.
+      </description>
+    </object>
+    <object name="Device.IP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        IP object that contains the {{object|Interface}}, {{object|ActivePort}}, and {{object|Diagnostics}} objects.
+      </description>
+      <parameter name="IPv4Capable" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the device is IPv4 capable.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables the IPv4 stack, and so the use of IPv4 on the device. This affects only layer 3 and above.
+          When {{false}}, IP interfaces that had been operationally up and passing IPv4 packets will now no longer be able to do so, and will be operationally down (unless also attached to an enabled IPv6 stack).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4Status" access="readOnly" dmr:version="2.2">
+        <description>
+          Indicates the status of the IPv4 stack.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6Capable" access="readOnly" dmr:version="2.2">
+        <description>
+          Indicates whether the device is IPv6 capable.
+          Note: If {{false}}, it is expected that IPv6-related parameters, enumeration values, etc will not be implemented by the device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables the IPv6 stack, and so the use of IPv6 on the device. This affects only layer 3 and above.
+          When {{false}}, IP interfaces that had been operationally up and passing IPv6 packets will now no longer be able to do so, and will be operationally down (unless also attached to an enabled IPv4 stack).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6Status" access="readOnly" dmr:version="2.2">
+        <description>
+          Indicates the status of the IPv6 stack.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ULAPrefix" access="readWrite" dmr:version="2.2">
+        <description>
+          The ULA /48 prefix {{bibref|RFC4193|Section 3}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ActivePortNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Interface.{i}." access="readWrite" numEntriesParameter="InterfaceNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        IP interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). This table models the layer 3 IP interface.
+        Each IP interface can be attached to the IPv4 and/or IPv6 stack.  The interface's IP addresses and prefixes are listed in the {{object|IPv4Address}}, {{object|IPv6Address}} and {{object|IPv6Prefix}} tables.
+        Note that support for manipulating {{param|Loopback}} interfaces is OPTIONAL, so the implementation MAY choose not to create (or allow the ACS to create) {{object}} instances of type {{enum|Loopback|Type}}.
+        When the ACS administratively disables the interface, i.e. sets {{param|Enable}} to {{false}}, the interface's automatically-assigned IP addresses and prefixes MAY be retained.  When the ACS administratively enables the interface, i.e. sets {{param|Enable}} to {{true}}, these IP addresses and prefixes MUST be refreshed.  It's up to the implementation to decide exactly what this means: it SHOULD take all reasonable steps to refresh everything but if it is unable, for example, to refresh a prefix that still has a significant lifetime, it might well choose to retain rather than discard it.
+        Any {{enum|Tunneled|Type}} IP interface instances instantiated by the CPE MUST NOT have any statistics, writable parameters, IP addresses or IPv6 prefixes.  Any read-only parameters, e.g. {{param|Status}}, MUST return the same information as for the corresponding {{enum|Tunnel|Type}} interface.  The reason for these rules is that {{enum|Tunneled|Type}} IP interfaces exist only in order to be the targets of references (within the data model) and do not model any concepts over and above those already modeled by the {{enum|Tunnel|Type}} IP interfaces.
+        Note that {{enum|Tunnel|Type}} and {{enum|Tunneled|Type}} IP interfaces are part of a legacy mechanism that is only used for {{object|##.IPv6rd}}, {{object|##.DSLite}} and {{object|##.IPsec}} tunnels and MUST NOT be used in any other context.  For all other tunneling mechanisms {{enum|Normal|Type}} IP interfaces are stacked above technology-specific Tunnel Interfaces, e.g. above {{object|##.GRE.Tunnel.{i}.Interface}} or {{object|##.MAP.Domain.{i}.Interface}} objects.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface (regardless of {{param|IPv4Enable}} and {{param|IPv6Enable}}).
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          If set to {{true}}, attaches this interface to the IPv4 stack.  If set to {{false}}, detaches this interface from the IPv4 stack.
+          Once detached from the IPv4 stack, the interface will now no longer be able to pass IPv4 packets, and will be operationally down (unless also attached to an enabled IPv6 stack).
+          For an IPv4 capable device, if {{param}} is not present this interface SHOULD be permanently attached to the IPv4 stack.
+          Note that {{param}} is independent of {{param|Enable}}, and that to administratively enable an interface for IPv4 it is necessary for both {{param|Enable}} and {{param}} to be {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          If set to {{true}}, attaches this interface to the IPv6 stack.  If set to {{false}}, detaches this interface from the IPv6 stack.
+          Once detached from the IPv6 stack, the interface will now no longer be able to pass IPv6 packets, and will be operationally down (unless also attached to an enabled IPv4 stack).
+          For an IPv6 capable device, if {{param}} is not present this interface SHOULD be permanently attached to the IPv6 stack.
+          Note that {{param}} is independent of {{param|Enable}}, and that to administratively enable an interface for IPv6 it is necessary for both {{param|Enable}} and {{param}} to be {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ULAEnable" access="readWrite" dmr:version="2.2">
+        <description>
+          Controls whether or not ULAs {{bibref|RFC4193}} are generated and used on this interface.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          {{param}} MUST be {{empty}} and read-only when {{param|Type}} is {{enum|Loopback|Type}}, {{enum|Tunnel|Type}}, or {{enum|Tunneled|Type}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Router" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The ''Router'' instance that is associated with this IP Interface entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".Routing.Router." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Reset" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, the device MUST tear down the existing IP connection represented by this object and establish a new one.
+          The device MUST initiate the reset after completion of the current CWMP session.  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>
+        <syntax command="true">
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxMTUSize" access="readWrite" dmr:version="2.0">
+        <description>
+          The maximum transmission unit (MTU); the largest allowed size of an IP packet (including IP headers, but excluding lower layer headers such as Ethernet, PPP, or PPPoE headers) that is allowed to be transmitted by or through this device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="64" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.0">
+        <description>
+          IP interface type. {{enum}}
+          For {{enum|Loopback}}, {{enum|Tunnel}}, and {{enum|Tunneled}} IP interface objects, the {{param|LowerLayers}} parameter MUST be {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Normal"/>
+            <enumeration value="Loopback"/>
+            <enumeration value="Tunnel">
+              <description>
+                Only used with legacy ({{enum|Tunnel}},{{enum|Tunneled}}) IP interface pairs
+              </description>
+            </enumeration>
+            <enumeration value="Tunneled">
+              <description>
+                Only used with legacy ({{enum|Tunnel}},{{enum|Tunneled}}) IP interface pairs
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Normal"/>
+        </syntax>
+      </parameter>
+      <parameter name="Loopback" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, the IP interface becomes a loopback interface and the CPE MUST set {{param|Type}} to {{enum|Loopback|Type}}. In this case, the CPE MUST also set {{param|LowerLayers}} to {{empty}} and fail subsequent attempts at setting {{param|LowerLayers}} until the interface is no longer a loopback.
+          Support for manipulating loopback interfaces is OPTIONAL.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4AddressNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6AddressNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6PrefixNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoIPEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{true}}, enables auto-IP on the interface {{bibref|RFC3927}}. This mechanism is only used with IPv4.
+          When auto-IP is enabled on an interface, an {{object|IPv4Address}} object will dynamically be created and configured with auto-IP  parameter values. The exact conditions under which an auto-IP address is created (e.g. always when enabled or only in absence of  dynamic IP addressing) is implementation specific.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="TWAMPReflectorNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Interface.{i}.IPv4Address.{i}." access="readWrite" numEntriesParameter="IPv4AddressNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        IPv4 address table. Entries are auto-created and auto-deleted as IP addresses are added and deleted via DHCP, auto-IP, or IPCP. Static entries are created and configured by the ACS.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="IPAddress"/>
+        <parameter ref="SubnetMask"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this IPv4 address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this {{object}} table entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+          This parameter can only be modified if {{param|AddressingType}} is {{enum|Static|AddressingType}}.
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          IPv4 address.
+          This parameter can only be modified if the {{param|AddressingType}} is {{enum|Static|AddressingType}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="SubnetMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Subnet mask.
+          This parameter can only be modified if the {{param|AddressingType}} is {{enum|Static|AddressingType}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AddressingType" access="readOnly" dmr:version="2.0">
+        <description>
+          Addressing method used to assign the IP address. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCP"/>
+            <enumeration value="IKEv2">
+              <description>
+                Assigned by IKEv2 {{bibref|RFC5996}}.
+              </description>
+            </enumeration>
+            <enumeration value="AutoIP"/>
+            <enumeration value="IPCP"/>
+            <enumeration value="Static"/>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+          Note that IPv6 does not define broadcast addresses, so IPv6 packets will never cause this counter to increment.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+          Note that IPv6 does not define broadcast addresses, so IPv6 packets will never cause this counter to increment.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Interface.{i}.TWAMPReflector.{i}." access="readWrite" numEntriesParameter="TWAMPReflectorNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object contains parameters associated with the configuration that permits this interface to be used as Two-Way Active Measurement Protocol (TWAMP) reflector as defined in {{bibref|TR-390}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Port"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables the TWAMP reflector.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the TWAMP reflector.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Active"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.12">
+        <description>
+          The port used to listen for the TWAMP test packets.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="862"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumTTL" access="readWrite" dmr:version="2.12">
+        <description>
+          The maximum TTL of a received packet that this TWAMP reflector will reflect to the TWAMP controller.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="255"/>
+          </unsignedInt>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPAllowedList" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} List items represent source IP addresses and subnets from which test packets MUST always be received. {{empty}} list will allow test packets to be received from any source IP address.
+          Each entry in the list MUST be either an IP address, or an IP prefix specified using Classless Inter-Domain Routing (CIDR) notation {{bibref|RFC4632}}.
+          An IP prefix is specified as an IP address followed (with no intervening white space) by "/n", where ''n'' (the prefix size) is an integer in the range 0-32 (for IPv4) or 0-128 (for IPv6) that indicates the number of (leftmost) '1' bits of the prefix.
+          IPv4 example:
+          * 1.2.3.4 specifies a single IPv4 address, and 1.2.3.4/24 specifies a class C subnet with subnet mask 255.255.255.0.
+          * 1.2.0.0/22 represents the 1024 IPv4 addresses from 1.2.0.0 to 1.2.3.255.
+          IPv6 example:
+          * fec0::220:edff:fe6a:f76 specifies a single IPv6 address.
+          * 2001:edff:fe6a:f76::/64 represents the IPv6 addresses from 2001:edff:fe6a:f76:0:0:0:0 to 2001:edff:fe6a:f76:ffff:ffff:ffff:ffff.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="255"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="PortAllowedList" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} List items represent source port ranges from which test packets MUST always be received. {{empty}} list will allow test packets to be received from any source port.
+          Each entry in the list MUST be either a port number or a range of port numbers separated by a hypen (-).
+          For example, an entry with the value: '2-40' accepts test packets from any allowed source IP addresses with a source port between 2 and 40 inclusive. An entry of '3' accepts test packets from allow source IP addresses with a port of 3.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="255"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Interface.{i}.IPv6Address.{i}." access="readWrite" numEntriesParameter="IPv6AddressNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        This table contains the IP interface's IPv6 unicast addresses.  There MUST be an entry for each such address, including anycast addresses.
+        There are several ways in which entries can be added to and deleted from this table, including:
+        * Automatically via SLAAC {{bibref|RFC4862}}, which covers generation of link-local addresses (for all types of device) and global addresses (for non-router devices).
+        * Automatically via DHCPv6 {{bibref|RFC3315}}, which covers generation of any type of address (subject to the configured DHCP server policy).
+        * Manually via a GUI or some other local management interface.
+        * Manually via factory default configuration.
+        * By the ACS.
+        This table MUST NOT include entries for the Subnet-Router anycast address {{bibref|RFC4291|Section 2.6.1}}.  Such entries would be identical to others but with a zero interface identifier, and would add no value.
+        A loopback interface will always have address ''::1'' {{bibref|RFC4291|Section 2.5.3}} and MAY also have link-local address ''fe80::1''.
+        This object is based on ''ipAddressTable'' from {{bibref|RFC4293}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="IPAddress"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this {{object}} table entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddressStatus" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of {{param|IPAddress}}, indicating whether it can be used for communication.  See also {{param|PreferredLifetime}} and {{param|ValidLifetime}}.  {{enum}}
+          This parameter is based on ''ipAddressStatus'' and ''ipAddressStatusTC'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Preferred">
+              <description>
+                Valid address that can appear as the destination or source address of a packet.
+              </description>
+            </enumeration>
+            <enumeration value="Deprecated">
+              <description>
+                Valid but deprecated address that is not intended to be used as a source address.
+              </description>
+            </enumeration>
+            <enumeration value="Invalid">
+              <description>
+                Invalid address that is not intended to appear as the destination or source address of a packet.
+              </description>
+            </enumeration>
+            <enumeration value="Inaccessible">
+              <description>
+                Valid address that is not accessible because the interface to which it is assigned is not operational.
+              </description>
+            </enumeration>
+            <enumeration value="Unknown">
+              <description>
+                Address status cannot be determined for some reason.
+              </description>
+            </enumeration>
+            <enumeration value="Tentative">
+              <description>
+                The uniqueness of the address on the link is being verified.
+              </description>
+            </enumeration>
+            <enumeration value="Duplicate">
+              <description>
+                Invalid address that has been determined to be non-unique on the link.
+              </description>
+            </enumeration>
+            <enumeration value="Optimistic">
+              <description>
+                Valid address that is available for use, subject to restrictions, while its uniqueness on a link is being verified.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Invalid"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddress" access="readWrite" dmr:version="2.2">
+        <description>
+          IPv6 address.
+          This parameter can only be modified if the {{param|Origin}} is {{enum|Static|Origin}}.
+          This parameter is based on ''ipAddressAddr'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.2">
+        <description>
+          Mechanism via which the IP address was assigned.  {{enum}}
+          This parameter is based on ''ipOrigin'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AutoConfigured">
+              <description>
+                Automatically generated. For example, a link-local address as specified by SLAAC {{bibref|RFC4862|Section 5.3}}, a global address as specified by SLAAC {{bibref|RFC4862|Section 5.5}}, or generated via CPE logic (e.g. from delegated prefix as specified by {{bibref|RFC3633}}), or from ULA /48 prefix as specified by {{bibref|RFC4193}}.
+              </description>
+            </enumeration>
+            <enumeration value="DHCPv6">
+              <description>
+                Assigned by DHCPv6 {{bibref|RFC3315}}.
+              </description>
+            </enumeration>
+            <enumeration value="IKEv2">
+              <description>
+                Assigned by IKEv2 {{bibref|RFC5996}}.
+              </description>
+            </enumeration>
+            <enumeration value="MAP">
+              <description>
+                Assigned by MAP {{bibref|RFC7597}}, i.e. is this interface's ''MAP IPv6 address''
+              </description>
+            </enumeration>
+            <enumeration value="WellKnown">
+              <description>
+                Specified by a standards organization, e.g. the ''::1'' loopback address, which is defined in {{bibref|RFC4291}}.
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                For example, present in the factory default configuration (but not {{enum|WellKnown}}), created by the ACS, or created by some other management entity (e.g. via a GUI).
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+      <parameter name="Prefix" access="readWrite" dmr:version="2.2">
+        <description>
+          IPv6 address prefix.
+          Some addresses, e.g. addresses assigned via the DHCPv6 IA_NA option, are not associated with a prefix, and some {{enum|WellKnown|#.IPv6Prefix.{i}.Origin}} prefixes might not be modeled.  In both of these cases {{param}} will be {{null}}.
+          This parameter can only be modified if the {{param|Origin}} is {{enum|Static|Origin}}.
+          This parameter is based on ''ipAddressPrefix'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.IPv6Prefix." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredLifetime" access="readWrite" dmr:version="2.2">
+        <description>
+          The time at which this address will cease to be preferred (i.e. will become deprecated), or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+          This parameter can only be modified if the {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="9999-12-31T23:59:59Z"/>
+        </syntax>
+      </parameter>
+      <parameter name="ValidLifetime" access="readWrite" dmr:version="2.2">
+        <description>
+          The time at which this address will cease to be valid (i.e. will become invalid), or {{null}} if unknown. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+          This parameter can only be modified if the {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="9999-12-31T23:59:59Z"/>
+        </syntax>
+      </parameter>
+      <parameter name="Anycast" access="readWrite" dmr:version="2.2">
+        <description>
+          Indicates whether this is an anycast address {{bibref|RFC4291|Section 2.6}}.  Anycast addresses are syntactically identical to unicast addresses and so need to be configured explicitly.
+          This parameter can only be modified if the {{param|Origin}} is {{enum|Static|Origin}}.
+          This parameter is based on ''ipAddressType'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Interface.{i}.IPv6Prefix.{i}." access="readWrite" numEntriesParameter="IPv6PrefixNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        This table contains the interface's IPv6 prefixes.  There MUST be an entry for each such prefix, not only for prefixes learned from router advertisements.
+        There are several ways in which entries can be added to and deleted from this table, including:
+        * Automatically via {{bibref|RFC4861}} Router Advertisements.  See also {{object|.RouterAdvertisement}}.
+        * Automatically via DHCPv6 {{bibref|RFC3315}} prefix delegation {{bibref|RFC3633}}.  See also {{object|.DHCPv6.Client}}.
+        * Automatically via internal CPE logic, e.g. creation of child prefixes derived from a parent prefix.
+        * Manually via a GUI or some other local management interface.
+        * Manually via factory default configuration.
+        * By the ACS.
+        The CPE MAY choose not to create {{object}} entries for {{enum|WellKnown|Origin}} prefixes or for the ULA /48 prefix {{bibref|RFC4193}}. If an {{object}} entry exists for the ULA /48 prefix, it MUST be on a downstream interface (i.e. an interface for which the physical layer interface object has ''Upstream'' = {{false}}).
+        This object is based on ''ipAddressPrefixTable'' from {{bibref|RFC4293}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Prefix"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this {{object}} table entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="PrefixStatus" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of {{param|Prefix}}, indicating whether it can be used for communication.  See also {{param|PreferredLifetime}} and {{param|ValidLifetime}}.  {{enum}}
+          This parameter is based on ''ipAddressStatus'' and ''ipAddressStatusTC'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Preferred">
+              <description>
+                Valid prefix.
+              </description>
+            </enumeration>
+            <enumeration value="Deprecated">
+              <description>
+                Valid but deprecated prefix.
+              </description>
+            </enumeration>
+            <enumeration value="Invalid">
+              <description>
+                Invalid prefix.
+              </description>
+            </enumeration>
+            <enumeration value="Inaccessible">
+              <description>
+                Valid prefix that is not accessible because the interface to which it is assigned is not operational.
+              </description>
+            </enumeration>
+            <enumeration value="Unknown">
+              <description>
+                Prefix status cannot be determined for some reason.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Invalid"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Prefix" access="readWrite" dmr:version="2.2">
+        <description>
+          IPv6 address prefix.
+          This parameter can only be modified if the {{param|Origin}} is {{enum|Static|Origin}}.
+          This parameter is based on ''ipAddressPrefixPrefix'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.2">
+        <description>
+          Mechanism via which the prefix was assigned or most recently updated. {{enum}}
+          Note that:
+          * {{enum|PrefixDelegation}} and {{enum|RouterAdvertisement}} prefixes can exist only on upstream interfaces (i.e. interfaces for which the physical layer interface object has ''Upstream'' = {{true}}),
+          * {{enum|AutoConfigured}} and {{enum|WellKnown}} prefixes can exist on any interface, and
+          * {{enum|Static}} and {{enum|Child}} prefixes can exist only on downstream interfaces (i.e. interfaces for which the physical layer interface object has ''Upstream'' = {{false}}).
+          Also note that a {{enum|Child}} prefix's {{param|ParentPrefix}} will always be an {{enum|AutoConfigured}}, {{enum|PrefixDelegation}}, or {{enum|RouterAdvertisement}} prefix.
+          This parameter is based on ''ipAddressOrigin'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AutoConfigured">
+              <description>
+                Generated via internal CPE logic (e.g. the ULA /48 prefix) or derived from an internal prefix that is not modeled in any {{object}} table.
+              </description>
+            </enumeration>
+            <enumeration value="PrefixDelegation">
+              <description>
+                Delegated via DHCPv6 {{bibref|RFC3633}} or some other protocol, e.g. IPv6rd {{bibref|RFC5969}}.  Also see {{param|StaticType}}.
+              </description>
+            </enumeration>
+            <enumeration value="RouterAdvertisement">
+              <description>
+                Discovered via router advertisement {{bibref|RFC4861}} Prefix Information Option.
+              </description>
+            </enumeration>
+            <enumeration value="WellKnown">
+              <description>
+                Specified by a standards organization, e.g. ''fe80::/10'' for link-local addresses, or ''::1/128'' for the loopback address, both of which are defined in {{bibref|RFC4291}}.
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                Created by the ACS, by some other management entity (e.g. via a GUI), or present in the factory default configuration (but not {{enum|WellKnown}}).  Unrelated to any shorter length prefix that might exist on the CPE.  Also see {{param|StaticType}}.  Can be used for RA (Prefix Information), DHCPv6 address assignment (IA_NA) or DHCPv6 prefix delegation (IA_PD).
+              </description>
+            </enumeration>
+            <enumeration value="Child">
+              <description>
+                Derived from an associated {{enum|AutoConfigured}} or {{enum|PrefixDelegation}} parent prefix.  Also see {{param|StaticType}}, {{param|ParentPrefix}} and {{param|ChildPrefixBits}}.  Can be used for RA (Prefix Information), DHCPv6 address assignment (IA_NA) or DHCPv6 prefix delegation (IA_PD).
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+      <parameter name="StaticType" access="readWrite" dmr:version="2.2">
+        <description>
+          Static prefix sub-type.  For a {{enum|Static|Origin}} prefix, this can be set to {{enum|PrefixDelegation}} or {{enum|Child}}, thereby creating an unconfigured prefix of the specified type that will be populated in preference to creating a new instance.  This allows the ACS to pre-create "prefix slots" with known path names that can be referenced from elsewhere in the data model before they have been populated.  {{enum}}
+          This mechanism works as follows:
+          * When this parameter is set to {{enum|PrefixDelegation}} or {{enum|Child}}, the instance becomes a "prefix slot" of the specified type.
+          * Such an instance can be administratively enabled ({{param|Enable}} = {{true}}) but will remain operationally disabled ({{param|Status}} = {{enum|Disabled|Status}}) until it has been populated.
+          * When a new prefix of of type T is needed, the CPE will look for a matching unpopulated instance, i.e. an instance with ({{param|Origin}},{{param}},{{param|Prefix}}) = ({{enum|Static|Origin}},T,"").  If the CPE finds at least one such instance it will choose one and populate it.  If already administratively enabled it will immediately become operationally enabled.  If the CPE finds no such instances, it will create and populate a new instance with ({{param|Origin}},{{param}}) = (T,T).  If the CPE finds more than one such instance, the algorithm via which it chooses which instance to populate is implementation-specific.
+          * When a prefix that was populated via this mechanism becomes invalid, the CPE will reset {{param|Prefix}} to {{empty}}.  This does not affect the value of the {{param|Enable}} parameter.
+          The prefix {{param}} can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Static">
+              <description>
+                Prefix is a "normal" {{enum|Static|Origin}} prefix.
+              </description>
+            </enumeration>
+            <enumeration value="Inapplicable" access="readOnly">
+              <description>
+                Prefix is not {{enum|Static|Origin}}, so this parameter does not apply.
+              </description>
+            </enumeration>
+            <enumeration value="PrefixDelegation">
+              <description>
+                Prefix will be populated when a {{enum|PrefixDelegation|Origin}} prefix needs to be created.
+              </description>
+            </enumeration>
+            <enumeration value="Child">
+              <description>
+                Prefix will be populated when a {{enum|Child|Origin}} prefix needs to be created. In this case, the ACS needs also to set {{param|ParentPrefix}} and might want to set {{param|ChildPrefixBits}} (if parent prefix is not set, or goes away, then the child prefix will become operationally disabled).
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+      <parameter name="ParentPrefix" access="readWrite" dmr:version="2.2">
+        <description>
+          Indicates the parent prefix from which this prefix was derived. The parent prefix is relevant only for {{enum|Child|Origin}} prefixes and for {{enum|Static|Origin}} {{enum|Child|StaticType}} prefixes (both of which will always be on downstream interfaces), i.e. for {{param|Origin}}={{enum|Child|Origin}} and for ({{param|Origin}},{{param|StaticType}}) = ({{enum|Static|Origin}},{{enum|Child|StaticType}}) prefixes.
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}} (which makes sense only for a prefix whose {{param|StaticType}} is already or will be changed to {{enum|Child|StaticType}}).
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ChildPrefixBits" access="readWrite" dmr:version="2.2">
+        <description>
+          A prefix that specifies the length of {{enum|Static|Origin}} {{enum|Child|StaticType}} prefixes and how they are derived from their {{param|ParentPrefix}}. It will be used if and only if it is not {{empty}} and is longer than the parent prefix (if it is not used, derivation of such prefixes is implementation-specific).  Any bits to the right of the parent prefix are set to the bits in this prefix.
+          For example, for a parent prefix of fedc::/56, if this parameter had the value 123:4567:89ab:cdef::/64, the child /64 would be fedc:0:0:ef::/64.  For a parent prefix of fedc::/60, the child /64 would be fedc:0:0:f::/64.
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="OnLink" access="readWrite" dmr:version="2.2">
+        <description>
+          On-link flag {{bibref|RFC4861|Section 4.6.2}} as received (in the RA) for RouterAdvertisement.  Indicates whether this prefix can be used for on-link determination.
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+          This parameter is based on ''ipAddressPrefixOnLinkFlag'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Autonomous" access="readWrite" dmr:version="2.2">
+        <description>
+          Autonomous address configuration flag {{bibref|RFC4861|Section 4.6.2}} as received (in the RA) for RouterAdvertisement.  Indicates whether this prefix can be used for generating global addresses as specified by SLAAC {{bibref|RFC4862}}.
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+          This parameter is based on ''ipAddressPrefixAutonomousFlag'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredLifetime" access="readWrite" dmr:version="2.2">
+        <description>
+          This parameter is based on ''ipAddressPrefixAdvPreferredLifetime'' from {{bibref|RFC4293}}. The time at which this prefix will cease to be preferred (i.e. will become deprecated), or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="9999-12-31T23:59:59Z"/>
+        </syntax>
+      </parameter>
+      <parameter name="ValidLifetime" access="readWrite" dmr:version="2.2">
+        <description>
+          This parameter is based on ''ipAddressPrefixAdvValidLifetime'' from {{bibref|RFC4293}}.  The time at which this prefix will cease to be valid (i.e. will become invalid), or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="9999-12-31T23:59:59Z"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.ActivePort.{i}." access="readOnly" numEntriesParameter="ActivePortNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This table lists the ports on which TCP connections are listening or established.
+      </description>
+      <uniqueKey>
+        <parameter ref="LocalIPAddress"/>
+        <parameter ref="LocalPort"/>
+        <parameter ref="RemoteIPAddress"/>
+        <parameter ref="RemotePort"/>
+      </uniqueKey>
+      <parameter name="LocalIPAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          Connection local IP address.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="LocalPort" access="readOnly" dmr:version="2.0">
+        <description>
+          Connection local port.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteIPAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The remote IP address of the source of inbound packets.
+          This will be {{null}} for listening connections (only connections in {{enum|ESTABLISHED|Status}} state have remote addresses).
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemotePort" access="readOnly" dmr:version="2.0">
+        <description>
+          The remote port of the source of inbound packets.
+          This will be {{null}} for listening connections (only connections in {{enum|ESTABLISHED|Status}} state have remote addresses).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Current operational status of the connection. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="LISTEN"/>
+            <enumeration value="ESTABLISHED"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Diagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The IP Diagnostics object.
+      </description>
+      <parameter name="IPv4PingSupported" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates that Ping over IPv4 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6PingSupported" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates that Ping over IPv6 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4TraceRouteSupported" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates that TraceRoute over IPv4 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6TraceRouteSupported" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates that TraceRoute over IPv6 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4DownloadDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that Download Diagnostics over IPv4 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6DownloadDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that Download Diagnostics over IPv6 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4UploadDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that Upload Diagnostics over IPv4 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6UploadDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that Upload Diagnostics over IPv6 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4UDPEchoDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that UDPEcho Diagnostics over IPv4 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6UDPEchoDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that UDPEcho Diagnostics over IPv6 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4ServerSelectionDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that ServerSelection Diagnostics over IPv4 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6ServerSelectionDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that ServerSelection Diagnostics over IPv6 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Diagnostics.IPPing." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object provides access to an IP-layer ping test.
+      </description>
+      <parameter name="DiagnosticsState" access="readWrite" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="DiagnosticsState">
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Canceled" optional="true"/>
+            <enumeration value="Complete" access="readOnly"/>
+            <enumeration value="Error" access="readOnly" optional="true"/>
+            <enumeration value="Error_CannotResolveHostName" access="readOnly"/>
+            <enumeration value="Error_NoRouteToHost" access="readOnly">
+              <description>
+                The CPE can not reach the requested Ping host address
+              </description>
+            </enumeration>
+            <enumeration value="Error_Internal" access="readOnly"/>
+            <enumeration value="Error_Other" access="readOnly"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The layer 2 or layer 3 interface over which the test is to be performed. Example: ''Device.IP.Interface.1'', ''Device.Bridge.1.Port.2''
+          If {{empty}} is specified, the CPE MUST use the interface as directed by its bridging or routing policy (''Forwarding'' table entries) to determine the appropriate interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetParent=".IP.Interface. .Bridging.Bridge.{i}.Port." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolVersion" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates the IP protocol to be used.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Any">
+              <description>
+                Use either IPv4 or IPv6 depending on the system preference
+              </description>
+            </enumeration>
+            <enumeration value="IPv4">
+              <description>
+                Use IPv4 for the Ping requests
+              </description>
+            </enumeration>
+            <enumeration value="IPv6">
+              <description>
+                Use IPv6 for the Ping requests
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readWrite" dmr:version="2.0">
+        <description>
+          Host name or address of the host to ping.
+          In the case where {{param}} is specified by name, and the name resolves to more than one address, it is up to the device implementation to choose which address to use.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfRepetitions" access="readWrite" dmr:version="2.0">
+        <description>
+          Number of repetitions of the ping test to perform before reporting the results.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Timeout" access="readWrite" dmr:version="2.0">
+        <description>
+          Timeout in {{units}} for the ping test.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DataBlockSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Size of the data block in bytes to be sent for each ping.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DSCP" access="readWrite" dmr:version="2.0">
+        <description>
+          DiffServ codepoint to be used for the test packets.  By default the CPE SHOULD set this value to  zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="63"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddressUsed" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates which IP address was used to send the Ping request. The parameter is only valid if the {{param|DiagnosticsState}} is {{enum|Complete|DiagnosticsState}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessCount" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result parameter indicating the number of successful pings (those in which a successful response was received  prior to the timeout) in the most recent ping test.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FailureCount" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result parameter indicating the number of failed pings in the most recent ping test.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AverageResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result parameter indicating the average response time in {{units}} over all repetitions with successful  responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MinimumResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result parameter indicating the minimum response time in {{units}} over all repetitions with successful  responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result parameter indicating the maximum response time in {{units}} over all repetitions with successful  responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AverageResponseTimeDetailed" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          Result parameter indicating the average response time in {{units}} over all repetitions with successful responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MinimumResponseTimeDetailed" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          Result parameter indicating the minimum response time in {{units}} over all repetitions with successful responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumResponseTimeDetailed" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          Result parameter indicating the maximum response time in {{units}} over all repetitions with successful responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Diagnostics.TraceRoute." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object defines access to an IP-layer trace-route test for the specified IP interface.
+      </description>
+      <parameter name="DiagnosticsState" access="readWrite" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="DiagnosticsState">
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Canceled" optional="true"/>
+            <enumeration value="Complete" access="readOnly"/>
+            <enumeration value="Error" access="readOnly" optional="true"/>
+            <enumeration value="Error_CannotResolveHostName" access="readOnly"/>
+            <enumeration value="Error_NoRouteToHost" access="readOnly">
+              <description>
+                The CPE can not reach the requested TraceRoute host address
+              </description>
+            </enumeration>
+            <enumeration value="Error_MaxHopCountExceeded" access="readOnly"/>
+            <enumeration value="Error_Internal" access="readOnly"/>
+            <enumeration value="Error_Other" access="readOnly"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The layer 2 or layer 3 interface over which the test is to be performed. Example: ''Device.IP.Interface.1'', ''Device.Bridge.1.Port.2''
+          If {{empty}} is specified, the CPE MUST use the interface as directed by its bridging or routing policy (''Forwarding'' table entries) to determine the appropriate interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetParent=".IP.Interface. .Bridging.Bridge.{i}.Port." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolVersion" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates the IP protocol to be used.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Any">
+              <description>
+                Use either IPv4 or IPv6 depending on the system preference
+              </description>
+            </enumeration>
+            <enumeration value="IPv4">
+              <description>
+                Use IPv4 for the TraceRoute
+              </description>
+            </enumeration>
+            <enumeration value="IPv6">
+              <description>
+                Use IPv6 for the TraceRoute
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readWrite" dmr:version="2.0">
+        <description>
+          Host name or address of the host to find a route to.
+          In the case where {{param}} is specified by name, and the name resolves to more than one address, it is up to the device implementation to choose which address to use.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfTries" access="readWrite" dmr:version="2.0">
+        <description>
+          Number of tries per hop. Set prior to running Diagnostic.  By default, the CPE SHOULD set this value to  3.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="3"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Timeout" access="readWrite" dmr:version="2.0">
+        <description>
+          Timeout in {{units}} for each hop of the trace route test.  By default the CPE SHOULD set this value to 5000.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DataBlockSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Size of the data block in bytes to be sent for each trace route.  By default, the CPE SHOULD set this value to  38.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DSCP" access="readWrite" dmr:version="2.0">
+        <description>
+          DiffServ codepoint to be used for the test packets.  By default the CPE SHOULD set this value to  0.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="63"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxHopCount" access="readWrite" dmr:version="2.0">
+        <description>
+          The maximum number of hop used in outgoing probe packets (max TTL).  By default the CPE SHOULD set this value to  30.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="64"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddressUsed" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates which IP address was used for TraceRoute. The parameter is only valid if the {{param|DiagnosticsState}} is {{enum|Complete|DiagnosticsState}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result parameter indicating the response time in {{units}} the most recent trace route test.  If a route  could not be determined, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RouteHopsNumberOfEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Diagnostics.TraceRoute.RouteHops.{i}." access="readOnly" numEntriesParameter="RouteHopsNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:noUniqueKeys="true">
+      <description>
+        Contains the array of hop results returned. If a route could not be determined, this array will be empty
+      </description>
+      <parameter name="Host" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result parameter indicating the Host Name if DNS is able to resolve or IP Address of a hop along the discovered  route.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="HostAddress" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          If this parameter is not {{empty}} it will contain the last IP address of the host returned for this hop and the  {{param|Host}} will contain the Host Name returned from the reverse DNS query.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorCode" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Contains the error code returned for this hop. This code is directly from the ICMP CODE field.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTTimes" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Each list item contains one or more round trip times in {{units}} (one for each repetition) for this hop.
+          A list item of 0 indicates that the corresponding response was not received. Round trip times of less than 1 {{units}} MUST be rounded up to 1.
+          The number of list entries is determined by the value of {{param|#.NumberOfTries}}.
+        </description>
+        <syntax>
+          <list minItems="1" maxItems="3">
+            <size maxLength="16"/>
+          </list>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Diagnostics.DownloadDiagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object 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>
+      <parameter name="DiagnosticsState" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicate the availability of diagnostic data.  {{enum}}
+          If the ACS sets the value of this parameter to {{enum|Requested}}, the CPE MUST initiate the corresponding diagnostic test.  When writing, the only allowed value is {{enum|Requested}}.  To ensure the use of the proper test parameters (the writable parameters in this object), the test parameters MUST be set either prior to or at the same time as (in the same SetParameterValues) setting the {{param}} to {{enum|Requested}}.
+          When requested, the CPE SHOULD wait until after completion of the communication session with the ACS before starting the diagnostic.
+          When the test is completed, the value of this parameter MUST be either {{enum|Completed}} (if the test completed successfully), or one of the ''Error'' values listed above.
+          If the value of this parameter is anything other than {{enum|Completed}}, the values of the results parameters for this test are indeterminate.
+          When the diagnostic initiated by the ACS is completed (successfully or not), the CPE MUST establish a new connection to the ACS to allow the ACS to view the results, indicating the Event code ''8 DIAGNOSTICS COMPLETE'' in the Inform message.
+          After the diagnostic is complete, the value of all result parameters (all read-only parameters in this object) MUST be retained by the CPE until either this diagnostic is run again, or the CPE reboots.  After a reboot, if the CPE has not retained the result parameters from the most recent test, it MUST set the value of this parameter to {{enum|None}} and remove all object instances from {{object|PerConnectionResult}} and {{object|IncrementalResult}}.
+          Modifying any of the writable parameters in this object except for this one MUST result in the value of this parameter being set to {{enum|None}} and remove all object instances from {{object|PerConnectionResult}} and {{object|IncrementalResult}}.
+          While the test is in progress, modifying any of the writable parameters in this object except for this one MUST result in the test being terminated and the value of this parameter being set to {{enum|None}} and remove all object instances from {{object|PerConnectionResult}} and {{object|IncrementalResult}}.
+          While the test is in progress, setting this parameter to {{enum|Requested}} (and possibly modifying other writable parameters in this object) MUST result in the test being terminated and then restarted using the current values of the test parameters.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Completed" access="readOnly"/>
+            <enumeration value="Error_CannotResolveHostName" access="readOnly"/>
+            <enumeration value="Error_NoRouteToHost" access="readOnly"/>
+            <enumeration value="Error_InitConnectionFailed" access="readOnly"/>
+            <enumeration value="Error_NoResponse" access="readOnly"/>
+            <enumeration value="Error_TransferFailed" access="readOnly"/>
+            <enumeration value="Error_PasswordRequestFailed" access="readOnly"/>
+            <enumeration value="Error_LoginFailed" access="readOnly"/>
+            <enumeration value="Error_NoTransferMode" access="readOnly"/>
+            <enumeration value="Error_NoPASV" access="readOnly"/>
+            <enumeration value="Error_IncorrectSize" access="readOnly"/>
+            <enumeration value="Error_Timeout" access="readOnly"/>
+            <enumeration value="Error_Internal" access="readOnly"/>
+            <enumeration value="Error_Other" access="readOnly"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The IP-layer interface over which the test is to be performed. Example: Device.IP.Interface.1
+          If {{empty}} is specified, the CPE MUST use the interface as directed by its routing policy (''Forwarding'' table entries) to determine the appropriate interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DownloadURL" access="readWrite" dmr:version="2.0">
+        <description>
+          The URL, as defined in {{bibref|RFC3986}}, for the CPE to perform the download on. This parameter MUST be in the form of a valid HTTP {{bibref|RFC2616}} or FTP {{bibref|RFC959}} URL.
+          * When using FTP transport, FTP binary transfer MUST be used.
+          * When using HTTP transport, persistent connections MUST be used and pipelining MUST NOT be used.
+          * When using HTTP transport the HTTP Authentication MUST NOT be used.
+          Note: For time based tests ({{param|TimeBasedTestDuration}} &gt; 0) the ACS MAY add a hint to duration of the test to the URL.  See {{bibref|TR-143a1|Section 4.3}} for more details.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DownloadTransports" access="readOnly" dmr:version="2.0">
+        <description>
+          Supported ''DownloadDiagnostics'' transport protocols for a CPE device.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="HTTP"/>
+            <enumeration value="FTP" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DownloadDiagnosticMaxConnections" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates the maximum number of connections that are supported by Download Diagnostics.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownloadDiagnosticsMaxIncrementalResult" access="readOnly" dmr:version="2.9">
+        <description>
+          The maximum number of rows in {{object|IncrementalResult}} that the CPE will store.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DSCP" access="readWrite" dmr:version="2.0">
+        <description>
+          The DiffServ code point for marking packets transmitted in the test.
+          The default value SHOULD be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="63"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriority" access="readWrite" dmr:version="2.0">
+        <description>
+          Ethernet priority code for marking packets transmitted in the test (if applicable).
+          The default value SHOULD be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimeBasedTestDuration" access="readWrite" dmr:version="2.9">
+        <description>
+          Controls time based testing {{bibref|TR-143a1|Section 4.3}}. When {{param}} &gt; 0, {{param}} is the duration in {{units}} of a time based test. If {{param}} is 0, the test is not based on time, but on the size of the file to be downloaded.  The default value SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="999"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimeBasedTestMeasurementInterval" access="readWrite" dmr:version="2.9">
+        <description>
+          The measurement interval duration in {{units}} for objects in {{object|IncrementalResult}} for a time based FTP/HTTP download test (when {{param|TimeBasedTestDuration}} &gt; 0).  The default value SHOULD be 0, which implies {{object|IncrementalResult}} collection is disabled.
+          For example if {{param|TimeBasedTestDuration}} is 90 seconds and {{param}} is 10 {{units}}, there will be 9 results in {{object|IncrementalResult}}, each with a 10 {{units}} duration.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="999"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimeBasedTestMeasurementOffset" access="readWrite" dmr:version="2.9">
+        <description>
+          This {{param}} works in conjunction with {{param|TimeBasedTestMeasurementInterval}} to allow the interval measurement to start a number of {{units}} after {{param|BOMTime}}. The test measurement interval in {{object|IncrementalResult}} starts at time {{param|BOMTime}} + {{param}} to allow for slow start window removal of file transfers.
+          This {{param}} is in {{units}}.  The default value SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolVersion" access="readWrite" dmr:version="2.9">
+        <description>
+          Indicates the IP protocol version to be used.  The default value SHOULD be {{enum|Any}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Any">
+              <description>
+                Use either IPv4 or IPv6 depending on the system preference.
+              </description>
+            </enumeration>
+            <enumeration value="IPv4">
+              <description>
+                Use IPv4 for the requests
+              </description>
+            </enumeration>
+            <enumeration value="IPv6">
+              <description>
+                Use IPv6 for the requests.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfConnections" access="readWrite" dmr:version="2.9">
+        <description>
+          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>
+      <parameter name="IPAddressUsed" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Indicates which IP address was used to send the request.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ROMTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Request time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the client sends the GET command.
+          * For FTP this is the time at which the client sends the RTRV command.
+          If multiple connections are used, then {{param}} is set to the earliest {{param}} across all connections.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="BOMTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Begin of transmission time in UTC, which MUST be specified to microsecond precision
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the first data packet is received.
+          * For FTP this is the time at which the client receives the first data packet on the data connection.
+          If multiple connections are used, then {{param}} is set to the earliest {{param}} across all connections.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EOMTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          End of transmission in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the last data packet is received.
+          * For FTP this is the time at which the client receives the last packet on the data connection.
+          If multiple connections are used, then {{param}} is set to the latest {{param}} across all connections.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TestBytesReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of {{units}} received during the FTP/HTTP transaction including FTP/HTTP headers, between {{param|BOMTime}} and {{param|EOMTime}} across all connections.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of {{units}} (at the IP layer) received on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesSent" access="readOnly" dmr:version="2.9">
+        <description>
+          The total number of {{units}} (at the IP layer) sent on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesSent on the {{param|Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TestBytesReceivedUnderFullLoading" access="readOnly" dmr:version="2.9">
+        <description>
+          The number of {{units}} of the test file received between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}} across all connections.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesReceivedUnderFullLoading" access="readOnly" dmr:version="2.9">
+        <description>
+          The total number of {{units}} (at the IP layer) received in between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}}.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|Interface}} object at the latest {{param|PerConnectionResult.{i}.BOMTime}} and at the earliest {{param|PerConnectionResult.{i}.EOMTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesSentUnderFullLoading" access="readOnly" dmr:version="2.9">
+        <description>
+          The total number of {{units}} (at the IP layer) sent between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}}.  This MAY be calculated by sampling Stats.bytesSent on the {{param|Interface}} object at the latest {{param|PerConnectionResult.{i}.BOMTime}} and at the earliest {{param|PerConnectionResult.{i}.EOMTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodOfFullLoading" access="readOnly" dmr:version="2.9">
+        <description>
+          The period of time in {{units}} between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}} of the test.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TCPOpenRequestTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Request time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the TCP socket open (SYN) was sent for the HTTP connection.
+          * For FTP this is the time at which the TCP socket open (SYN) was sent for the data connection.
+          Note: Interval of 1 microsecond SHOULD be supported.
+          If multiple connections are used, then {{param}} is set to the latest {{param}} across all connections.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TCPOpenResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Response time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the TCP ACK to the socket opening the HTTP connection was received.
+          * For FTP this is the time at which the TCP ACK to the socket opening the data connection was received.
+          Note: Interval of 1 microsecond SHOULD be supported.
+          If multiple connections are used, then {{param}} is set to the latest {{param}} across all connections.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="PerConnectionResultNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="EnablePerConnectionResults" access="readWrite" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The results must be returned in the {{object|PerConnectionResult}} table for every connection when set to {{true}}. The default value SHOULD be {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IncrementalResultNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Diagnostics.DownloadDiagnostics.PerConnectionResult.{i}." access="readOnly" numEntriesParameter="PerConnectionResultNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        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.  All instances are removed when {{param|#.DiagnosticsState}} is set to {{enum|Requested|#.DiagnosticsState}} or {{enum|None|#.DiagnosticsState}}.
+      </description>
+      <parameter name="ROMTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Request time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the client sends the GET command.
+          * For FTP this is the time at which the client sends the RTRV command.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="BOMTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Begin of transmission time in UTC, which MUST be specified to microsecond precision
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the first data packet is received.
+          * For FTP this is the time at which the client receives the first data packet on the data connection.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EOMTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          End of transmission in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the last data packet is received.
+          * For FTP this is the time at which the client receives the last packet on the data connection.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TestBytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The number of {{units}} of the test file received during the FTP/HTTP transaction including FTP/HTTP headers, between {{param|BOMTime}} and {{param|EOMTime}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The total number of {{units}} (at the IP layer) received on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|#.Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The total number of {{units}} (at the IP layer) sent on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesSent on the {{param|#.Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TCPOpenRequestTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Request time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the TCP socket open (SYN) was sent for the HTTP connection.
+          * For FTP this is the time at which the TCP socket open (SYN) was sent for the data connection.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TCPOpenResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Response time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the TCP ACK to the socket opening the HTTP connection was received.
+          * For FTP this is the time at which the TCP ACK to the socket opening the data connection was received.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Diagnostics.DownloadDiagnostics.IncrementalResult.{i}." access="readOnly" numEntriesParameter="IncrementalResultNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        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.  All instances are removed when {{param|#.DiagnosticsState}} is set to {{enum|Requested|#.DiagnosticsState}} or {{enum|None|#.DiagnosticsState}}.
+      </description>
+      <parameter name="TestBytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Change in the value of {{param|#.TestBytesReceivedUnderFullLoading}} between {{param|StartTime}} and {{param|EndTime}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesReceived" access="readOnly" dmr:version="2.9">
+        <description>
+          The total number of {{units}} (at the IP layer) received on the Interface between {{param|StartTime}} and {{param|EndTime}}.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|#.Interface}} object at {{param|StartTime}} and at {{param|EndTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesSent" access="readOnly" dmr:version="2.9">
+        <description>
+          The total number of {{units}} (at the IP layer) sent on the Interface between {{param|StartTime}} and {{param|EndTime}}.  This MAY be calculated by sampling Stats.bytesSent on the {{param|#.Interface}} object at {{param|StartTime}} and at {{param|EndTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="StartTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The start time of this interval which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EndTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The end time of this interval which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Diagnostics.UploadDiagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object 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>
+      <parameter name="DiagnosticsState" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicate the availability of diagnostic data.  {{enum}}
+          If the ACS sets the value of this parameter to {{enum|Requested}}, the CPE MUST initiate the corresponding diagnostic test.  When writing, the only allowed value is {{enum|Requested}}.  To ensure the use of the proper test parameters (the writable parameters in this object), the test parameters MUST be set either prior to or at the same time as (in the same SetParameterValues) setting the {{param}} to {{enum|Requested}}.
+          When requested, the CPE SHOULD wait until after completion of the communication session with the ACS before starting the diagnostic.
+          When the test is completed, the value of this parameter MUST be either {{enum|Completed}} (if the test completed successfully), or one of the ''Error'' values listed above.
+          If the value of this parameter is anything other than {{enum|Completed}}, the values of the results parameters for this test are indeterminate.
+          When the diagnostic initiated by the ACS is completed (successfully or not), the CPE MUST establish a new connection to the ACS to allow the ACS to view the results, indicating the Event code ''8 DIAGNOSTICS COMPLETE'' in the Inform message.
+          After the diagnostic is complete, the value of all result parameters (all read-only parameters in this object) MUST be retained by the CPE until either this diagnostic is run again, or the CPE reboots.  After a reboot, if the CPE has not retained the result parameters from the most recent test, it MUST set the value of this parameter to {{enum|None}} and remove all object instances from {{object||PerConnectionResult}} and {{object|IncrementalResult}}.
+          Modifying any of the writable parameters in this object except for this one MUST result in the value of this parameter being set to {{enum|None}} and remove all object instances from {{object|PerConnectionResult}} and {{object|IncrementalResult}}.
+          While the test is in progress, modifying any of the writable parameters in this object except for this one MUST result in the test being terminated and the value of this parameter being set to {{enum|None}} and remove all object instances from {{object|PerConnectionResult}} and {{object|IncrementalResult}}.
+          While the test is in progress, setting this parameter to {{enum|Requested}} (and possibly modifying other writable parameters in this object) MUST result in the test being terminated and then restarted using the current values of the test parameters.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Completed" access="readOnly"/>
+            <enumeration value="Error_CannotResolveHostName" access="readOnly"/>
+            <enumeration value="Error_NoRouteToHost" access="readOnly"/>
+            <enumeration value="Error_InitConnectionFailed" access="readOnly"/>
+            <enumeration value="Error_NoResponse" access="readOnly"/>
+            <enumeration value="Error_PasswordRequestFailed" access="readOnly"/>
+            <enumeration value="Error_LoginFailed" access="readOnly"/>
+            <enumeration value="Error_NoTransferMode" access="readOnly"/>
+            <enumeration value="Error_NoPASV" access="readOnly"/>
+            <enumeration value="Error_NoCWD" access="readOnly"/>
+            <enumeration value="Error_NoSTOR" access="readOnly"/>
+            <enumeration value="Error_NoTransferComplete" access="readOnly"/>
+            <enumeration value="Error_Timeout" access="readOnly"/>
+            <enumeration value="Error_Internal" access="readOnly"/>
+            <enumeration value="Error_Other" access="readOnly"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The IP-layer interface over which the test is to be performed. Example: Device.IP.Interface.1
+          If {{empty}} is specified, the CPE MUST use the interface as directed by its routing policy (''Forwarding'' table entries) to determine the appropriate interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UploadURL" access="readWrite" dmr:version="2.0">
+        <description>
+          The URL, as defined in {{bibref|RFC3986}}, for the CPE to Upload to. This parameter MUST be in the form of a valid HTTP {{bibref|RFC2616}} or FTP {{bibref|RFC959}} URL.
+          * When using FTP transport, FTP binary transfer MUST be used.
+          * When using HTTP transport, persistent connections MUST be used and pipelining MUST NOT be used.
+          * When using HTTP transport the HTTP Authentication MUST NOT be used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UploadTransports" access="readOnly" dmr:version="2.0">
+        <description>
+          Supported ''UploadDiagnostics'' transport protocols for a CPE device.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="HTTP"/>
+            <enumeration value="FTP" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UploadDiagnosticsMaxConnections" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates the maximum number of connections that are supported by Upload Diagnostics.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UploadDiagnosticsMaxIncrementalResult" access="readOnly" dmr:version="2.9">
+        <description>
+          The maximum number of rows in {{object|IncrementalResult}} that the CPE will store.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DSCP" access="readWrite" dmr:version="2.0">
+        <description>
+          DiffServ code point for marking packets transmitted in the test.
+          The default value SHOULD be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="63"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriority" access="readWrite" dmr:version="2.0">
+        <description>
+          Ethernet priority code for marking packets transmitted in the test (if applicable).
+          The default value SHOULD be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TestFileLength" access="readWrite" dmr:version="2.0">
+        <description>
+          The size of the file (in bytes) to be uploaded to the server.
+          The CPE MUST insure the appropriate number of bytes are sent.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TimeBasedTestDuration" access="readWrite" dmr:version="2.9">
+        <description>
+          Controls time based testing {{bibref|TR-143a1|Section 4.3}}. When {{param}} &gt; 0, {{param}} is the duration in {{units}} of a time based test. If {{param}} is 0, the test is not based on time, but on the size of the file to be uploaded.  The default value SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="999"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimeBasedTestMeasurementInterval" access="readWrite" dmr:version="2.9">
+        <description>
+          The measurement interval duration in {{units}} for objects in {{object|IncrementalResult}} for a time based FTP/HTTP upload test (when {{param|TimeBasedTestDuration}} &gt; 0).  The default value SHOULD be 0, which implies {{object|IncrementalResult}} collection is disabled.
+          For example if {{param|TimeBasedTestDuration}} is 90 seconds and {{param}} is 10 {{units}}, there will be 9 results in {{object|IncrementalResult}}, each with a 10 {{units}} duration.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="999"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TimeBasedTestMeasurementOffset" access="readWrite" dmr:version="2.9">
+        <description>
+          This {{param}} works in conjunction with {{param|TimeBasedTestMeasurementInterval}} and allows the interval measurement to start a number of {{units}} after {{param|BOMTime}}. The test measurement interval in  {{object|IncrementalResult}} starts at time {{param|BOMTime}} + {{param}} to allow for slow start window removal of file transfers.
+          This {{param}} is in {{units}}.  The default value SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolVersion" access="readWrite" dmr:version="2.9">
+        <description>
+          Indicates the IP protocol version to be used.  The default value SHOULD be {{enum|Any}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Any">
+              <description>
+                Use either IPv4 or IPv6 depending on the system preference.
+              </description>
+            </enumeration>
+            <enumeration value="IPv4">
+              <description>
+                Use IPv4 for the requests
+              </description>
+            </enumeration>
+            <enumeration value="IPv6">
+              <description>
+                Use IPv6 for the requests.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfConnections" access="readWrite" dmr:version="2.9">
+        <description>
+          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>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddressUsed" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates which IP address was used to send the request.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ROMTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Request time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the client sends the GET command.
+          * For FTP this is the time at which the client sends the RTRV command.
+          If multiple connections are used, then {{param}} is set to the earliest {{param}} across all connections.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="BOMTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Begin of transmission time in UTC, which MUST be specified to microsecond precision
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the first data packet is received.
+          * For FTP this is the time at which the client receives the first data packet on the data connection.
+          If multiple connections are used, then {{param}} is set to the earliest {{param}} across all connections.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EOMTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          End of transmission in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the last data packet is received.
+          * For FTP this is the time at which the client receives the last packet on the data connection.
+          If multiple connections are used, then {{param}} is set to the latest {{param}} across all connections.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TestBytesSent" access="readOnly" dmr:version="2.9">
+        <description>
+          The number of {{units}} of the test file sent during the FTP/HTTP transaction including FTP/HTTP headers, between {{param|BOMTime}} and {{param|EOMTime}} acrosss all connections.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesReceived" access="readOnly" dmr:version="2.9">
+        <description>
+          The total number of {{units}} (at the IP layer) received on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesSent" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of {{units}} (at the IP layer) sent on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesSent on the {{param|Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TestBytesSentUnderFullLoading" access="readOnly" dmr:version="2.9">
+        <description>
+          The number of {{units}} of the test file sent between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}} across all connections.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesReceivedUnderFullLoading" access="readOnly" dmr:version="2.9">
+        <description>
+          The total number of {{units}} (at the IP layer) received between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}} across all connections in the test.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|Interface}} object at the latest {{param|PerConnectionResult.{i}.BOMTime}} and at the earliest {{param|PerConnectionResult.{i}.EOMTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesSentUnderFullLoading" access="readOnly" dmr:version="2.9">
+        <description>
+          The total number of {{units}} (at the IP layer) sent between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}} across all connections in the test.  This MAY be calculated by sampling Stats.bytesSent on the {{param|Interface}} object at the latest {{param|PerConnectionResult.{i}.BOMTime}} and at the earliest {{param|PerConnectionResult.{i}.EOMTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodOfFullLoading" access="readOnly" dmr:version="2.9">
+        <description>
+          The period of time in {{units}} between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}} of the test.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TCPOpenRequestTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Request time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the TCP socket open (SYN) was sent for the HTTP connection.
+          * For FTP this is the time at which the TCP socket open (SYN) was sent for the data connection.
+          Note: Interval of 1 microsecond SHOULD be supported.
+          If multiple connections are used, then {{param}} is set to the latest {{param}} across all connections.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TCPOpenResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Response time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the TCP ACK to the socket opening the HTTP connection was received.
+          * For FTP this is the time at which the TCP ACK to the socket opening the data connection was received.
+          Note: Interval of 1 microsecond SHOULD be supported.
+          If multiple connections are used, then {{param}} is set to the latest {{param}} across all connections.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="PerConnectionResultNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="EnablePerConnectionResults" access="readWrite" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The results must be returned in the {{object|PerConnectionResult}} table for every connection when set to {{true}}. The default value SHOULD be {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IncrementalResultNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Diagnostics.UploadDiagnostics.PerConnectionResult.{i}." access="readOnly" numEntriesParameter="PerConnectionResultNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        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.  All instances are removed when {{param|#.DiagnosticsState}} is set to {{enum|Requested|#.DiagnosticsState}} or {{enum|None|#.DiagnosticsState}}.
+      </description>
+      <parameter name="ROMTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Request time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the client sends the GET command.
+          * For FTP this is the time at which the client sends the RTRV command.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="BOMTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Begin of transmission time in UTC, which MUST be specified to microsecond precision
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the first data packet is received.
+          * For FTP this is the time at which the client receives the first data packet on the data connection.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EOMTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          End of transmission in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the last data packet is received.
+          * For FTP this is the time at which the client receives the last packet on the data connection.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TestBytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The number of {{units}} of the test file sent during the FTP/HTTP transaction including FTP/HTTP headers, between {{param|BOMTime}} and {{param|EOMTime}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The total number of {{units}} (at the IP layer) received on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|#.Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The total number of {{units}} (at the IP layer) sent on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesSent on the {{param|#.Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TCPOpenRequestTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Request time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the TCP socket open (SYN) was sent for the HTTP connection.
+          * For FTP this is the time at which the TCP socket open (SYN) was sent for the data connection.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TCPOpenResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Response time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          * For HTTP this is the time at which the TCP ACK to the socket opening the HTTP connection was received.
+          * For FTP this is the time at which the TCP ACK to the socket opening the data connection was received.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Diagnostics.UploadDiagnostics.IncrementalResult.{i}." access="readOnly" numEntriesParameter="IncrementalResultNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        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.  All instances are removed when {{param|#.DiagnosticsState}} is set to {{enum|Requested|#.DiagnosticsState}} or {{enum|None|#.DiagnosticsState}}.
+      </description>
+      <parameter name="TestBytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Change in the value of {{param|#.TestBytesSent}} between {{param|StartTime}} and {{param|EndTime}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesReceived" access="readOnly" dmr:version="2.9">
+        <description>
+          The total number of {{units}} (at the IP layer) received on the Interface between {{param|StartTime}} and {{param|EndTime}}.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|#.Interface}} object at {{param|StartTime}} and at {{param|EndTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TotalBytesSent" access="readOnly" dmr:version="2.9">
+        <description>
+          The total number of {{units}} (at the IP layer) sent on the Interface between {{param|StartTime}} and {{param|EndTime}}.  This MAY be calculated by sampling Stats.bytesSent on the {{param|#.Interface}} object at {{param|StartTime}} and at {{param|EndTime}} and subtracting.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="StartTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The start time of this interval which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EndTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The end time of this interval which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Diagnostics.UDPEchoConfig." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object allows the CPE to be configured to perform the UDP Echo Service defined in {{bibref|RFC862}} and UDP Echo Plus Service defined in {{bibref|TR-143|Appendix A.1}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          MUST be enabled to receive UDP echo. When enabled from a disabled state all related timestamps, statistics and UDP Echo Plus counters are cleared.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference|IP-layer interface over which the CPE MUST listen and receive UDP echo requests on}}
+          The value of this parameter MUST be either a valid interface or {{empty}}.  An attempt to set this parameter to a different value MUST be rejected as an invalid parameter value.
+          If {{empty}} is specified, the CPE MUST listen and receive UDP echo requests on all interfaces.
+          Note: Interfaces behind a NAT MAY require port forwarding rules configured in the Gateway to enable receiving the UDP packets.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIPAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          The Source IP address of the UDP echo packet. The CPE MUST only respond to a UDP echo from this source IP address.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="UDPPort" access="readWrite" dmr:version="2.0">
+        <description>
+          The UDP port on which the UDP server MUST listen and respond to UDP echo requests.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="EchoPlusEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{true}} the CPE will perform necessary packet processing for UDP Echo Plus packets.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EchoPlusSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          {{true}} if UDP Echo Plus is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Incremented upon each valid UDP echo packet received.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsResponded" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Incremented for each UDP echo response sent.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The number of UDP received bytes including payload and UDP header after the UDPEchoConfig is enabled.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesResponded" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The number of UDP responded bytes, including payload and UDP header sent after the UDPEchoConfig is enabled.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TimeFirstPacketReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456,
+          The time that the server receives the first UDP echo packet after the UDPEchoConfig is enabled.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TimeLastPacketReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456
+          The time that the server receives the most recent UDP echo packet.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Diagnostics.UDPEchoDiagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object defines the diagnostics configuration for a UDP Echo test {{bibref|TR-143a1|Appendix A.1}} defined in {{bibref|RFC862}} or a UDP Echo Plus test defined in {{bibref|TR-143a1|Appendix A.1}}.
+      </description>
+      <parameter name="DiagnosticsState" access="readWrite" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Indicate the availability of diagnostic data. {{enum}}
+          If the ACS sets the value of this parameter to {{enum|Requested}}, the CPE MUST initiate the corresponding diagnostic test. When writing, the only allowed value is {{enum|Requested}}. To ensure the use of the proper test parameters (the writable parameters in this object), the test parameters MUST be set either prior to or at the same time as (in the same SetParameterValues) setting the {{param}} to {{enum|Requested}}.
+          When requested, the CPE SHOULD wait until after completion of the communication session with the ACS before starting the diagnostic. When the test is completed, the value of this parameter MUST be either {{enum|Completed}} (if the test completed successfully), or one of the ''Error'' values listed above.
+          If the value of this parameter is anything other than {{enum|Completed}}, the values of the results parameters for this test are indeterminate.
+          When the diagnostic initiated by the ACS is completed (successfully or not), the CPE MUST establish a new connection to the ACS to allow the ACS to view the results, indicating the Event code ''8 DIAGNOSTICS COMPLETE'' in the Inform message.
+          After the diagnostic is complete, the value of all result parameters (all read-only parameters in this object) MUST be retained by the CPE until either this diagnostic is run again, or the CPE reboots. After a reboot, if the CPE has not retained the result parameters from the most recent test, it MUST set the value of this parameter to {{enum|None}} and remove all object instances from {{object|IndividualPacketResult}}.
+          Modifying any of the writable parameters in this object except for this one MUST result in the value of this parameter being set to {{enum|None}} and remove all object instances from {{object|IndividualPacketResult}}.
+          While the test is in progress, modifying any of the writable parameters in this object except for this one MUST result in the test being terminated and the value of this parameter being set to {{enum|None}} and remove all object instances from {{object|IndividualPacketResult}}.
+          While the test is in progress, setting this parameter to {{enum|Requested}} (and possibly modifying other writable parameters in this object) MUST result in the test being terminated and then restarted using the current values of the test parameters.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Completed" access="readOnly"/>
+            <enumeration value="Error_CannotResolveHostName" access="readOnly"/>
+            <enumeration value="Error_Internal" access="readOnly"/>
+            <enumeration value="Error_Other" access="readOnly"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.9">
+        <description>
+          {{reference|the IP-layer interface over which the test is to be performed|ignore}} Example: Device.IP.Interface.1
+          If {{empty}} is specified, the CPE MUST use the interface as directed by its routing policy (''Forwarding'' table entries) to determine the appropriate interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".WANDevice.{i}.WANConnectionDevice.{i}.WANIPConnection. .WANDevice.{i}.WANConnectionDevice.{i}.WANPPPConnection. .IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readWrite" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Host name or address of the host to perform tests to.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Port on the host to perform tests to.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfRepetitions" access="readWrite" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Number of repetitions of the test to perform before reporting the results. The default value SHOULD be 1.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Timeout" access="readWrite" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Timeout in {{units}} for the test. That is, the amount of time to wait for the return of a packet that was sent to the {{param|Host}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DataBlockSize" access="readWrite" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Size of the data block in {{units}} to be sent for each packet.  The default value SHOULD be 24.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DSCP" access="readWrite" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          DiffServ codepoint to be used for the test packets. The default value SHOULD be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="63"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="InterTransmissionTime" access="readWrite" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The time in {{units}} between the {{param|NumberOfRepetitions}} of packets sent during a given test.  The default value SHOULD be 1000.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolVersion" access="readWrite" dmr:version="2.9">
+        <description>
+          Indicates the IP protocol version to be used.  The default value SHOULD be {{enum|Any}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Any">
+              <description>
+                Use either IPv4 or IPv6 depending on the system preference.
+              </description>
+            </enumeration>
+            <enumeration value="IPv4">
+              <description>
+                Use IPv4 for the requests
+              </description>
+            </enumeration>
+            <enumeration value="IPv6">
+              <description>
+                Use IPv6 for the requests.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddressUsed" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates which IP address was used to send the request.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessCount" access="readOnly" dmr:version="2.9">
+        <description>
+          Result parameter indicating the number of successful packets (those in which a successful response was received prior to the timeout) in the most recent test.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FailureCount" access="readOnly" dmr:version="2.9">
+        <description>
+          Result parameter indicating the number of failed packets (those in which a successful response was not received prior to the timeout) in the most recent test.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AverageResponseTime" access="readOnly" dmr:version="2.9">
+        <description>
+          Result parameter indicating the average response time in {{units}} over all repetitions with successful responses of the most recent test. If there were no successful responses, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MinimumResponseTime" access="readOnly" dmr:version="2.9">
+        <description>
+          Result parameter indicating the minimum response time in {{units}} over all repetitions with successful responses of the most recent test. If there were no successful responses, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumResponseTime" access="readOnly" dmr:version="2.9">
+        <description>
+          Result parameter indicating the maximum response time in {{units}} over all repetitions with successful responses of the most recent test. If there were no successful responses, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="EnableIndividualPacketResults" access="readWrite" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The results must be returned in the {{object|IndividualPacketResult}} table for every repetition of the test when set to {{true}}. The default value SHOULD be {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IndividualPacketResultNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UDPEchoDiagnosticsMaxResults" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The maximum number of rows in {{object|IndividualPacketResult}} that the CPE will store.  If a test would create more rows than {{param}} only the first {{param}} rows are present in {{object|IndividualPacketResult}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Diagnostics.UDPEchoDiagnostics.IndividualPacketResult.{i}." access="readOnly" numEntriesParameter="IndividualPacketResultNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        This object provides the results from individual UDPEchoPlus test packets collected during a test if {{param|#.EnableIndividualPacketResults}} is set to true.  When {{param|#.DiagnosticsState}} is set to {{enum|Completed|#.DiagnosticsState}} 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.  All instances are removed when {{param|#.DiagnosticsState}} is set to {{enum|Requested|#.DiagnosticsState}} or {{enum|None|#.DiagnosticsState}}.
+      </description>
+      <parameter name="PacketSuccess" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that the response to this UDP Echo Plus packet sent was received by the client. When this value is {{true}}, then all the remaining parameters in this instance are valid. Otherwise only the values originally set by the CPE client (e.g. {{param|PacketSendTime}} and {{param|TestGenSN}}) MAY be set to valid values.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketSendTime" access="readOnly" dmr:version="2.9">
+        <description>
+          Time the client sent this UDP Echo Plus packet in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketReceiveTime" access="readOnly" dmr:version="2.9">
+        <description>
+          Time the client receives the response packet in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456Z
+          If this response is never received, {{param}} SHOULD be set to the Unknown Time value as specified in {{bibref|TR-106a7|Section 3.2.2}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TestGenSN" access="readOnly" dmr:version="2.9">
+        <description>
+          The TestGenSN field in the UDPEcho Plus packet {{bibref|TR-143a1|Section A.1.4}} sent by the CPE client.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TestRespSN" access="readOnly" dmr:version="2.9">
+        <description>
+          The TestRespSN field in the response packet {{bibref|TR-143a1|Section A.1.4}} from the UDP Echo Plus server (i.e. {{param|#.Host}}) for this Echo Plus packet sent by the CPE client. If {{param|PacketSuccess}} is {{false}}, {{param}} SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TestRespRcvTimeStamp" access="readOnly" dmr:version="2.9">
+        <description>
+          The TestRespRcvTimeStamp field in the response packet {{bibref|TR-143a1|Section A.1.4}} from the UDP Echo Plus server (i.e. {{param|#.Host}}) to record the reception time of this UDP Echo Plus packet sent from the CPE client. If {{param|PacketSuccess}} is {{false}}, {{param}} SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TestRespReplyTimeStamp" access="readOnly" dmr:version="2.9">
+        <description>
+          The TestRespReplyTimeStamp field in the response packet {{bibref|TR-143a1|Section A.1.4}} from the UDP Echo Plus server (i.e. {{param|#.Host}}) to record the server reply time of this UDP Echo Plus packet sent from the CPE client.
+          That is, the time that the server returned the UDP Echo Plus packet. If {{param|PacketSuccess}} is {{false}}, {{param}} SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TestRespReplyFailureCount" access="readOnly" dmr:version="2.9">
+        <description>
+          The count value that was set by the UDP Echo Plus server (i.e. {{param|#.Host}}) to record the number of dropped echo response packets by the server. This count is incremented if a valid echo request packet is received at a UDP EchoPlus server but for some reason cannot be responded to (e.g. due to local buffer overflow, CPU utilization, etc...).  If {{param|PacketSuccess}} is {{false}}, {{param}} SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Diagnostics.ServerSelectionDiagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object 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>
+      <parameter name="DiagnosticsState" access="readWrite" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Indicates availability of diagnostic data.  {{enum}}
+          If the ACS sets the value of this parameter to {{enum|Requested}}, the CPE MUST initiate the corresponding diagnostic test.  When  writing, the only allowed value is {{enum|Requested}}.  To ensure the use of the proper test parameters (the writable parameters in  this object), the test parameters MUST be set either prior to or at the same time as (in the same SetParameterValues) setting the  {{param}} to {{enum|Requested}}.
+          When requested, the CPE SHOULD wait until after completion of the communication session with the ACS before starting the diagnostic.
+          When the test is completed, the value of this parameter MUST be either {{enum|Completed}} (if the test completed successfully), or one  of the ''Error'' values listed above.
+          If the value of this parameter is anything other than {{enum|Completed}}, the values of the results parameters for this test are  indeterminate.
+          When the diagnostic initiated by the ACS is completed (successfully or not), the CPE MUST establish a new connection to the ACS to  allow the ACS to view the results, indicating the Event code ''8 DIAGNOSTICS COMPLETE'' in the Inform message.
+          After the diagnostic is complete, the value of all result parameters (all read-only parameters in this object) MUST be retained by  the CPE until either this diagnostic is run again, or the CPE reboots.  After a reboot, if the CPE has not retained the result  parameters from the most recent test, it MUST set the value of this parameter to {{enum|None}}.
+          Modifying any of the writable parameters in this object except for this one MUST result in the value of this parameter being set to  {{enum|None}}.
+          While the test is in progress, modifying any of the writable parameters in this object except for this one MUST result in the test  being terminated and the value of this parameter being set to {{enum|None}}.
+          While the test is in progress, setting this parameter to {{enum|Requested}} (and possibly modifying other writable parameters in this  object) MUST result in the test being terminated and then restarted using the current values of the test parameters.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Completed" access="readOnly"/>
+            <enumeration value="Error_CannotResolveHostName" access="readOnly"/>
+            <enumeration value="Error_Internal" access="readOnly"/>
+            <enumeration value="Error_Other" access="readOnly"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.9">
+        <description>
+          {{reference|the IP-layer interface over which the test is to be performed|ignore}} Example: Device.IP.Interface.1
+          If {{empty}} is specified, the CPE MUST use the interface as directed by its routing policy (''Forwarding'' table entries) to determine the appropriate interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".WANDevice.{i}.WANConnectionDevice.{i}.WANIPConnection. .WANDevice.{i}.WANConnectionDevice.{i}.WANPPPConnection. .IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolVersion" access="readWrite" dmr:version="2.9">
+        <description>
+          Indicates the IP protocol version to be used.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Any">
+              <description>
+                Use either IPv4 or IPv6 depending on the system preference.
+              </description>
+            </enumeration>
+            <enumeration value="IPv4">
+              <description>
+                Use IPv4 for the requests.
+              </description>
+            </enumeration>
+            <enumeration value="IPv6">
+              <description>
+                Use IPv6 for the requests.
+              </description>
+            </enumeration>
+          </string>
+          <default type="factory" value="Any"/>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.9">
+        <description>
+          The protocol over which the test is to be performed.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ICMP"/>
+            <enumeration value="UDP Echo"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="HostList" access="readWrite" dmr:version="2.9">
+        <description>
+          Each entry is a Host name or address of a host to ping.
+        </description>
+        <syntax>
+          <list maxItems="10"/>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfRepetitions" access="readWrite" dmr:version="2.9">
+        <description>
+          Number of repetitions of the ping test to perform for each {{param|HostList}} entry before reporting the results.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Timeout" access="readWrite" dmr:version="2.9">
+        <description>
+          Timeout in {{units}} for each iteration of the ping test where the total number of iterations is the value of {{param|NumberOfRepetitions}} times the number of entities in the {{param|HostList}} Parameter.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FastestHost" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Result parameter indicating the Host (one of the items within the {{param|HostList}} Parameter) with the smallest average response time.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="MinimumResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Result parameter indicating the minimum response time in {{units}} over all repetitions with successful responses of the most recent ping test for the Host identified in {{param|FastestHost}}. Success is defined by the underlying protocol used.   If there were no successful responses across all Hosts, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AverageResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Result parameter indicating the average response time in {{units}} over all repetitions with successful responses of the most recent ping test for the Host identified in {{param|FastestHost}}. Success is defined by the underlying protocol used.   If there were no successful responses across all Hosts, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Result parameter indicating the maximum response time in {{units}} over all repetitions with successful responses of the most recent ping test for the Host identified in {{param|FastestHost}}. Success is defined by the underlying protocol used.   If there were no successful responses across all Hosts, this value MUST be zero.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddressUsed" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates which IP address was used to send the request to the host identified in {{param|FastestHost}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LLDP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object contains Link Layer Discovery Protocol (LLDP) {{bibref|802.1AB-2009}} related objects and parameters.
+      </description>
+    </object>
+    <object name="Device.LLDP.Discovery." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object is used for managing the discovery of LLDP devices.
+        The CPE MAY, but need not, retain some or all of the information in this object across reboot.
+      </description>
+      <parameter name="DeviceNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LLDP.Discovery.Device.{i}." access="readOnly" numEntriesParameter="DeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        This table contains information about discovered LLDP devices.
+      </description>
+      <uniqueKey>
+        <parameter ref="ChassisIDSubtype"/>
+        <parameter ref="ChassisID"/>
+      </uniqueKey>
+      <parameter name="Interface" access="readOnly" dmr:version="2.8">
+        <description>
+          {{reference|the interface via which the LLDP device was discovered}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ChassisIDSubtype" access="readOnly" dmr:version="2.8">
+        <description>
+          The chassis identifier subtype, which is included in the value of the ''LLDPDU's'' Chassis ID TLV (TLV Type = 1).  The following subtype values are defined:
+          * ''0'' (Reserved)
+          * ''1'' (Chassis component)
+          * ''2'' (Interface alias)
+          * ''3'' (Port component)
+          * ''4'' (MAC address)
+          * ''5'' (Network address)
+          * ''6'' (Interface name)
+          * ''7'' (Locally assigned)
+          * ''8-255'' (Reserved)
+          Note: It is assumed that this integer might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, the Chassis ID is set to the representative MAC address (chassis ID subtype = 4) for ''HTIP-Ethernet Bridge''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ChassisID" access="readOnly" dmr:version="2.8">
+        <description>
+          The chassis identifier, which is included in the value of the ''LLDPDU's'' Chassis ID TLV (TLV Type = 1).
+          Note: It is assumed that this string might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, the Chassis ID is set to the representative MAC address. If ''LLDPDU''s are sent and received from two or more LLDP agents of the same ''HTIP-Ethernet Bridge'', this value is same in all ''LLDPDU''s.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="1" maxLength="255"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.8">
+        <description>
+          {{list}}Indicates the full path names of all Host table entries, whether active or inactive, that correspond to this device.
+          When the entries are added to or removed from the Host tables, the value of this parameter MUST be updated accordingly.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".Hosts.Host." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PortNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LLDP.Discovery.Device.{i}.Port.{i}." access="readOnly" numEntriesParameter="PortNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        This table contains information about ports on discovered LLDP devices.
+      </description>
+      <uniqueKey>
+        <parameter ref="PortIDSubtype"/>
+        <parameter ref="PortID"/>
+      </uniqueKey>
+      <parameter name="PortIDSubtype" access="readOnly" dmr:version="2.8">
+        <description>
+          The port identifier subtype, which is included in the value of the ''LLDPDU's'' Port ID TLV (TLV Type = 2).  The following subtype values are defined:
+          * ''0'' (Reserved)
+          * ''1'' (Interface alias)
+          * ''2'' (Port component)
+          * ''3'' (MAC address)
+          * ''4'' (Network address)
+          * ''5'' (Interface name)
+          * ''6'' (Agent circuit ID)
+          * ''7'' (Locally assigned)
+          * ''8-255'' (Reserved)
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PortID" access="readOnly" dmr:version="2.8">
+        <description>
+          The port identifier, which is included in the value of the ''LLDPDU's'' Port ID TLV (TLV Type = 2).
+        </description>
+        <syntax>
+          <string>
+            <size minLength="1" maxLength="255"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TTL" access="readOnly" dmr:version="2.8">
+        <description>
+          The ''LLDPDU'' lifetime (in {{units}}), which is the value of the latest TimeToLive TLV (TLV Type = 3).
+          If this value is 0, it means that the LLDP agent or the MAC service function of the port is stopped.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PortDescription" access="readOnly" dmr:version="2.8">
+        <description>
+          The port description, which is the value of the latest Port Description TLV (TLV Type = 4), or {{empty}} if no Port Description TLV has been received.
+          Note: It is assumed that this string might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, the parameter value is likely to be one of the names defined in {{bibref|JJ-300.00|Appendix A (''List of Interface Standard Names'')}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddressList" access="readOnly" dmr:version="2.8">
+        <description>
+          The device's MAC addresses, which are included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127), or {{empty}} if no list of MAC addresses has been received.
+          The parameter is relevant when there is a LLDP device which has a MAC copy function and has two or more MAC addresses.
+          Note: It is assumed that it might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, the {{bibref|OUI}} in the third octet is E0271A (''TTC-OUI'') and the organizationally defined subtype in the sixth octet is 3 (''MAC Address List'').
+        </description>
+        <syntax>
+          <list maxItems="255"/>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" dmr:version="2.8">
+        <description>
+          The date and time at which the last LLDPDU was received for this ({{object|#}},{{object}}).
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LLDP.Discovery.Device.{i}.Port.{i}.LinkInformation." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        The port's link information, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127).
+        Note: It is assumed that this object might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, the {{bibref|OUI}} in the third octet is E0271A (''TTC-OUI'') and the organizationally defined subtype in the sixth octet is 2 (''Link Information'').
+      </description>
+      <parameter name="InterfaceType" access="readOnly" dmr:version="2.8">
+        <description>
+          The port's interface type, or 0 if no interface type has been received.
+          Note: It is assumed that it might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, it's an IANA interface type {{bibref|IANAifType}}.
+          For example, IANAifType defines the following interface types for wired line (UTP cable), wireless line, power line, and coaxial cable:
+          * ''6'' (Wired line)
+          * ''71'' (Wireless)
+          * ''174'' (PLC)
+          * ''236'' (Coaxial cable)
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MACForwardingTable" access="readOnly" dmr:version="2.8">
+        <description>
+          The port's MAC forwarding table, or the value is {{empty}} if no forwarding table was supplied.
+        </description>
+        <syntax>
+          <list maxItems="255"/>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LLDP.Discovery.Device.{i}.DeviceInformation." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        The device information, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127).
+        Note: It is assumed that this object might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, this table contains the Organizationally Specific TLV (TLV Type = 127) of ''LLDPDU'', in which the {{bibref|OUI}} in the third octet is E0271A (''TTC-OUI'') and the organizationally defined subtype in the sixth octet is 1 (''Device Information'').
+      </description>
+      <parameter name="DeviceCategory" access="readOnly" dmr:version="2.8">
+        <description>
+          Each list item indicates a device category (e.g."AV_TV" and "AV_Recorder"), or the value is {{empty}} if no device categories were provided.
+          Note: It is assumed that this list might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. Standard HTIP device categories are defined in {{bibref|JJ-300.01}}. In this case, the maximum length of the list is 127 and of each item is 31, and any non-HTIP device categories SHOULD NOT conflict with standard HTIP device categories.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerOUI" access="readOnly" dmr:version="2.8">
+        <description>
+          The manufacturer OUI, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127), or {{empty}} if no manufacturer OUI was provided.
+          {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <size minLength="0" maxLength="6"/>
+            <pattern value="">
+              <description>
+                {{empty}}
+              </description>
+            </pattern>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModelName" access="readOnly" dmr:version="2.8">
+        <description>
+          The model name, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127), or {{empty}} if no model name was provided.
+          Note: It is assumed that this string might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="31"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModelNumber" access="readOnly" dmr:version="2.8">
+        <description>
+          The model number, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127), or {{empty}} if no model number was provided.
+          Note: It is assumed that this string might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="31"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorSpecificNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LLDP.Discovery.Device.{i}.DeviceInformation.VendorSpecific.{i}." access="readOnly" numEntriesParameter="VendorSpecificNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        The vendor-specific device information, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127).
+        {{keys}}
+        Note: It is assumed that this object might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, this table contains the Organizationally Specific TLV (TLV Type = 127) of ''LLDPDU'', in which the {{bibref|OUI}} in the third octet is E0271A (''TTC-OUI''), the organizationally defined subtype in the sixth octet is 1 (''Device Information''), and the device information ID in the seventh octet is 255 (''Vendor-specific extension field'').
+      </description>
+      <uniqueKey>
+        <parameter ref="OrganizationCode"/>
+        <parameter ref="InformationType"/>
+      </uniqueKey>
+      <parameter name="OrganizationCode" access="readOnly" dmr:version="2.8">
+        <description>
+          The vendor-specific organization code, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127).
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InformationType" access="readOnly" dmr:version="2.8">
+        <description>
+          The vendor-specific device information type, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Information" access="readOnly" dmr:version="2.8">
+        <description>
+          The vendor-specific device information, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="248"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.5">
+      <description>
+        IPsec {{bibref|RFC4301}} object that supports the configuration of Encapsulating Security Payload (ESP) {{bibref|RFC4303}} and Authentication Header (AH) {{bibref|RFC4302}} in tunnel mode {{bibref|RFC4301|Section 3.2}}.
+        Use of IKEv2 {{bibref|RFC5996}} is assumed.  The IPsec object does not currently support static configuration of tunnels and child Security Associations (SAs).
+        See the IPsec Theory of Operation {{bibref|TR-181i2a5|Appendix IX}} for a description of the working of this IPsec data model.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.5">
+        <description>
+          Enables or disables IPsec.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.5">
+        <description>
+          IPsec status.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AHSupported" access="readOnly" dmr:version="2.5">
+        <description>
+          Indicates whether or not Authentication Header (AH) {{bibref|RFC4302}} is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2SupportedEncryptionAlgorithms" access="readOnly" dmr:version="2.5">
+        <description>
+          Supported IKEv2 encryption algorithms {{bibref|IKEv2-params|Transform Type 1}}.  {{enum}}
+          Note that these are the names from the above reference, transformed as follows:
+          * Leading ''ENCR_'' (when present) discarded because they are all encryption algorithms so it's not needed.
+          * Underscores changed to hyphens to preserve names used in existing data models (and because of inconsistent conventions).
+          * Phrases collapsed where unambiguous, e.g. "with a(n) NN octet ICV" -&gt; "-NN".
+          As additional algorithms are added to the above reference, this data model will be extended according to the above conventions.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="DES"/>
+            <enumeration value="3DES"/>
+            <enumeration value="RC5"/>
+            <enumeration value="IDEA"/>
+            <enumeration value="CAST"/>
+            <enumeration value="BLOWFISH"/>
+            <enumeration value="3IDEA"/>
+            <enumeration value="AES-CBC"/>
+            <enumeration value="AES-CTR"/>
+            <enumeration value="AES-CCM-8"/>
+            <enumeration value="AES-CCM-12"/>
+            <enumeration value="AES-CCM-16"/>
+            <enumeration value="AES-GCM-8"/>
+            <enumeration value="AES-GCM-12"/>
+            <enumeration value="AES-GCM-16"/>
+            <enumeration value="CAMELLIA-CBC"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ESPSupportedEncryptionAlgorithms" access="readOnly" dmr:version="2.5">
+        <description>
+          Supported ESP encryption algorithms {{bibref|IKEv2-params|Transform Type 1}} {{bibref|RFC4835|Section 3.1.1}}.  {{enum}}
+          Note that these are the names from the above reference, transformed as follows:
+          * Leading ''ENCR_'' (when present) discarded because they are all encryption algorithms so it's not needed.
+          * Underscores changed to hyphens to preserve names used in existing data models (and because of inconsistent conventions).
+          * Phrases collapsed where unambiguous, e.g. "with a(n) NN octet ICV" -&gt; "-NN".
+          * Some algorithms with apparently rather specialised application are omitted, e.g. ''ENCR_NULL_AUTH_AES_GMAC''.
+          As additional algorithms are added to the above reference, this data model will be extended according to the above conventions.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="NULL"/>
+            <enumeration value="DES-IV64"/>
+            <enumeration value="DES"/>
+            <enumeration value="3DES"/>
+            <enumeration value="RC5"/>
+            <enumeration value="IDEA"/>
+            <enumeration value="CAST"/>
+            <enumeration value="BLOWFISH"/>
+            <enumeration value="3IDEA"/>
+            <enumeration value="DES-IV32"/>
+            <enumeration value="AES-CBC"/>
+            <enumeration value="AES-CTR"/>
+            <enumeration value="AES-CCM-8"/>
+            <enumeration value="AES-CCM-12"/>
+            <enumeration value="AES-CCM-16"/>
+            <enumeration value="AES-GCM-8"/>
+            <enumeration value="AES-GCM-12"/>
+            <enumeration value="AES-GCM-16"/>
+            <enumeration value="NULL-AUTH-AES-GMAC"/>
+            <enumeration value="CAMELLIA-CBC"/>
+            <enumeration value="CAMELLIA-CTR"/>
+            <enumeration value="CAMELLIA-CCM-8"/>
+            <enumeration value="CAMELLIA-CCM-12"/>
+            <enumeration value="CAMELLIA-CCM-16"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2SupportedPseudoRandomFunctions" access="readOnly" dmr:version="2.5">
+        <description>
+          Supported IKEv2 pseudo-random functions {{bibref|IKEv2-params|Transform Type 2}}.  {{enum}}
+          Note that these are the names from the above reference, transformed as follows:
+          * Leading ''PRF_'' (when present) discarded because they all pseudo-random functions so it's not needed.
+          * Underscores changed to hyphens to preserve names used in existing data models.
+          * Hyphen inserted after ''AES'' (or other acronym) when immediately followed by a key length.
+          As additional functions are added to the above reference, this data model will be extended according to the above conventions.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="HMAC-MD5"/>
+            <enumeration value="HMAC-SHA1"/>
+            <enumeration value="HMAC-TIGER"/>
+            <enumeration value="AES-128-XCBC"/>
+            <enumeration value="HMAC-SHA2-256"/>
+            <enumeration value="HMAC-SHA2-384"/>
+            <enumeration value="HMAC-SHA2-512"/>
+            <enumeration value="AES-128-CMAC"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedIntegrityAlgorithms" access="readOnly" dmr:version="2.5">
+        <description>
+          Supported integrity algorithms {{bibref|IKEv2-params|Transform Type 3}}.  {{enum}}
+          Note that these are the names from the above reference, transformed as follows:
+          * Leading ''AUTH_'' (when present) discarded because they all authentication (integrity) algorithms so it's not needed.
+          * Underscores changed to hyphens to preserve names used in existing data models.
+          As additional algorithms are added to the above reference, this data model will be extended according to the above conventions.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="NONE"/>
+            <enumeration value="HMAC-MD5-96"/>
+            <enumeration value="HMAC-SHA1-96"/>
+            <enumeration value="DES-MAC"/>
+            <enumeration value="KPDK-MD5"/>
+            <enumeration value="AES-XCBC-96"/>
+            <enumeration value="HMAC-MD5-128"/>
+            <enumeration value="HMAC-SHA1-160"/>
+            <enumeration value="AES-CMAC-96"/>
+            <enumeration value="AES-128-GMAC"/>
+            <enumeration value="AES-192-GMAC"/>
+            <enumeration value="AES-256-GMAC"/>
+            <enumeration value="HMAC-SHA2-256-128"/>
+            <enumeration value="HMAC-SHA2-256-192"/>
+            <enumeration value="HMAC-SHA2-256-256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedDiffieHellmanGroupTransforms" access="readOnly" dmr:version="2.5">
+        <description>
+          Supported Diffie-Hellman group transforms {{bibref|IKEv2-params|Transform Type 4}}.  {{enum}}
+          Note that these are the names from the above reference, transformed as follows:
+          * Name (other than ''NONE'') always starts with the type of group, currently ''MODP'' or ''ECP'' (implies ECP random).
+          * This is followed by ''-NN'', where ''NN'' is the group length in bits.
+          * this is followed by ''-PRIME-NN'' for groups with prime order subgroups, where ''NN'' is the subgroup length in bits.
+          As additional algorithms are added to the above reference, this data model will be extended according to the above conventions.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="NONE"/>
+            <enumeration value="MODP-768"/>
+            <enumeration value="MODP-1024"/>
+            <enumeration value="MODP-1536"/>
+            <enumeration value="MODP-2048"/>
+            <enumeration value="MODP-3072"/>
+            <enumeration value="MODP-4096"/>
+            <enumeration value="MODP-6144"/>
+            <enumeration value="MODP-8192"/>
+            <enumeration value="ECP-256"/>
+            <enumeration value="ECP-384"/>
+            <enumeration value="ECP-521"/>
+            <enumeration value="MODP-1024-PRIME-160"/>
+            <enumeration value="MODP-2048-PRIME-224"/>
+            <enumeration value="MODP-2048-PRIME-256"/>
+            <enumeration value="ECP-192"/>
+            <enumeration value="ECP-224"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxFilterEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          The maximum number of entries in the {{object|Filter}} table.
+          A value of 0 means no specific limit.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxProfileEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          The maximum number of entries in the {{object|Profile}} table.
+          A value of 0 means no specific limit.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FilterNumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ProfileNumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TunnelNumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2SANumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.5">
+      <description>
+        Global IPsec statistics.  These statistics include all IPsec traffic, i.e. all IKEv2 negotiation, IKEv2 SAs and child SAs.
+        The CPE MUST reset global IPsec Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when IPsec is disabled ({{param|.IPsec.Enable}} is set to {{false}}) or when IPsec is enabled ({{param|.IPsec.Enable}} is set to {{true}}).
+      </description>
+      <parameter name="NegotiationFailures" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of times an IPsec negotiation failure has occurred.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} sent by IPsec.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} received by IPsec.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} sent by IPsec.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} received by IPsec.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} discarded by IPsec due to any error.  This can include packets dropped due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownSPIErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} discarded by IPsec due to an unknown SPI (Security Parameter Index).
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DecryptionErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} discarded by IPsec due to ESP decryption errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="IntegrityErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} discarded by IPsec due to integrity errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ReplayErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} discarded by IPsec due to replay errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PolicyErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} discarded by IPsec due to policy errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="OtherReceiveErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} discarded by IPsec due to errors other than unknown SPI, decryption, integrity, replay or policy errors. This can include packets dropped due to a lack of receive buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.Filter.{i}." access="readWrite" numEntriesParameter="FilterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.5">
+      <description>
+        Filter table that represents the IPsec Security Policy Database (SPD) {{bibref|RFC4301|Section 4.4.1}} selection criteria.  Each (ordered) entry defines a set of selection criteria and references a {{object|#.Profile}} table entry that specifies how matching packets will be processed.
+        SPD filtering is performed for all packets that might need to cross the IPsec boundary {{bibref|RFC4301|Section 3.1}}.  Given that IPsec operates at the IP level, this means that SPD filtering conceptually occurs after bridging and before routing.
+        For enabled table entries, if {{param|Interface}} is not a valid reference and {{param|AllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.5">
+        <description>
+          Enables or disables this IPsec Filter table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.5">
+        <description>
+          The status of this IPsec Filter table entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.5">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each packet, the highest ordered entry that matches the filter criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.5">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion. {{reference}}
+          This specifies the ingress interface associated with the entry.  It MAY be a layer 1, 2 or 3 interface.  However, the types of interfaces for which filters can be instantiated is a local matter to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllInterfaces" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          This specifies that all ingress interfaces are associated with the entry.  If {{true}}, the value of {{param|Interface}} is ignored since all ingress interfaces are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIP" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          Destination IP address.  {{empty}} indicates this criterion is not used, i.e. is ''ANY''.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMask" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          Destination IP address mask.  If not {{empty}}, only the indicated network portion of the {{param|DestIP}} address is to be used for selection.  {{empty}} indicates that the full {{param|DestIP}} address is to be used for selection.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIPExclude" access="readWrite" dmr:version="2.5">
+        <description>
+          If {{false}}, the rule matches only those packets that match the (masked) {{param|DestIP}} entry, if specified.
+          If {{true}}, the rule matches all packets except those that match the (masked) {{param|DestIP}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIP" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          Source IP address.  {{empty}} indicates this criterion is not used, i.e. is ''ANY''.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMask" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          Source IP address mask.  If not {{empty}}, only the indicated network portion of the {{param|SourceIP}} address is to be used for selection.  {{empty}} indicates that the full {{param|SourceIP}} address is to be used for selection.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIPExclude" access="readWrite" dmr:version="2.5">
+        <description>
+          If {{false}}, the rule matches only those packets that match the (masked) {{param|SourceIP}} entry, if specified.
+          If {{true}}, the rule matches all packets except those that match the (masked) {{param|SourceIP}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          Protocol number.  A value of -1 indicates this criterion is not used, i.e. is ''ANY''.
+          Note that {{bibref|RFC4301}} refers to this as the ''Next Layer Protocol''.  It is obtained from the IPv4 ''Protocol'' or the IPv6 ''Next Header'' fields.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="255"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolExclude" access="readWrite" dmr:version="2.5">
+        <description>
+          If {{false}}, the rule matches only those packets that match {{param|Protocol}}, if specified.
+          If {{true}}, the rule matches all packets except those that match {{param|Protocol}}, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPort" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          Destination port number.  A value of -1 indicates this criterion is not used, i.e. is ''ANY''.
+          The value of this parameter is ignored for protocols that do not use ports, e.g. ICMP (1).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortRangeMax" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          If specified, indicates a destination port address range from {{param|DestPort}} through {{param}} (inclusive), in which case {{param}} MUST be greater than or equal to {{param|DestPort}}.
+          A value of -1 indicates that no destination port range is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortExclude" access="readWrite" dmr:version="2.5">
+        <description>
+          If {{false}}, the rule matches only those packets that match {{param|DestPort}} (or port range), if specified.
+          If {{true}}, the rule matches all packets except those that match {{param|DestPort}} (or port range), if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePort" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          Source port number.  A value of -1 indicates this criterion is not used, i.e. is ''ANY''.
+          The value of this parameter is ignored for protocols that do not use ports, e.g. ICMP (1).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortRangeMax" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          If specified, indicates a source port address range from {{param|SourcePort}} through {{param}} (inclusive), in which case {{param}} MUST be greater than or equal to {{param|SourcePort}}.
+          A value of -1 indicates that no source port range is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortExclude" access="readWrite" dmr:version="2.5">
+        <description>
+          If {{false}}, the rule matches only those packets that match {{param|SourcePort}} (or port range), if specified.
+          If {{true}}, the rule matches all packets except those that match {{param|SourcePort}} (or port range), if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProcessingChoice" access="readWrite" dmr:version="2.5">
+        <description>
+          Indicates how packets that match this rule will be processed {{bibref|RFC4301|Section 4.4.1}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Discard">
+              <description>
+                Packet is not allowed to traverse the IPsec boundary; packet will be discarded
+              </description>
+            </enumeration>
+            <enumeration value="Bypass">
+              <description>
+                Packet is allowed to bypass traverse the IPsec boundary without protection
+              </description>
+            </enumeration>
+            <enumeration value="Protect">
+              <description>
+                Packet is afforded protection as specified by {{param|Profile}}
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Bypass"/>
+        </syntax>
+      </parameter>
+      <parameter name="Profile" access="readWrite" dmr:version="2.5">
+        <description>
+          The profile that defines the IPsec treatment for matching packets.  {{reference}}
+          If {{param|ProcessingChoice}} is {{enum|Protect|ProcessingChoice}}, {{param}} MUST NOT be {{empty}}.  In this case, if it ever becomes {{empty}}, e.g. because the referenced profile is deleted, this IPsec Filter table entry is invalid and {{param|Status}} MUST be set to {{enum|Error_Misconfigured|Status}}.
+          If {{param|ProcessingChoice}} is not {{enum|Protect|ProcessingChoice}}, {{param}} is ignored.
+          Any changes to the referenced profile will have an immediate effect on any established IPsec tunnels.  Such changes will often force IKEv2 sessions and child SAs to be re-established.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.Profile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.Profile.{i}." access="readWrite" numEntriesParameter="ProfileNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.5">
+      <description>
+        Profile table that represents the IPsec Security Policy Database (SPD) {{bibref|RFC4301|Section 4.4.1}} processing info.  Each entry defines the IPsec treatment for packets that match the {{object|#.Filter}} entries that reference the entry.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.5">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxChildSAs" access="readWrite" dmr:version="2.5">
+        <description>
+          Controls the maximum number of child Security Association (SA) pairs that can be negotiated by a single IKEv2 session.
+          If a new child SA pair is needed, but the current IKEv2 session already has {{param}} child SA pairs, an additional IKEv2 session (and therefore an additional IPsec tunnel) will be established.
+          A value of 0 means no specific limit.
+          Note that support for more than one child SA pair per IKEv2 session is OPTIONAL {{bibref|RFC5996|Section 1.3}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteEndpoints" access="readWrite" dmr:version="2.5">
+        <description>
+          The host name or IP address of the remote IPsec tunnel endpoint.  If more than one name/address is supplied, they will be tried in turn, i.e. they are in decreasing order of precedence.
+        </description>
+        <syntax>
+          <list maxItems="4"/>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingPolicy" access="readWrite" dmr:version="2.5">
+        <description>
+          Identifier of the forwarding policy associated with traffic that is associated with this profile.
+          The forwarding policy can be referenced by entries in the {{object|##.Routing.Router.{i}.IPv4Forwarding}} and {{object|##.Routing.Router.{i}.IPv6Forwarding}} tables, and therefore allows SPD selection criteria to influence the forwarding decision.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.5">
+        <description>
+          The "child" security protocol.
+          This is not to be confused with {{object|#.Filter}}.{{param|#.Filter.{i}.Protocol}}, which is an SPD selector that can select packets that already have AH or ESP headers.  {{object}}.{{param}} selects whether AH or ESP will be used when encapsulating a packet.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AH">
+              <description>
+                Authentication Header {{bibref|RFC4302}}; can only be selected if {{param|#.AHSupported}} is {{true}}
+              </description>
+            </enumeration>
+            <enumeration value="ESP">
+              <description>
+                Encapsulating Security Payload {{bibref|RFC4303}}
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="ESP"/>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2AuthenticationMethod" access="readWrite" dmr:version="2.5">
+        <description>
+          IKEv2 CPE authentication method {{bibref|RFC5996|Section 2.15}}. {{reference|an enabled row in the {{object|.Security.Certificate}} table or in another table that contains appropriate CPE credentials}}
+          If {{empty}}, or the referenced row is disabled or deleted, the CPE chooses the authentication method based on local policy.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2AllowedEncryptionAlgorithms" access="readWrite" dmr:version="2.5">
+        <description>
+          Allowed IKEv2 encryption algorithms.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam=".IPsec.IKEv2SupportedEncryptionAlgorithms"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ESPAllowedEncryptionAlgorithms" access="readWrite" dmr:version="2.5">
+        <description>
+          Allowed ESP encryption algorithms.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam=".IPsec.ESPSupportedEncryptionAlgorithms"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2AllowedPseudoRandomFunctions" access="readWrite" dmr:version="2.5">
+        <description>
+          Allowed IKEv2 pseudo-random functions.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam=".IPsec.IKEv2SupportedPseudoRandomFunctions"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2AllowedIntegrityAlgorithms" access="readWrite" dmr:version="2.5">
+        <description>
+          Allowed IKEv2 integrity algorithms.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam=".IPsec.SupportedIntegrityAlgorithms"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AHAllowedIntegrityAlgorithms" access="readWrite" dmr:version="2.5">
+        <description>
+          Allowed AH integrity algorithms {{bibref|IKEv2-params|Transform Type 3}} {{bibref|RFC4835|Section 3.2}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam=".IPsec.SupportedIntegrityAlgorithms"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ESPAllowedIntegrityAlgorithms" access="readWrite" dmr:version="2.5">
+        <description>
+          Allowed ESP integrity algorithms {{bibref|IKEv2-params|Transform Type 3}} {{bibref|RFC4835|Section 3.1.1}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam=".IPsec.SupportedIntegrityAlgorithms"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2AllowedDiffieHellmanGroupTransforms" access="readWrite" dmr:version="2.5">
+        <description>
+          Allowed IKEv2 Diffie-Hellman group transforms.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam=".IPsec.SupportedDiffieHellmanGroupTransforms"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2DeadPeerDetectionTimeout" access="readWrite" dmr:version="2.5">
+        <description>
+          IKEv2 Dead Peer Detection (DPD) timeout in {{units}}.  {{bibref|RFC5996|section 2.4}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2NATTKeepaliveTimeout" access="readWrite" dmr:version="2.5">
+        <description>
+          IKEv2 NAT traversal (NAT-T) keepalive timeout in {{units}}.  {{bibref|RFC3948|Section 4}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AntiReplayWindowSize" access="readWrite" dmr:version="2.5">
+        <description>
+          The size of the AH or ESP Anti-Replay Window.  {{bibref|RFC4302|Section B.2}} {{bibref|RFC4303|Section A2}}
+          A value of 0 means that Sequence Number Verification is disabled.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DoNotFragment" access="readWrite" dmr:version="2.5">
+        <description>
+          Controls the value of the ''Do Not Fragment'' (DF) bit.  {{bibref|RFC4301|Section 8.1}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Set"/>
+            <enumeration value="Clear"/>
+            <enumeration value="Copy">
+              <description>
+                Copy from inner header; applies only when both inner and outer headers are IPv4
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMarkPolicy" access="readWrite" dmr:version="2.5">
+        <description>
+          DSCP with which to mark the outer IP header for traffic that is associated with this IPsec channel.
+          A value of -1 indicates copy from the incoming packet.
+          A value of -2 indicates automatic marking of DSCP.
+          De-tunneled packets are never re-marked.
+          Automatic DSCP marking behavior is a local matter to the CPE, possibly influenced by other Broadband Forum standards that it supports.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2" maxInclusive="63"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2SATrafficLimit" access="readWrite" dmr:version="2.5">
+        <description>
+          IKEv2 SA lifetime in {{units}}, or zero if there is no traffic constraint on its expiration.
+          If both {{param}} and {{param|IKEv2SATimeLimit}} are non-zero, the IKEv2 SA is deleted when the first limit is reached.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="bytes"/>
+          </unsignedLong>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2SATimeLimit" access="readWrite" dmr:version="2.5">
+        <description>
+          IKEv2 SA lifetime in {{units}}, or zero if there is no time constraint on its expiration.
+          If both {{param}} and {{param|IKEv2SATrafficLimit}} are non-zero, the IKEv2 SA is deleted when the first limit is reached.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2SAExpiryAction" access="readWrite" dmr:version="2.5">
+        <description>
+          Action to take when an IKEv2 SA expires, whether as a result of hitting a traffic limit or a time limit.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Renegotiate"/>
+            <enumeration value="Delete"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ChildSATrafficLimit" access="readWrite" dmr:version="2.5">
+        <description>
+          Child SA lifetime in {{units}}, or zero if there is no traffic constraint on its expiration.
+          If both {{param}} and {{param|ChildSATimeLimit}} are non-zero, the child SA is deleted when the first limit is reached.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="bytes"/>
+          </unsignedLong>
+        </syntax>
+      </parameter>
+      <parameter name="ChildSATimeLimit" access="readWrite" dmr:version="2.5">
+        <description>
+          Child SA lifetime in {{units}}, or zero if there is no time constraint on its expiration.
+          If both {{param}} and {{param|ChildSATrafficLimit}} are non-zero, the child SA is deleted when the first limit is reached.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ChildSAExpiryAction" access="readWrite" dmr:version="2.5">
+        <description>
+          Action to take when a Child SA expires, whether as a result of hitting a traffic limit or a time limit.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Renegotiate"/>
+            <enumeration value="Delete"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SentCPAttrNumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.Profile.{i}.SentCPAttr.{i}." access="readWrite" numEntriesParameter="SentCPAttrNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.5">
+      <description>
+        Each instance of this object represents an IKEv2 Configuration Payload (CP) {{bibref|RFC5996|Section 3.15}} Attribute that MUST, if enabled, be sent in IKEv2 CP CFG_REQUEST messages.  All such Attributes MUST be listed.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Type"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.5">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.5">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readWrite" dmr:version="2.5">
+        <description>
+          CP Attribute Type as described in {{bibref|RFC5996|Section 3.15.1}} and defined in {{bibref|IKEv2-params|IKEv2 Configuration Payload Attribute Types}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="32767"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.5">
+        <description>
+          A hexbinary encoded CP Attribute Value as described in {{bibref|RFC5996|Section 3.15.1}} and defined in {{bibref|IKEv2-params|IKEv2 Configuration Payload Attribute Types}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.Tunnel.{i}." access="readOnly" numEntriesParameter="TunnelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.5">
+      <description>
+        Represents an IPsec tunnel, i.e. a virtual IP interface that models an IPsec tunnel entry point and exit point.  A {{object}} instance always references (and has the same lifetime as) a ({{enum|Tunnel|.IP.Interface.{i}.Type}},{{enum|Tunneled|.IP.Interface.{i}.Type}}) {{object|.IP.Interface}} pair.  The {{object}} instance models the IPsec-specific concepts, the {{enum|Tunnel|.IP.Interface.{i}.Type}} {{object|.IP.Interface}} instance models the generic concepts, and the {{enum|Tunneled|.IP.Interface.{i}.Type}} {{object|.IP.Interface}} instance exists only so it can be referenced by forwarding or filter rules.
+        {{object}} instances are automatically created (as needed) when {{object|#.Filter}} instances are enabled and disabled.
+        Each instance's {{param|Filters}} parameter references the {{object|#.Filter}} instances that require the {{object}} instance to exist.  If this list ever becomes {{empty}}, e.g. because all the referenced {{object|#.Filter}} instances have been disabled or deleted, the CPE MAY choose not to delete the {{object}} instance (and its associated ({{enum|Tunnel|.IP.Interface.{i}.Type}},{{enum|Tunneled|.IP.Interface.{i}.Type}}) {{object|.IP.Interface}} pair).  This can be desirable, because {{object|.QoS.Classification}}, {{object|.Routing.Router.{i}.IPv4Forwarding}}, {{object|.Routing.Router.{i}.IPv6Forwarding}} etc instances might be referencing the {{object|.IP.Interface}} instances.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="TunnelInterface"/>
+        <parameter ref="TunneledInterface"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.5">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="TunnelInterface" access="readOnly" dmr:version="2.5">
+        <description>
+          The corresponding auto-created {{enum|Tunnel|Device.IP.Interface.{i}.Type}} {{object|.IP.Interface}} instance.  {{reference||delete}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TunneledInterface" access="readOnly" dmr:version="2.5">
+        <description>
+          The corresponding auto-created {{enum|Tunneled|Device.IP.Interface.{i}.Type}} {{object|.IP.Interface}} instance.  {{reference||delete}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Filters" access="readOnly" dmr:version="2.5">
+        <description>
+          The {{object|#.Filter}} instances that require this {{object}} instance to exist.  {{reference}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".IPsec.Filter." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.Tunnel.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.5">
+      <description>
+        Statistics for this IPsec tunnel, i.e. all traffic that has passed through the tunnel, including IKEv2 negotiation, IKEv2 SA and ChildSA traffic.
+        The CPE MUST reset the tunnel's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the tunnel becomes operationally down due to a previous administrative down (i.e. its associated {{param|.IP.Interface.{i}.Status}} parameter transitions to a down state after the tunnel has been disabled) or when the tunnel becomes administratively up (i.e. its associated {{param|.IP.Interface.{i}.Enable}} parameter transition from {{false}} to {{true}}).
+        Note that this object does not include generic statistics that are available in the associated {{object|.IP.Interface.{i}.Stats}} object.
+      </description>
+      <parameter name="DecryptionErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} discarded due to ESP decryption errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="IntegrityErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} discarded due to integrity errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ReplayErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} discarded due to replay errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PolicyErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} discarded due to policy errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="OtherReceiveErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} discarded due to errors other than decryption, integrity, replay or policy errors. This can include packets dropped due to a lack of receive buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.IKEv2SA.{i}." access="readOnly" numEntriesParameter="IKEv2SANumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.5" dmr:noUniqueKeys="true">
+      <description>
+        Represents an IKEv2 Security Association (SA), corresponding to an IKEv2 session.  Instances are automatically created and deleted as IKEv2 SAs are created and deleted.
+      </description>
+      <uniqueKey>
+        <parameter ref="Tunnel"/>
+      </uniqueKey>
+      <parameter name="Status" access="readOnly" dmr:version="2.5">
+        <description>
+          The current operational state of the IKEv2 SA.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.5">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tunnel" access="readOnly" dmr:version="2.5">
+        <description>
+          The associated {{object|#.Tunnel}} instance.  {{reference}}
+          Note that {{param}} is a unique key, i.e only one {{object}} instance is associated with a given {{object|#.Tunnel}} instance.  During rekeying {{bibref|RFC5996|Section 2.8}}, a new IKEv2 SA is created and inherits the existing IKEv2 SA's child SAs, then the old IKEv2 SA is deleted.  From the management point of view the new and old IKEv2 SAs are the same SA and MUST be modeled using the same {{object}} instance.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.Tunnel." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LocalAddress" access="readOnly" dmr:version="2.5">
+        <description>
+          The local IP address that this IKEv2 SA was negotiated with.  This is assigned via IKEv2 and will also be available via the associated {{object|#.Tunnel}}'s {{param|#.Tunnel.{i}.TunnelInterface}} {{object|##.IP.Interface.{i}.IPv4Address}} or {{object|##.IP.Interface.{i}.IPv6Address}} table (as appropriate).
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteAddress" access="readOnly" dmr:version="2.5">
+        <description>
+          The IP address of the peer that this IKEv2 SA was negotiated with.  This will be the IP address of one of the security gateways configured via {{param|#.Profile.{i}.RemoteEndpoints}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="EncryptionAlgorithm" access="readOnly" dmr:version="2.5">
+        <description>
+          The encryption algorithm applied to traffic carried by this IKEv2 SA.
+          This will be one of the {{param|#.Profile.{i}.IKEv2AllowedEncryptionAlgorithms}} from the {{object|#.Profile}} instance via which this IKEv2 SA was created.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EncryptionKeyLength" access="readOnly" dmr:version="2.5">
+        <description>
+          The length of the encryption key in {{units}} used for the algorithm specified in the {{param|EncryptionAlgorithm}} parameter.
+          The value is 0 if the key length is implicit in the specified algorithm or there is no encryption applied.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PseudoRandomFunction" access="readOnly" dmr:version="2.5">
+        <description>
+          The pseudo-random function used by this IKEv2 SA.
+          This will be one of the {{param|#.Profile.{i}.IKEv2AllowedPseudoRandomFunctions}} from the {{object|#.Profile}} instance via which this IKEv2 SA was created.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IntegrityAlgorithm" access="readOnly" dmr:version="2.5">
+        <description>
+          The integrity algorithm applied to the traffic carried by this IKEv2 SA.
+          This will be one of the {{param|#.Profile.{i}.IKEv2AllowedIntegrityAlgorithms}} from the {{object|#.Profile}} instance via which this IKEv2 SA was created.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DiffieHellmanGroupTransform" access="readOnly" dmr:version="2.5">
+        <description>
+          The Diffie-Hellman Group used by this IKEv2 SA.
+          This will be one of the {{param|#.Profile.{i}.IKEv2AllowedDiffieHellmanGroupTransforms}} from the {{object|#.Profile}} instance via which this IKEv2 SA was created.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CreationTime" access="readOnly" dmr:version="2.5">
+        <description>
+          When this IKEv2 SA was set up.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="NATDetected" access="readOnly" dmr:version="2.5">
+        <description>
+          Whether NAT traversal is supported by the device and, if so, whether a NAT was detected.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="Local"/>
+            <enumeration value="Remote"/>
+            <enumeration value="Unsupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedCPAttrNumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ChildSANumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.IKEv2SA.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.5">
+      <description>
+        Statistics for this IKEv2 Security Association (SA).
+        The CPE MUST reset the IKEv2 SA's Stats parameters (unless otherwise stated in individual object or parameter descriptions) whenever the associated {{param|#.Tunnel}} instance's Stats parameters are reset.
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} handled in the outbound direction by the IKEv2 SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} handled in the inbound direction by the IKEv2 SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} handled in the outbound direction by the IKEv2 SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} handled in the inbound direction by the IKEv2 SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of outbound {{units}} from this IKEv2 SA discarded for any reason. This can include {{units}} dropped due to a lack of transmit buffer space.
+          Note that this refers to IKE protocol {{units}}, and not to {{units}} carried by other SAs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DecryptionErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} to this IKEv2 SA discarded due to decryption errors.
+          Note that this refers to IKEv2 protocol {{units}}, and not to {units}} carried by other SAs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="IntegrityErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} to this IKEv2 SA discarded due to integrity errors.
+          Note that this refers to IKEv2 protocol {{units}}, and not to {{units}} carried by other SAs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="OtherReceiveErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} to this IKEv2 SA discarded for reasons other than decryption or integrity errors. This can include {{units}} dropped due to a lack of receive buffer space.
+          Note that this refers to IKEv2 protocol {{units}}, and not to {{units}} carried by other SAs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.IKEv2SA.{i}.ReceivedCPAttr.{i}." access="readWrite" numEntriesParameter="ReceivedCPAttrNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.5" dmr:noUniqueKeys="true">
+      <description>
+        This is a transitory table that lists all the IKEv2 Configuration Payload (CP) {{bibref|RFC5996|Section 3.15}} Attributes that have been received via CFG_REPLY messages.  Table entries are automatically created to correspond with received Attributes. However, it is a local matter to the CPE when to delete old table entries.
+        If the same Attribute is received multiple times, it is up to the CPE to decide which entries to include (i.e. whether the same Attribute will be present multiple times). In order to allow for the same Attribute to be present multiple times within the table, this table has no unique key defined.
+      </description>
+      <parameter name="Type" access="readOnly" dmr:version="2.5">
+        <description>
+          CP Attribute Type as described in {{bibref|RFC5996|Section 3.15.1}} and defined in {{bibref|IKEv2-params|IKEv2 Configuration Payload Attribute Types}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="32767"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.5">
+        <description>
+          A hexbinary encoded CP Attribute Value as described in {{bibref|RFC5996|Section 3.15.1}} and defined in {{bibref|IKEv2-params|IKEv2 Configuration Payload Attribute Types}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.IKEv2SA.{i}.ChildSA.{i}." access="readOnly" numEntriesParameter="ChildSANumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.5">
+      <description>
+        Represents a child Security Association (SA) pair, i.e. an inbound child SA and an outbound child SA.
+      </description>
+      <uniqueKey>
+        <parameter ref="InboundSPI"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="OutboundSPI"/>
+      </uniqueKey>
+      <parameter name="Status" access="readOnly" dmr:version="2.5">
+        <description>
+          The current operational state of the child SA pair.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.5">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="InboundSPI" access="readOnly" dmr:version="2.5">
+        <description>
+          The inbound child SA's Security Parameter Index (SPI).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OutboundSPI" access="readOnly" dmr:version="2.5">
+        <description>
+          The outbound child SA's Security Parameter Index (SPI).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CreationTime" access="readOnly" dmr:version="2.5">
+        <description>
+          The date and time when the child SA was created.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.IKEv2SA.{i}.ChildSA.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.5">
+      <description>
+        Statistics for this child Security Association (SA).
+        The CPE MUST reset the child SA's Stats parameters (unless otherwise stated in individual object or parameter descriptions) whenever the parent {{object|#}} instance's Stats parameters are reset.
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} handled by the outbound child SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} handled by the inbound child SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} handled by the outbound child SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} handled by the inbound child SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} discarded by the outbound child SA due to any error. This can include compression errors or errors due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DecryptionErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} discarded by the inbound child SA due to decryption errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="IntegrityErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} discarded by the inbound child SA due to integrity errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ReplayErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} discarded by the inbound child SA due to replay errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PolicyErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} discarded by the inbound child SA due to policy errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="OtherReceiveErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} discarded by the inbound child SA due to errors other than decryption, integrity, replay or policy errors. This can include decompression errors or errors due to a lack of receive buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.GRE." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object contains parameters associated with the Generic Routing Encapsulation (GRE) Tunnel ({{bibref|RFC2784}}) with Key and Sequence Number extensions ({{bibref|RFC2890}}). This object also provides a means to treat packets that are encapsulated within a GRE Tunnel by using a set of {{object|Filter}} objects to determine the treatment of the packet.
+      </description>
+      <parameter name="TunnelNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FilterNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.GRE.Tunnel.{i}." access="readWrite" numEntriesParameter="TunnelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        GRE Tunnel table, models the GRE Tunnel instance and represents the entry point and exit point of the tunnel in relation to the WAN interface. A {{object}} object has one or more {{object|Interface}} objects that further define the sessions or flows within the tunnel.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the tunnel.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The current operational state of the tunnel.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteEndpoints" access="readWrite" dmr:version="2.8">
+        <description>
+          The Fully Qualified Domain Name (FQDN) or IP address of the remote GRE tunnel endpoint. If more than one name/address is supplied, they will be tried in turn, i.e. they are in decreasing order of precedence.
+        </description>
+        <syntax>
+          <list maxItems="4"/>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAlivePolicy" access="readWrite" dmr:version="2.8">
+        <description>
+          The mechanism used to keep the tunnel from timing out at the {{param|ConnectedRemoteEndpoint}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ICMP"/>
+            <enumeration value="None"/>
+          </string>
+          <default type="object" value="None"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveTimeout" access="readWrite" dmr:version="2.8">
+        <description>
+          The tunnel keepalive timeout in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="10"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveThreshold" access="readWrite" dmr:version="2.8">
+        <description>
+          Number of KeepAlive messages unacknowledged by the {{param|ConnectedRemoteEndpoint}} before the {{object}} is perceived failed.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="3"/>
+        </syntax>
+      </parameter>
+      <parameter name="DeliveryHeaderProtocol" access="readWrite" dmr:version="2.8">
+        <description>
+          The protocol used for the delivery header.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IPv4"/>
+            <enumeration value="IPv6"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultDSCPMark" access="readWrite" dmr:version="2.8">
+        <description>
+          If the specified entries in the {{object|#.Filter}} table do not match this {{object}} object or an instance of the {{object|Interface}} object for this {{object}} object, then the value of this parameter is applied to the delivery header of the packets in this {{object}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectedRemoteEndpoint" access="readOnly" dmr:version="2.8">
+        <description>
+          The Fully Qualified Domain Name (FQDN) name or IP address of the connected remote GRE tunnel endpoint.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.GRE.Tunnel.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Statistics for this GRE tunnel, i.e. all traffic that has passed through the tunnel.
+        The device MUST reset the tunnel's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the tunnel becomes operationally down due to a previous administrative down (i.e., Status parameter transitions to a disabled state after the tunnel has been disabled) or when the tunnel becomes administratively up (i.e. the Enable parameter transitioned from {{false}} to {{true}}).
+      </description>
+      <parameter name="KeepAliveSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of KeepAlive {{units}} sent out the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="messages"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of KeepAlive {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="messages"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} sent by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} sent by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} discarded by the tunnel due to any error.  This can include packets dropped due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by the tunnel that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.GRE.Tunnel.{i}.Interface.{i}." access="readWrite" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        GRE Interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). The {{object}} object models the GRE Header as defined in {{bibref|RFC2784}} and extensions to the GRE Header as defined in {{bibref|RFC2890}}. The {{object}} object provides a way to discriminate how sessions or flows are encapsulated within the GRE Tunnel. In addition the {{object}} object represents the entry point and exit point of the tunnel in relation to the LAN interface. Unless the Key Identifier of {{bibref|RFC2890}} is supported there is only one instance of this {{object}} object per tunnel.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.8">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.8">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolIdOverride" access="readWrite" dmr:version="2.8">
+        <description>
+          The Protocol ID assigned to this {{object}}. The Protocol Id is the EtherType value used to identify the encapsulated payload. When set to {{null}} the CPE determines the Protocol Id.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="UseChecksum" access="readWrite" dmr:version="2.8">
+        <description>
+          When {{true}}, includes the "Checksum" field in the GRE header as defined in {{bibref|RFC2784}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeyIdentifierGenerationPolicy" access="readWrite" dmr:version="2.8">
+        <description>
+          The method used to generate the Key Identifier extension as defined in.{{bibref|RFC2890}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Provisioned"/>
+            <enumeration value="CPE_Generated" optional="true">
+              <description>
+                The generation of the Key field is CPE specific implementation.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeyIdentifier" access="readWrite" dmr:version="2.8">
+        <description>
+          When the value of {{param|KeyIdentifierGenerationPolicy}} is {{enum|Provisioned|KeyIdentifierGenerationPolicy}} this {{param}} parameter is used to identify an individual traffic flow within a GRE tunnel, as defined in {{bibref|RFC2890}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="UseSequenceNumber" access="readWrite" dmr:version="2.8">
+        <description>
+          When {{true}}, includes the "SequenceNumber" field in the GRE header as defined in {{bibref|RFC2890}}
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.GRE.Tunnel.{i}.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Statistics for this GRE tunnel interface, i.e. all traffic that has passed through the interface.
+        The device MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e., the interface's Status parameter transitions to a down state after the interface has been disabled) or when the interface becomes administratively up (i.e. the Enable parameter transitioned from {{false}} to {{true}}).
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} sent by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} sent by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} discarded by this interface due to any error.  This can include packets dropped due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by this interface that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardChecksumReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by the tunnel interface that are discarded because of Checksum errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardSequenceNumberReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by the tunnel interface that are discarded because of Sequence Number errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.GRE.Filter.{i}." access="readWrite" numEntriesParameter="FilterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        GRE Filter table. Entries in this table are applied against the packets that are to be encapsulated within the GRE Tunnel based on the following conditions:
+        * If the value of the {{param|AllInterfaces}} is {{true}}, then this entry will be applied to all {{object|#.Tunnel}} and {{object|#.Tunnel.{i}.Interface}} instances.
+        * If the value of {{param|AllInterfaces}} is {{false}} and the value of {{param|Interface}} parameter is a reference to a row in the {{object|#.Tunnel}} table then this entry is applied to all {{object|#.Tunnel.{i}.Interface}} instances of the {{object|#.Tunnel}} reference.
+        * If the value of {{param|AllInterfaces}} is {{false}} and the value of {{param|Interface}} parameter is a reference to a row in the {{object|#.Tunnel.{i}.Interface}} table then this entry is applied to the {{object|#.Tunnel.{i}.Interface}} reference.
+        * If no entries are matched for the packet, then the default treatment (e.g., {{param|#.Tunnel.{i}.DefaultDSCPMark}}) is applied to the packet.
+        For enabled table entries, if {{param|Interface}} is not a valid reference and {{param|AllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables this filter.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of this filter.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.8">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each packet, the highest ordered entry that matches the filter criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.8">
+        <description>
+          Filter criterion. {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Tunnel. #.Tunnel.{i}.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllInterfaces" access="readWrite" dmr:version="2.8">
+        <description>
+          Filter criterion. This specifies that all ingress GRE tunnel interfaces are associated with the entry. If {{true}}, the value of {{param|Interface}} is ignored since all ingress GRE tunnel interfaces are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDCheck" access="readWrite" dmr:version="2.8">
+        <description>
+          Filter criterion.
+          Current outer Ethernet VLAN ID as defined in 802.1Q. A value of -1 indicates this criterion is not used for filtering.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDExclude" access="readWrite" dmr:version="2.8">
+        <description>
+          If {{false}}, the filter includes only those packets that match the {{param|VLANIDCheck}} entry, if specified.
+          If {{true}}, the filter includes all packets except those that match the {{param|VLANIDCheck}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMarkPolicy" access="readWrite" dmr:version="2.8">
+        <description>
+          DSCP with which to mark the outer IP header for traffic that is associated with the interface criterion.
+          Automatic DSCP marking behavior is a local matter to the device, possibly influenced by other Broadband Forum standards that it supports.
+          * A value of -1 indicates copy from the upstream packet.
+          * A value of -2 indicates automatic marking of DSCP.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2" maxInclusive="63"/>
+          </int>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.L2TPv3." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object contains parameters associated with the configuration and monitoring of stateless tunnels using the Layer Two Tunneling Protocol version 3 (L2TPv3) ({{bibref|RFC3931}}).
+        This object also provides a means to treat packets that are encapsulated within a L2TPv3 Tunnel by using a set of {{object|Filter}} objects to determine the treatment of the packet.
+      </description>
+      <parameter name="TunnelNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FilterNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.L2TPv3.Tunnel.{i}." access="readWrite" numEntriesParameter="TunnelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        L2TPv3 Tunnel table, models the L2TPv3 Tunnel instance and represents the entry point and exit point of the tunnel in relation to the WAN interface.
+        A {{object}} object has one or more {{object|Interface}} objects that further define the sessions or flows within the tunnel.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables the tunnel.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the tunnel.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteEndpoints" access="readWrite" dmr:version="2.12">
+        <description>
+          The Fully Qualified Domain Name (FQDN) or IP address of the remote L2TPv3 tunnel endpoint.
+          If more than one name/address is supplied, they will be tried in turn, i.e. they are in decreasing order of precedence.
+        </description>
+        <syntax>
+          <list maxItems="4"/>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAlivePolicy" access="readWrite" dmr:version="2.12">
+        <description>
+          The mechanism used to keep the tunnel from timing out at the {{param|ConnectedRemoteEndpoint}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ICMP">
+              <description>
+                The version of the ICMP packet used for this {{param}} is based on the value of the {{param|DeliveryHeaderProtocol}} parameter (Either ICMP for IPv4 or ICMPv6 for IPv6).
+              </description>
+            </enumeration>
+            <enumeration value="None"/>
+          </string>
+          <default type="object" value="None"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveTimeout" access="readWrite" dmr:version="2.12">
+        <description>
+          The tunnel keepalive timeout in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="10"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveThreshold" access="readWrite" dmr:version="2.12">
+        <description>
+          Number of KeepAlive messages unacknowledged by the {{param|ConnectedRemoteEndpoint}} before the {{object}} is perceived failed.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="3"/>
+        </syntax>
+      </parameter>
+      <parameter name="DeliveryHeaderProtocol" access="readWrite" dmr:version="2.12">
+        <description>
+          The protocol used for the delivery header.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IPv4"/>
+            <enumeration value="IPv6"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultDSCPMark" access="readWrite" dmr:version="2.12">
+        <description>
+          If the specified entries in the {{object|#.Filter}} table do not match this {{object}} object or an instance of the {{object|Interface}} object for this {{object}} object, then the value of this parameter is applied to the delivery header of the packets in this {{object}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TunnelEncapsulation" access="readWrite" dmr:version="2.12">
+        <description>
+          The protocol that this {{object}} will be encapsulated
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IP"/>
+            <enumeration value="UDP"/>
+          </string>
+          <default type="object" value="IP"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectedRemoteEndpoint" access="readOnly" dmr:version="2.12">
+        <description>
+          The Fully Qualified Domain Name (FQDN) name or IP address of the connected remote L2TPv3 tunnel endpoint.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.L2TPv3.Tunnel.{i}.UDP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This {{object}} provides the parameters when the value of the {{param|##.Tunnel.{i}.TunnelEncapsulation}} parameter is {{enum|UDP|##.Tunnel.{i}.TunnelEncapsulation}}.
+      </description>
+      <parameter name="SourcePort" access="readWrite" dmr:version="2.12">
+        <description>
+          The source (local) port used to transmit PDUs. A value of 0 indicates that the port selection is performed by the device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="1701"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemotePort" access="readWrite" dmr:version="2.12">
+        <description>
+          The remote port used to by the remote endpoint to transmit PDUs.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="1701"/>
+        </syntax>
+      </parameter>
+      <parameter name="EnableChecksum" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables checksum processing.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.L2TPv3.Tunnel.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        Statistics for this L2TPv3 tunnel, i.e. all traffic that has passed through the tunnel.
+        The device MUST reset the tunnel's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the tunnel becomes operationally down due to a previous administrative down (i.e., Status parameter transitions to a disabled state after the tunnel has been disabled) or when the tunnel becomes administratively up (i.e. the Enable parameter transitioned from {{false}} to {{true}}).
+      </description>
+      <parameter name="KeepAliveSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of KeepAlive {{units}} sent out the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="messages"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of KeepAlive {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="messages"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} discarded by the tunnel due to any error.  This can include packets dropped due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.L2TPv3.Tunnel.{i}.Interface.{i}." access="readWrite" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        L2TPv3 Interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+        The {{object}} object models the L2TPv3 Header as defined in {{bibref|RFC3931}} and the transport of L2 frames across over L2TPv3 as defined in {{bibref|RFC4719}}.
+        The {{object}} object provides a way to discriminate how sessions or flows are encapsulated within the L2TPv3 Tunnel.
+        In addition the {{object}} object represents the entry point and exit point of the tunnel in relation to the LAN interface.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.12">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}} See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SessionID" access="readWrite" dmr:version="2.12">
+        <description>
+          The unique Session ID to be used in the L2TPv3 header of the tunnel.
+          A Session ID with a value of -1 indicates that he CPE is to generate the session ids for this {{object}} instance.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="-1"/>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+      <parameter name="CookiePolicy" access="readWrite" dmr:version="2.12">
+        <description>
+          The policy that defines how the Cookie is handled in this {{object}} instance.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled">
+              <description>
+                The device does not perform Cooking processing.
+              </description>
+            </enumeration>
+            <enumeration value="Configured">
+              <description>
+                The value of the {{param|Cookie}} parameter is transmitted in the L2TPv3 header.
+              </description>
+            </enumeration>
+            <enumeration value="Generated">
+              <description>
+                The device generates the value of the Cookie transmitted in the L2TPv3 header.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Configured"/>
+        </syntax>
+      </parameter>
+      <parameter name="Cookie" access="readWrite" dmr:version="2.12">
+        <description>
+          The Cookie transmitted in the L2TPv3 header. The default is to set the Cookie to the device's MAC address that is encoded in the low order 6 bytes.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.L2TPv3.Tunnel.{i}.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        Statistics for this L2TPv3 tunnel interface, i.e. all traffic that has passed through the interface.
+        The device MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e., the interface's Status parameter transitions to a down state after the interface has been disabled) or when the interface becomes administratively up (i.e. the Enable parameter transitioned from {{false}} to {{true}}).
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} discarded by this interface due to any error.  This can include packets dropped due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by this interface that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardChecksumReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel interface that are discarded because of Checksum errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardSequenceNumberReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel interface that are discarded because of Sequence Number errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.L2TPv3.Filter.{i}." access="readWrite" numEntriesParameter="FilterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        L2TPv3 Filter table. Entries in this table are applied against the packets that are to be encapsulated within the L2TPv3 Tunnel based on the following conditions:
+        * If the value of the {{param|AllInterfaces}} is {{true}}, then this entry will be applied to all {{object|#.Tunnel}} and {{object|#.Tunnel.{i}.Interface}} instances.
+        * If the value of {{param|AllInterfaces}} is {{false}} and the value of {{param|Interface}} parameter is a reference to a row in the {{object|#.Tunnel}} table then this entry is applied to all {{object|#.Tunnel.{i}.Interface}} instances of the {{object|#.Tunnel}} reference.
+        * If the value of {{param|AllInterfaces}} is {{false}} and the value of {{param|Interface}} parameter is a reference to a row in the {{object|#.Tunnel.{i}.Interface}} table then this entry is applied to the {{object|#.Tunnel.{i}.Interface}} reference.
+        * If no entries are matched for the packet, then the default treatment (e.g., {{param|#.Tunnel.{i}.DefaultDSCPMark}}) is applied to the packet.
+        For enabled table entries, if {{param|Interface}} is not a valid reference and {{param|AllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this filter.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The status of this filter.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.12">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each packet, the highest ordered entry that matches the filter criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.12">
+        <description>
+          Filter criterion. {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Tunnel. #.Tunnel.{i}.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllInterfaces" access="readWrite" dmr:version="2.12">
+        <description>
+          Filter criterion. This specifies that all ingress L2TPv3 tunnel interfaces are associated with the entry. If {{true}}, the value of {{param|Interface}} is ignored since all ingress L2TPv3 tunnel interfaces are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDCheck" access="readWrite" dmr:version="2.12">
+        <description>
+          Filter criterion.
+          Current outer Ethernet VLAN ID as defined in 802.1Q. A value of -1 indicates this criterion is not used for filtering.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDExclude" access="readWrite" dmr:version="2.12">
+        <description>
+          If {{false}}, the filter includes only those packets that match the {{param|VLANIDCheck}} entry, if specified.
+          If {{true}}, the filter includes all packets except those that match the {{param|VLANIDCheck}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMarkPolicy" access="readWrite" dmr:version="2.12">
+        <description>
+          DSCP with which to mark the outer IP header for traffic that is associated with the interface criterion.
+          Automatic DSCP marking behavior is a local matter to the device, possibly influenced by other Broadband Forum standards that it supports.
+          * A value of -1 indicates copy from the upstream packet.
+          * A value of -2 indicates automatic marking of DSCP.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2" maxInclusive="63"/>
+          </int>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.VXLAN." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object contains parameters associated with the configuration and monitoring of stateless tunnels using the Virtual eXtensible Local Area Network (VXLAN) ({{bibref|RFC7348}}).
+        This object also provides a means to treat packets that are encapsulated within a VXLAN Tunnel by using a set of {{object|Filter}} objects to determine the treatment of the packet.
+      </description>
+      <parameter name="TunnelNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FilterNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.VXLAN.Tunnel.{i}." access="readWrite" numEntriesParameter="TunnelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        VXLAN Tunnel table, models the VXLAN Tunnel instance and represents the entry point and exit point of the tunnel in relation to the WAN interface.
+        A {{object}} object has one or more {{object|Interface}} objects that further define the sessions or flows within the tunnel.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables the tunnel.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the tunnel.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteEndpoints" access="readWrite" dmr:version="2.12">
+        <description>
+          The Fully Qualified Domain Name (FQDN) or IP address of the remote VXLAN tunnel endpoint.
+          If more than one name/address is supplied, they will be tried in turn, i.e. they are in decreasing order of precedence.
+        </description>
+        <syntax>
+          <list maxItems="4"/>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAlivePolicy" access="readWrite" dmr:version="2.12">
+        <description>
+          The mechanism used to keep the tunnel from timing out at the {{param|ConnectedRemoteEndpoint}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ICMP">
+              <description>
+                The version of the ICMP packet used for this {{param}} is based on the value of the {{param|DeliveryHeaderProtocol}} parameter (Either ICMP for IPv4 or ICMPv6 for IPv6).
+              </description>
+            </enumeration>
+            <enumeration value="None"/>
+          </string>
+          <default type="object" value="None"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveTimeout" access="readWrite" dmr:version="2.12">
+        <description>
+          The tunnel keepalive timeout in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="10"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveThreshold" access="readWrite" dmr:version="2.12">
+        <description>
+          Number of KeepAlive messages unacknowledged by the {{param|ConnectedRemoteEndpoint}} before the {{object}} is perceived failed.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="3"/>
+        </syntax>
+      </parameter>
+      <parameter name="DeliveryHeaderProtocol" access="readWrite" dmr:version="2.12">
+        <description>
+          The protocol used for the delivery header.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IPv4"/>
+            <enumeration value="IPv6"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultDSCPMark" access="readWrite" dmr:version="2.12">
+        <description>
+          If the specified entries in the {{object|#.Filter}} table do not match this {{object}} object or an instance of the {{object|Interface}} object for this {{object}} object, then the value of this parameter is applied to the delivery header of the packets in this {{object}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectedRemoteEndpoint" access="readOnly" dmr:version="2.12">
+        <description>
+          The Fully Qualified Domain Name (FQDN) name or IP address of the connected remote VXLAN tunnel endpoint.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePort" access="readWrite" dmr:version="2.12">
+        <description>
+          The source (local) port used to transmit PDUs. A value of 0 indicates that the port selection is performed by the device. In such case, it is recommended that the UDP source port number be calculated using a hash of fields from the inner packet and that it is in the dynamic/private port range 49152-65535.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemotePort" access="readWrite" dmr:version="2.12">
+        <description>
+          The remote port used to by the remote endpoint to transmit PDUs. The well-known port allocated by IANA is 4789, but it should be configurable.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="4789"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.VXLAN.Tunnel.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        Statistics for this VXLAN tunnel, i.e. all traffic that has passed through the tunnel.
+        The device MUST reset the tunnel's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the tunnel becomes operationally down due to a previous administrative down (i.e., Status parameter transitions to a disabled state after the tunnel has been disabled) or when the tunnel becomes administratively up (i.e. the Enable parameter transitioned from {{false}} to {{true}}).
+      </description>
+      <parameter name="KeepAliveSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of KeepAlive {{units}} sent out the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="messages"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of KeepAlive {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="messages"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} discarded by the tunnel due to any error.  This can include packets dropped due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.VXLAN.Tunnel.{i}.Interface.{i}." access="readWrite" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        VXLAN Interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+        The {{object}} object models the VXLAN Header as defined in {{bibref|RFC7348}} for the transport of L2 frames across over VXLAN.
+        The {{object}} object provides a way to discriminate how multiple LAN segments are encapsulated within the VXLAN Tunnel.
+        In addition the {{object}} object represents the entry point and exit point of the tunnel in relation to the LAN interface.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.12">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VNI" access="readWrite" dmr:version="2.12">
+        <description>
+          The unique Virtual Network Identifier (VNI) to be used in the VXLAN header of the tunnel.
+          A VNI with a value of -1 indicates that the CPE is to generate the VNI for this {{object}} instance.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="-1"/>
+            <range minInclusive="0" maxInclusive="16777215"/>
+          </int>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.VXLAN.Tunnel.{i}.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        Statistics for this VXLAN tunnel interface, i.e. all traffic that has passed through the interface.
+        The device MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e., the interface's Status parameter transitions to a down state after the interface has been disabled) or when the interface becomes administratively up (i.e. the Enable parameter transitioned from {{false}} to {{true}}).
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} discarded by this interface due to any error.  This can include packets dropped due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by this interface that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardChecksumReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel interface that are discarded because of Checksum errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardSequenceNumberReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel interface that are discarded because of Sequence Number errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.VXLAN.Filter.{i}." access="readWrite" numEntriesParameter="FilterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        VXLAN Filter table. Entries in this table are applied against the packets that are to be encapsulated within the VXLAN Tunnel based on the following conditions:
+        * If the value of the {{param|AllInterfaces}} is {{true}}, then this entry will be applied to all {{object|#.Tunnel}} and {{object|#.Tunnel.{i}.Interface}} instances.
+        * If the value of {{param|AllInterfaces}} is {{false}} and the value of {{param|Interface}} parameter is a reference to a row in the {{object|#.Tunnel}} table then this entry is applied to all {{object|#.Tunnel.{i}.Interface}} instances of the {{object|#.Tunnel}} reference.
+        * If the value of {{param|AllInterfaces}} is {{false}} and the value of {{param|Interface}} parameter is a reference to a row in the {{object|#.Tunnel.{i}.Interface}} table then this entry is applied to the {{object|#.Tunnel.{i}.Interface}} reference.
+        * If no entries are matched for the packet, then the default treatment (e.g., {{param|#.Tunnel.{i}.DefaultDSCPMark}}) is applied to the packet.
+        For enabled table entries, if {{param|Interface}} is not a valid reference and {{param|AllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this filter.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The status of this filter.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.12">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each packet, the highest ordered entry that matches the filter criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.12">
+        <description>
+          Filter criterion. {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Tunnel. #.Tunnel.{i}.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllInterfaces" access="readWrite" dmr:version="2.12">
+        <description>
+          Filter criterion. This specifies that all ingress VXLAN tunnel interfaces are associated with the entry. If {{true}}, the value of {{param|Interface}} is ignored since all ingress VXLAN tunnel interfaces are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDCheck" access="readWrite" dmr:version="2.12">
+        <description>
+          Filter criterion.
+          Current outer Ethernet VLAN ID as defined in 802.1Q. A value of -1 indicates this criterion is not used for filtering.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDExclude" access="readWrite" dmr:version="2.12">
+        <description>
+          If {{false}}, the filter includes only those packets that match the {{param|VLANIDCheck}} entry, if specified.
+          If {{true}}, the filter includes all packets except those that match the {{param|VLANIDCheck}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMarkPolicy" access="readWrite" dmr:version="2.12">
+        <description>
+          DSCP with which to mark the outer IP header for traffic that is associated with the interface criterion.
+          Automatic DSCP marking behavior is a local matter to the device, possibly influenced by other Broadband Forum standards that it supports.
+          * A value of -1 indicates copy from the upstream packet.
+          * A value of -2 indicates automatic marking of DSCP.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2" maxInclusive="63"/>
+          </int>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MAP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        The Mapping of Address and Port (MAP) object {{bibref|RFC7597}} {{bibref|RFC7599}} {{bibref|RFC7598}}. This object applies only to gateway devices that support IPv4 on the LAN side, include a {{object|#.NAT}}, and typically have only IPv6 connectivity on the WAN side.
+        See the MAP Theory of Operation {{bibref|TR-181i2a8|Appendix XV}} for a description of the working of this MAP data model.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables MAP.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="DomainNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MAP.Domain.{i}." access="readWrite" numEntriesParameter="DomainNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        MAP domain settings {{bibref|RFC7597}} {{bibref|RFC7599}}.  Each instance models a MAP domain.
+        MAP supports two transport modes, both of which use NAPT44 (modified to use a restricted port range):
+        * MAP-E ({{param|TransportMode}} = {{enum|Encapsulation|TransportMode}}) uses an IPv4-in-IPv6 tunnel.
+        * MAP-T ({{param|TransportMode}} = {{enum|Translation|TransportMode}}) uses stateless NAT64.
+        Note: There is an n:1 relationship between a MAP domain and the associated {{param|WANInterface}}, i.e. in theory multiple MAP domains can be associated with a single WAN IP interface (each domain would have its own ''End-user IPv6 prefix'' and ''MAP IPv6 address'').
+        Note: The {{object}} table includes unique key parameters that are strong references. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="WANInterface"/>
+        <parameter ref="IPv6Prefix"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the MAP domain.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The current operational state of the MAP domain.
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured" optional="true"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransportMode" access="readWrite" dmr:version="2.8">
+        <description>
+          The transport mode to use.
+          Corresponds to the {{bibref|RFC7598}} ''S46_CONT_MAPE'' and ''S46_CONT_MAPT'' container options.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Encapsulation">
+              <description>
+                MAP-E {{bibref|RFC7597}}
+              </description>
+            </enumeration>
+            <enumeration value="Translation">
+              <description>
+                MAP-T {{bibref|RFC7599}}
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Translation"/>
+        </syntax>
+      </parameter>
+      <parameter name="WANInterface" access="readWrite" dmr:version="2.8">
+        <description>
+          The IP interface with which this MAP domain is associated.  This will always be a NAT-ted upstream (WAN) interface.
+          The ''End-user IPv6 prefix'' {{param|IPv6Prefix}} is one of this IP interface's prefixes.
+          The ''MAP IPv6 address'' is derived from the ''End-user IPv6 prefix'' and is one of this IP interface's IP addresses, with an {{param|##.IP.Interface.{i}.IPv6Address.{i}.Origin}} of {{enum|MAP|##.IP.Interface.{i}.IPv6Address.{i}.Origin}}.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6Prefix" access="readWrite" dmr:version="2.8">
+        <description>
+          The MAP domain's ''End-user IPv6 prefix''.  This MUST reference one of {{param|WANInterface}}'s prefixes.
+          If the ACS configures this prefix directly, the CPE MUST use the ACS-configured prefix.  Otherwise, the CPE MUST select one of {{param|WANInterface}}'s prefixes; the selected prefix will typically have {{param|##.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} =  {{enum|PrefixDelegation|##.IP.Interface.{i}.IPv6Prefix.{i}.Origin}}.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BRIPv6Prefix" access="readWrite" dmr:version="2.8">
+        <description>
+          The MAP Border Relay (BR) address or prefix.
+          * For MAP-E this is the BR address and therefore MUST be a /128 {{bibref|RFC7597}}. Note this address can be an IPv6 anycast address. This address corresponds to the {{bibref|RFC7598}} ''OPTION_S46_BR'' (Border Relay) option.
+          * For MAP-T this is the BR prefix {{bibref|RFC7599}}. This address prefix corresponds to the {{bibref|RFC7598}} ''OPTION_S46_DMR'' (Default Mapping Rule) option.
+          Note: There will be a corresponding {{object|.Routing.Router.{i}.IPv4Forwarding}} default rule.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMarkPolicy" access="readWrite" dmr:version="2.8">
+        <description>
+          DSCP with which to mark the outer IP header for traffic that is associated with this MAP domain.
+          Downstream packets are never re-marked.
+          Automatic DSCP marking behavior is a local matter to the device, possibly influenced by other Broadband Forum standards that it supports.
+          * A value of -1 indicates copy from the incoming packet.
+          * A value of -2 indicates automatic marking of DSCP.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2" maxInclusive="63"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="PSIDOffset" access="readWrite" status="deprecated" dmr:version="2.8">
+        <description>
+          ''Port-set ID'' (PSID) offset in {{units}}.  The number of Port-sets is 2^{{param}}.
+          Corresponds to the {{bibref|RFC7598}} ''S46_PORTPARAMS'' (Port Parameters) option's ''offset'' field.
+          This parameter is DEPRECATED because details changed between drafting this data model and the RFC being published.  This parameter has been moved to the proper location within the {{object|Rule.{i}.}} object.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="15"/>
+            <units value="bits"/>
+          </unsignedInt>
+          <default type="object" value="6"/>
+        </syntax>
+      </parameter>
+      <parameter name="PSIDLength" access="readWrite" status="deprecated" dmr:version="2.8">
+        <description>
+          The length in {{units}} of the ''Port-set id'' (PSID) configured in the {{param|PSID}} parameter.
+          Corresponds to the {{bibref|RFC7598}} ''S46_PORTPARAMS'' (Port Parameters) option's ''PSID-len'' field.
+          This parameter is DEPRECATED because details changed between drafting this data model and the RFC being published.  This parameter has been moved to the proper location within the {{object|Rule.{i}.}} object.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="16"/>
+            <units value="bits"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PSID" access="readWrite" status="deprecated" dmr:version="2.8">
+        <description>
+          ''Port-set ID'' (PSID) to use in preference to the value extracted from the ''Embedded Address'' (EA) bits.
+          Only the high order {{param|PSIDLength}} bits of the {{param}} value are used, so the parameter is ignored when {{param|PSIDLength}} is zero.
+          Corresponds to the {{bibref|RFC7598}} ''S46_PORTPARAMS'' (Port Parameters) option's ''PSID'' field.
+          This parameter is DEPRECATED because details changed between drafting this data model and the RFC being published.  This parameter has been moved to the proper location within the {{object|Rule.{i}.}} object.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="IncludeSystemPorts" access="readWrite" dmr:version="2.8">
+        <description>
+          Whether to include low-numbered (system) ports in the Port-sets. Normally ports in the range [0:2^(16-{{param|PSIDOffset}})-1] are excluded, e.g. for the default {{param|PSIDOffset}} value of 4, ports [0:4095] are not included in the Port-sets.
+          This parameter is related to {{bibref|RFC7597}}'s ''N'', which is defined as ''the number of ports (e.g., 1024) excluded from the lower end of the range''.  The parameter is relevant only when {{param|PSIDOffset}} is 0; {{false}} corresponds to ''N=1024'' and {{true}} corresponds to ''N=0''.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="RuleNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MAP.Domain.{i}.Rule.{i}." access="readWrite" numEntriesParameter="RuleNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        The MAP domain's Mapping Rules {{bibref|RFC7597}}. The rule with the longest match between its {{param|IPv6Prefix}} and the end-user {{param|#.IPv6Prefix}} is the Basic Mapping Rule (BMR). Any of the rules (including the BMR) can be a Forwarding Mapping Rule.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="IPv6Prefix"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="IPv4Prefix"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enable or disable this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of this {{object}} instance.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.8">
+        <description>
+          The mechanism via which the {{object}} was created.
+          If the CPE supports MAP configuration via both DHCPv6 and CWMP, it is up to the implementation to determine how the two mechanisms will interact.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv6">
+              <description>
+                Created via a {{bibref|RFC7598}} ''S46_RULE'' option.
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                Present in the factory default configuration, created by the ACS, or created by some other management entity (e.g. via a GUI)
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6Prefix" access="readWrite" dmr:version="2.8">
+        <description>
+          The ''Rule IPv6 prefix''.
+          The Rule IPv6 prefix is a leading part of the end-user {{param|#.IPv6Prefix}}, i.e. its length MUST be less than or equal to the length of the end-user ''IPv6Prefix'', and it MUST match the end-user ''IPv6Prefix''.
+          Corresponds to the {{bibref|RFC7598}} ''S46_RULE'' option's ''ipv6-prefix'' field.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+          <default type="object" value="/0"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4Prefix" access="readWrite" dmr:version="2.8">
+        <description>
+          The ''Rule IPv4 prefix''.
+          Corresponds to the {{bibref|RFC7598}} ''S46_RULE'' option's ''ipv4-prefix'' field.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Prefix"/>
+          <default type="object" value="/0"/>
+        </syntax>
+      </parameter>
+      <parameter name="EABitsLength" access="readWrite" dmr:version="2.8">
+        <description>
+          The length in {{units}} of the ''Embedded Address (EA) bits'' in the end-user {{param|#.IPv6Prefix}}.
+          Corresponds to the {{bibref|RFC7598}} ''S46_RULE'' option's ''ea-len'' field.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="48"/>
+            <units value="bits"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="IsFMR" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates whether this rule is a ''Forwarding Mapping Rule'' (FMR), i.e. can be used for forwarding.
+          Corresponds to the {{bibref|RFC7598}} ''S46_RULE'' option's ''flags'' field's ''F-Flag''.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PSIDOffset" access="readWrite" dmr:version="2.12">
+        <description>
+          ''Port-set ID'' (PSID) offset in {{units}}.  The number of Port-sets is 2^{{param}}.
+          Corresponds to the {{bibref|RFC7598}} ''S46_PORTPARAMS'' (Port Parameters) option's ''offset'' field.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="15"/>
+            <units value="bits"/>
+          </unsignedInt>
+          <default type="object" value="6"/>
+        </syntax>
+      </parameter>
+      <parameter name="PSIDLength" access="readWrite" dmr:version="2.12">
+        <description>
+          The length in {{units}} of the ''Port-set id'' (PSID) configured in the {{param|PSID}} parameter.
+          Corresponds to the {{bibref|RFC7598}} ''S46_PORTPARAMS'' (Port Parameters) option's ''PSID-len'' field.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="16"/>
+            <units value="bits"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PSID" access="readWrite" dmr:version="2.12">
+        <description>
+          ''Port-set ID'' (PSID) to use in preference to the value extracted from the ''Embedded Address'' (EA) bits.
+          Only the high order {{param|PSIDLength}} bits of the {{param}} value are used, so the parameter is ignored when {{param|PSIDLength}} is zero.
+          Corresponds to the {{bibref|RFC7598}} ''S46_PORTPARAMS'' (Port Parameters) option's ''PSID'' field.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MAP.Domain.{i}.Interface." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        MAP interface (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).  This models the LAN side MAP domain interface.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.8">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.8">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since this interface object is a MAP domain interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MAP.Domain.{i}.Interface.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Throughput statistics for this MAP domain interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+          Note that IPv6 does not define broadcast addresses, so IPv6 packets will never cause this counter to increment.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+          Note that IPv6 does not define broadcast addresses, so IPv6 packets will never cause this counter to increment.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.CaptivePortal." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains parameters relating to the captive portal configuration on the CPE.
+        The captive portal configuration defines the CPE's upstream HTTP (port 80) traffic redirect behavior.
+        When the captive portal is disabled, upstream HTTP (port 80) traffic MUST be permitted to all destinations.
+        When the captive portal is enabled, upstream HTTP (port 80) traffic MUST be permitted only to destinations listed in the {{param|AllowedList}}; traffic to all other destinations MUST be redirected to the {{param|URL}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the captive portal.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the status of the captive portal.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_URLEmpty">
+              <description>
+                {{param|URL}} is {{empty}}
+              </description>
+            </enumeration>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AllowedList" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} List items represent IP addresses to which HTTP (port 80) traffic MUST always be permitted, regardless of whether the captive portal is enabled.
+          Each entry in the list MUST be either an IP address, or an IP prefix specified using Classless Inter-Domain Routing (CIDR) notation {{bibref|RFC4632}}.
+          An IP prefix is specified as an IP address followed (with no intervening white space) by "/n", where ''n'' (the prefix size) is an integer in the range 0-32 (for IPv4) or 0-128 (for IPv6) that indicates the number of (leftmost) '1' bits of the prefix.
+          IPv4 example:
+          * 1.2.3.4 specifies a single IPv4 address, and 1.2.3.4/24 specifies a class C subnet with subnet mask 255.255.255.0.
+          * 1.2.0.0/22 represents the 1024 IPv4 addresses from 1.2.0.0 to 1.2.3.255.
+          IPv6 example:
+          * fec0::220:edff:fe6a:f76 specifies a single IPv6 address.
+          * 2001:edff:fe6a:f76::/64 represents the IPv6 addresses from 2001:edff:fe6a:f76:0:0:0:0 to 2001:edff:fe6a:f76:ffff:ffff:ffff:ffff.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="10000"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="URL" access="readWrite" dmr:version="2.0">
+        <description>
+          Captive portal URL to which upstream HTTP (port 80) traffic to destinations not listed in the {{param|AllowedList}} will be redirected.
+          The captive portal URL MUST be an HTTP (not HTTPS) URL.
+          The CPE MUST permit the captive portal URL to be set to {{empty}}, which has the effect of disabling the captive portal (if {{param|Enable}} is {{true}} and the captive portal URL is {{empty}}, {{param|Status}} MUST be {{enum|Error_URLEmpty|Status}}).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="2000"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Routing object that contains the {{object|Router}} table and {{object|RIP}} protocol object.
+      </description>
+      <parameter name="RouterNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing.Router.{i}." access="readWrite" numEntriesParameter="RouterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object allows the handling of the routing and forwarding configuration of the device.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this ''Router'' entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this ''Router'' entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4ForwardingNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6ForwardingNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing.Router.{i}.IPv4Forwarding.{i}." access="readWrite" numEntriesParameter="IPv4ForwardingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Layer 3 IPv4 forwarding table.
+        In addition to statically configured routes, this table MUST include dynamic routes learned through layer 3 routing protocols, including RIP (i.e. RIP version 2), OSPF, DHCPv4, and IPCP.  The CPE MAY reject attempts to delete or modify a dynamic route entry.
+        For each incoming packet, the layer 3 forwarding decision is conceptually made as follows:
+        * Only enabled table entries with a matching {{param|ForwardingPolicy}} are considered, i.e. those that either do not specify a {{param|ForwardingPolicy}}, or else specify a {{param|ForwardingPolicy}} that matches that of the incoming packet.
+        * Next, table entries that also have a matching destination address/mask are considered, and the matching entry with the longest prefix is applied to the packet (i.e. the entry with the most specific network). An unspecified destination address is a wild-card and always matches, but with a prefix length of zero.
+        For enabled table entries, if {{param|Interface}} is not a valid reference to an IPv4-capable interface (that is attached to the IPv4 stack), then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="DestIPAddress"/>
+        <parameter ref="DestSubnetMask"/>
+        <parameter ref="ForwardingPolicy"/>
+        <parameter ref="GatewayIPAddress"/>
+        <parameter ref="Interface"/>
+        <parameter ref="ForwardingMetric"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the forwarding entry.  On creation, an entry is disabled by default.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the status of the forwarding entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="StaticRoute" access="readOnly" dmr:version="2.0">
+        <description>
+          If {{true}}, this route is a Static route.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIPAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          Destination IPv4 address.  {{empty}} indicates no destination address is specified.
+          A Forwarding table entry for which {{param}} and {{param|DestSubnetMask}} are both {{empty}} is a default route.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestSubnetMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Destination subnet mask.  {{empty}} indicates no destination subnet mask is specified.
+          If a destination subnet mask is specified, the {{param}} is ANDed with the destination address before comparing with the {{param|DestIPAddress}}.  Otherwise, the full destination address is used as is.
+          A Forwarding table entry for which {{param|DestIPAddress}} and {{param}} are both {{empty}} is a default route.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingPolicy" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifier of a set of classes or flows that have the corresponding {{param}} value as defined in the {{object|Device.QoS}} object.
+          A value of -1 indicates no {{param}} is specified.
+          If specified, this forwarding entry is to apply only to traffic associated with the specified classes and flows.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="GatewayIPAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          IPv4 address of the gateway.
+          Only one of {{param}} and Interface SHOULD be configured for a route.
+          If both are configured, {{param}} and {{param|Interface}} MUST be consistent with each other.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Specifies the egress layer 3 interface associated with this entry. Example: Device.IP.Interface.1.
+          Only one of {{param|GatewayIPAddress}} and {{param}} SHOULD be configured for a route.
+          If both are configured, {{param|GatewayIPAddress}} and {{param}} MUST be consistent with each other.
+          For a route that was configured by setting {{param|GatewayIPAddress}} but not {{param}}, read access to {{param}} MUST return the full hierarchical parameter name for the routes egress interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.2">
+        <description>
+          Protocol via which the IPv4 forwarding rule was learned.  {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv4"/>
+            <enumeration value="OSPF"/>
+            <enumeration value="IPCP"/>
+            <enumeration value="RIP"/>
+            <enumeration value="Static">
+              <description>
+                For example, present in the factory default configuration, created by the ACS, or created by some other management entity (e.g. via a GUI).
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingMetric" access="readWrite" dmr:version="2.0">
+        <description>
+          Forwarding metric.  A value of -1 indicates this metric is not used.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing.Router.{i}.IPv6Forwarding.{i}." access="readWrite" numEntriesParameter="IPv6ForwardingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        Layer 3 IPv6 forwarding table.
+        In addition to statically configured routes, this table MUST include dynamic routes learned through layer 3 routing protocols, including RIPng, OSPF, DHCPv6, and RA.  The CPE MAY reject attempts to delete or modify a dynamic route entry.
+        For each incoming packet, the layer 3 forwarding decision is conceptually made as follows:
+        * Only enabled table entries with a matching {{param|ForwardingPolicy}} are considered, i.e. those that either do not specify a {{param|ForwardingPolicy}}, or else specify a {{param|ForwardingPolicy}} that matches that of the incoming packet.
+        * Next, table entries that also have a matching destination prefix are considered, and the matching entry with the longest prefix length is applied to the packet (i.e. the entry with the most specific network). An unspecified destination address is a wild-card and always matches, but with a prefix length of zero.
+        For enabled table entries, if {{param|Interface}} is not a valid reference to an IPv6-capable interface (that is attached to the IPv6 stack), then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        This object is based on ''inetCidrRouteTable'' from {{bibref|RFC4292}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="DestIPPrefix"/>
+        <parameter ref="ForwardingPolicy"/>
+        <parameter ref="NextHop"/>
+        <parameter ref="Interface"/>
+        <parameter ref="ForwardingMetric"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          Indicates the status of the forwarding entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIPPrefix" access="readWrite" dmr:version="2.2">
+        <description>
+          Destination IPv6 prefix. {{empty}} indicates that it matches all destination prefixes (i.e. equivalent to "::/0"). All bits to the right of the prefix MUST be zero, e.g. 2001:edff:fe6a:f76::/64.
+          Routes with a 128-bit prefix length (/128) are host routes for a specific IPv6 destination, e.g. 2001:db8:28:2:713e:a426:d167:37ab/128.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingPolicy" access="readWrite" dmr:version="2.2">
+        <description>
+          Identifier of a set of classes or flows that have the corresponding {{param}} value as defined in the {{object|.QoS}} object.
+          A value of -1 indicates no {{param}} is specified.
+          If specified, this forwarding entry is to apply only to traffic associated with the specified classes and flows.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="NextHop" access="readWrite" dmr:version="2.2">
+        <description>
+          IPv6 address of the next hop.
+          Only one of {{param}} and {{param|Interface}} SHOULD be configured for a route. {{empty}} indicates no {{param}} is specified.
+          If both are configured, {{param}} and {{param|Interface}} MUST be consistent with each other.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.2">
+        <description>
+          {{reference}} Specifies the egress layer 3 interface associated with this entry. Example: ''Device.IP.Interface.1''.
+          Only one of {{param|NextHop}} and {{param}} SHOULD be configured for a route. {{empty}} indicates no {{param}} is specified.
+          If both are configured, {{param|NextHop}} and {{param}} MUST be consistent with each other.
+          For a route that was configured by setting {{param|NextHop}} but not {{param}}, read access to {{param}} MUST return the full hierarchical parameter name for the route's egress interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.2">
+        <description>
+          Protocol via which the IPv6 forwarding rule was learned.  {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv6"/>
+            <enumeration value="OSPF"/>
+            <enumeration value="RA">
+              <description>
+                Router Advertisement Route Information Option {{bibref|RFC4191}}.
+              </description>
+            </enumeration>
+            <enumeration value="RIPng">
+              <description>
+                RIPng for IPv6 {{bibref|RFC2080}}
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                For example, present in the factory default configuration, created by the ACS, or created by some other management entity (e.g. via a GUI).
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingMetric" access="readWrite" dmr:version="2.2">
+        <description>
+          Forwarding metric.  A value of -1 indicates this metric is not used.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ExpirationTime" access="readOnly" dmr:version="2.2">
+        <description>
+          The time at which the route will expire, or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+          {{param}} is provided by an underlying dynamic routing protocol, e.g. by an {{bibref|RFC4191}} route information option.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="9999-12-31T23:59:59Z"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing.RIP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Routing Information Protocol (RIP) object.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables RIP on the device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedModes" access="readOnly" dmr:version="2.0">
+        <description>
+          The supported RIP protocol modes.  {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Send"/>
+            <enumeration value="Receive"/>
+            <enumeration value="Both"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceSettingNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing.RIP.InterfaceSetting.{i}." access="readWrite" numEntriesParameter="InterfaceSettingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        IP Interface RIP configuration table.
+        For enabled table entries, if {{param|Interface}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+        Note: This object only applies to RIP2; i.e. version 2 of the RIP protocol is used to accept or send over the specified {{param|Interface}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} This is the IP interface associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AcceptRA" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, RIP route advertisements received over {{param|Interface}} are accepted.
+          When set to {{false}}, RIP route advertisements received over {{param|Interface}} are rejected.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SendRA" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, RIP route advertisements are to be sent over {{param|Interface}}.
+          When set to {{false}}, no RIP route advertisements will be sent over {{param|Interface}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing.RouteInformation." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        Received Router Advertisement (RA) route information {{bibref|RFC4191}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables receiving route information from the RA.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceSettingNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing.RouteInformation.InterfaceSetting.{i}." access="readOnly" numEntriesParameter="InterfaceSettingNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        IP Interface RA route information table. Contains received RA route information {{bibref|RFC4191}}. As such, the data in this table cannot be modified.
+      </description>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ForwardingEntryCreated"/>
+            <enumeration value="NoForwardingEntry"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readOnly" dmr:version="2.2">
+        <description>
+          {{reference}} This is the IP interface associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SourceRouter" access="readOnly" dmr:version="2.2">
+        <description>
+          IPv6 Address of the router that sent the RA that included this route info.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredRouteFlag" access="readOnly" dmr:version="2.2">
+        <description>
+          Flag included in a specific Route Information Option within an RA message (Prf flag), as defined in {{bibref|RFC4191|Section 2.3}}. {{enum}}
+          Note that this is not the Prf flag included in the base RA message. Also see {{bibref|RFC4191|Section 2.1}} which discusses how this flag is encoded on the wire.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="High"/>
+            <enumeration value="Medium"/>
+            <enumeration value="Low"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Prefix" access="readOnly" dmr:version="2.2">
+        <description>
+          IPv6 address prefix, as received in an instance of the Route Information Option of a RA message.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+        </syntax>
+      </parameter>
+      <parameter name="RouteLifetime" access="readOnly" dmr:version="2.2">
+        <description>
+          The time at which {{param|Prefix}} will cease to be usable for use as a forwarding entry, or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+          {{param}} is received in an instance of the Route Information Option of a RA message.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.NeighborDiscovery." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        The Neighbor Discovery Protocol (NDP) object {{bibref|RFC4861}}.  This object applies only to IPv6.  It contains an {{object|InterfaceSetting}} table that defines the NDP configuration for individual IP interfaces.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables Neighbor Discovery.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceSettingNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.NeighborDiscovery.InterfaceSetting.{i}." access="readWrite" numEntriesParameter="InterfaceSettingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        Per-interface Neighbor Discovery Protocol (NDP) configuration {{bibref|RFC4861}}.
+        For enabled table entries, if {{param|Interface}} is not a valid reference to an IPv6-capable interface (that is attached to the IPv6 stack), then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.2">
+        <description>
+          This is the IP interface associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="RetransTimer" access="readWrite" dmr:version="2.2">
+        <description>
+          Retransmission interval in {{units}}, as defined in {{bibref|RFC4861}}. For auto-configuration purposes, {{param}} specifies the delay between consecutive Neighbor Solicitation transmissions performed during Duplicate Address Detection (DAD) {{bibref|RFC4862|Section 5.4}}, as well as the time a node waits after sending the last Neighbor Solicitation before ending the DAD process.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="1000"/>
+        </syntax>
+      </parameter>
+      <parameter name="RtrSolicitationInterval" access="readWrite" dmr:version="2.2">
+        <description>
+          Retransmission interval in {{units}}, as defined in {{bibref|RFC4861}}. For auto-configuration purposes, {{param}} specifies the delay between consecutive Router Solicitation transmissions.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="4"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxRtrSolicitations" access="readWrite" dmr:version="2.2">
+        <description>
+          Maximum Number of Router Solicitation Transmission messages, as defined in {{bibref|RFC4861}}. For auto-configuration purposes {{param}} specifies the Maximum Number of Router Solicitation Transmission messages to help the host to conclude that there are no routers on the link.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="3"/>
+        </syntax>
+      </parameter>
+      <parameter name="NUDEnable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables Neighbor Unreachability Detection (NUD) {{bibref|RFC4861|Section 7}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RSEnable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables Router Solicitation (RS) on {{param|Interface}} {{bibref|RFC4861|Section 4.1}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.RouterAdvertisement." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        The Router Advertisement (RA) object {{bibref|RFC4861}}. This object applies only to IPv6. It contains an {{object|InterfaceSetting}} table that defines the RA configuration for individual IP interfaces.
+        Information received via router advertisement messages is automatically propagated to the relevant {{object|.IP.Interface}} sub-objects, e.g. to the {{object|.IP.Interface.{i}.IPv6Address}} and {{object|.IP.Interface.{i}.IPv6Prefix}} tables.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables Router Advertisement.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceSettingNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.RouterAdvertisement.InterfaceSetting.{i}." access="readWrite" numEntriesParameter="InterfaceSettingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        Per-interface Router Advertisement (RA) configuration {{bibref|RFC4861}}. Table entries are created for use in sending Router Advertisements.
+        For enabled table entries, if {{param|Interface}} is not a valid reference to an IPv6-capable interface (that is attached to the IPv6 stack), then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+          Defines the value of the ''IsRouter'' and ''AdvSendAdvertisements'' flags from {{bibref|RFC4861|Section 4.2}}
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.2">
+        <description>
+          This is the IP interface associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ManualPrefixes" access="readWrite" dmr:version="2.2">
+        <description>
+          {{list}} {{reference}}
+          Manually-configured prefixes that will be sent in Router Advertisement messages.  Each referenced prefix MUST have a  {{param|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}} of {{enum|Static|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}} or {{enum|Child|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}}.  Router Advertisement messages MUST include Prefix Information Options {{bibref|RFC4861}} for all ''Valid'' ({{param|.IP.Interface.{i}.IPv6Prefix.{i}.ValidLifetime}} is infinite or in the future) prefixes in this list.
+          Prefixes MUST be associated with the interface instance referenced by {{param|Interface}}.
+        </description>
+        <syntax>
+          <list maxItems="8"/>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Prefixes" access="readOnly" dmr:version="2.2">
+        <description>
+          {{list}} {{reference}}
+          All prefixes that will be included in Router Advertisement (RA) messages sent out this interface. This list can include:
+          * Prefixes from {{param|ManualPrefixes}} that are included in RA messages.
+          * Prefixes with {{param|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} = {{enum|Child|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} or {{enum|AutoConfigured|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} associated with the interface instance referenced by {{param|Interface}}.
+        </description>
+        <syntax>
+          <list maxItems="8"/>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxRtrAdvInterval" access="readWrite" dmr:version="2.2">
+        <description>
+          The maximum time allowed between sending unsolicited multicast Router Advertisements from the interface, in {{units}} (see {{bibref|RFC4861|Section 4.2}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="4" maxInclusive="1800"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="600"/>
+        </syntax>
+      </parameter>
+      <parameter name="MinRtrAdvInterval" access="readWrite" dmr:version="2.2">
+        <description>
+          The minimum time allowed between sending unsolicited multicast Router Advertisements from the interface, in {{units}} (see {{bibref|RFC4861|Section 4.2}}).
+          The value MUST be no greater than 3/4 * {{param|MaxRtrAdvInterval}}.
+          Note: The ''1350'' maximum was derived from the RFC, based on 3/4 times the maximum value of {{param|MaxRtrAdvInterval}}. Similarly, the ''200'' default was derived from the RFC, based on 1/3 times the default value of {{param|MaxRtrAdvInterval}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="3" maxInclusive="1350"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="200"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvDefaultLifetime" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Router Lifetime" field of Router Advertisement messages on this interface, in {{units}} (see {{bibref|RFC4861|Section 4.2}}).
+          The value can be zero or between {{param|MaxRtrAdvInterval}} and 9000 {{units}}, but these limits can be overridden by specific documents that describe how IPv6 operates over different link layers.
+          A value of zero indicates that the router is not to be used as a default router.
+          Note: The ''1800'' default was derived from the RFC, based on 3 times the default value of {{param|MaxRtrAdvInterval}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="1800"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvManagedFlag" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Managed address configuration" (M) flag field of Router Advertisement messages on this interafce (see {{bibref|RFC4861|Section 4.2}}, and {{bibref|RFC4862}}).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvOtherConfigFlag" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Other configuration" (O) flag field of Router Advertisement messages on this interface (see {{bibref|RFC4861|Section 4.2}}, and {{bibref|RFC4862}}).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvMobileAgentFlag" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Home agent" (H) flag field of Router Advertisement messages on this interface (see {{bibref|RFC3775|Section 7.1}}).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvPreferredRouterFlag" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Default Router Preference" (Prf) field of Router Advertisement messages on this interface, as defined in {{bibref|RFC4191|Section 2.2}}. {{enum}}
+          Also see {{bibref|RFC4191|Section 2.1}} which discusses how this flag is encoded on the wire.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="High"/>
+            <enumeration value="Medium"/>
+            <enumeration value="Low"/>
+          </string>
+          <default type="object" value="Medium"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvNDProxyFlag" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Proxy" (P) flag field of Router Advertisement messages on this interface (see {{bibref|RFC4389|Section 4.1.3.3}}).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvLinkMTU" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in MTU options of Router Advertisement messages on this interface. A value of zero indicates that no MTU options are included (see {{bibref|RFC4861|Section 4.6.4}}).
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvReachableTime" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Reachable Time" field of Router Advertisement messages on this interface, in {{units}} (see {{bibref|RFC4861|Section 4.2}}).
+          The value zero means unspecified (by the router).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="3600000"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvRetransTimer" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Retrans Timer" field of Router Advertisement messages on this interface (see {{bibref|RFC4861|Section 4.2}}).
+          The value zero means unspecified (by the router).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvCurHopLimit" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Cur Hop Limit" field of Router Advertisement messages on this interface (see {{bibref|RFC4861|Section 4.2}}).
+          The value zero means unspecified (by the router).
+          Note: The default can be overridden with the value specified in {{bibref|RFC3232}} that was in effect at the time of implementation.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.RouterAdvertisement.InterfaceSetting.{i}.Option.{i}." access="readWrite" numEntriesParameter="OptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        This object specifies the options in a Router Advertisement (RA) message {{bibref|RFC4861|Section 4.6}}. {{object}} entries are created for use in sending Router Advertisements (enabled options MUST be included in RA messages sent). This includes support for sending DNS information in the RA message as described in {{bibref|RFC6106}}.
+        This table is intended only for options that are not modeled elsewhere. For example, it is not appropriate for the MTU option (which is modeled via {{param|#.AdvLinkMTU}}).
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Tag"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tag" access="readWrite" dmr:version="2.2">
+        <description>
+          Option tag (type) {{bibref|RFC4861|Section 4.6}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.2">
+        <description>
+          A hexbinary encoded option value {{bibref|RFC4861|Section 4.6}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPv6rd." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        Settings allowing a CPE to derive and route IPv6 Rapid Deployment (6rd) delegated prefixes as specified in {{bibref|RFC5969}}.  The 6rd mechanism is intended to be implemented only on what {{bibref|RFC5969}} refers to as ''Customer Edge Routers'', i.e. on gateway devices, that support IPv6 on the LAN side and only have IPv4 connectivity on the WAN side.
+        See the 6rd Theory of Operation {{bibref|TR-181i2a2|Appendix VI}} for a description of the working of this 6rd data model.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables IPv6rd.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceSettingNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPv6rd.InterfaceSetting.{i}." access="readOnly" numEntriesParameter="InterfaceSettingNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        6rd {{bibref|RFC5969}} settings.
+        A 6rd delegated prefix is expected to be of maximum length 64 bits, and is the concatenation of the following two items:
+        * Service provider IPv6 prefix: specified via the {{param|SPIPv6Prefix}} parameter
+        * IPv4 address suffix: the IPv4 address with the first {{param|IPv4MaskLength}} bits removed
+        This object definition is derived from {{bibref|RFC5969}} with some minor nomenclature changes.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enable or disable this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="BorderRelayIPv4Addresses" access="readWrite" dmr:version="2.2">
+        <description>
+          List items are the IPv4 addresses (possibly anycast) of the 6rd Relay(s).
+        </description>
+        <syntax>
+          <list maxItems="4"/>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="AllTrafficToBorderRelay" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{true}}, the destination address for all 6rd traffic will be set (IPv4 destination address) to one of the {{param|BorderRelayIPv4Addresses}}. If {{false}}, traffic whose destination address begins with the same prefix as {{param|SPIPv6Prefix}} will be sent directly to the destination IPv4 address of the endpoint, which is in the same 6rd domain. See 6rd Theory of Operation for further explanation {{bibref|TR-181i2a2|Appendix VI}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SPIPv6Prefix" access="readWrite" dmr:version="2.2">
+        <description>
+          The Service Provider's 6rd IPv6 prefix for this deployment and this 6rd RG.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4MaskLength" access="readWrite" dmr:version="2.2">
+        <description>
+          The number of high-order {{units}} that are identical across all IPv4 addresses within a given 6rd domain. This number of {{units}} MUST be removed from the start of the IPv4 address when generating the 6rd delegated prefix.
+          For example, if this value is 8, only the final 24 {{units}} of the subscriber IPv4 prefix will be used when creating the IPv6 delegated prefix, determining the destination IPv4 encapsulation address, etc.
+          If the value is 0, then the whole 32 {{units}} of the IPv4 address are used in the encoding.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="32"/>
+            <units value="bits"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AddressSource" access="readWrite" dmr:version="2.2">
+        <description>
+          {{reference}} Points to the IPv4 address that is the source of the IPv4 address embedded in the IPv6 6rd prefix, and used as the source encapsulating IPv4 address. If the value is {{empty}} or this parameter is not present, the device will use internal logic to determine which IPv4 source address to use.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv4Address." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TunnelInterface" access="readOnly" dmr:version="2.2">
+        <description>
+          {{reference}} This is an IP interface of ''Type'' {{enum|Tunnel|.IP.Interface.{i}.Type}} that is logically the tunnel entry point for upstream IPv6 traffic and is also logically the tunnel exit point for downstream IPv6 traffic (i.e. the entry point for non-tunneled upstream IPv6 traffic to enter a tunnel and become tunneled, or conversely, the exit point for downstream IPv6 traffic leaving a tunnel after being un-tunneled).
+          IPv6 traffic that enters {{param}} from the LAN is expected to continue on through {{param|TunneledInterface}}, and traffic from the WAN is expected to come from {{param|TunneledInterface}} into {{param}}. {{param}} is a logical interface that can allow for classification, marking (of IPv6 headers), and policing of IPv6 traffic that will be going over a 6rd tunnel. These functions are modeled in the {{object|.QoS.}} object.
+          {{param}} can be used also to represent the 6rd virtual interface defined in {{bibref|RFC5969}}.
+          Note: In 6rd, IPv6 packets arriving over one or more device LAN IP interfaces are logically fed into this {{param}}. Likewise, 6rd traffic from the WAN gets logically sent from this {{param}} to LAN IP interfaces.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TunneledInterface" access="readOnly" dmr:version="2.2">
+        <description>
+          {{reference}} This is an IP interface of ''Type'' {{enum|Tunneled|.IP.Interface.{i}.Type}} that provides information about the IPv4 headers used to encapsulate the IPv6 packets.
+          Encapsulated IPv6 traffic that enters {{param}} from the WAN is expected to continue on through {{param|TunnelInterface}}, and traffic from the LAN is expected to come from {{param|TunnelInterface}} into {{param}}. {{param}} is a logical interface that can allow for classification, marking (of IPv4 headers and VLAN tags), and policing of IPv4 packets that encapsulate IPv6 packets in 6rd traffic. These functions are modeled in the {{object|.QoS.}} object.
+          Note: In 6rd, {{param}} traffic originating from the LAN logically feeds into a WAN-side IPv4 capable IP interface that the "IPv6 6rd tunnel" goes over. 6rd traffic that enters over this IPv4 WAN interface gets logically sent to this {{param}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSLite." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        Settings allowing a CPE to configure and route IPv6 Dual-Stack Lite (DSLite) as specified in {{bibref|DSLite}}. The DS-Lite mechanism is intended to be implemented only on gateway devices that support IPv4 on the LAN side and only have IPv6 connectivity on the WAN side.
+        See the Dual-Stack Lite Theory of Operation {{bibref|TR-181i2a2|Appendix VII}} for a description of the working of this DS-Lite data model.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables DSLite.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceSettingNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSLite.InterfaceSetting.{i}." access="readOnly" numEntriesParameter="InterfaceSettingNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        DSLite {{bibref|DSLite}} settings.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enable or disable this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="EndpointAssignmentPrecedence" access="readWrite" dmr:version="2.2">
+        <description>
+          Indicates the preferred method to be used in assigning values to {{param|EndpointName}} when both static and dynamic values are available.  See {{param|EndpointName}} for further clarification.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv6"/>
+            <enumeration value="Static"/>
+          </string>
+          <default type="factory" value="DHCPv6"/>
+        </syntax>
+      </parameter>
+      <parameter name="EndpointAddressTypePrecedence" access="readWrite" dmr:version="2.5">
+        <description>
+          Indicates the preferred method to be used to assign the address of the DS-Lite Endpoint when both {{param|EndpointName}} and {{param|EndpointAddress}} values are available and the {{enum|Static|EndpointAssignmentPrecedence}} method is used.  See {{param|EndpointName}} and {{param|EndpointAddress}} for further clarification.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="FQDN">
+              <description>
+                Derive from {{param|EndpointName}} via a DNS lookup.
+              </description>
+            </enumeration>
+            <enumeration value="IPv6Address">
+              <description>
+                Use {{param|EndpointAddress}} directly.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EndpointAddressInUse" access="readOnly" dmr:version="2.5">
+        <description>
+          Indicates the address currently in use for the tunnel concentrator (remote endpoint).  It is derived from the values of the {{param|EndpointAssignmentPrecedence}}, {{param|EndpointAddressTypePrecedence}}, {{param|EndpointName}} and {{param|EndpointAddress}} parameters.
+          It is {{empty}} if no endpoint address is currently known.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="EndpointName" access="readWrite" dmr:version="2.2">
+        <description>
+          The Fully Qualified Domain Name (FQDN) of the tunnel concentrator (remote endpoint).
+          This parameter is based on ''OPTION_DS_LITE_NAME'' from {{bibref|DSLite-options|Section 4}} and can be assigned statically (e.g. present in the factory default configuration or set by the ACS) or can be updated dynamically (via DHCPv6). If both statically and dynamically assigned, then {{param|EndpointAssignmentPrecedence}} indicates whether it is the static configuration or the DHCPv6 configuration that is actually applied to {{param}}.
+          Note: {{param}} is only writable when {{param|EndpointAssignmentPrecedence}} is {{enum|Static|EndpointAssignmentPrecedence}}; otherwise, {{param}} is automatically configured via the DHCPv6 received option.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EndpointAddress" access="readWrite" dmr:version="2.2">
+        <description>
+          The address of the tunnel concentrator (remote endpoint).
+          This parameter can only be assigned statically (e.g. present in the factory default configuration or set by the ACS).
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.2">
+        <description>
+          Method used to assign {{param|EndpointAddressInUse}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv6">
+              <description>
+                Assigned by DHCPv6 {{bibref|RFC3315}}.
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                For example, present in the factory default configuration, set by the ACS, or set by some other management entity (e.g. via a GUI).
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TunnelInterface" access="readOnly" dmr:version="2.2">
+        <description>
+          {{reference}} This is an IP interface of ''Type'' {{enum|Tunnel|.IP.Interface.{i}.Type}} that is logically the tunnel entry point for upstream IPv4 traffic and is also logically the tunnel exit point for downstream IPv4 traffic (i.e. the entry point for non-tunneled upstream IPv4 traffic to enter a tunnel and become tunneled, or conversely, the exit point for downstream IPv4 traffic leaving a tunnel after being un-tunneled).
+          IPv4 traffic that enters {{param}} is expected to continue on through {{param|TunneledInterface}} from the LAN, and traffic from the WAN is expected to come from TunneledInterface into TunnelInterface. TunnelInterface is a logical interface that can allow for classification, marking (of IPv4 headers), and policing of IPv4 traffic that will be going over a DS-Lite tunnel. These functions are modeled in the Device.QoS object.
+          Note: In DS-Lite, IPv4 packets arriving over one or more device LAN IP interfaces are logically fed into this {{param}}. Likewise, DS-Lite traffic from the WAN gets logically sent from this {{param}} to LAN IP interfaces.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TunneledInterface" access="readOnly" dmr:version="2.2">
+        <description>
+          {{reference}} This is an IP interface of ''Type'' {{enum|Tunneled|.IP.Interface.{i}.Type}} that provides information about the IPv6 headers used to encapsulate the IPv4 packets.
+          Encapsulated IPv4 traffic that enters {{param}} from the WAN is expected to continue on through {{param|TunnelInterface}}, and traffic from the LAN is expected to come from {{param|TunnelInterface}} into {{param}}. {{param}} is a logical interface that can allow for classification, marking (of IPv6 headers and VLAN tags), and policing of IPv6 packets that encapsulate IPv4 packets in DS-Lite traffic. These functions are modeled in the {{object|.QoS.}} object.
+          Note: In DS-Lite, {{param}} traffic originating from the LAN logically feeds into a WAN-side IPv6 capable IP interface that the "DSLite IPv4-in-IPv6 tunnel" goes over. DS-Lite traffic that enters over this IPv6 WAN interface gets logically sent to this {{param}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Queue management configuration object.
+      </description>
+      <parameter name="MaxClassificationEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the Classification table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ClassificationNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAppEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the {{object|App}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AppNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxFlowEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the {{object|Flow}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FlowNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxPolicerEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the {{object|Policer}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PolicerNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxQueueEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the {{object|Queue}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueStatsNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxShaperEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the {{object|Shaper}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ShaperNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultForwardingPolicy" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifier of the forwarding policy associated with traffic not associated with any specified  classifier.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultTrafficClass" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifier of the traffic class associated with traffic not associated with any specified classifier.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultPolicer" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Indicates the ''Policer'' table entry for traffic not associated with any specified classifier.
+          {{empty}} indicates a null policer.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="Policer." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultQueue" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Indicates the ''Queue'' table entry for traffic not associated with any specified classifier. Note: The interpretation of {{empty}} value is implementation specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="Queue." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultDSCPMark" access="readWrite" dmr:version="2.0">
+        <description>
+          DSCP to mark traffic not associated with any specified classifier.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of DSCP based upon the EthernetPriority value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultEthernetPriorityMark" access="readWrite" dmr:version="2.0">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1Q-2011}}) to mark traffic not associated with any specified classifier.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2a5|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultInnerEthernetPriorityMark" access="readWrite" dmr:version="2.7">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1Q-2011}}) to mark traffic of the inner VLAN Tag as defined in 802.1Q, when the PDU is not associated with any specified classifier. This parameter is only applicable when the PDU has 2 VLAN Tags.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="AvailableAppList" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items represent URNs, each indicating a protocol supported for use as a ProtocolIdentifier in the App table.  This list MAY include any of the URNs defined in {{bibref|TR-181i2|Annex A}} as well as other URNs defined elsewhere.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS.Classification.{i}." access="readWrite" numEntriesParameter="ClassificationNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Classification table.
+        For enabled table entries, if {{param|Interface}} is not a valid reference and {{param|AllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Several of this object's parameters specify DHCP option values. Some cases are version neutral (the parameter can apply to both DHCPv4 and DHCPv6), but in other cases the representation of the option is different for DHCPv4 and DHCPv6, so it is necessary to define separate DHCPv4-specific and DHCPv6-specific parameters. Therefore, an instance of this object that uses DHCP option values as classification criteria will be associated with either DHCPv4 or DHCPv6, as indicated by the {{param|DHCPType}} parameter.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this classifier.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this classifier.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.0">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each packet, the highest ordered entry that matches the classification criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="DHCPType" access="readWrite" dmr:version="2.2">
+        <description>
+          The DHCP protocol associated with the {{object}} instance. Affects only parameters that specify DHCP option values as classification criteria (all such parameter descriptions note this fact).  {{enum}}
+          If {{param}} is {{enum|DHCPv4}}, then {{object}} parameters that are DHCPv6-specific are ignored. If {{param}} is {{enum|DHCPv6}}, then {{object}} parameters that are DHCPv4-specific are ignored.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv4"/>
+            <enumeration value="DHCPv6"/>
+          </string>
+          <default type="object" value="DHCPv4"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion. {{reference}}
+          This specifies the ingress interface associated with the entry. It MAY be a layer 1, 2 or 3 interface, however, the types of interfaces for which ''Classifications'' can be instantiated is a local matter to the CPE.
+          Note that this parameter is permitted to reference ''Tunnel'' instances in order to classify upstream packets that have just been encapsulated (such packets are conceptually similar to locally-generated traffic).  For example, this parameter might reference a {{object|.GRE.Tunnel}} or a {{object|.MAP.Domain}} instance.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllInterfaces" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion. This specifies that all ingress interfaces are associated with the entry. If {{true}}, the value of {{param|Interface}} is ignored since all ingress interfaces are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIP" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Destination IP address.  {{empty}} indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Destination IP address mask, represented as an IP routing prefix using CIDR notation [RFC4632]. The IP address part MUST be {{empty}} (and, if specified, MUST be ignored).
+        </description>
+        <syntax>
+          <dataType ref="IPPrefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIPExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the (masked) DestIP entry, if specified.
+          If {{true}}, the class includes all packets except those that match the (masked) DestIP entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIP" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Source IP address.  {{empty}} indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Source IP address mask, represented as an IP routing prefix using CIDR notation [RFC4632]. The IP address part MUST be {{empty}} (and, if specified, MUST be ignored).
+        </description>
+        <syntax>
+          <dataType ref="IPPrefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIPExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the (masked) {{param|SourceIP}} entry, if  specified.
+          If {{true}}, the class includes all packets except those that match the (masked) {{param|SourceIP}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Protocol number.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="255"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|Protocol}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|Protocol}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPort" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Destination port number.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortRangeMax" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          If specified, indicates the classification criterion is to include the port range from {{param|DestPort}} through {{param}} (inclusive).  If specified, {{param}} MUST be greater than or equal to {{param|DestPort}}.
+          A value of -1 indicates that no port range is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|DestPort}} entry (or port range), if  specified.
+          If {{true}}, the class includes all packets except those that match the {{param|DestPort}} entry (or port range), if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePort" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Source port number.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortRangeMax" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          If specified, indicates the classification criterion is to include the port range from {{param|SourcePort}} through {{param}} (inclusive).  If specified, {{param}} MUST be greater than or equal to SourcePort.
+          A value of -1 indicates that no port range is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|SourcePort}} entry (or port range),  if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|SourcePort}} entry (or port range), if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Source MAC Address.  {{empty}} indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Bit-mask for the MAC address, where matching of a packet's MAC address with the {{param|SourceMACAddress}} is  only to be done for bit positions set to one in the mask.  A mask of ''FF:FF:FF:FF:FF:FF'' or {{empty}} indicates all bits of the  {{param|SourceMACAddress}} are to be used for classification.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the (masked) {{param|SourceMACAddress}} entry, if  specified.
+          If {{true}}, the class includes all packets except those that match the (masked) {{param|SourceMACAddress}} entry, if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Destination MAC Address.  {{empty}} indicates this criterion is not used for classification.
+          The use of destination MAC address as a classification criterion is primarily useful only for bridged traffic.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Bit-mask for the MAC address, where matching of a packet's MAC address with the {{param|DestMACAddress}} is only to be done for bit positions set to one in the mask.  A mask of ''FF:FF:FF:FF:FF:FF'' or {{empty}} indicates all bits of the  {{param|DestMACAddress}} are to be used for classification.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the (masked) {{param|DestMACAddress}} entry, if  specified.
+          If {{true}}, the class includes all packets except those that match the (masked) {{param|DestMACAddress}} entry, if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Ethertype" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Ethertype as indicated in either the Ethernet or SNAP Type header.  A value of -1 indicates this criterion is not used for  classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthertypeExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|Ethertype}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|Ethertype}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SSAP" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          SSAP element in the LLC header.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SSAPExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|SSAP}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|SSAP}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSAP" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          DSAP element in the LLC header.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSAPExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|DSAP}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|DSAP}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="LLCControl" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Control element in the LLC header.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="LLCControlExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|LLCControl}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|LLCControl}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SNAPOUI" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          OUI element in the SNAP header.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SNAPOUIExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|SNAPOUI}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|SNAPOUI}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Used to identify one or more LAN devices, value of the DHCPv4 Vendor Class Identifier (Option 60) as defined in {{bibref|RFC2132}}, matched according to the criterion in {{param|SourceVendorClassIDMode}}.  Case sensitive.
+          This is a normal string, e.g. "abc" is represented as "abc" and not say "616263" hex. However, if the value includes non-printing characters then such characters have to be represented using XML escapes, e.g. #x0a for line-feed.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: This parameter is DHCPv4-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv4|DHCPType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorClassIDv6" access="readWrite" dmr:version="2.2">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCPv6 Vendor Class Identifier (Option 16) as defined in {{bibref|RFC3315}}. The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: This parameter is DHCPv6-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv6|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets sourced from LAN devices that match the {{param|SourceVendorClassID}} entry (for {{enum|DHCPv4|DHCPType}}) or the {{param|SourceVendorClassIDv6}} entry (for {{enum|DHCPv6|DHCPType}}), if specified.
+          If {{true}}, the class includes all packets except those sourced from LAN devices that match the {{param|SourceVendorClassID}} entry (for {{enum|DHCPv4|DHCPType}}) or the {{param|SourceVendorClassIDv6}} entry (for {{enum|DHCPv6|DHCPType}}), if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorClassIDMode" access="readWrite" dmr:version="2.0">
+        <description>
+          SourceVendorClassID pattern match criterion.  {{enum}}
+          For example, if {{param|SourceVendorClassID}} is "Example" then an Option 60 value of "Example device" will match with {{param}}  values of {{enum|Prefix}} or {{enum|Substring}}, but not with {{enum|Exact}} or {{enum|Suffix}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Exact"/>
+            <enumeration value="Prefix"/>
+            <enumeration value="Suffix"/>
+            <enumeration value="Substring"/>
+          </string>
+          <default type="object" value="Exact"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Used to identify one or more LAN devices, value of the DHCPv4 Vendor Class Identifier (Option 60) as defined in {{bibref|RFC2132}}, matched according to the criterion in {{param|DestVendorClassIDMode}}.  Case sensitive.
+          This is a normal string, e.g. "abc" is represented as "abc" and not say "616263" hex. However, if the value includes non-printing characters then such characters have to be represented using XML escapes, e.g. #x0a for line-feed.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: This parameter is DHCPv4-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv4|DHCPType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorClassIDv6" access="readWrite" dmr:version="2.2">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCPv6 Vendor Class Identifier (Option 16) as defined in {{bibref|RFC3315}}. The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: This parameter is DHCPv6-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv6|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets destined for LAN devices that match the {{param|DestVendorClassID}} entry (for {{enum|DHCPv4|DHCPType}}) or the {{param|DestVendorClassIDv6}} entry (for {{enum|DHCPv6|DHCPType}}), if specified.
+          If {{true}}, the class includes all packets except those destined for LAN devices that match the {{param|DestVendorClassID}} entry (for {{enum|DHCPv4|DHCPType}}) or the {{param|DestVendorClassIDv6}} entry (for {{enum|DHCPv6|DHCPType}}), if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorClassIDMode" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|DestVendorClassID}} pattern match criterion.  {{enum}}
+          For example, if {{param|DestVendorClassID}} is "Example" then an Option 60 value of "Example device" will match with {{param}} values  of {{enum|Prefix}} or {{enum|Substring}}, but not with {{enum|Exact}} or {{enum|Suffix}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Exact"/>
+            <enumeration value="Prefix"/>
+            <enumeration value="Suffix"/>
+            <enumeration value="Substring"/>
+          </string>
+          <default type="object" value="Exact"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceClientID" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP Client Identifier. The DHCP Client Identifier is Option 61 (as defined in {{bibref|RFC2132}}) for {{enum|DHCPv4|DHCPType}}, or is Option 1 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+          Note: DHCPv6 Option 1 (Client Identifier) is sometimes referred to as ''DUID''.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceClientIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets sourced from LAN devices that match the  {{param|SourceClientID}} entry, if specified.
+          If {{true}}, the class includes all packets except those sourced from LAN devices that match the {{param|SourceClientID}} entry, if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestClientID" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP Client Identifier. The DHCP Client Identifier is Option 61 (as defined in {{bibref|RFC2132}}) for {{enum|DHCPv4|DHCPType}}, or is Option 1 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+          Note: DHCPv6 Option 1 (Client Identifier) is sometimes referred to as ''DUID''.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestClientIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets destined for LAN devices that match the  {{param|DestClientID}} entry, if specified.
+          If {{true}}, the class includes all packets except those destined for LAN devices that match the {{param|DestClientID}} entry, if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceUserClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP User Class Identifier. The DHCP User Class Identifier is Option 77 (as defined in {{bibref|RFC3004}}) for {{enum|DHCPv4|DHCPType}}, or is Option 15 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceUserClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets sourced from LAN devices that match the  {{param|SourceUserClassID}} entry, if specified.
+          If {{true}}, the class includes all packets except those sourced from LAN devices that match the {{param|SourceUserClassID}} entry,  if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestUserClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP User Class Identifier. The DHCP User Class Identifier is Option 77 (as defined in {{bibref|RFC3004}}) for {{enum|DHCPv4|DHCPType}}, or is Option 15 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestUserClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets destined for LAN devices that match the  {{param|DestUserClassID}} entry, if specified.
+          If {{true}}, the class includes all packets except those destined for LAN devices that match the {{param|DestUserClassID}} entry, if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorSpecificInfo" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP Vendor-specific Information, matched according to the criteria in {{param|SourceVendorSpecificInfoEnterprise}} and {{param|SourceVendorSpecificInfoSubOption}}. The DHCP Vendor-specific Information is Option 125 (as defined in {{bibref|RFC3925}}) for {{enum|DHCPv4|DHCPType}}, or is Option 17 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorSpecificInfoExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets sourced from LAN devices that match the  {{param|SourceVendorSpecificInfo}} entry, if specified.
+          If {{true}}, the class includes all packets except those sourced from LAN devices that match the {{param|SourceVendorSpecificInfo}}  entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorSpecificInfoEnterprise" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|SourceVendorSpecificInfo}} Enterprise Number as defined in {{bibref|RFC3925}}.
+          The default value (0) is assigned to IANA and will probably need to be replaced with an appropriate enterprise number.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorSpecificInfoSubOption" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|SourceVendorSpecificInfo}} Sub Option Code as defined in {{bibref|RFC3925}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="0" maxInclusive="255"/>
+          </int>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorSpecificInfo" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP Vendor-specific Information, matched according to the criteria in {{param|DestVendorSpecificInfoEnterprise}} and {{param|DestVendorSpecificInfoSubOption}}. The DHCP Vendor-specific Information is Option 125 (as defined in {{bibref|RFC3925}}) for {{enum|DHCPv4|DHCPType}}, or is Option 17 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorSpecificInfoExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets destined for LAN devices that match the  {{param|DestVendorSpecificInfo}} entry, if specified.
+          If {{true}}, the class includes all packets except those destined for LAN devices that match the {{param|DestVendorSpecificInfo}}  entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorSpecificInfoEnterprise" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|DestVendorSpecificInfo}} Enterprise Number as defined in {{bibref|RFC3925}}.
+          The default value (0) is assigned to IANA and will probably need to be replaced with an appropriate enterprise number.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorSpecificInfoSubOption" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|DestVendorSpecificInfo}} Sub Option Code as defined in {{bibref|RFC3925}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="0" maxInclusive="255"/>
+          </int>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TCPACK" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          If {{false}}, this criterion is not used for classification.
+          If {{true}}, this criterion matches with all TCP segments that have the ACK control bit set.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="TCPACKExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|TCPACK}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|TCPACK}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPLengthMin" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Minimum IP Packet Length (including header) in bytes.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPLengthMax" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Maximum IP Packet Length (including header) in bytes.
+          A value of zero indicates that no maximum is specified (an umlimited maximum length).
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPLengthExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets whose length (including header) falls within the inclusive  range {{param|IPLengthMin}} through {{param|IPLengthMax}}.  A value of zero for both {{param|IPLengthMin}} and {{param|IPLengthMax}}  allows any length packet.  An equal non-zero value of {{param|IPLengthMin}} and {{param|IPLengthMax}} allows only a packet with the exact length specified.
+          If {{true}}, the class includes all packets except those whose length (including header) falls within the inclusive range  {{param|IPLengthMin}} through {{param|IPLengthMax}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPCheck" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          DiffServ codepoint (defined in {{bibref|RFC2474}}).
+          If set to a Class Selector Codepoint (defined in {{bibref|RFC2474}}), all DSCP values that match the first 3 bits will be considered a valid  match.
+          A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="63"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|DSCPCheck}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|DSCPCheck}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMark" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification result.
+          DSCP to mark traffic with that falls into this classification entry.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of DSCP based upon the EthernetPriority value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriorityCheck" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Current Ethernet priority of a VLAN Tag as defined in {{bibref|802.1Q-2011}} or Ethernet Priority field as defined in 802.1D. If more than 1 VLAN tag is present, then this parameter represents the outer VLAN Tag. A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriorityExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|EthernetPriorityCheck}} entry, if  specified.
+          If {{true}}, the class includes all packets except those that match the {{param|EthernetPriorityCheck}} entry, if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriorityMark" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification result.
+          Ethernet priority code (as defined in {{bibref|802.1Q-2011}}) to mark traffic with that falls into this classification entry associated with the {{param|EthernetPriorityCheck}}.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="InnerEthernetPriorityCheck" access="readWrite" dmr:version="2.7">
+        <description>
+          Classification criterion.
+          Current Ethernet priority of the inner VLAN Tag as defined in 802.1Q. This parameter is only applicable when the PDU has 2 VLAN Tags. A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="InnerEthernetPriorityExclude" access="readWrite" dmr:version="2.7">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|InnerEthernetPriorityCheck}} entry, if  specified.
+          If {{true}}, the class includes all packets except those that match the {{param|InnerEthernetPriorityCheck}} entry, if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="InnerEthernetPriorityMark" access="readWrite" dmr:version="2.7">
+        <description>
+          Classification result.
+          Ethernet priority code to mark traffic with that falls into this classification entry associated with the {{param|InnerEthernetPriorityCheck}}.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetDEICheck" access="readWrite" dmr:version="2.7">
+        <description>
+          Classification criterion.
+          Current Ethernet Drop eligible Indication (DEI) of the VLAN tag as defined in 802.1Q. If 2 VLAN Tags are present, then this parameter represents the outer VLAN tag. A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetDEIExclude" access="readWrite" dmr:version="2.7">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|EthernetDEICheck}} entry, if  specified.
+          If {{true}}, the class includes all packets except those that match the {{param|EthernetDEICheck}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDCheck" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Current Ethernet VLAN ID as defined in 802.1Q.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|VLANIDCheck}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|VLANIDCheck}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="OutOfBandInfo" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Allows traffic to be distinguished based on out-of-band information such as physical port or application ID.  Primarily intended for,  but not restricted to, locally sourced traffic.
+          If specified, this entry applies to traffic with matching out-of-band information.  A value of -1 indicates this criterion is not  used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingPolicy" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification result.
+          Identifier of the forwarding policy associated with traffic that falls in this classification.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TrafficClass" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification result.
+          Identifier of the traffic class associated with traffic that falls in this classification.  If specified, at least one {{object|#.Queue}} table entry MUST include this traffic class in its {{param|#.Queue.{i}.TrafficClasses}} parameter (which is a comma-separated list).
+          A value of -1 indicates a null traffic class.
+          {{param}} and {{param|App}} are mutually exclusive and one of the two MUST be specified.  If {{param}} is {{null}}, {{param|App}} MUST be specified, and vice versa.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="Policer" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification result. {{reference}}
+          Indicates the ''Policer'' table entry for traffic that falls in this classification.
+          {{empty}} indicates a null policer.
+          {{param}} MAY optionally be specified in conjunction with {{param|TrafficClass}}. {{param}} and {{param|App}} are mutually exclusive.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Policer." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="App" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification result. {{reference}}
+          Indicates the ''App'' table entry for traffic that falls in this classification.
+          {{empty}} indicates a null ''App''.
+          {{param|TrafficClass}} and {{param}} are mutually exclusive and one of the two MUST be specified.  If {{param|TrafficClass}} is null, {{param}} MUST be specified, and vice versa.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.App." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS.App.{i}." access="readWrite" numEntriesParameter="AppNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Application table.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this App table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this App table entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolIdentifier" access="readWrite" dmr:version="2.0">
+        <description>
+          URN identifying the protocol associated with the given application.  A set of defined URNs is given in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.0">
+        <description>
+          Human-readable name associated with this entry in the App table.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultForwardingPolicy" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifier of the forwarding policy associated with traffic associated with this App table entry, but not  associated with any specified flow.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultTrafficClass" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifier of the traffic class associated with traffic associated with this App table entry, but not associated with any specified flow.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultPolicer" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Indicates the ''Policer'' table entry for traffic associated with this {{object}} table entry, but not associated with any specified flow.
+          {{empty}} indicates a null policer.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Policer." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultDSCPMark" access="readWrite" dmr:version="2.0">
+        <description>
+          DSCP to mark traffic associated with this App table entry, but not associated with any specified flow.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of DSCP based upon the EthernetPriority value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultEthernetPriorityMark" access="readWrite" dmr:version="2.0">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1Q-2011}}) to mark traffic associated with this App table entry, but not  associated with any specified flow.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2a5|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultInnerEthernetPriorityMark" access="readWrite" dmr:version="2.7">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1Q-2011}}) to mark the inner VLAN Tags as defined in 802.1Q with this {{object}} table entry where the packet is not associated with any specified flow. This parameter is only applicable when the PDU has 2 VLAN Tags.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS.Flow.{i}." access="readWrite" numEntriesParameter="FlowNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Flow table.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this Flow table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this Flow table entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readWrite" dmr:version="2.0">
+        <description>
+          URN identifying the type of flow to be associated with the specified policer.  A set of defined URNs is given in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="TypeParameters" access="readWrite" dmr:version="2.0">
+        <description>
+          List of name-value pairs representing additional criteria to identify the flow type.  The use and interpretation is specific to the particular FlowType URN.Encoded using the "x-www-form-urlencoded" content type defined in {{bibref|HTML4.01}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.0">
+        <description>
+          Human-readable name associated with this entry in the Flow table.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="App" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Indicates the ''App'' table entry associated with this flow.  {{empty}} indicates the flow table is not associated with any App table entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.App." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingPolicy" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifier of the forwarding policy associated with this flow.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TrafficClass" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifier of the traffic class associated with this flow.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Policer" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Indicates the ''Policer'' table entry for traffic that falls in this flow.
+          {{empty}} indicates a null policer.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Policer." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMark" access="readWrite" dmr:version="2.0">
+        <description>
+          DSCP to mark traffic with that falls into this flow.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of DSCP based upon the EthernetPriority value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriorityMark" access="readWrite" dmr:version="2.0">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1Q-2011}}) to mark traffic with that falls into this flow.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2a5|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="InnerEthernetPriorityMark" access="readWrite" dmr:version="2.7">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1Q-2011}}) to mark the inner VLAN Tags with for traffic that falls into this flow.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS.Policer.{i}." access="readWrite" numEntriesParameter="PolicerNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Policer table.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this policer.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this policer.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="CommittedRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Committed rate allowed for this policer in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="CommittedBurstSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Committed Burstsize in bytes.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ExcessBurstSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Excess Burstsize in bytes.
+          Applied for a {{enum|SingleRateThreeColor|MeterType}} meter.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PeakRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Peak rate allowed for this Meter in {{units}}.
+          Applied for {{enum|TwoRateThreeColor|MeterType}} meters.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PeakBurstSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Peak Burstsize in bytes.
+          Applied for {{enum|TwoRateThreeColor|MeterType}} meters.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="MeterType" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifies the method of traffic measurement to be used for this policer.  {{enum}}
+          {{enum|SimpleTokenBucket}} makes use of {{param|CommittedRate}} and {{param|CommittedBurstSize}}.
+          {{enum|SingleRateThreeColor}} makes use of {{param|CommittedRate}}, {{param|CommittedBurstSize}}, and {{param|ExcessBurstSize}} as  defined in {{bibref|RFC2697}}.
+          {{enum|TwoRateThreeColor}} makes use of {{param|CommittedRate}}, {{param|CommittedBurstSize}}, {{param|PeakRate}}, and  {{param|PeakBurstSize}} as defined in {{bibref|RFC2698}}.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="PossibleMeterTypes"/>
+          </string>
+          <default type="object" value="SimpleTokenBucket"/>
+        </syntax>
+      </parameter>
+      <parameter name="PossibleMeterTypes" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates supported meter types.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="SimpleTokenBucket"/>
+            <enumeration value="SingleRateThreeColor"/>
+            <enumeration value="TwoRateThreeColor"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConformingAction" access="readWrite" dmr:version="2.0">
+        <description>
+          Instructions for how to handle traffic that is conforming.  {{pattern}}
+          {{pattern|Null}} corresponds with no action.
+          ''&lt;DSCP Value&gt;'' is an unsigned integer that corresponds with a mark action overwriting the traffic's DSCP with the configured  DSCP.
+          ''&lt;:Ethernet Priority&gt;'' is a colon (":") followed by an unsigned integer (no white space).  It corresponds with a mark action  overwriting the traffic's Ethernet Priority with the configured Ethernet Priority.
+          ''&lt;DSCP Value:Ethernet Priority&gt;'' is an unsigned integer followed by a colon (":") and a second unsigned integer (no white  space).  It corresponds with a mark action overwriting the traffic's DSCP and Ethernet Priority with the configured values.
+          For example, "24" specifies a DSCP value of 24, ":3" specifies an Ethernet Priority of 3, and "24:3" specifies both.
+        </description>
+        <syntax>
+          <string>
+            <pattern value="Null"/>
+            <pattern value="Drop"/>
+            <pattern value="[0-9]|[1-5][0-9]|6[0-3]">
+              <description>
+                &lt;DSCP Value&gt;
+              </description>
+            </pattern>
+            <pattern value=":[0-7]">
+              <description>
+                &lt;Ethernet Priority&gt;
+              </description>
+            </pattern>
+            <pattern value="([0-9]|[1-5][0-9]|6[0-3]):[0-7]">
+              <description>
+                &lt;DSCP Value:Ethernet Priority&gt;
+              </description>
+            </pattern>
+          </string>
+          <default type="object" value="Null"/>
+        </syntax>
+      </parameter>
+      <parameter name="PartialConformingAction" access="readWrite" dmr:version="2.0">
+        <description>
+          Instructions for how to handle traffic that is partially conforming (colored yellow).  {{pattern}}
+          {{pattern|Null}} corresponds with no action.
+          ''&lt;DSCP Value&gt;'' is an unsigned integer that corresponds with a mark action overwriting the traffic's DSCP with the configured  DSCP.Only applies for three-color meters.
+          ''&lt;:Ethernet Priority&gt;'' is a colon (":") followed by an unsigned integer (no white space).  It corresponds with a mark action  overwriting the traffic's Ethernet Priority with the configured Ethernet Priority.
+          ''&lt;DSCP Value:Ethernet Priority&gt;'' is an unsigned integer followed by a colon (":") and a second unsigned integer (no white  space).  It corresponds with a mark action overwriting the traffic's DSCP and Ethernet Priority with the configured values.
+          For example, "24" specifies a DSCP value of 24, ":3" specifies an Ethernet Priority of 3, and "24:3" specifies both.
+        </description>
+        <syntax>
+          <string>
+            <pattern value="Null"/>
+            <pattern value="Drop"/>
+            <pattern value="[0-9]|[1-5][0-9]|6[0-3]">
+              <description>
+                &lt;DSCP Value&gt;
+              </description>
+            </pattern>
+            <pattern value=":[0-7]">
+              <description>
+                &lt;Ethernet Priority&gt;
+              </description>
+            </pattern>
+            <pattern value="([0-9]|[1-5][0-9]|6[0-3]):[0-7]">
+              <description>
+                &lt;DSCP Value:Ethernet Priority&gt;
+              </description>
+            </pattern>
+          </string>
+          <default type="object" value="Drop"/>
+        </syntax>
+      </parameter>
+      <parameter name="NonConformingAction" access="readWrite" dmr:version="2.0">
+        <description>
+          Instructions for how to handle traffic that is non-conforming.  {{pattern}}
+          {{pattern|Null}} corresponds with no action.
+          ''&lt;DSCP Value&gt;'' is an unsigned integer that corresponds with a mark action overwriting the traffic's DSCP with the configured  DSCP.
+          ''&lt;:Ethernet Priority&gt;'' is a colon (":") followed by an unsigned integer (no white space).  It corresponds with a mark action  overwriting the traffic's Ethernet Priority with the configured Ethernet Priority.
+          ''&lt;DSCP Value:Ethernet Priority&gt;'' is an unsigned integer followed by a colon (":") and a second unsigned integer (no white  space).  It corresponds with a mark action overwriting the traffic's DSCP and Ethernet Priority with the configured values.
+          For example, "24" specifies a DSCP value of 24, ":3" specifies an Ethernet Priority of 3, and "24:3" specifies both.
+        </description>
+        <syntax>
+          <string>
+            <pattern value="Null"/>
+            <pattern value="Drop"/>
+            <pattern value="[0-9]|[1-5][0-9]|6[0-3]">
+              <description>
+                &lt;DSCP Value&gt;
+              </description>
+            </pattern>
+            <pattern value=":[0-7]">
+              <description>
+                &lt;Ethernet Priority&gt;
+              </description>
+            </pattern>
+            <pattern value="([0-9]|[1-5][0-9]|6[0-3]):[0-7]">
+              <description>
+                &lt;DSCP Value:Ethernet Priority&gt;
+              </description>
+            </pattern>
+          </string>
+          <default type="object" value="Drop"/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalCountedPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of Packets counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalCountedBytes" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of Bytes counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConformingCountedPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of conforming Packets counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConformingCountedBytes" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of conforming Bytes counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PartiallyConformingCountedPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of partially conforming Packets counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PartiallyConformingCountedBytes" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of partially conforming Bytes counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="NonConformingCountedPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of non-conforming Packets counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="NonConformingCountedBytes" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of non-conforming Bytes counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS.Queue.{i}." access="readWrite" numEntriesParameter="QueueNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Queue table. Each entry is associated with a set of traffic classes, which are specified via the {{param|TrafficClasses}} parameter, and is configured with weight, precedence, drop algorithm, scheduler algorithm etc as appropriate for the traffic classes. An entry can be associated either with all egress interfaces (in which case an actual queue will be instantiated on each egress interface on which traffic of that traffic class can be generated) or else with a single specified egress interface.
+        For enabled table entries, if {{param|Interface}} is not a valid reference and {{param|AllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this queue.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this queue.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="TrafficClasses" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} Each list item identifies the set of traffic classes associated with this queue.
+          Traffic is sent to this queue if a {{object|#.Classification}}, {{object|#.App}} or {{object|#.Flow}} table entry specifies a traffic class, e.g. via the {{param|#.Classification.{i}.TrafficClass}} parameter.
+          If more than one queue on a given egress interface is associated with a given traffic class, the implementation will choose which queue to send traffic of this class to.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <unsignedInt/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Specifies the egress interface for which the specified queue MUST exist.
+          This MAY be a layer 1, 2 or 3 interface, however, the types of interfaces for which ''Queues'' can be instantiated is a local matter to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllInterfaces" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates that the specified queue MUST exist for all egress interfaces (i.e. this queue entry is to apply to all egress interfaces). If {{true}}, the value of {{param|Interface}} is ignored since all egress interfaces are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="HardwareAssisted" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether ''all'' the queues corresponding to this table entry are hardware assisted. If any of the queues corresponding to this table entry are not hardware assisted, the parameter value MUST be {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="BufferLength" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of bytes in the buffer.
+          Queue buffer size for all egress interfaces for which this queue exists.  If the buffer size is not the same for all such egress  interfaces, this parameter MUST be 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Weight" access="readWrite" dmr:version="2.0">
+        <description>
+          Weight of this queue in case of {{enum|WFQ|SchedulerAlgorithm}} or {{enum|WRR|SchedulerAlgorithm}}, but only  used for queues of equal precedence.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Precedence" access="readWrite" dmr:version="2.0">
+        <description>
+          Precedence of this queue relative to others. Lower numbers imply greater precedence.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+      <parameter name="REDThreshold" access="readWrite" dmr:version="2.0">
+        <description>
+          Random Early Detection threshold, used only when {{param|DropAlgorithm}} is {{enum|RED|DropAlgorithm}}.
+          This is the minimum threshold (''min_th'') and is measured as a percentage of the queue size.  If the value is set to zero, the CPE  MUST choose a sensible value, e.g. 5 (but the value MUST still read back as zero).
+          In this version of the data model, there is no way to set the maximum threshold (''max_th'').  The CPE MUST choose a sensible value,  e.g. three times the minimum threshold.
+          In this version of the data model, there is no way to set the RED weight (''w_q'').  The CPE MUST choose a sensible value, e.g.  0.002.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="100"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="REDPercentage" access="readWrite" dmr:version="2.0">
+        <description>
+          Random Early Detection percentage, used only when {{param|DropAlgorithm}} is {{enum|RED|DropAlgorithm}}.
+          This is the maximum value of the packet marking probability (''max_p'').  If the value is set to zero, the CPE MUST choose a sensible  value, e.g. 10 (but the value MUST still read back as zero).
+          In this version of the data model, there is no way to set the RED weight (''w_q'').  The CPE MUST choose a sensible value, e.g.  0.002.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="100"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DropAlgorithm" access="readWrite" dmr:version="2.0">
+        <description>
+          Dropping algorithm used for this queue if congested.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="RED">
+              <description>
+                Random Early Detection {{bibref|RED}}
+              </description>
+            </enumeration>
+            <enumeration value="DT">
+              <description>
+                Drop Tail
+              </description>
+            </enumeration>
+            <enumeration value="WRED">
+              <description>
+                Weighted RED
+              </description>
+            </enumeration>
+            <enumeration value="BLUE">
+              <description>
+                {{bibref|BLUE}}
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="DT"/>
+        </syntax>
+      </parameter>
+      <parameter name="SchedulerAlgorithm" access="readWrite" dmr:version="2.0">
+        <description>
+          Scheduling Algorithm used by scheduler.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="WFQ">
+              <description>
+                Weighted Fair Queueing
+              </description>
+            </enumeration>
+            <enumeration value="WRR">
+              <description>
+                Weighted Round Robin
+              </description>
+            </enumeration>
+            <enumeration value="SP">
+              <description>
+                Strict Priority
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="SP"/>
+        </syntax>
+      </parameter>
+      <parameter name="ShapingRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Rate to shape this queue's traffic to.  For leaky bucket (constant rate shaping), this is the constant rate.  For token bucket (variable rate shaping), this is the average rate.
+          If &lt;= 100, in percent of the rate of the highest rate-constrained layer over which the packet will travel on egress.
+          If &gt; 100, in bits per second.
+          A value of -1 indicates no shaping.
+          For example, for packets destined for a WAN DSL interface, if the egress will be on a PPP or IP link with a specified ''ShapingRate'', the percentage is calculated relative to this rate.  Otherwise, if the ATM layer is rate-constrained, then the rate is calculated relative to this rate.  Otherwise, the rate is calculated relative to the physical-layer DSL rate.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ShapingBurstSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Burst size in bytes.  For both leaky bucket (constant rate shaping) and token bucket (variable rate shaping)  this is the bucket size and is therefore the maximum burst size.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS.QueueStats.{i}." access="readWrite" numEntriesParameter="QueueStatsNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Queue statistics table. This table is managed by the ACS, which will create entries only for those {Queue, Interface} combinations for which statistics are to be collected.
+        Note: The {{object}} table includes unique key parameters that are strong references. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Queue"/>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this object.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this object.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled">
+              <description>
+                Enabled and {Queue,Interface} is valid
+              </description>
+            </enumeration>
+            <enumeration value="Error">
+              <description>
+                Enabled but {Queue,Interface} is invalid
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Queue" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Indicates ''Queue'' entry with which this object is associated.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Queue." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Specifies the egress interface for which this object contains statistics.
+          This MAY be a layer 1, 2 or 3 interface, however, the types of interfaces for which ''QueueStats'' can be instantiated is a local matter to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="OutputPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of packets output through the queue.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="OutputBytes" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of bytes output through the queue.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DroppedPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of packets dropped by the queue.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DroppedBytes" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of bytes dropped by the queue.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueOccupancyPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Queue occupancy in packets (gives a measure of queue latency).
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueOccupancyPercentage" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Queue occupancy measured as a {{units}}, i.e. 100 * queue occupancy in bytes / queue size in bytes (gives a measure of queue usage).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+            <units value="percent"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS.Shaper.{i}." access="readWrite" numEntriesParameter="ShaperNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Shaper table. Used to shape the queue(s) associated with {{param|Interface}}. In case of a single queue for that interface, determines the egress rate of the queue. In case of multiple queues for that interface (possibly with per queue shaping rates), determines the aggregate egress rate on that interface.
+        For enabled table entries, if {{param|Interface}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this shaper.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this shaper.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}The interface object associated with this ''Shaper'' entry. It MAY be a layer 1, 2 or 3 interface, however, the types of interfaces for which ''Shapers'' can be instantiated is a local matter to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ShapingRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Rate to shape the associated interface connection's egress traffic to.  For leaky bucket (constant rate shaping), this is the constant rate.  For token bucket (variable rate shaping), this is the average rate.
+          If &lt;= 100, in percent of the rate of the highest rate-constrained layer over which the packet will travel on egress.
+          If &gt; 100, in bits per second.
+          A value of -1 indicates no shaping.
+          For example, for packets destined for a WAN DSL interface, if the ATM layer is rate-constrained, then the rate is calculated relative to this rate.  Otherwise, the rate is calculated relative to the physical-layer DSL rate.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ShapingBurstSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Burst size in bytes.  For both leaky bucket (constant rate shaping) and token bucket (variable rate shaping)  this is the bucket size and is therefore the maximum burst size.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LANConfigSecurity." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains generic device configuration information.
+      </description>
+      <parameter name="ConfigPassword" access="readWrite" dmr:version="2.0">
+        <description>
+          A password to allow LAN access to protected auto-configuration services.
+          If the CPE supports TR-064 (LAN-side DSL CPE Configuration Protocol), this parameter is to be used as the ''dslf-config'' password  (as defined in TR-064).
+          If the CPE has a user interface with password protection enabled, this parameter is also to be used as the user password for  password-protected operations.  However, this parameter MUST NOT be used to set the user password if the parameter  {{param|.UserInterface.PasswordUserSelectable}} is {{true}}.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Hosts." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object provides information about each of the hosts on the LAN, including those whose IP address was allocated by the CPE using DHCP as well as hosts with statically allocated IP addresses. It can also include non-IP  hosts.
+      </description>
+      <parameter name="HostNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Hosts.Host.{i}." access="readOnly" numEntriesParameter="HostNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Host table.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="PhysAddress"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" status="deprecated" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+          This parameter is DEPRECATED because {{object}} is a transient object.
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="PhysAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          Unique physical identifier of the host. For many layer 2 technologies this is typically a MAC address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          Current IP Address of the host. {{empty}} if no address is available.
+          If more than one IP address for this host is known, the CPE will choose a ''primary'' address.  All known IP addresses can be listed in the {{object|IPv4Address}} and {{object|IPv6Address}} tables.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="AddressSource" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          Indicates whether the IP address of the host was allocated by the CPE using DHCP, was assigned to the host statically, or was assigned using automatic IP address allocation.  {{enum}}
+          This parameter is DEPRECATED because only {{enum|None}} and {{enum|DHCP}} made sense (the CPE doesn't know whether the address is {{enum|Static}} or {{enum|AutoIP}}).  The {{enum|DHCP}} case is now handled via the {{param|DHCPClient}} reference.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCP"/>
+            <enumeration value="Static"/>
+            <enumeration value="AutoIP"/>
+            <enumeration value="None"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DHCPClient" access="readOnly" dmr:version="2.2">
+        <description>
+          {{reference}} Each list item is the DHCPv4 or DHCPv6 server's client entry that corresponds to the host.
+        </description>
+        <syntax>
+          <list maxItems="2"/>
+          <string>
+            <pathRef refType="strong" targetParent=".DHCPv4.Server.Pool.{i}.Client. .DHCPv6.Server.Pool.{i}.Client." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTimeRemaining" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          DHCP lease time remaining in {{units}}.  A value of -1 indicates an infinite lease.  The value MUST be 0 (zero) if the {{param|AddressSource}} is not {{enum|DHCP|AddressSource}}.
+          This parameter is DEPRECATED because DHCP lease/lifetime information can be accessed via the {{param|DHCPClient}} reference.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDevice" access="readOnly" dmr:version="2.2">
+        <description>
+          {{noreference}}The value MUST the path name of the ''AssociatedDevice'' (or equivalent) table row that models the host, or {{null}} if there is no such table.
+          For example: ''Device.WiFi.AccessPoint.1.AssociatedDevice.2''
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Layer1Interface" access="readOnly" dmr:version="2.0">
+        <description>
+          {{noreference}}The value MUST be the path name of a row in a layer 1 interface table.  If the layer 1 device isn’t known, then {{param}} will be {{null}}.
+          For example: ''Device.Ethernet.Interface.2''
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Layer3Interface" access="readOnly" dmr:version="2.0">
+        <description>
+          {{reference}}  If the entry represents a non-IP device, then {{param}} will be {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassID" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          Vendor Class Identifier DHCP option (Option 60) of the host.
+          This is a normal string, e.g. "abc" is represented as "abc" and not say "616263" hex. However, if the value includes non-printing characters then such characters have to be represented using XML escapes, e.g. #x0a for line-feed.
+          It MAY be defined when {{param|AddressSource}} is {{enum|DHCP|AddressSource}}. {{empty}} indicates this option is not used.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          This parameter is DEPRECATED because host-supplied DHCP options can be accessed via the {{param|DHCPClient}} reference.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ClientID" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          A hexbinary string, Client Identifier DHCP option (Option 61) for the specific IP connection of the client.  The option value is binary, so an exact match is REQUIRED.
+          It MAY be defined when {{param|AddressSource}} is {{enum|DHCP|AddressSource}}. {{empty}} indicates this option is not used.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          This parameter is DEPRECATED because host-supplied DHCP options can be accessed via the {{param|DHCPClient}} reference.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="UserClassID" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          A hexbinary string, User Class Identifier DHCP option (Option 77) of the host.
+          It MAY be defined when {{param|AddressSource}} is {{enum|DHCP|AddressSource}}. {{empty}} indicates this option is not used.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          This parameter is DEPRECATED because host-supplied DHCP options can be accessed via the {{param|DHCPClient}} reference.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="HostName" access="readOnly" dmr:version="2.0">
+        <description>
+          The device's host name or {{empty}} if unknown.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether or not the host is currently present on the LAN.  The method of presence detection is a local matter to  the CPE.
+          The ability to list inactive hosts is OPTIONAL.  If the CPE includes inactive hosts in this table, {{param}} MUST be set to {{false}}  for each inactive host.  The length of time an inactive host remains listed in this table is a local matter to the CPE.
+          Entries in Device.Hosts.Host SHOULD NOT be removed when they become inactive if there are {{object|WANStats}} statistics collected for the entry in the past seven days.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ActiveLastChange" access="readOnly" dmr:version="2.10">
+        <description>
+          The datetime when {{param|Active}} last changed from {{true}} to {{false}} or from {{false}} to {{true}}.  The initial detection of a host SHOULD be treated as a transition from {{false}} to {{true}}, showing the datetime when the host was first detected.
+          The ability to list inactive hosts is OPTIONAL. The length of time an inactive host remains listed in this table is a local matter to the CPE.
+          Entries in Device.Hosts.Host SHOULD NOT be removed when they become inactive if there are {{object|WANStats}} statistics collected for the entry in the past seven days.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4AddressNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6AddressNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Hosts.Host.{i}.IPv4Address.{i}." access="readOnly" numEntriesParameter="IPv4AddressNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        The host's known IPv4 addresses.  This includes any addresses assigned via DHCP, which can also be accessed via the {{param|#.DHCPClient}} reference.
+      </description>
+      <uniqueKey>
+        <parameter ref="IPAddress"/>
+      </uniqueKey>
+      <parameter name="IPAddress" access="readOnly" dmr:version="2.2">
+        <description>
+          IPv4 address.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Hosts.Host.{i}.IPv6Address.{i}." access="readOnly" numEntriesParameter="IPv6AddressNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        The host's known IPv6 addresses.  This includes any addresses assigned via DHCP, which can also be accessed via the {{param|#.DHCPClient}} reference.
+      </description>
+      <uniqueKey>
+        <parameter ref="IPAddress"/>
+      </uniqueKey>
+      <parameter name="IPAddress" access="readOnly" dmr:version="2.2">
+        <description>
+          IPv6 address.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Hosts.Host.{i}.WANStats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        These count bytes or packets at the IP layer sent to the WAN, or received from the WAN.
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of bytes transmitted to the WAN from the Host device at the IP layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of bytes received from the WAN and sent to the Host device at the IP layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of IP packets transmitted to the WAN from the Host device.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of IP packets received from the WAN and sent to the Host device.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of outbound IP packets to the WAN from the Host device that could not be transmitted because of errors. These may be due to the number of retransmissions exceeding the retry limit, or from other causes.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="RetransCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of transmitted IP packets to the WAN from the Host device which were retransmissions. Two retransmissions of the same packet results in this counter incrementing by two.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of outbound IP packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Properties for Domain Name Service (DNS).
+      </description>
+      <parameter name="SupportedRecordTypes" access="readOnly" dmr:version="2.2">
+        <description>
+          The DNS record types that are supported by the device. {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="A">
+              <description>
+                {{bibref|RFC1035}}
+              </description>
+            </enumeration>
+            <enumeration value="AAAA">
+              <description>
+                {{bibref|RFC3596}}
+              </description>
+            </enumeration>
+            <enumeration value="SRV">
+              <description>
+                {{bibref|RFC2782}}
+              </description>
+            </enumeration>
+            <enumeration value="PTR">
+              <description>
+                {{bibref|RFC1035}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.Client." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Client properties for Domain Name Service (DNS). The DNS client resolves FQDN on behalf of device internal (client) applications.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the DNS client.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of the DNS client. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServerNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.Client.Server.{i}." access="readWrite" numEntriesParameter="ServerNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This table contains the DNS Server IP address to be used by the DHCP Client (it does ''not'' model a DNS Server). Entries are either automatically created as result of DHCP (v4 or v6), IPCP, or RA received DNS server information, or are statically configured by the ACS.
+      </description>
+      <uniqueKey>
+        <parameter ref="DNSServer"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="DNSServer" access="readWrite" dmr:version="2.0">
+        <description>
+          DNS server IP addresses.
+          Note: {{param}} is only writable when {{param|Type}} is {{enum|Static|Type}}; otherwise, {{param}} is automatically configured as result of DHCP, IPCP, or RA received DNS server information.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} This parameter specifies the IP interface over which the DNS query is sent.
+          If {{empty}} is specified, the CPE MUST use its routing policy (Forwarding table entries), if necessary, to determine the appropriate interface.
+          Note: {{param}} is only writable when {{param|Type}} is {{enum|Static|Type}}; otherwise, {{param}} is automatically configured as result of DHCP, IPCP, or RA received DNS server information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.0">
+        <description>
+          Method used to assign the {{param|DNSServer}} address.  {{enum}}
+          Table entries that are automatically created as result of DHCP, IPCP, or RA received DNS server information will have {{param}} set to {{enum|DHCPv4}}, {{enum|DHCPv6}}, {{enum|IPCP}}, or {{enum|RouterAdvertisement}}, as the case may be. Manually created table entires will have their {{param}} set to {{enum|Static}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCP" status="deprecated">
+              <description>
+                Replaced by {{enum|DHCPv4}}.
+              </description>
+            </enumeration>
+            <enumeration value="DHCPv4"/>
+            <enumeration value="DHCPv6"/>
+            <enumeration value="RouterAdvertisement"/>
+            <enumeration value="IPCP"/>
+            <enumeration value="Static"/>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.Relay." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        DNS Relay object. The DNS proxy (or relay) function allows the forwarding of local network DNS queries to local or external DNS server(s) {{bibref|RFC5625}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the DNS Relay function.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of the DNS relay. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.Relay.Forwarding.{i}." access="readWrite" numEntriesParameter="ForwardNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        DNS Server forwarding policy to be used by the DNS Relay.  Entries are either automatically created as result of DHCP (v4 or v6), IPCP, or RA received DNS server information, or are statically configured by the ACS.
+        Note: Management of re-directing queries to the device embedded DNS server is not defined in this version of the specification.
+      </description>
+      <uniqueKey>
+        <parameter ref="DNSServer"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="DNSServer" access="readWrite" dmr:version="2.0">
+        <description>
+          DNS server IP addresses.
+          Note: {{param}} is only writable when {{param|Type}} is {{enum|Static|Type}}; otherwise, {{param}} is automatically configured as result of DHCP, IPCP, or RA received DNS server information.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Specifies the IP interface over which the DNS query is sent.
+          If {{empty}} is specified, the CPE MUST use its routing policy (IP Forwarding table entries), if necessary, to determine the appropriate interface.
+          Note: {{param}} is only writable when {{param|Type}} is {{enum|Static|Type}}; otherwise, {{param}} is automatically configured as result of DHCP, IPCP, or RA received DNS server information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.0">
+        <description>
+          Method used to assign the {{param|DNSServer}} address.  {{enum}}
+          Table entries that are automatically created as result of DHCP, IPCP, or RA received DNS server information will have {{param}} set to {{enum|DHCPv4}}, {{enum|DHCPv6}}, {{enum|IPCP}}, or {{enum|RouterAdvertisement}}, as the case may be. Manually created table entires will have their {{param}} set to {{enum|Static}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCP" status="deprecated">
+              <description>
+                Replaced by {{enum|DHCPv4}}.
+              </description>
+            </enumeration>
+            <enumeration value="DHCPv4"/>
+            <enumeration value="DHCPv6"/>
+            <enumeration value="RouterAdvertisement"/>
+            <enumeration value="IPCP"/>
+            <enumeration value="Static"/>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.Diagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The DNS Diagnostics object containing the {{object|NSLookupDiagnostics}} test.
+      </description>
+    </object>
+    <object name="Device.DNS.Diagnostics.NSLookupDiagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object 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>
+      <parameter name="DiagnosticsState" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates availability of diagnostic data. {{enum}}
+          If the ACS sets the value of this parameter to {{enum|Requested}}, the CPE MUST initiate the corresponding diagnostic test.  When writing, the only allowed value is {{enum|Requested}}.  To ensure the use of the proper test parameters (the writable parameters in this object), the test parameters MUST be set either prior to or at the same time as (in the same SetParameterValues) setting the DiagnosticsState to {{enum|Requested}}.
+          When requested, the CPE SHOULD wait until after completion of the communication session with the ACS before starting the diagnostic.
+          When the test is completed, the value of this parameter MUST be either {{enum|Complete}} (if the test completed successfully), or one of the Error values listed above.
+          If the value of this parameter is anything other than {{enum|Complete}}, the values of the results parameters for this test are indeterminate.
+          When the diagnostic initiated by the ACS is completed (successfully or not), the CPE MUST establish a new connection to the ACS to allow the ACS to view the results, indicating the Event code "8 DIAGNOSTICS COMPLETE" in the Inform message.
+          After the diagnostic is complete, the value of all result parameters (all read-only parameters in this object) MUST be retained by the CPE until either this diagnostic is run again, or the CPE reboots.  After a reboot, if the CPE has not retained the result parameters from the most recent test, it MUST set the value of this parameter to {{enum|None}}.
+          Modifying any of the writable parameters in this object except for this one MUST result in the value of this parameter being set to {{enum|None}}.
+          While the test is in progress, modifying any of the writable parameters in this object except for this one MUST result in the test being terminated and the value of this parameter being set to {{enum|None}}.
+          While the test is in progress, setting this parameter to {{enum|Requested}} (and possibly modifying other writable parameters in this object) MUST result in the test being terminated and then restarted using the current values of the test parameters.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Complete" access="readOnly"/>
+            <enumeration value="Error_DNSServerNotResolved" access="readOnly">
+              <description>
+                Unable to resolve DNSServer Name
+              </description>
+            </enumeration>
+            <enumeration value="Error_Internal" access="readOnly"/>
+            <enumeration value="Error_Other" access="readOnly"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} This parameter specifies the IP-layer interface over which the test is to be performed (i.e. the source IP address to use when performing the test).
+          If {{empty}} is specified, the CPE MUST use its routing policy (Forwarding table entries), if necessary, to determine the appropriate interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="HostName" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies the Host Name that NS Lookup is to look for. The current domain name MUST be used unless the name is a fully qualified name.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DNSServer" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies the DNS Server name or IP address that NS Lookup is to use for the lookup. The name of this server will be resolved using the default DNS server unless an IP address is provided.
+          If {{empty}} is specified, the device's default DNS server will be used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Timeout" access="readWrite" dmr:version="2.0">
+        <description>
+          Timeout in {{units}} that indicates that a request has failed.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfRepetitions" access="readWrite" dmr:version="2.0">
+        <description>
+          The number of times the device SHOULD repeat the execution of the NSLookup using the same input parameters.  If the diagnostics test fails the CPE MAY terminate the test without completing the full number of repetitions.
+          Each repetition will use a Result instance to hold the NSLookup result data.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessCount" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of successfully executed repetitions.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ResultNumberOfEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{numentries}}
+          Total number of Result entries from the most recent invocation of the test.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.Diagnostics.NSLookupDiagnostics.Result.{i}." access="readOnly" numEntriesParameter="ResultNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:noUniqueKeys="true">
+      <description>
+        Results from the most recent invocation of the test, one instance per repetition.
+      </description>
+      <parameter name="Status" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result Parameter to represent whether the NS Lookup was successful or not.
+          Errors for individual Result instances do not get bubbled up to {{param|#.DiagnosticsState}}.
+          A failure on a specific attempt does not mean that the overall test failed, but a failure on all attempts means that {{param|#.DiagnosticsState}} SHOULD be {{enum|Error_Other|#.DiagnosticsState}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Success"/>
+            <enumeration value="Error_DNSServerNotAvailable"/>
+            <enumeration value="Error_HostNameNotResolved"/>
+            <enumeration value="Error_Timeout"/>
+            <enumeration value="Error_Other"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AnswerType" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result parameter to represent whether the answer is Authoritative or not.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None">
+              <description>
+                Indicates that the NS Lookup failed to find the host.
+              </description>
+            </enumeration>
+            <enumeration value="Authoritative"/>
+            <enumeration value="NonAuthoritative"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="HostNameReturned" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result parameter to represent the fully qualified name for the Host Name in the calling parameter (e.g. HostName.DomainName); if no response was provided, then this parameter is {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddresses" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the IP Address results returned by the NS Lookup; if no response was provided, then this parameter is {{empty}}.
+        </description>
+        <syntax>
+          <list maxItems="10"/>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="DNSServerIP" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Result parameter to represent the actual DNS Server IP address that the NS Lookup used.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ResponseTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Response time (for the first response packet) in {{units}}, or 0 if no response was received.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.SD." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.6">
+      <description>
+        This object contains the DNS Service Discovery {{bibref|DNS-SD}} object and parameters necessary to discover services and their associated devices.
+        Upon reboot the the contents of the service table are repopulated. When the DNS.SD service is disabled, the contents of the service table is implementation specific.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.6">
+        <description>
+          The parameter, when {{true}}, enables the discovery of DNS-SD services hosted by other devices.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvertisedInterfaces" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|the {{object|##.IP.Interface}} object instance from which DNS-SD services are advertised}}
+          If this parameter is not supported by an implementation then DNS-SD services are advertised on all LAN interfaces.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="##.IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.SD.Service.{i}." access="readOnly" numEntriesParameter="ServiceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.6">
+      <description>
+        The {{object}} table contains discovered DNS-SD services. DNS.SD service information is provided in DNS RR SRV records {{bibref|RFC2782}}. The Service Instance Name {{bibref|DNS-SD|Section 4.1 Structured Instance Names}} further specifies information about the service name (RFC2782 Service field) and domain name (RFC2782 Name field) in the form:
+        Service Instance Name = &lt;InstanceName&gt; . &lt;Service&gt; . &lt;Domain&gt;
+        &lt;Service&gt; = _&lt;ApplicationProtocol&gt; . _&lt;TransportProtocol&gt;
+        RFC2782 Service field will always be equal to &lt;InstanceName&gt;. &lt;Service&gt;
+        RFC2782 Name field will always be equal to &lt;Domain&gt;
+        For example, an SSH service might have:
+        *{{param|InstanceName}} = "Secure Shell (SSH))"
+        *{{param|ApplicationProtocol}} = "ssh"
+        *{{param|TransportProtocol}} = "TCP"
+        *{{param|Domain}} = "example.com"
+        *{{param|Port}} = 22
+        *{{param|Target}} = "ssh.example.com."
+      </description>
+      <uniqueKey>
+        <parameter ref="InstanceName"/>
+        <parameter ref="ApplicationProtocol"/>
+        <parameter ref="TransportProtocol"/>
+        <parameter ref="Domain"/>
+      </uniqueKey>
+      <parameter name="InstanceName" access="readOnly" dmr:version="2.6">
+        <description>
+          Human-readable instance name {{bibref|DNS-SD|Section 4.1.1 Instance Names}} (i.e. The "&lt;{{param}}&gt;" portion of the '"Service Instance Name'").
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="63"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ApplicationProtocol" access="readOnly" dmr:version="2.6">
+        <description>
+          The Application Protocol, without the leading underscore, associated with the service (e.g., daap) as defined by the DNS-SD service {{bibref|DNS-SD|Section 7 Application Protocol Names}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="15"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TransportProtocol" access="readOnly" dmr:version="2.6">
+        <description>
+          The Transport Protocol associated with the service as defined by the DNS-SD service {{bibref|DNS-SD|Section 4.1.2 Service Names}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="TCP"/>
+            <enumeration value="UDP"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Domain" access="readOnly" dmr:version="2.6">
+        <description>
+          The value extracted from the Name field of the DNS SRV record {{bibref|RFC2782}} which represents the fully qualified domain name (FQDN) associated with the service as defined by the DNS-SD service {{bibref|DNS-SD|Section 4.1.3 Domain Names}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readOnly" dmr:version="2.6">
+        <description>
+          The value extracted from the Port field of the DNS SRV record {{bibref|RFC2782}} that is used to contact the service.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Target" access="readOnly" dmr:version="2.6">
+        <description>
+          The fully qualified domain name (FQDN) with the trailing dot "." of the target host implementing the service as in the DNS SRV record {{bibref|RFC2782}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.6">
+        <description>
+          The status of the discovered {{object}} at {{param|LastUpdate}} time. {{enum}}
+          The ability to instantiate an inactive {{object}} is OPTIONAL.
+          The time an inactive {{object}} remains listed in this table is a local matter to the device.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="LeaseActive">
+              <description>
+                The {{object}} has received a response record with TTL &gt; 0 and the {{param|#.Service.{i}.TimeToLive}} has not expired yet. The {{object}} is considered active.
+              </description>
+            </enumeration>
+            <enumeration value="GoodbyeReceived">
+              <description>
+                The device has received a response record containing TTL=0 indicating a goodbye message and the {{param|#.Service.{i}.TimeToLive}} has not expired yet. The {{object}} is considered inactive.
+              </description>
+            </enumeration>
+            <enumeration value="LeaseExpired">
+              <description>
+                The {{param|#.Service.{i}.TimeToLive}} has expired. The {{object}} is considered inactive
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" dmr:version="2.6">
+        <description>
+          The date and time at which the last advertisement for this {{object}} was received.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.6">
+        <description>
+          {{list}} {{reference|all Host table entries, active or inactive, that correspond to this discovered DNS.SD service. As such, when entries are added or removed from the Host tables the value of this parameter MUST be updated accordingly|ignore}}
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".LANDevice.{i}.Hosts.Host. .Hosts.Host." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TimeToLive" access="readOnly" dmr:version="2.6">
+        <description>
+          The value extracted from the TTL field of the DNS SRV record {{bibref|RFC2782}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="2147483647"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Priority" access="readOnly" dmr:version="2.6">
+        <description>
+          The value extracted from the Priority field of the DNS SRV record {{bibref|RFC2782}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Weight" access="readOnly" dmr:version="2.6">
+        <description>
+          A server selection mechanism. The value extracted from the Weight field of the DNS SRV record {{bibref|RFC2782}} that specifies the relative weight for entries with the same {{param|Priority}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TextRecordNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.SD.Service.{i}.TextRecord.{i}." access="readOnly" numEntriesParameter="TextRecordNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.6" dmr:noUniqueKeys="true">
+      <description>
+        This object maintains an instance of a (key/value pairs) of the service. The information is extracted from DNS TXT records {{bibref|RFC1035}} of the discovered service.
+        When multiple instances of the {{object}} table have the same value for the {{param|Key}} parameter, the implementation is CPE specific.
+      </description>
+      <parameter name="Key" access="readOnly" dmr:version="2.6">
+        <description>
+          The key that identifies the text record
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the text record.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.NAT." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Properties for Network Address Translation (NAT).
+        The entire {{object}} object only applies to IPv4.
+      </description>
+      <parameter name="InterfaceSettingNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PortMappingNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.NAT.InterfaceSetting.{i}." access="readWrite" numEntriesParameter="InterfaceSettingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        NAT settings for an associated IP Interface on which NAT is enabled.
+        For enabled table entries, if {{param|Interface}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the {{object}} entry, indicating if NAT is enabled for the referenced IP Interface instance.   On creation, an {{object}} entry is disabled by default.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Enabled_NATForcedDisabled">
+              <description>
+                NAT enabled but forced by a third party to be operationally disabled, e.g. because a {{object|##.MAP.Domain}} is enabled but there is no Basic Mapping Rule {{bibref|RFC7597}}.
+              </description>
+            </enumeration>
+            <enumeration value="Enabled_PortMappingDisabled">
+              <description>
+                NAT enabled but port mapping has been operationally disabled by a third party, e.g. because this is REQUIRED by the current {{object|##.Firewall}} level.
+              </description>
+            </enumeration>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The associated IP interface on which NAT is to be enabled.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.NAT.PortMapping.{i}." access="readWrite" numEntriesParameter="PortMappingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Port mapping table.
+        This table MUST contain all NAT port mappings associated with this connection, including static and dynamic port mappings programmatically created via local control protocol, such as UPnP.
+        This table MUST NOT contain dynamic NAT binding entries associated with the normal operation of NAT.
+        If the CPE hosts a firewall, it is assumed that it will appropriately configure the firewall for the port mapping.
+        For enabled table entries, if {{param|InternalClient}} is {{empty}}, or if {{param|Interface}} is not a valid reference and {{param|AllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="RemoteHost"/>
+        <parameter ref="ExternalPort"/>
+        <parameter ref="Protocol"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the port mapping instance.  On creation, an entry is disabled by default.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+          Note: There is no guarantee that the {{param}} value on automatically-created {{object}} instances will be retained. This is because automatically-created {{object}} instances can be transitory.
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Specifies the IP interface to which this port mapping applies.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllInterfaces" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates whether this port mapping applies to all IP interfaces that support port mappings. If {{true}}, the value of {{param|Interface}} is ignored since all supported IP interfaces are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseDuration" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Determines the time to live, in {{units}}, of a port mapping lease, where "time to live" means the number of  seconds before the port mapping expires.
+          A value of 0 means the port mapping is static. Support for dynamic (non-static) port mappings is OPTIONAL.  That is, the only value  for {{param}} that MUST be supported is 0.
+          For a dynamic (non-static) port mapping, when this parameter is read, the value represents the time remaining on the port mapping  lease.  That is, for a dynamic port mapping, the value counts down toward 0.  When a dynamic port mapping lease expires, the CPE MUST  automatically terminate that port mapping, and MUST automatically delete the corresponding {{object}} table entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteHost" access="readWrite" dmr:version="2.0">
+        <description>
+          This parameter is the IP address of the source of inbound packets.  {{empty}} indicates a "wildcard", i.e. any IP address (this will be {{empty}} in most cases).  CPE are REQUIRED only to support {{empty}}.
+          When {{param}} is {{empty}}, all traffic sent to the {{param|ExternalPort}} on the WAN interface of the gateway is forwarded to the {{object|.IP.Interface}} associated with the {{param|InternalClient}} on the {{param|InternalPort}}.
+          When {{param}} is specified as one external IP address, the NAT will only forward inbound packets from this {{param}} to the {{param|InternalClient}}, all other packets will be dropped.
+          If a CPE supports non-empty values for {{param}}, it MAY additionally support the ability to have more than one port mapping with the same {{param|ExternalPort}} and {{param|Protocol}}, but with differing values of {{param}}.
+          When wildcard values are used for {{param}} and/or {{param|ExternalPort}}, the following precedence order applies (with the highest precedence listed first):
+          # Explicit {{param}}, explicit {{param|ExternalPort}}
+          # Explicit {{param}}, zero {{param|ExternalPort}}
+          # Empty {{param}}, explicit {{param|ExternalPort}}
+          # Empty {{param}}, zero {{param|ExternalPort}}
+          If an incoming packet matches the criteria associated with more than one entry in this table, the CPE MUST apply the port mapping associated with the highest precedence entry.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ExternalPort" access="readWrite" dmr:version="2.0">
+        <description>
+          The external port (or the first port of a range of external ports) that the NAT gateway would listen on for traffic to a corresponding {{param|InternalPort}}. Inbound packets to this external port on the WAN interface SHOULD be forwarded to the {{object|.IP.Interface}} associated with the {{param|InternalClient}} on the {{param|InternalPort}}.
+          A value of zero ({{null}}) represents a "wildcard", i.e. any port number.  If this value is {{null}}, traffic on all external ports (that are not otherwise mapped) will be forwarded to {{param|InternalClient}}, and the value(s) of  {{param|InternalPort}} on {{param|InternalClient}} are ignored.
+          When wildcard values are used for {{param|RemoteHost}} and/or {{param}}, the following precedence order applies (with the highest precedence listed first):
+          # Explicit {{param|RemoteHost}}, explicit {{param}}
+          # Explicit {{param|RemoteHost}}, zero {{param}}
+          # Empty {{param|RemoteHost}}, explicit {{param}}
+          # Empty {{param|RemoteHost}}, zero {{param}}
+          If an incoming packet matches the criteria associated with more than one entry in this table, the CPE MUST apply the port mapping associated with the highest precedence entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ExternalPortEndRange" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates the last port of the external port range that starts with {{param|ExternalPort}}.
+          If an external port range is specified, then the behavior described for {{param|ExternalPort}} applies to all ports within the range.
+          A value of zero (0) indicates that no external port range is specified, i.e. that the range consists only of {{param|ExternalPort}}.
+          If {{param|ExternalPort}} is zero (wildcard), the value of this parameter MUST be ignored.
+          If specified, the value of this parameter MUST be greater than or equal to the value of {{param|ExternalPort}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="InternalPort" access="readWrite" dmr:version="2.0">
+        <description>
+          The port on {{param|InternalClient}} that the gateway SHOULD forward traffic to.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.0">
+        <description>
+          The protocol of the port mapping.  {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="TCP"/>
+            <enumeration value="UDP"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InternalClient" access="readWrite" dmr:version="2.0">
+        <description>
+          The IP address or DNS host name of an internal client (on the LAN).
+          Support for an IP address is mandatory.  If {{param}} is specified as an IP address and the LAN device's IP address subsequently changes, the port mapping MUST remain associated with the original IP address.
+          Support for DNS host names is OPTIONAL.  If {{param}} is specified as a DNS host name and the LAN device's IP address subsequently changes, the port mapping MUST remain associated with this LAN device.  In this case, it is the responsibility of the CPE to maintain the name-to-address mapping in the event of IP address changes.  This can be accomplished, for example, by assigning the DNS host name via use of DHCP option 12 (Host Name) or option 81 (FQDN).  Note that the ACS can learn the host name associated with a given LAN device via the {{object|.Hosts.Host.}} table.
+          Read access to this parameter MUST always return the exact value that was last set by the ACS.  For example, if the internal client is set to a DNS host name, it MUST read back as a DNS host name and not as an IP address.
+          It MUST be possible to set the {{param}} to the broadcast IP address 255.255.255.255 for UDP mappings. This is to enable multiple NAT clients to use the same well-known port simultaneously.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readWrite" dmr:version="2.0">
+        <description>
+          User-readable description of this port mapping.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Properties for Port Control Protocol (PCP) {{bibref|RFC6887}}.
+        See the PCP Theory of Operation {{bibref|TR-181i2a8|Appendix XIV}} for a description of the working of this PCP data model.
+      </description>
+      <parameter name="SupportedVersions" access="readOnly" dmr:version="2.8">
+        <description>
+          {{list}} Each list item denotes a PCP version supported by the PCP Client. Currently known versions are 0, 1 and 2.
+          This parameter is based on Version from {{bibref|RFC6887}}.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredVersion" access="readWrite" dmr:version="2.8">
+        <description>
+          This is the version to be used in the first exchange with a new PCP Server.
+          The factory default MUST be the highest supported version, as described in {{bibref|RFC6887|Section 9}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="OptionList" access="readOnly" dmr:version="2.8">
+        <description>
+          {{list}} The list of the PCP Options supported by the PCP Client.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="254"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ClientNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP.Client.{i}." access="readWrite" numEntriesParameter="ClientNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        Client properties for Port Control Protocol (PCP). The PCP Client interacts with a PCP Server as defined in {{bibref|RFC6887}} for internal device applications or LAN device applications via Interworking functions.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="WANInterface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the PCP Client.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="WANInterface" access="readOnly" dmr:version="2.8">
+        <description>
+          {{reference|the interface stack instance representing the WAN interface this client operates on}} See {{object|.InterfaceStack.}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of the PCP Client. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MAPEnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the MAP OpCode.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PEEREnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the PEER OpCode.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ANNOUNCEEnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the ANNOUNCE OpCode.
+          When {{false}} the PCP Client does not support unsolicited ANNOUNCE messages.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="THIRDPARTYEnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the THIRD_PARTY Option.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="THIRDPARTYStatus" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates whether THIRD_PARTY Option is enabled or not. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FILTEREnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the FILTER option.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP.Client.{i}.PCPProxy." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Properties for the Port Control Protocol (PCP) Proxy, as specified in {{bibref|PCPProxy}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the PCP Proxy for this PCP Client.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="HighestVersion" access="readOnly" dmr:version="2.8">
+        <description>
+          A string identifying the highest version of PCP that the proxy supports.
+          This parameter is based on Version from {{bibref|RFC6887}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of the PCP Proxy for this PCP Client. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP.Client.{i}.UPnPIWF." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Properties for the interworking function between UPnP IGD (Internet Gateway Device) and PCP, as specified in {{bibref|RFC6970}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the UPnP IGD-PCP Interworking Function for this PCP Client.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of the UPnP IGD-PCP Interworking Function for this PCP Client. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP.Client.{i}.Server.{i}." access="readWrite" numEntriesParameter="ServerNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        This table contains the PCP Servers to be used by the PCP Client. Entries are either statically configured or automatically created via DHCP options OPTION_V4_PCP_SERVER and OPTION_V6_PCP_SERVER, as per {{bibref|RFC7291}}.
+        Each OPTION_V4_PCP_SERVER or OPTION_V6_PCP_SERVER option corresponds to a {{object}} instance.  If an option returns multiple addresses then that {{object}} instance has multiple addresses.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="ServerNameOrAddress"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables this PCP Server.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of the PCP Server. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Connecting"/>
+            <enumeration value="Error_Timeout"/>
+            <enumeration value="Error_HostNameNotResolved"/>
+            <enumeration value="Error_NetworkFailure"/>
+            <enumeration value="Error_NotAuthorized"/>
+            <enumeration value="Error_Unsupported"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.8">
+        <description>
+          Method used to assign {{param|ServerNameOrAddress}} and create this table entry. {{enum}}
+          Note: In the {{enum|DHCPv4}} and {{enum|DHCPv6}} cases, if more than one IP address is received {{param|ServerNameOrAddress}} will be the first address and {{param|AdditionalServerAddresses}} will be the remaining addresses.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv4">
+              <description>
+                {{param|ServerNameOrAddress}} is an IPv4 address that was received via OPTION_V4_PCP_SERVER
+              </description>
+            </enumeration>
+            <enumeration value="DHCPv6">
+              <description>
+                {{param|ServerNameOrAddress}} is an IPv6 address that was received via OPTION_V6_PCP_SERVER
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                {{param|ServerNameOrAddress}} is an FQDN, IPv4 address or IPv6 address that was created by the ACS, by some other management entity (e.g. via a GUI), or is present in the factory default configuration
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerNameOrAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          The FQDN or IP address of the PCP Server, assigned as described under {{param|Origin}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServerAddressInUse" access="readOnly" dmr:version="2.8">
+        <description>
+          The IP address currently in use for the PCP Server, derived from the value of {{param|ServerNameOrAddress}}.
+          {{empty}} indicates that no PCP Server address is currently known.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalServerAddresses" access="readOnly" dmr:version="2.8">
+        <description>
+          PCP Server addresses in addition to {{param|ServerNameOrAddress}}.  This can be non-empty only if {{param|Origin}} is {{enum|DHCPv4|Origin}} or {{enum|DHCPv6|Origin}} and if more than one PCP Server address was received.
+        </description>
+        <syntax>
+          <list/>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ExternalIPAddress" access="readOnly" dmr:version="2.8">
+        <description>
+          The external IP address of the PCP-controlled device hosting this server.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentVersion" access="readOnly" dmr:version="2.8">
+        <description>
+          This is the version of PCP resulting from client-server Version Negotiation.
+          This parameter is based on Version from {{bibref|RFC6887}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumFilters" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates the maximum number of inbound filters allowed to be associated with a mapping entry on this server.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PortQuota" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates the maximum number of ports allocated to this PCP Client on this server.
+          A value of 0 means that there is no limitation.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredLifetime" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates the preferred lifetime (in {{units}}) to be used for mappings with this server when no preference is selected by an application/user.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Capabilities" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates the capabilities supported by the PCP Server. {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="NAT44"/>
+            <enumeration value="StatelessNAT64"/>
+            <enumeration value="StatefulNAT64"/>
+            <enumeration value="A+PPortRangeRouter"/>
+            <enumeration value="SupportsPORTSETOption"/>
+            <enumeration value="IPv4Firewall"/>
+            <enumeration value="IPv6Firewall"/>
+            <enumeration value="NPTv6"/>
+            <enumeration value="DSCPReMarkingFunction"/>
+            <enumeration value="FLOWDATAAwareFunction"/>
+            <enumeration value="ILNPTranslator"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InboundMappingNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OutboundMappingNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP.Client.{i}.Server.{i}.InboundMapping.{i}." access="readWrite" numEntriesParameter="InboundMappingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        Inbound Mapping table.
+        This table contains all Inbound Mappings requested by this PCP Client on this PCP Server. Such a mapping is created by a PCP request with OpCode MAP, as described in {{bibref|RFC6887|Section 11}}.
+        These requests can be issued from internal device applications, from static configuration or from other LAN device applications via interworking functions such as UPnP IGD or PCP proxies.  The {{param|Origin}} parameter indicates which mechanism requested the mapping.
+        For non-{{enum|Static|Origin}} mappings (here ''Static'' refers to the mechanism that created the mapping, not to the {{param|Lifetime}}), the ACS MAY modify the {{param||Enable}} parameter but MUST NOT modify any other parameters in the mapping or its sub-objects.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="InternalPort"/>
+        <parameter ref="ProtocolNumber"/>
+        <parameter ref="ThirdPartyAddress"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of this entry. {{enum}}
+          The {{enum|Error_PCPErrorCodeReceived}} value indicates that the PCP Client received an error code from the PCP Server.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_PCPErrorCodeReceived"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorCode" access="readOnly" dmr:version="2.8">
+        <description>
+          Provides the PCP error code when {{param|Status}} is {{enum|Error_PCPErrorCodeReceived|Status}}. Error code values are defined in {{bibref|RFC6887|Section 7.4}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.8">
+        <description>
+          Mechanism via which the mapping was requested. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Internal">
+              <description>
+                Requested via internal device application
+              </description>
+            </enumeration>
+            <enumeration value="UPnP_IWF">
+              <description>
+                Requested via UPnP IGD interworking function
+              </description>
+            </enumeration>
+            <enumeration value="PCP_Proxy">
+              <description>
+                Requested via PCP proxy
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                Requested via static configuration, i.e. created by the ACS, by some other management entity (e.g. via a GUI), or is present in the factory default configuration
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Lifetime" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          Determines the time to live, in {{units}}, of this Inbound Mapping lease, i.e. the remaining time before this port mapping expires.
+          A value of 0 means that the port mapping is permanent (referred to as a static mapping in {{bibref|RFC6887}}).
+          When a dynamic Inbound Mapping lease expires, the CPE MUST automatically delete the corresponding {{object}} table entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SuggestedExternalIPAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          The external IPv4 or IPv6 Address that the PCP-controlled device will listen on for incoming packets to be forwarded to the PCP Client.
+          This is useful for refreshing an Inbound Mapping, especially after the PCP Server loses state. If the PCP client does not know the external address, or does not have a preference, it MUST use {{empty}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SuggestedExternalPort" access="readWrite" dmr:version="2.8">
+        <description>
+          The external port (or the first port of a range of external ports) that the PCP-controlled device will listen on for incoming packets. Those inbound packets will be forwarded to {{param|InternalPort}}. If the PCP client does not know the external port, or does not have a preference, it MUST use 0.
+          This is useful for refreshing an Inbound Mapping, especially after the PCP Server loses state. If the PCP Client does not know the external port, or does not have a preference, it MUST use 0.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="SuggestedExternalPortEndRange" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates the last port of the external port range that starts with {{param|SuggestedExternalPort}}.
+          If an external port range is specified, then the behavior described for {{param|SuggestedExternalPort}} applies to all ports within the range.
+          A value of zero (0) indicates that no external port range is specified, i.e. that the range consists only of {{param|SuggestedExternalPort}}.
+          If {{param|SuggestedExternalPort}} is zero (wildcard), the value of {{param}} MUST be ignored.
+          If specified, the value of this parameter MUST be zero or be greater than or equal to the value of {{param|SuggestedExternalPort}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="InternalPort" access="readWrite" dmr:version="2.8">
+        <description>
+          The port on this PCP Client's {{param|##.WANInterface}} that the PCP-controlled device forwards incoming packets to.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolNumber" access="readWrite" dmr:version="2.8">
+        <description>
+          The protocol number of the {{object}}. Values are taken from {{bibref|IANA-protocolnumbers}}.
+          The value -1 means ''all protocols''.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="255"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ThirdPartyAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          Under certain conditions, the PCP Client can create a PCP mapping on behalf of another device, by using the THIRD_PARTY option, as specified in {{bibref|RFC6887|Section 7.3}}. In that case, {{param}} is the IP address of the device for which the PCP operation is requested.
+          For non-third-party mappings, {{param}} SHOULD be {{empty}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readWrite" dmr:version="2.8">
+        <description>
+          User-readable description of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AssignedExternalIPAddress" access="readOnly" dmr:version="2.8">
+        <description>
+          The external IPAddress returned by the PCP Server. The IP address that the PCP-controlled device is listening on for incoming packets to a corresponding PCP Client.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AssignedExternalPort" access="readOnly" dmr:version="2.8">
+        <description>
+          The external port returned by the PCP Server. The external port (or the first port of a range of external ports) that the PCP-controlled device is listening on for incoming packets to a corresponding {{param|InternalPort}}. Inbound packets to this external port on the External interface of the PCP-controlled device is forwarded to the on the {{param|InternalPort}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AssignedExternalPortEndRange" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates the last port of the external port range that starts with {{param|AssignedExternalPort}}.
+          If an external port range is specified, then the behavior described for {{param|AssignedExternalPort}} applies to all ports within the range.
+          A value of zero (0) indicates that no external port range is specified, i.e. that the range consists only of {{param|AssignedExternalPort}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="FilterNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP.Client.{i}.Server.{i}.InboundMapping.{i}.Filter.{i}." access="readWrite" numEntriesParameter="FilterNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        Filter table.
+        This table contains all Filters restricting this Inbound Mapping, as defined in {{bibref|RFC6887|}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteHostIPAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          Permitted remote peer IP address for this filter.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="PrefixLength" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates how many bits of {{param|RemoteHostIPAddress}} are relevant for this filter.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="128"/>
+          </unsignedInt>
+          <default type="object" value="128"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemotePort" access="readWrite" dmr:version="2.8">
+        <description>
+          Permitted remote peer port number for this filter.
+          The value 0 indicates ''all ports''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RemotePortEndRange" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates the last port of the remote port range that starts with {{param|RemotePort}}.
+          If an external port range is specified, then the behavior described for {{param|RemotePort}} applies to all ports within the range.
+          A value of zero (0) indicates that no remote port range is specified, i.e. that the range consists only of {{param|RemotePort}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP.Client.{i}.Server.{i}.OutboundMapping.{i}." access="readWrite" numEntriesParameter="OutboundMappingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        Outbound Mapping table.
+        This table contains all Outbound Mappings requested by this PCP Client on this PCP Server. Such a mapping is created by a PCP request with OpCode PEER, as described in {{bibref|RFC6887|Section 12}}.
+        These requests can be issued from internal device applications, from static configuration or from other LAN device applications via interworking functions such as UPnP IGD or PCP proxies. The {{param|Origin}} parameter indicates which mechanism requested the mapping.
+        For non-{{enum|Static|Origin}} mappings (here ''Static'' refers to the mechanism that created the mapping, not to the {{param|Lifetime}}), the ACS MAY modify the {{param||Enable}} parameter but MUST NOT modify any other parameters in the mapping or its sub-objects.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="InternalPort"/>
+        <parameter ref="ProtocolNumber"/>
+        <parameter ref="ThirdPartyAddress"/>
+        <parameter ref="RemoteHostIPAddress"/>
+        <parameter ref="RemotePort"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of this entry. {{enum}}
+          The {{enum|Error_PCPErrorCodeReceived}} value indicates that the PCP Client received an error code from the PCP Server.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_PCPErrorCodeReceived"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorCode" access="readOnly" dmr:version="2.8">
+        <description>
+          Provides the PCP Error code when {{param|Status}} is {{enum|Error_PCPErrorCodeReceived|Status}}. Error code values are defined in {{bibref|RFC6887|Section 7.4}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.8">
+        <description>
+          Mechanism via which the mapping was requested. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Internal">
+              <description>
+                Requested via internal device application
+              </description>
+            </enumeration>
+            <enumeration value="UPnP_IWF">
+              <description>
+                Requested via UPnP IGD interworking function
+              </description>
+            </enumeration>
+            <enumeration value="PCP_Proxy">
+              <description>
+                Requested via PCP proxy
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                Requested via static configuration, i.e. created by the ACS, by some other management entity (e.g. via a GUI), or is present in the factory default configuration
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Lifetime" access="readWrite" dmr:version="2.8">
+        <description>
+          Determines the time to live, in {{units}}, of this Outbound Mapping lease, i.e. the remaining time before this port mapping expires.
+          A value of 0 means that the port mapping is permanent (referred to as a static mapping in {{bibref|RFC6887}}).
+          When a dynamic Outbound Mapping lease expires, the CPE MUST automatically delete the corresponding {{object}} table entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SuggestedExternalIPAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          The external IPv4 or IPv6 Address that the PCP-controlled device will use to send outgoing packets covered by this mapping.
+          This is useful for refreshing a mapping, especially after the PCP Server has lost state. If the PCP Client does not know the external address, or does not have a preference, it MUST use {{empty}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SuggestedExternalPort" access="readWrite" dmr:version="2.8">
+        <description>
+          The external port that the PCP-controlled device will use to send outgoing packets covered by this mapping.
+          This is useful for refreshing a mapping, especially after the PCP Server has lost state. If the PCP Client does not know the external port, or does not have a preference, it MUST use 0.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteHostIPAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          The remote peer's IP address, as seen from the PCP Client, for this Outbound Mapping.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="InternalPort" access="readWrite" dmr:version="2.8">
+        <description>
+          The port on PCP Client WAN Interface that the PCP-controlled device SHOULD listen to for this mapping.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RemotePort" access="readWrite" dmr:version="2.8">
+        <description>
+          The remote peer's port, as seen from the PCP Client, for this Outbound Mapping.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolNumber" access="readWrite" dmr:version="2.8">
+        <description>
+          The protocol number of the {{object}}. Values are taken from the {{bibref|IANA-protocolnumbers}}.
+          The value -1 means ''all protocols''.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="255"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ThirdPartyAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          Under certain conditions, the PCP Client can create a PCP mapping on behalf of another device, by using the THIRD_PARTY option, as specified in {{bibref|RFC6887|Section 7.3}}. In that case, {{param}} is the IP address of the device for which the PCP operation is requested.
+          For non-third-party mappings, {{param}} SHOULD be {{empty}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readWrite" dmr:version="2.8">
+        <description>
+          User-readable description of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AssignedExternalIPAddress" access="readOnly" dmr:version="2.8">
+        <description>
+          The external IP address returned by the PCP Server. The IP address that the PCP-controlled device uses to send outgoing packets corresponding to this mapping.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AssignedExternalPort" access="readOnly" dmr:version="2.8">
+        <description>
+          The external port returned by the PCP Server. The port that the PCP-controlled device uses to send outgoing packets corresponding to this mapping.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The Dynamic Host Configuration Protocol (DHCP) IPv4 object {{bibref|RFC2131}}. This entire object applies to IPv4 only. It contains the {{object|Client}}, {{object|Server}}, and {{object|Relay}} objects.
+      </description>
+      <parameter name="ClientNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Client.{i}." access="readWrite" numEntriesParameter="ClientNumberOfEntries" enableParameter="Enable" minEntries="1" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object contains DHCP client settings for an associated ''IP Interface'' indicated by {{param|Interface}}.
+        For enabled table entries, if {{param|Interface}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the DHCP Client entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The IP Interface associated with the ''Client'' entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this table entry. {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="DHCPStatus" access="readOnly" dmr:version="2.0">
+        <description>
+          The DHCP Client status as defined in {{bibref|RFC2131}}. {{enum}}
+          Note: This value is only relevant when the DHCP Client is operationally enabled (i.e. when {{param|Status}} is {{enum|Enabled|Status}}).
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Init"/>
+            <enumeration value="Selecting"/>
+            <enumeration value="Requesting"/>
+            <enumeration value="Rebinding"/>
+            <enumeration value="Bound"/>
+            <enumeration value="Renewing"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Renew" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, the DHCP client will renew its DHCP lease.
+        </description>
+        <syntax command="true">
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          IPv4 Address option received from the DHCP Server. {{empty}} when {{param|Status}} is not equal to {{enum|Bound|DHCPStatus}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SubnetMask" access="readOnly" dmr:version="2.0">
+        <description>
+          Subnet mask option received from the DHCP Server. {{empty}} when {{param|Status}} is not equal to {{enum|Bound|DHCPStatus}}.
+          Value is information received via DHCP Option 1.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="IPRouters" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Items represent IP Router IPv4 Address(es) received from the DHCP server. {{empty}} when {{param|Status}} is not equal to {{enum|Bound|DHCPStatus}}.
+          Value is information received via DHCP Options 3, 33 or 121.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DNSServers" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Items represent DNS Server IPv4 Address(es) received from the DHCP server. {{empty}} when {{param|Status}} is not equal to {{enum|Bound|DHCPStatus}}.
+          Value is information received via DHCP Option 6.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTimeRemaining" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DHCP lease time remaining in {{units}}. A value of -1 indicates an infinite lease.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DHCPServer" access="readOnly" dmr:version="2.0">
+        <description>
+          The IPv4 address of the current DHCP server.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="PassthroughEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the DHCP Client retrieved IP address information is configured on the referenced  {{param|Interface}} object.
+          If {{true}}, the DHCP Client retrieved information is propagated to the parameters in the referenced {{param|PassthroughDHCPPool}} object, replacing any existing configuration (including ''MinAddress'', ''MaxAddress'', ''SubnetMask'', ''IPRouters'', and ''DNSServers'').
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PassthroughDHCPPool" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}When {{param}} is set to {{empty}}, {{param|PassthroughEnable}} MUST be set to {{false}} (i.e. passthrough can not be enabled without a pool reference specified).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Server.Pool." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SentOptionNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ReqOptionNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Client.{i}.SentOption.{i}." access="readWrite" numEntriesParameter="SentOptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Each instance of this object represents a DHCP option that MUST, if enabled, be sent in DHCP client requests.  All  sent DHCP options MUST be listed.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Tag"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this SentOption table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tag" access="readWrite" dmr:version="2.0">
+        <description>
+          Option tag as defined in {{bibref|RFC2132}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="254"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.0">
+        <description>
+          A hexbinary encoded option value.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="255"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Client.{i}.ReqOption.{i}." access="readWrite" numEntriesParameter="ReqOptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Each instance of this object represents a DHCP option that MUST, if enabled, be requested in DHCP client requests.  All requested DHCP options MUST be listed.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Tag"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this ReqOption table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.0">
+        <description>
+          Position of the option in the DHCP client request.  A value of ''1'' indicates the first entry.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is  changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tag" access="readWrite" dmr:version="2.0">
+        <description>
+          Option tag as defined in {{bibref|RFC2132}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="254"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.0">
+        <description>
+          A hexbinary encoded, most recently received DHCP option value.
+          If no option value has been received, then the value MUST represent {{empty}}.
+          Received DHCP option values MAY, but need not, persist across CPE reboots.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="255"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Server." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        DHCP server configuration.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the DHCP server.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PoolNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Server.Pool.{i}." access="readWrite" numEntriesParameter="PoolNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        DHCP conditional serving pool table.
+        Each instance of this object defines a DHCP conditional serving pool. Client requests are associated with pools based on criteria such as source interface, supplied DHCP options, and MAC address.
+        Overlapping pool ranges MUST be supported.
+        For enabled table entries, if {{param|Interface}} is not a valid reference, or {{param|MinAddress}}, {{param|MaxAddress}}, or {{param|SubnetMask}} is not a valid value, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the Pool entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.0">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For  each DHCP request, the highest ordered entry that matches the association criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be  compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The IP Interface associated with the ''Pool'' entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          Used to identify one or more LAN devices, value of the DHCP Vendor Class Identifier (Option 60) as defined in {{bibref|RFC2132}}, matched according to the criterion in {{param|VendorClassIDMode}}.  Case sensitive.
+          This is a normal string, e.g. "abc" is represented as "abc" and not say "616263" hex. However, if the value includes non-printing characters then such characters have to be represented using XML escapes, e.g. #x0a for line-feed.
+          {{empty}} indicates this criterion is not used for conditional serving.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|VendorClassID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|VendorClassID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassIDMode" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|VendorClassID}} pattern match criterion.  {{enum}}
+          For example, if {{param|VendorClassID}} is "Example" then an Option 60 value of "Example device" will match with {{param}} values of  {{enum|Prefix}} or {{enum|Substring}}, but not with {{enum|Exact}} or {{enum|Suffix}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Exact"/>
+            <enumeration value="Prefix"/>
+            <enumeration value="Suffix"/>
+            <enumeration value="Substring"/>
+          </string>
+          <default type="object" value="Exact"/>
+        </syntax>
+      </parameter>
+      <parameter name="ClientID" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP Client Identifier (Option 61) as defined in {{bibref|RFC2132}}.  The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used for conditional serving.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="255"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ClientIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|ClientID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|ClientID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="UserClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP User Class Identifier (Option 77) as defined in {{bibref|RFC3004}}.
+          {{empty}} indicates this criterion is not used for conditional serving.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="255"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="UserClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|UserClassID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|UserClassID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Chaddr" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          Hardware address (MAC address) of the physical interface of the DHCP client.
+          {{empty}} indicates this criterion is not used for conditional serving.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ChaddrMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Bit-mask for the MAC address, where matching of a packet's MAC address with the {{param|Chaddr}} is only to be  done for bit positions set to one in the mask.  A mask of FF:FF:FF:FF:FF:FF  or {{empty}} indicates all bits of the {{param|Chaddr}}  are to be used for conditional serving classification.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ChaddrExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the (masked) {{param|Chaddr}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the (masked) {{param|Chaddr}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="MinAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies first IPv4 address in the pool to be assigned by the DHCP server on the LAN interface.
+          The parameter value can be overwritten by dynamic values retrieved via a DHCP client with {{param|##.Client.{i}.PassthroughEnable}} or a PPP interface with {{param|.PPP.Interface.{i}.IPCP.PassthroughEnable}} equal to {{true}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies last IPv4 address in the pool to be assigned by the DHCP server on the LAN interface.
+          The parameter value can be overwritten by dynamic values retrieved via a DHCP client with {{param|##.Client.{i}.PassthroughEnable}} or a PPP interface with {{param|.PPP.Interface.{i}.IPCP.PassthroughEnable}} equal to {{true}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReservedAddresses" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} List items represent addresses marked reserved from the address allocation pool.
+        </description>
+        <syntax>
+          <list maxItems="32"/>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SubnetMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies the client's network subnet mask.
+          The parameter value can be overwritten by dynamic values retrieved via a DHCP client with  {{param|##.Client.{i}.PassthroughEnable}} or a PPP interface with {{param|.PPP.Interface.{i}.IPCP.PassthroughEnable}} equal to {{true}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="DNSServers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} List items represent DNS servers offered to DHCP clients.  Support for more than three DNS Servers is OPTIONAL.
+          The parameter value can be overwritten by dynamic values retrieved via a DHCP client with {{param|##.Client.{i}.PassthroughEnable}} or a PPP interface with {{param|.PPP.Interface.{i}.IPCP.PassthroughEnable}} equal to  {{true}}.
+        </description>
+        <syntax>
+          <list maxItems="4"/>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="DomainName" access="readWrite" dmr:version="2.0">
+        <description>
+          Sets the domain name to provide to clients on the LAN interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IPRouters" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} List items represent addresses of routers on this subnet.  Also known as default gateway.  Support for more than one Router address is OPTIONAL.
+          The parameter value can be overwritten by dynamic values retrieved via a DHCP client with {{param|##.Client.{i}.PassthroughEnable}} or a PPP interface with {{param|.PPP.Interface.{i}.IPCP.PassthroughEnable}} equal to  {{true}}.
+        </description>
+        <syntax>
+          <list maxItems="4"/>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTime" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies the lease time in {{units}} of client assigned addresses.  A value of -1 indicates an infinite lease.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+          <default type="object" value="86400"/>
+        </syntax>
+      </parameter>
+      <parameter name="StaticAddressNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ClientNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Server.Pool.{i}.StaticAddress.{i}." access="readWrite" numEntriesParameter="StaticAddressNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        DHCP static address table.
+        Entries in this table correspond to what {{bibref|RFC2131}} calls "manual allocation", where a client's IP address is assigned by the network administrator, and DHCP is used simply to convey the assigned address to the client.
+        Each instance of this object specifies a hardware address (MAC address) and an IP address within the pool.  When serving from this pool, this IP address MUST, if available, be assigned to the DHCP client with this hardware address, and MUST NOT be assigned to any other client.
+        Note that it is possible that an IP address in this table is present in one or more of the other conditional serving pools, in which case it is possible that such an address will be assigned to a different client.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Chaddr"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the StaticAddress table entry.
+          Disabling an entry does not return the IP address to the pool.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Chaddr" access="readWrite" dmr:version="2.0">
+        <description>
+          Hardware address (MAC address) of the physical interface of the DHCP client.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Yiaddr" access="readWrite" dmr:version="2.0">
+        <description>
+          IPv4 address to be assigned by the DHCP server to the DHCP client with the specified hardware address (MAC address).
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Server.Pool.{i}.Option.{i}." access="readWrite" numEntriesParameter="OptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object specifies the DHCP options that MUST, if enabled, be returned to clients whose DHCP requests are  associated with this pool.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Tag"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this Option table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tag" access="readWrite" dmr:version="2.0">
+        <description>
+          Option tag as defined in {{bibref|RFC2132}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="254"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.0">
+        <description>
+          A hexbinary encoded option value.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="255"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Server.Pool.{i}.Client.{i}." access="readOnly" numEntriesParameter="ClientNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        DHCPv4 client table.
+        This table lists details of DHCPv4 clients that matched the filter criteria of this {{object|#}} entry.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Chaddr"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+          Note: There is no guarantee that the {{param}} value on automatically-created {{object}} instances will be retained. This is because automatically-created {{object}} instances can be transitory.
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Chaddr" access="readOnly" dmr:version="2.2">
+        <description>
+          MAC address of the DHCPv4 client.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.2">
+        <description>
+          Whether or not the DHCPv4 client is currently present on the LAN.  The method of presence detection is a local matter to  the CPE.
+          The ability to list inactive DHCPv4 clients is OPTIONAL.  If the CPE includes inactive DHCPv4 clients in this table, {{param}} MUST be set to {{false}}  for each inactive DHCPv4 client.  The length of time an inactive DHCPv4 client remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4AddressNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Server.Pool.{i}.Client.{i}.IPv4Address.{i}." access="readOnly" numEntriesParameter="IPv4AddressNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        IPv4 addresses assigned to this client.
+      </description>
+      <uniqueKey>
+        <parameter ref="IPAddress"/>
+      </uniqueKey>
+      <parameter name="IPAddress" access="readOnly" dmr:version="2.2">
+        <description>
+          IPv4 address.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTimeRemaining" access="readOnly" dmr:version="2.2">
+        <description>
+          The time at which the DHCP lease will expire or {{null}} if not known. For an infinite lease, the parameter value MUST be 9999-12-31T23:59:59Z.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Server.Pool.{i}.Client.{i}.Option.{i}." access="readOnly" numEntriesParameter="OptionNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2" dmr:noUniqueKeys="true">
+      <description>
+        DHCPv4 options supplied by this client, e.g. ''VendorClassID'' (Option 60), ''ClientID'' (option 61) or ''UserClassID'' (Option 77).
+      </description>
+      <parameter name="Tag" access="readOnly" dmr:version="2.2">
+        <description>
+          Option tag as defined in {{bibref|RFC2132}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.2">
+        <description>
+          A hexbinary encoded option value.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="255"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Relay." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        DHCP Relay Agent (conditional relaying).
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the DHCP Relay Agent function.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of the DHCP relay. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Relay.Forwarding.{i}." access="readWrite" numEntriesParameter="ForwardingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        DHCP Relay Agent Forwarding table.
+        For enabled table entries, if {{param|Interface}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the Forwarding entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.0">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each DHCP request, the highest ordered entry that matches the association criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be  compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The IP Interface associated with the ''Forwarding'' entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          Used to identify one or more LAN devices, value of the DHCP Vendor Class Identifier (Option 60) as defined in {{bibref|RFC2132}}, matched according to the criterion in {{param|VendorClassIDMode}}.  Case sensitive.
+          This is a normal string, e.g. "abc" is represented as "abc" and not say "616263" hex. However, if the value includes non-printing characters then such characters have to be represented using XML escapes, e.g. #x0a for line-feed.
+          {{empty}} indicates this criterion is not used as a relay classification criterion.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|VendorClassID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|VendorClassID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassIDMode" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|VendorClassID}} pattern match criterion.  {{enum}}
+          For example, if {{param|VendorClassID}} is "Example" then an Option 60 value of "Example device" will match with {{param}} values of  {{enum|Prefix}} or {{enum|Substring}}, but not with {{enum|Exact}} or {{enum|Suffix}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Exact"/>
+            <enumeration value="Prefix"/>
+            <enumeration value="Suffix"/>
+            <enumeration value="Substring"/>
+          </string>
+          <default type="object" value="Exact"/>
+        </syntax>
+      </parameter>
+      <parameter name="ClientID" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP Client Identifier (Option 61) as defined in {{bibref|RFC2132}}.  The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used as a relay classification criterion.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="255"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ClientIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|ClientID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|ClientID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="UserClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP User Class Identifier (Option 77) as defined in {{bibref|RFC3004}}.
+          {{empty}} indicates this criterion is not used as a relay classification criterion.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="255"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="UserClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|UserClassID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|UserClassID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Chaddr" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          Hardware address (MAC address) of the physical interface of the DHCP client.
+          {{empty}} indicates this criterion is not used as a relay classification criterion.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ChaddrMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Bit-mask for the MAC address, where matching of a packet's MAC address with the {{param|Chaddr}} is only to be done for bit positions set to one in the mask.  A mask of FF:FF:FF:FF:FF:FF or {{empty}} indicates all bits of the {{param|Chaddr}} are to be used for relay classification.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ChaddrExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the (masked) {{param|Chaddr}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the (masked) {{param|Chaddr}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="LocallyServed" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{true}}, incoming DHCP requests will be forwarded to the CPE DHCP Server. If {{false}}, incoming DHCP requests will be forwarded to the {{param|DHCPServerIPAddress}} configured for this forwarding entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DHCPServerIPAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          IPv4 address of the DHCP server, where the request has to be sent to when there is a conditional match with this forwarding entry and {{param|LocallyServed}} is {{false}}. If {{param|LocallyServed}} is {{false}} and this parameter is not  configured, then the DHCP request is dropped.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        The Dynamic Host Configuration Protocol (DHCP) IPv6 object {{bibref|RFC3315}}. This entire object applies to IPv6 only. It contains the {{object|Client}} and {{object|Server}} objects.
+      </description>
+      <parameter name="ClientNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Client.{i}." access="readWrite" numEntriesParameter="ClientNumberOfEntries" enableParameter="Enable" minEntries="1" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        This object contains DHCPv6 client settings for an associated ''IP Interface'' indicated by {{param|Interface}}.
+        For enabled table entries, if {{param|Interface}} is not a valid reference to an IPv6-capable interface (that is attached to the IPv6 stack), then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference.  If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}.  However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.2">
+        <description>
+          {{reference}} The IP Interface associated with the {{object}} entry. This will reference an IPv6-capable interface (that is attached to the IPv6 stack), otherwise the table entry will be inoperable.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this table entry. {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="DUID" access="readOnly" dmr:version="2.2">
+        <description>
+          The client's DHCP Unique Identifier (DUID) {{bibref|RFC3315|Section 9}}. {{param}} is set by the CPE.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="130"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="RequestAddresses" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables inclusion of the ''Identity Association (IA) for Non-Temporary Address'' option OPTION_IA_NA(3) {{bibref|RFC3315|Section 22.4}} in Solicit messages.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="RequestPrefixes" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables inclusion of the ''Identity Association (IA) for Prefix Delegation'' option OPTION_IA_PD(25) {{bibref|RFC3633|Section 10}} in Solicit messages.
+          Note that this is only appropriate for an upstream interface on a requesting router, e.g. for an RG WAN interface.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="RapidCommit" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables inclusion of the ''Rapid Commit'' option OPTION_RAPID_COMMIT(14) {{bibref|RFC3315|Section 22.14}} in Solicit messages.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Renew" access="readWrite" dmr:version="2.2">
+        <description>
+          When set to {{true}}, the {{object}} will renew its DHCPv6-supplied information (i.e. the CPE will do a renew or information request as needed, updating both stateful and stateless parameter values discovered by this Client instance).
+        </description>
+        <syntax command="true">
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SuggestedT1" access="readWrite" dmr:version="2.2">
+        <description>
+          T1 value, in {{units}}, that the client SHOULD use when sending IA options, e.g. OPTION_IA_NA {{bibref|RFC3315|Section 22.4}} and OPTION_IA_PD {{bibref|RFC3633|Section 10}}.
+          A value of -1 indicates that no T1 value is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="SuggestedT2" access="readWrite" dmr:version="2.2">
+        <description>
+          T2 value, in {{units}}, that the client SHOULD use when sending IA options, e.g. OPTION_IA_NA {{bibref|RFC3315|Section 22.4}} and OPTION_IA_PD {{bibref|RFC3633|Section 10}}.
+          A value of -1 indicates that no T2 value is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedOptions" access="readOnly" dmr:version="2.2">
+        <description>
+          {{list}} The options that the client is able to process in server responses.  This list MUST include both top-level and encapsulated options, e.g. if the client is able to process OPTION_IA_NA (3) with an encapsulated OPTION_IAADDR (5), the list would be expected to include both 3 and 5.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RequestedOptions" access="readWrite" dmr:version="2.2">
+        <description>
+          {{list}} An ordered list of the top-level options (i.e. not encapsulated options) that the client will explicitly request from the server.
+          This parameter is intended only for options that are not necessary for the basic operation of the protocol, and are not modeled elsewhere.  For example, it is appropriate for OPTION_DNS_SERVERS {{bibref|RFC3646}} but is not appropriate for OPTION_SERVERID (which is part of the protocol), OPTION_IA_NA (which is modeled via {{param|RequestAddresses}}) or OPTION_IA_PD (which is modeled via {{param|RequestPrefixes}}).  However, the CPE MUST NOT reject an attempt to set this parameter to a value that includes options that it regards as inappropriate; instead, it MUST accept the requested options and handle them as best it can.
+          Loosely speaking, these are the options that the client will include in OPTION_ORO {{bibref|RFC3315}} but the client is free to decide (in accordance with {{bibref|RFC3315}}) in which messages to request which option, whether also to request additional options, whether not to request inappropriate options, and in which order to request any options that are also in {{param|SupportedOptions}}.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SentOptionNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedOptionNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Client.{i}.Server.{i}." access="readOnly" numEntriesParameter="ServerNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        This is a transitory table that lists the discovered DHCPv6 servers (it does ''not'' model a local DHCP server). Table entries are automatically created to correspond with these servers. However, it is a local matter to the CPE when to delete old table entries.
+      </description>
+      <uniqueKey>
+        <parameter ref="SourceAddress"/>
+      </uniqueKey>
+      <parameter name="SourceAddress" access="readOnly" dmr:version="2.2">
+        <description>
+          The IP address from which the message most recently received from this server was sent.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="DUID" access="readOnly" dmr:version="2.2">
+        <description>
+          The server's DHCP Unique Identifier (DUID) {{bibref|RFC3315|Section 9}} as received via OPTION_SERVERID.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="130"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="InformationRefreshTime" access="readOnly" dmr:version="2.2">
+        <description>
+          The OPTION_INFORMATION_REFRESH_TIME value {{bibref|RFC4242}} that was most recently received from this server, converted to the ''dateTime'' at which the associated information will expire.  If no such option has been received, the parameter value MUST be the "Unknown Time" {{null}}.  If the information will never expire, the parameter value MUST be infinite time 9999-12-31T23:59:59Z.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Client.{i}.SentOption.{i}." access="readWrite" numEntriesParameter="SentOptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        The top-level options and option values (including any encapsulated options) that the client will send to the server.
+        This table is intended only for options that are not part of the basic operation of the protocol, and whose values are simple, do not often change and are not modeled elsewhere.  For example, it is appropriate for OPTION_USER_CLASS (whose value is a list of user classes) but is not appropriate for OPTION_RECONF_MSG (which is part of the protocol), OPTION_IA_NA (which is modeled via {{param|#.RequestAddresses}}) or OPTION_RAPID_COMMIT (which is modeled via {{param|#.RapidCommit}}).
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Tag"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tag" access="readWrite" dmr:version="2.2">
+        <description>
+          Option tag (code) {{bibref|RFC3315|Section 22.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.2">
+        <description>
+          A hexbinary encoded option data {{bibref|RFC3315|Section 22.1}}.
+          Note: The length of the option data is ''option-len'' octets, as specified in {{bibref|RFC3315|Section 22.1}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Client.{i}.ReceivedOption.{i}." access="readOnly" numEntriesParameter="ReceivedOptionNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2" dmr:noUniqueKeys="true">
+      <description>
+        This is a transitory table that lists all the options received from all servers. Table entries are automatically created to correspond with received options. However, it is a local matter to the CPE when to delete old table entries.
+        If the same option is received multiple times, whether from one or more servers, it is up to the CPE to decide which entries to include (i.e. whether the same option will be present multiple times). In order to allow for the same option to be present multiple times within the table, this table has no unique key defined.
+      </description>
+      <parameter name="Tag" access="readOnly" dmr:version="2.2">
+        <description>
+          Option tag (code) {{bibref|RFC3315|Section 22.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.2">
+        <description>
+          A hexbinary encoded option data {{bibref|RFC3315|Section 22.1}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="Server" access="readOnly" dmr:version="2.2">
+        <description>
+          {{reference}} This is the server that sent the option to the client. Each {{object}} entry MUST have an associated server.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.Server." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Server." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        DHCPv6 server configuration.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables the DHCPv6 server function.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PoolNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Server.Pool.{i}." access="readWrite" numEntriesParameter="PoolNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        DHCPv6 server pool table.
+        Each instance of this object defines a DHCPv6 server pool. Client requests are associated with pools based on criteria such as source interface, supplied DHCPv6 options, and source address.
+        Overlapping pool ranges MUST be supported.
+        For enabled table entries, if {{param|Interface}} is not a valid reference to an IPv6-capable interface (that is attached to the IPv6 stack) then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Order"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.2">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each DHCPv6 request, the highest ordered entry that matches the association criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.2">
+        <description>
+          {{reference}} The IP Interface associated with the {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DUID" access="readWrite" dmr:version="2.2">
+        <description>
+          Pool association criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCPv6 Client Identifier (Option 1) {{bibref|RFC3315|Section 22.2}}.  The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used.
+          Note: DHCPv6 Option 1 (DUID) is sometimes referred to as ''Client Identifier''.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="130"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DUIDExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|DUID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|DUID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassID" access="readWrite" dmr:version="2.2">
+        <description>
+          Pool association criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCPv6 Vendor Class Identifier (Option 16) {{bibref|RFC3315|Section 22.16}}.  The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassIDExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|VendorClassID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|VendorClassID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="UserClassID" access="readWrite" dmr:version="2.2">
+        <description>
+          Pool association criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCPv6 User Class Identifier (Option 15) {{bibref|RFC3315|Section 22.15}}.
+          {{empty}} indicates this criterion is not used.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="UserClassIDExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|UserClassID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|UserClassID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceAddress" access="readWrite" dmr:version="2.2">
+        <description>
+          Pool association criterion.
+          Source address (link-layer address) of DHCPv6 messages sent from the DHCPv6 client.  This criterion is only likely to be useful if this is a link-layer address.
+          {{empty}} indicates this criterion is not used for serving.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceAddressMask" access="readWrite" dmr:version="2.2">
+        <description>
+          Bit-mask for the source address, where matching of a packet's source address with the {{param|SourceAddress}} is only to be done for bit positions set to one in the mask.  A mask of {{empty}} indicates all bits of the {{param|SourceAddress}} are to be used.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceAddressExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, matching packets are those that match the (masked) {{param|SourceAddress}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the (masked) {{param|SourceAddress}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="IANAEnable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables IANA offers.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IANAManualPrefixes" access="readWrite" dmr:version="2.2">
+        <description>
+          {{list}} {{reference}}
+          Manually-configured prefixes from which IA_NA addresses will be assigned.  Each referenced prefix MUST have a  {{param|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}} of {{enum|Static|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}} or {{enum|Child|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}}.  All clients that request IA_NA and match filter criteria on this {{param|Interface}} MUST be offered IA_NA addresses from all of the ''Valid'' ({{param|.IP.Interface.{i}.IPv6Prefix.{i}.ValidLifetime}} is infinite or in the future) /64 prefixes in this list.
+          Prefixes MUST be associated with the interface instance referenced by {{param|Interface}}.
+        </description>
+        <syntax>
+          <list maxItems="8"/>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="IANAPrefixes" access="readOnly" dmr:version="2.2">
+        <description>
+          {{list}} {{reference}}
+          All prefixes from which IA_NA addresses will be assigned. This list can include:
+          * Prefixes from {{param|IANAManualPrefixes}} that are used for IA_NA offers.
+          * Prefixes with {{param|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} = {{enum|Child|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} or {{enum|AutoConfigured|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} associated with the interface instance referenced by {{param|Interface}}.
+        </description>
+        <syntax>
+          <list maxItems="8"/>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IAPDEnable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables IAPD offers.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IAPDManualPrefixes" access="readWrite" dmr:version="2.2">
+        <description>
+          {{list}} {{reference}}
+          Manually-configured prefixes from which IA_PD prefixes will be derived.  This list can include:
+          * Prefixes with {{param|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} = {{enum|Static|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} or {{enum|PrefixDelegation|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} associated with upstream interfaces (i.e. interfaces for which the physical layer interface object has ''Upstream'' = {{true}}).
+          * Prefixes with {{param|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}} = {{enum|Static|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}} or {{enum|Child|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}} associated with with the interface instance referenced by {{param|Interface}}.
+          All clients that request IA_PD and match filter criteria on this {{param|Interface}} MUST be offered IA_PD prefixes derived from all of the ''Valid'' ({{param|.IP.Interface.{i}.IPv6Prefix.{i}.ValidLifetime}} is infinite or in the future) prefixes in this list.
+        </description>
+        <syntax>
+          <list maxItems="8"/>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="IAPDPrefixes" access="readOnly" dmr:version="2.2">
+        <description>
+          {{list}} {{reference}}
+          All prefixes for which IA_PD prefixes will be assigned. This list can include:
+          * Prefixes from {{param|IAPDManualPrefixes}} that are used for IA_PD offers.
+          * Prefixes with {{param|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} = {{enum|PrefixDelegation|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} or {{enum|AutoConfigured|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} associated with upstream interfaces (i.e. interfaces for which the physical layer interface object has ''Upstream'' = {{true}}).
+          * Prefixes with {{param|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} = {{enum|Child|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} or {{enum|AutoConfigured|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} associated with the interface instance referenced by {{param|Interface}}.
+        </description>
+        <syntax>
+          <list maxItems="8"/>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IAPDAddLength" access="readWrite" dmr:version="2.2">
+        <description>
+          The RECOMMENDED minimum number of bits to add to {{param|IAPDManualPrefixes}} or {{param|IAPDPrefixes}} in order to determine the length of prefixes that are offered in an IA_PD.  The device is responsible for ensuring that it does not delegate a prefix longer than /64.  The device can have additional logic that is used (in conjunction with this parameter) to determine the actual length of prefixes offered in an IA_PD.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="64"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ClientNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Server.Pool.{i}.Client.{i}." access="readOnly" numEntriesParameter="ClientNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        DHCPv6 client table.
+        This table lists details of DHCPv6 clients that matched the filter criteria of this {{object|#}} entry.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="SourceAddress"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+          Note: There is no guarantee that the {{param}} value on automatically-created {{object}} instances will be retained. This is because automatically-created {{object}} instances can be transitory.
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceAddress" access="readOnly" dmr:version="2.2">
+        <description>
+          Source address of the DHCPv6 client.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.2">
+        <description>
+          Whether or not the DHCPv6 client is currently present on the LAN.  The method of presence detection is a local matter to  the CPE.
+          The ability to list inactive DHCPv6 clients is OPTIONAL.  If the CPE includes inactive DHCPv6 clients in this table, {{param}} MUST be set to {{false}}  for each inactive DHCPv6 client.  The length of time an inactive DHCPv6 client remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6AddressNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6PrefixNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Server.Pool.{i}.Client.{i}.IPv6Address.{i}." access="readOnly" numEntriesParameter="IPv6AddressNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        IPv6 addresses assigned to this client via IA_NA.
+      </description>
+      <uniqueKey>
+        <parameter ref="IPAddress"/>
+      </uniqueKey>
+      <parameter name="IPAddress" access="readOnly" dmr:version="2.2">
+        <description>
+          IPv6 address.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredLifetime" access="readOnly" dmr:version="2.2">
+        <description>
+          The time at which this address will cease to be preferred (i.e. will become deprecated), or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ValidLifetime" access="readOnly" dmr:version="2.2">
+        <description>
+          The time at which this address will cease to be valid (i.e. will become invalid), or {{null}} if unknown. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Server.Pool.{i}.Client.{i}.IPv6Prefix.{i}." access="readOnly" numEntriesParameter="IPv6PrefixNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        IPv6 prefixes delegated to this client via IA_PD.
+      </description>
+      <uniqueKey>
+        <parameter ref="Prefix"/>
+      </uniqueKey>
+      <parameter name="Prefix" access="readOnly" dmr:version="2.2">
+        <description>
+          IPv6 address prefix.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredLifetime" access="readOnly" dmr:version="2.2">
+        <description>
+          The time at which this prefix will cease to be preferred (i.e. will become deprecated), or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ValidLifetime" access="readOnly" dmr:version="2.2">
+        <description>
+          The time at which this prefix will cease to be valid (i.e. will become invalid), or {{null}} if unknown. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Server.Pool.{i}.Client.{i}.Option.{i}." access="readOnly" numEntriesParameter="OptionNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2" dmr:noUniqueKeys="true">
+      <description>
+        DHCPv6 options supplied by this client, e.g. ''DUID'' (Option 1), ''UserClassID'' (Option 15) or ''VendorClassID'' (option 16).
+      </description>
+      <parameter name="Tag" access="readOnly" dmr:version="2.2">
+        <description>
+          Option tag (code) {{bibref|RFC3315|Section 22.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.2">
+        <description>
+          A hexbinary encoded option value.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Server.Pool.{i}.Option.{i}." access="readWrite" numEntriesParameter="OptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        This object specifies the DHCPv6 options that MUST, if enabled, be offered to clients whose DHCPv6 requests are associated with this pool. If {{param|PassthroughClient}} is specified, and the referenced client has a value for a given option then the {{param|PassthroughClient}} option value will be sent instead of {{param|Value}}. Otherwise, {{param|Value}} will be sent.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Tag"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tag" access="readWrite" dmr:version="2.2">
+        <description>
+          Option tag (code) {{bibref|RFC3315|Section 22.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.2">
+        <description>
+          A hexbinary encoded option value.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="PassthroughClient" access="readWrite" dmr:version="2.2">
+        <description>
+          {{reference}} Indicates whether this {{object}} entry is configured for passthrough.
+          If {{param}} is specified, and the referenced client (since boot) has received a value from an associated upstream DHCPv6 server for the given {{param|Tag}} option, then the referenced client's option value will be sent instead of {{param|Value}}. Otherwise, {{param|Value}} will be sent.
+          {{empty}} indicates that passthrough is not configured for this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="###.Client." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE8021x." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        IEEE 802.1x object {{bibref|802.1x-2004}}, where {{object|Supplicant}} models authentication supplicants.
+      </description>
+      <parameter name="SupplicantNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE8021x.Supplicant.{i}." access="readWrite" numEntriesParameter="SupplicantNumberOfEntries" enableParameter="Enable" minEntries="1" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        802.1x supplicant authentication provisioning and status information associated with an interface to be authenticated (e.g. an {{object|.Ethernet.Link}} instance).
+        For enabled table entries, if {{param|Interface}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          This parameter controls whether this resource will utilize the 802.1x protocol as a supplicant for device  authentication purposes.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational status of this 802.1x supplicant.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The interface on which authentication is to be performed. Example:  Device.Ethernet.Link.1
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="PAEState" access="readOnly" dmr:version="2.0">
+        <description>
+          The current supplicant state machine as defined in {{bibref|802.1x-2004|9.5.1}}, Supplicant PAE (Port Access Entity) State.  {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disconnected"/>
+            <enumeration value="Logoff"/>
+            <enumeration value="Connecting"/>
+            <enumeration value="Authenticating"/>
+            <enumeration value="Authenticated"/>
+            <enumeration value="Held"/>
+            <enumeration value="Restart"/>
+            <enumeration value="ForceAuth"/>
+            <enumeration value="ForceUnauth"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EAPIdentity" access="readWrite" dmr:version="2.0">
+        <description>
+          The identity to be exchanged between the supplicant and authenticator.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxStart" access="readWrite" dmr:version="2.0">
+        <description>
+          The maximum number of times the device will attempt to send an EAP start message before authentication fails as defined in {{bibref|802.1x-2004|9.5.1}}, maxStart.
+          This is in support of {{bibref|802.1x-2004|Section 8.4.6}}, Migration Considerations.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="10"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="StartPeriod" access="readWrite" dmr:version="2.0">
+        <description>
+          The period in {{units}} a supplicant will wait before the device will attempt to re-send an EAP start message as defined in {{bibref|802.1x-2004|9.5.1}}, startPeriod.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="HeldPeriod" access="readWrite" dmr:version="2.0">
+        <description>
+          The hold-off period in {{units}} a supplicant will wait before re-attempting authentication as defined in {{bibref|802.1x-2004|9.5.1}}, heldPeriod.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AuthPeriod" access="readWrite" dmr:version="2.0">
+        <description>
+          The period in {{units}} after which a request will be considered timed out as defined in {{bibref|802.1x-2004|9.5.1}}, authPeriod.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AuthenticationCapabilities" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the authentication methods supported by the device.  {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="EAP-TLS"/>
+            <enumeration value="EAP-MD5"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="StartFailurePolicy" access="readWrite" dmr:version="2.0">
+        <description>
+          The action to be taken when authentication has failed, when the network fails to respond to the supplicant's start message, and the retries have been exceeded (since network does not yet support 802.1x).  {{enum}}
+          This is in support of {{bibref|802.1x-2004|Section 8.4.6}}, Migration Considerations.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="FailAuthentication"/>
+            <enumeration value="AssumeAuthentication"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AuthenticationSuccessPolicy" access="readWrite" dmr:version="2.0">
+        <description>
+          The action to be taken when authentication succeeds and a connection has already received an address and/or policy settings.  {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NoAction"/>
+            <enumeration value="RenewConnection"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Reset" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, 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 MUST initiate the reset after completion of the current CWMP session.  The device MAY delay resetting the resource in  order to avoid interruption of a user service such as an ongoing voice call.
+        </description>
+        <syntax command="true">
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Disconnect" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, the device MUST disconnect (forced unauthentication) the resource.
+          The device MUST initiate the disconnect after completion of the current CWMP session.  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>
+        <syntax command="true">
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE8021x.Supplicant.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        802.1x Authentication Supplicant EAP statistics information for this resource.
+      </description>
+      <parameter name="ReceivedFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAPOL frames of any type that have been received by this Supplicant; {{bibref|802.1x-2004|9.5.2}}, EAPOL frames received.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAPOL frames of any type that have been transmitted by this Supplicant; {{bibref|802.1x-2004|9.5.2}}, EAPOL frames transmitted.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedStartFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAPOL Start frames that have been transmitted by this Supplicant; {{bibref|802.1x-2004|9.5.2}}, EAPOL Start frames transmitted.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedLogoffFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAPOL Logoff frames that have been transmitted by this Supplicant; {{bibref|802.1x-2004|9.5.2}}, EAPOL Logoff frames transmitted.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedResponseIdFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAP Resp/Id frames that have been transmitted; {{bibref|802.1x-2004|9.5.2}}, EAP Resp/Id frames transmitted.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedResponseFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of valid EAP Response frames (other than Resp/Id frames) that have been transmitted by this  Supplicant; {{bibref|802.1x-2004|9.5.2}}, EAP Resp frames transmitted.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedRequestIdFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAP Req/Id frames that have been received by this Supplicant; {{bibref|802.1x-2004|9.5.2}}, EAP Req/Id frames received.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedRequestFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAP Request frames (other than Rq/Id frames) that have been received by this Supplicant; {{bibref|802.1x-2004|9.5.2}}, EAP Req frames received.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedInvalidFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAPOL frames that have been received by this Supplicant in which the frame type is not recognized; {{bibref|802.1x-2004|9.5.2}}, EAP Req frames received.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedLengthErrorFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAPOL frames that have been received by this Supplicant in which the Packet Body Length field is invalid; {{bibref|802.1x-2004|9.5.2}}, EAP length error frames received.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="LastFrameVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          The protocol version number carried in the most recently received EAPOL frame; {{bibref|802.1x-2004|9.5.2}}, Last EAPOL frame version
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LastFrameSourceMACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The source MAC address carried in the most recently received EAPOL frame; {{bibref|802.1x-2004|9.5.2}}, Last EAPOL frame source.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE8021x.Supplicant.{i}.EAPMD5." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        802.1x Authentication Supplicant provisioning information used for MD5 shared secret exchange. This object will not exist if EAP-MD5 is not a supported authentication type.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          This parameter enables or disables the supplicant's support for EAP-MD5.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SharedSecret" access="readWrite" dmr:version="2.0">
+        <description>
+          The shared secret to be exchanged between the supplicant and authenticator.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE8021x.Supplicant.{i}.EAPTLS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        802.1x Authentication Supplicant provisioning information used for TLS certificate authentication. This object will not exist if the EAP-TLS is not a supported authentication type.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          This parameter enables or disables the supplicant's support for EAP-TLS.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MutualAuthenticationEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          The parameter controls if the supplicant will authenticate the authenticator.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Users." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Users object that contains the {{object|User}} table.
+      </description>
+      <parameter name="UserNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Users.User.{i}." access="readWrite" numEntriesParameter="UserNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object contains parameters relating to the user characteristics.
+      </description>
+      <uniqueKey>
+        <parameter ref="Username"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/disables this user object instance.
+          If the User being configured is currently accessing the device then a disable MUST apply to the next user session and the current user session MUST NOT be abruptly terminated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteAccessCapable" access="readWrite" dmr:version="2.0">
+        <description>
+          Allows this user to remotely access the UserInterface via the mechanism defined in {{object|.UserInterface.RemoteAccess.}}
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.0">
+        <description>
+          Name of the current user. MUST NOT be {{empty}} for an enabled entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.0">
+        <description>
+          The user's password.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Language" access="readWrite" dmr:version="2.0">
+        <description>
+          String describing the default language for the local configuration interface, specified according to {{bibref|RFC3066}}.
+          If {{empty}}, {{param|.UserInterface.CurrentLanguage}} is used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="16"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.SmartCardReaders." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        SmartCardReaders object that contains the {{object|SmartCardReader}} table.
+      </description>
+      <parameter name="SmartCardReaderNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.SmartCardReaders.SmartCardReader.{i}." access="readOnly" numEntriesParameter="SmartCardReaderNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object describes the characteristics of the smart card reader.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this smart card reader.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the status of this smart card reader.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled">
+              <description>
+                Indicates the smart card reader is enabled and functioning properly.
+              </description>
+            </enumeration>
+            <enumeration value="Error">
+              <description>
+                Indicates the smart card reader is enabled and not functioning properly.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          Human-readable name associated with this smart card reader.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Reset" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, resets the SmartCard Reader and the associated SmartCard.
+        </description>
+        <syntax command="true">
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ResetTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The time at which this SmartCard Reader was reset.
+          Reset can be caused by:
+          * {{param|Status}} transition from Disabled to Enabled
+          * {{param|Reset}} set to {{true}}.
+          * An internal reset of the SmartCard Reader (including a reboot of the device).
+          Unknown Time value indicates that this SmartCard Reader has never been reset, which can only happen if it has never been enabled.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="DecryptionFailedCounter" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Counter incremented once each time decryption cannot be carried out.
+          This counter relates to the smart card reader, not to the smart card itself, i.e. it is reset when the {{param|Reset}} parameter is used and not when a Smart Card is inserted or removed.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DecryptionFailedNoKeyCounter" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Counter incremented once each time the key is not available to decrypt it.  This is a subset of the more general {{param|DecryptionFailedCounter}} within the same object and thus will always be less than that parameter.
+          This counter relates to the smart card reader, not to the smart card itself, i.e. it is reset when the {{param|Reset}} parameter is used and not when a Smart Card is inserted or removed.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.SmartCardReaders.SmartCardReader.{i}.SmartCard." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Status of currently associated smart card.
+      </description>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Status of the Smart Card.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None">
+              <description>
+                Indicates that no Smart Card is inserted.
+              </description>
+            </enumeration>
+            <enumeration value="Running">
+              <description>
+                Indicates a Smart Card is present and working normally.
+              </description>
+            </enumeration>
+            <enumeration value="Error">
+              <description>
+                Indicates the Smart Card is present and in an error condition.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.0">
+        <description>
+          Smart Card Type. {{enum}}
+          Vendors can extend the enumerated values with vendor specific extensions, in which case the rules outlined in {{bibref|TR-106a2|Section 3.3}} MUST be adhered to.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="CA"/>
+            <enumeration value="DRM"/>
+            <enumeration value="UICC"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Application" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates Smart Card Application(s).  {{param}} is only relevant when {{param|Type}} has a value of UICC, otherwise it is {{empty}}. {{enum}}
+          Vendors can extend the enumerated values with vendor specific extensions, in which case the rules outlined in {{bibref|TR-106a2|Section 3.3}} MUST be adhered to.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="SIM"/>
+            <enumeration value="USIM"/>
+            <enumeration value="ISIM"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="2.0">
+        <description>
+          The Smart Card Serial Number or {{empty}} if the Smart Card serial Number is not available, e.g. in the case of IPTV due to restrictions of the Service Delivery Platform.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ATR" access="readOnly" dmr:version="2.0">
+        <description>
+          The Smart Card answer to a reset action. Issued by the Smart Card upon reset.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains all UPnP related objects and parameters including Device and Discovery related objects and parameters.
+      </description>
+    </object>
+    <object name="Device.UPnP.Device." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object defines the UPnP devices and UPnP services that are implemented by the CPE.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP support.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPMediaServer" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP Media Server.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPMediaRenderer" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP Media Renderer.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPWLANAccessPoint" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP Wireless Access Point.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPQoSDevice " access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP QoS Device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPQoSPolicyHolder" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP QoS Policy Holder.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPIGD" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP IGD.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPDMBasicMgmt" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP-DM Basic Management.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPDMConfigurationMgmt" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP-DM Configuration Management.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPDMSoftwareMgmt" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP-DM Software Management.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Device.Capabilities." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object defines what UPnP capabilities this device has.
+      </description>
+      <parameter name="UPnPArchitecture" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the major version of the supported UPnP architecture.
+          If UPnP 1.1 is supported the value is 1.  If UPnP 2.0 is supported the value is 2.
+          A value of 0 indicates no UPnP support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPArchitectureMinorVer" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the minor version of the supported UPnP architecture.
+          If UPnP 1.1 is supported the value is 1.  If UPnP 2.0 is supported the value is 0.
+          If {{param|UPnPArchitecture}} is 0 then this parameter SHOULD be ignored.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPMediaServer" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP Media Server.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPMediaRenderer" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP Media Renderer.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPWLANAccessPoint" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP Wireless Access Point.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPBasicDevice" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP Basic Device.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPQoSDevice" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP Qos Device.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPQoSPolicyHolder" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP Qos Policy Holder.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPIGD" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP IGD.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPDMBasicMgmt" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP-DM Basic Management.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPDMConfigurationMgmt" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP-DM Configuration Management.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPDMSoftwareMgmt" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP-DM Software Management.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Discovery." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        UPnP {{bibref|UPnP-DAv1}} SSDP discovered root devices, embedded devices and embedded services.
+        The CPE MAY, but need not, retain some or all of the information in this object across reboots.
+      </description>
+      <parameter name="RootDeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Discovery.RootDevice.{i}." access="readOnly" numEntriesParameter="RootDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        UPnP root device table. This table contains an entry for each UPnP root device that has been discovered via SSDP.
+      </description>
+      <uniqueKey>
+        <parameter ref="UUID"/>
+      </uniqueKey>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of the UPnP root device. {{enum}}
+          The ability to list inactive UPnP root devices is OPTIONAL. The length of time an inactive device remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="LeaseActive">
+              <description>
+                Device is active and UPnP lease has not expired.
+              </description>
+            </enumeration>
+            <enumeration value="LeaseExpired">
+              <description>
+                Device is inactive because UPnP lease has expired.
+              </description>
+            </enumeration>
+            <enumeration value="ByebyeReceived">
+              <description>
+                Device is inactive because byebye message was received.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UUID" access="readOnly" dmr:version="2.0">
+        <description>
+          This UPnP root device's UUID (Universally Unique IDentifier) {{bibref|RFC4122}}, extracted from any of its USN (Unique Service Name) headers. This is a 36-byte string that uniquely identifies the device, the following is an example:
+          : ''02c29d2a-dbfd-2d91-99c9-306d537e9856''
+          {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="36"/>
+            <pattern value="[0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="USN" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the USN (Unique Service Name) header for this UPnP root device. Three discovery messages are sent for root devices, and this SHOULD be the value of the USN header of the following form:
+          : ''uuid:device-UUID::urn:domain-name:device:deviceType:v''
+          SSDP is an unreliable protocol and it is possible that no discovery message containing the USN header of the above form was ever received. If so, one of the other two forms MAY be used:
+          : ''uuid:device-UUID::upnp:rootdevice''
+          : ''uuid:device-UUID'' (for root device UUID)
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The UPnP root device lease time in {{units}}, extracted from the CACHE-CONTROL header.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Location" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the LOCATION header for this UPnP root device, which is the URL of the root device's DDD (Device Description Document).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Server" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the SERVER header for this UPnP root device, which is a string of the following form:
+          : ''OS/version UPnP/udaversion product/version''
+          where '''UPnP''' is a literal string, '''udaversion''' is the version of the UPnP Device Architecture.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the full path names of all Host table entries, whether active or inactive, that correspond to this UPnP root device.
+          As such entries are added to or removed from the Host tables, the value of this parameter MUST be updated accordingly.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" dmr:version="2.6">
+        <description>
+          The date and time at which the last advertisement from this {{object}} was received.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Discovery.Device.{i}." access="readOnly" numEntriesParameter="DeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        UPnP embedded device table. This table contains an entry for each UPnP embedded device that has been discovered via SSDP.
+      </description>
+      <uniqueKey>
+        <parameter ref="UUID"/>
+      </uniqueKey>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of the UPnP embedded device. {{enum}}
+          The ability to list inactive UPnP embedded devices is OPTIONAL. The length of time an inactive device remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="LeaseActive">
+              <description>
+                Device is active and UPnP lease has not expired.
+              </description>
+            </enumeration>
+            <enumeration value="LeaseExpired">
+              <description>
+                Device is inactive because UPnP lease has expired.
+              </description>
+            </enumeration>
+            <enumeration value="ByebyeReceived">
+              <description>
+                Device is inactive because byebye message was received.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UUID" access="readOnly" dmr:version="2.0">
+        <description>
+          This UPnP embedded device's UUID (Universally Unique IDentifier) {{bibref|RFC4122}}, extracted from any of its USN (Unique Service Name) headers. This is a 36-byte string that uniquely identifies the device, the following is an example:
+          : ''02c29d2a-dbfd-2d91-99c9-306d537e9856''
+          {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="36"/>
+            <pattern value="[0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="USN" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the USN (Unique Service Name) header for this UPnP embedded device. Two discovery messages are sent for embedded devices, and this SHOULD be the value of the USN header of the following form:
+          : ''uuid:device-UUID::urn:domain-name:device:deviceType:v''
+          SSDP is an unreliable protocol and it is possible that no discovery message containing the USN header of the above form was ever received. If so, the other form MAY be used:
+          : ''uuid:device-UUID''
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The UPnP embedded device lease time in {{units}}, extracted from the CACHE-CONTROL header.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Location" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the LOCATION header for this UPnP embedded device, which is the URL of the root device's DDD (Device Description Document).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Server" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the SERVER header for this UPnP embedded device, which is a string of the following form:
+          : ''OS/version UPnP/udaversion product/version''
+          where '''UPnP''' is a literal string, '''udaversion''' is the version of the UPnP Device Architecture.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the full path names of all Host table entries, whether active or inactive, that correspond to this UPnP embedded device.
+          As such entries are added to or removed from the Host tables, the value of this parameter MUST be updated accordingly.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" dmr:version="2.6">
+        <description>
+          The date and time at which the last advertisement from this {{object}} was received.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Discovery.Service.{i}." access="readOnly" numEntriesParameter="ServiceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        UPnP embedded service table. This table contains an entry for each UPnP embedded service that has been discovered via SSDP.
+      </description>
+      <uniqueKey>
+        <parameter ref="USN"/>
+      </uniqueKey>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of the UPnP embedded service. {{enum}}
+          The ability to list inactive UPnP embedded services is OPTIONAL. The length of time an inactive service remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="LeaseActive">
+              <description>
+                Service is active and UPnP lease has not expired.
+              </description>
+            </enumeration>
+            <enumeration value="LeaseExpired">
+              <description>
+                Service is inactive because UPnP lease has expired.
+              </description>
+            </enumeration>
+            <enumeration value="ByebyeReceived">
+              <description>
+                Service is inactive because byebye message was received.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="USN" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the USN (Unique Service Name) header for this UPnP embedded service. This is of the following form:
+          : ''uuid:device-UUID::urn:domain-name:service:serviceType:v''
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The UPnP embedded service lease time in {{units}}, extracted from the CACHE-CONTROL header.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Location" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the LOCATION header for this UPnP embedded service, which is the URL of the root device's DDD (Device Description Document).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Server" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the SERVER header for this UPnP embedded service, which is a string of the following form:
+          : ''OS/version UPnP/udaversion product/version''
+          where '''UPnP''' is a literal string, '''udaversion''' is the version of the UPnP Device Architecture.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the full path names of all Host table entries, whether active or inactive, that correspond to this UPnP embedded service.
+          As such entries are added to or removed from the Host tables, the value of this parameter MUST be updated accordingly.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" dmr:version="2.6">
+        <description>
+          The date and time at which the last advertisement from this {{object}} was received.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ParentDevice" access="readOnly" dmr:version="2.6">
+        <description>
+          {{reference|the {{object|#.RootDevice}} or {{object|#.Device}} table entries that embeds this {{object}}}} This parameter is populated by extracting the "device-UUID" from the service's USN and matching the value against the root device or embedded device UUID value.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.RootDevice. #.Device." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Description." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.6">
+      <description>
+        This object contains information from the  Description Document discovered from the UPnP Devices and Services.
+      </description>
+      <parameter name="DeviceDescriptionNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceInstanceNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceInstanceNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Description.DeviceDescription.{i}." access="readOnly" numEntriesParameter="DeviceDescriptionNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.6">
+      <description>
+        This table contains information read from the Device Description Document of discovered root devices.
+        The CPE MAY, but need not, retain some or all of the information in this table after the associated SSDP advertisement (objects in the  UPnP.Discovery. object tables) expires.
+        In case the SSDP advertisement expires and the CPE deletes the related instances from the tables in UPnP.Discovery., the reference to such instances MUST be set to the empty string.
+      </description>
+      <uniqueKey>
+        <parameter ref="URLBase"/>
+      </uniqueKey>
+      <parameter name="URLBase" access="readOnly" dmr:version="2.6">
+        <description>
+          The value extracted from the URLBase element in the Device Description Document of the discovered root device. If the URLBase element in the root device's Device Description Document is empty or absent, the URL from which the device description was retrieved (e.g. the LOCATION from the SSDP message) is utilized as the URLBase.
+          Note: the URLBase element is not recommended by {{bibref|UPnP-DAv1}} and is not permitted by {{bibref|UPnP-DAv11}}, so the value of {{param}} will usually be the URL from which the device description was retrieved.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SpecVersion" access="readOnly" dmr:version="2.6">
+        <description>
+          The UPnP Device Architecture version extracted from the specVersion element in the Device Description Document of the discovered root device. The {{param}} is encoded as "major revison.minor revision". {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pattern value="\d+\.\d+"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.6">
+        <description>
+          {{list}} {{reference|the Host table entries associated with the root device from which the device description was retrieved|ignore}}
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".LANDevice.{i}.Hosts.Host. .Hosts.Host." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Description.DeviceInstance.{i}." access="readOnly" numEntriesParameter="DeviceInstanceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.6">
+      <description>
+        This table contains the information from Device Description Document retrieved for a discovered UPnP root or embedded device.
+      </description>
+      <uniqueKey>
+        <parameter ref="UDN"/>
+      </uniqueKey>
+      <parameter name="UDN" access="readOnly" dmr:version="2.6">
+        <description>
+          Unique Device Name of this device represented as a UUID for the device.
+          This value is extracted from the UDN element in the Device Description Document with the leading uuid: removed.
+        </description>
+        <syntax>
+          <dataType ref="UUID"/>
+        </syntax>
+      </parameter>
+      <parameter name="ParentDevice" access="readOnly" dmr:version="2.6">
+        <description>
+          {{reference|a {{object}} table entry (if this is an embedded device) or {{empty}} (if this is a root device)}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.DeviceInstance." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DiscoveryDevice" access="readOnly" dmr:version="2.6">
+        <description>
+          {{reference|a {{object|##.Discovery.RootDevice}} table entry (if this is a root device) or a {{object|##.Discovery.Device}} table entry (if this is an embedded device)}}
+          This {{param}} value can be {{empty}} because the referenced object has been deleted or the CPE was unable to retrieve the Description Document due to some out-of-band error. The determination to delete this {{object}} or use {{empty}} is implementation specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="##.Discovery.Device. ##.Discovery.RootDevice." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceType" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP deviceType element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FriendlyName" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP friendlyName element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceCategory" access="readOnly" dmr:version="2.8">
+        <description>
+          Each list item is the value of an element in the Device Description Document for this {{object}} that indicates a device category (e.g. "AV_TV" and "AV_Recorder"), or the value is {{empty}} if no such element is provided by the device.
+          Note: It is assumed that the ''htip:X_DeviceCategory'' Device Description Document element is used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. Standard HTIP device categories are defined in {{bibref|JJ-300.01}}. In this case, the maximum length of the list is 127 and of each item is 31, and any non-HTIP device categories SHOULD NOT conflict with standard HTIP device categories.
+          Note: {{param}} is different from {{param|DeviceType}} and is included here for the purpose of HTIP usage.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Manufacturer" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP manufacturer element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerOUI" access="readOnly" dmr:version="2.8">
+        <description>
+          The value of an element in the Device Description Document for this {{object}} that indicates the manufacturer OUI if this value is provided by the device; or {{empty}} if this value is not provided by the device.
+          {{pattern}}
+          Note: It is assumed that the ''htip:X_ManufacturerOUI'' element is used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="0" maxLength="6"/>
+            <pattern value=""/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerURL" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP manufacturerURL element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModelDescription" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP modelDescription element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModelName" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP modelName element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModelNumber" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP modelNumber element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModelURL" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP modelURL element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP serialNumber element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UPC" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP UPC element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="12"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PresentationURL" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP presentationURL element in the Device Description Document for this {{object}} and MUST be an absolute URL.
+          The way to obtain an absolute URL from the presentationURL element is specified in {{bibref|UPnP-DAv1}} and {{bibref|UPnP-DAv11}}.
+          If the presentationURL is not provided by the device then this value MUST be {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Description.ServiceInstance.{i}." access="readOnly" numEntriesParameter="ServiceInstanceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.6">
+      <description>
+        This table contains the information from Device Description Document retrieved for a discovered UPnP service.
+      </description>
+      <uniqueKey>
+        <parameter ref="ParentDevice"/>
+        <parameter ref="ServiceId"/>
+      </uniqueKey>
+      <parameter name="ParentDevice" access="readOnly" dmr:version="2.6">
+        <description>
+          {{reference|a {{object|#.DeviceInstance}} table entry}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.DeviceInstance." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceId" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP serviceId element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the service.
+          If the UPnP serviceId is not provided by the UPnP service, this {{object}} MUST be deleted.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceDiscovery" access="readOnly" dmr:version="2.6">
+        <description>
+          {{reference|a {{object|##.Discovery.Service}} table entry}}
+          This {{param}} value can be {{empty}} because the referenced object has been deleted or the CPE was unable to retrieve the Description Document due to some out-of-band error. The determination to delete this {{object}} or use {{empty}} is implementation specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="##.Discovery.Service." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceType" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP serviceType element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the service.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SCPDURL" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP SCPDURL element in the Device Description Document for this {{object}} and MUST be an absolute URL.
+          The way to obtain an absolute URL from the SCPDURL element is specified in {{bibref|UPnP-DAv1}} and {{bibref|UPnP-DAv11}}.
+          If the SCPDURL is not provided by the device then this value MUST be {{empty}}.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ControlURL" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP controlURL element in the Device Description Document for this {{object}} and MUST be an absolute URL.
+          The way to obtain an absolute URL from the controlURL element is specified in {{bibref|UPnP-DAv1}} and {{bibref|UPnP-DAv11}}.
+          If the controlURL is not provided by the device then this value MUST be {{empty}}
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="EventSubURL" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP eventSubURL element in the Device Description Document for this {{object}} and MUST be an absolute URL.
+          The way to obtain an absolute URL from the eventSubURLL element is specified in {{bibref|UPnP-DAv1}} and {{bibref|UPnP-DAv11}}.
+          If the eventSubURL is not provided by the device then this value MUST be {{empty}}
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DLNA." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains all DLNA related objects and parameters.
+      </description>
+    </object>
+    <object name="Device.DLNA.Capabilities." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        DLNA capabilities.
+      </description>
+      <parameter name="HNDDeviceClass" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the supported DLNA Home Network Device Classes {{bibref|DLNA-NDIG|Table 4-1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceCapability" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the supported DLNA Device Capabilities {{bibref|DLNA-NDIG|Table 4-2}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="HIDDeviceClass" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the supported DLNA Home Infrastructure Device Classes {{bibref|DLNA-NDIG|Table 4-4}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ImageClassProfileID" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the DLNA Image Class Profile IDs supported by this device, from Tables 5-2 and 5-3 of {{bibref|DLNA-NDIG}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="AudioClassProfileID" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the DLNA Audio Class Profile IDs supported by this device, from Tables 5-4 through 5-10 of {{bibref|DLNA-NDIG}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="AVClassProfileID" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the DLNA AV Class Profile IDs supported by this device, from Tables 5-11 through 5-15 of {{bibref|DLNA-NDIG}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="MediaCollectionProfileID" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the DLNA Media Collection Profile IDs supported by this device {{bibref|DLNA-NDIG|Table 5-16}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="PrinterClassProfileID" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the DLNA Printer Class Profile IDs supported by this device {{bibref|DLNA-NDIG|Table 5-17}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.SelfTestDiagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This diagnostics test is vendor-specific and MAY include testing hardware, software, and/or firmware.
+      </description>
+      <parameter name="DiagnosticsState" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates availability of diagnostic data. {{enum}}
+          If the ACS sets the value of this parameter to {{enum|Requested}}, the CPE MUST initiate the corresponding diagnostic test.  When writing, the only allowed value is {{enum|Requested}}.  To ensure the use of the proper test parameters (the writable parameters in this object), the test parameters MUST be set either prior to or at the same time as (in the same SetParameterValues) setting the DiagnosticsState to Requested.
+          When requested, the CPE SHOULD wait until after completion of the communication session with the ACS before starting the diagnostic.
+          When the test is completed, the value of this parameter MUST be either {{enum|Complete}} (if the test completed successfully), or one of the Error values listed above.
+          If the value of this parameter is anything other than {{enum|Complete}}, the values of the results parameters for this test are indeterminate.
+          When the diagnostic initiated by the ACS is completed (successfully or not), the CPE MUST establish a new connection to the ACS to allow the ACS to view the results, indicating the Event code "8 DIAGNOSTICS COMPLETE" in the Inform message.
+          After the diagnostic is complete, the value of all result parameters (all read-only parameters in this object) MUST be retained by the CPE until either this diagnostic is run again, or the CPE reboots.  After a reboot, if the CPE has not retained the result parameters from the most recent test, it MUST set the value of this parameter to {{enum|None}}.
+          Modifying any of the writable parameters in this object except for this one MUST result in the value of this parameter being set to {{enum|None}}.
+          While the test is in progress, modifying any of the writable parameters in this object except for this one MUST result in the test being terminated and the value of this parameter being set to {{enum|None}}.
+          While the test is in progress, setting this parameter to {{enum|Requested}} (and possibly modifying other writable parameters in this object) MUST result in the test being terminated and then restarted using the current values of the test parameters.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None" access="readOnly"/>
+            <enumeration value="Requested"/>
+            <enumeration value="Complete" access="readOnly"/>
+            <enumeration value="Error_Internal" access="readOnly"/>
+            <enumeration value="Error_Other" access="readOnly"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Results" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Results of self-test (vendor specific).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Firewall." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Firewall configuration object. The {{param|Config}} parameter enables and disables the Firewall, and can select either a predefined configuration ({{enum|High|Config}} or {{enum|Low|Config}}) or an explicitly-defined {{enum|Advanced|Config}} configuration.
+        For an {{enum|Advanced|Config}} configuration, {{param|AdvancedLevel}} controls the currently active Firewall Level, and the Firewall Levels are defined in the {{object|Level}}, {{object|Chain}} and {{object|Chain.{i}.Rule}} tables.
+        The Firewall rules modeled by this object operate only on the forwarding path. This means that they affect only routed traffic, and do not affect traffic that is destined for or generated by the CPE.  Note that any {{object|#.NAT}} processing on the ingress packet occurs before Firewall rules are applied so, for example, the Firewall rules will see the translated destination IP address and port in a downstream packet that has passed through the NAT.
+        See {{bibref|TR-181i2a2|Appendix VIII}} for an example {{enum|Advanced|Config}} configuration.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables the Firewall.
+          Firewalls often implement additional Denial of Service and other vulnerability protections, such as those described in {{bibref|ICSA-Baseline}}. If a {{enum|Stateful|Type}} Firewall is enabled, then it is assumed that all implemented stateful protections are enabled, unless they are overridden by some other part of the data model.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Config" access="readWrite" dmr:version="2.0">
+        <description>
+          How this firewall is configured. {{enum}}
+          Vendors can extend the enumerated values with vendor specific extensions, in which case the rules outlined in {{bibref|TR-106a2|Section 3.3}} MUST be adhered to.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="High">
+              <description>
+                The firewall implements the "Traffic Denied Inbound" and "Minimally Permit Common Services Outbound" components of the ICSA residential certification's Required Services Security Policy {{bibref|ICSA-Residential}}.  If DoS and vulnerability protections are implemented {{bibref|ICSA-Baseline}}, these are enabled.
+              </description>
+            </enumeration>
+            <enumeration value="Low">
+              <description>
+                All Outbound traffic and pinhole-defined Inbound traffic is allowed.  If DoS and vulnerability protections are implemented {{bibref|ICSA-Baseline}}, these are enabled.
+              </description>
+            </enumeration>
+            <enumeration value="Off" status="deprecated">
+              <description>
+                All Inbound and Outbound traffic is allowed, and the CPE is only protected by NAT settings (if supported and enabled).  If DoS and vulnerability protections are implemented {{bibref|ICSA-Baseline}}, these are disabled.
+                This value is DEPRECATED because it is the same as setting {{param|Enable}} to {{false}}.
+              </description>
+            </enumeration>
+            <enumeration value="Advanced" optional="true">
+              <description>
+                Advanced firewall configuration applies, as specified by {{param|AdvancedLevel}}.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdvancedLevel" access="readWrite" dmr:version="2.2">
+        <description>
+          Selects the currently active Firewall Level.
+          {{param}} only applies when {{param|Config}} is {{enum|Advanced|Config}}.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".Firewall.Level." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.2">
+        <description>
+          Firewall Type. {{enum}}
+          A {{enum|Stateless}} Firewall treats each packet individually and thus has no concept of sessions.  Therefore a {{enum|Stateless}} Firewall cannot distinguish between unsolicited downstream traffic and downstream traffic in response to outbound messages.  This means that it has to accept all incoming downstream traffic.  Furthermore, because a {{enum|Stateless}} Firewall treats each packet individually, it does not provide any DoS or vulnerability protections.
+          A {{enum|Stateful}} Firewall maintains state about previous packets and thus supports sessions.  Therefore a {{enum|Stateful}} Firewall can distinguish between solicited and unsolicited downstream traffic.  In a {{enum|Stateful}} Firewall, explicitly configured rules only apply to unsolicited traffic, and can not cause packets received in response to an upstream request to be dropped.  Furthermore, because a {{enum|Stateful}} Firewall maintains state, it can provide DoS and vulnerability protections.
+          A device that has a {{enum|Stateless}} Firewall depends on the NAT to provide protection against unsolicited downstream IPv4 traffic.  This is because, as noted above, a {{enum|Stateless}} Firewall has to be configured to accept all incoming downstream traffic.  For IPv6 there is no NAT, so a {{enum|Stateless}} Firewall can not provide simple security protections against unsolicited downstream IPv6 traffic.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Stateless">
+              <description>
+                The Firewall only implements stateless packet inspection.
+              </description>
+            </enumeration>
+            <enumeration value="Stateful">
+              <description>
+                The Firewall implements stateful packet inspection.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.0">
+        <description>
+          A string identifying the firewall settings version currently used in the CPE, or {{empty}} if the firewall settings are not associated with a version.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="16"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" dmr:version="2.0">
+        <description>
+          The time at which the firewall settings most recently changed.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LevelNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ChainNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Firewall.Level.{i}." access="readWrite" numEntriesParameter="LevelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        Firewall Level table. When an {{enum|Advanced|#.Config}} configuration is selected, {{param|#.AdvancedLevel}} selects the currently active entry in this table. Each {{object}} table entry references the {{object|#.Chain}} that contains the rules for this level.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.2">
+        <description>
+          Human-readable name associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readWrite" dmr:version="2.2">
+        <description>
+          Human-readable description associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.2">
+        <description>
+          Position of the {{object}} entry for user interface display; levels can be presented according to an increasing or decreasing level of security.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all greater-valued {{param}} entries is incremented to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Chain" access="readOnly" dmr:version="2.2">
+        <description>
+          The Chain containing Firewall Level Rules associated with this {{object}} entry.
+          On creation of a new {{object}} entry, the device will automatically create a new {{object|#.Chain}} table entry that this {{param}} parameter will reference.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".Firewall.Chain." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PortMappingEnabled" access="readWrite" dmr:version="2.2">
+        <description>
+          Indicates whether NAT port mapping is enabled or disabled when this is the active Level.  For a {{enum|Stateless|#.Type}} Firewall this can be set to {{false}} to force any port mappings to be operationally disabled (for a {{enum|Stateful|#.Type}} Firewall this is not necessary because the same effect can be achieved via Firewall rules).
+          This parameter affects all the interfaces on which NAT is enabled.  It operationally enables or disables port mapping functionality and therefore does not affect the individual {{param|##.NAT.PortMapping.{i}.Enable}} settings.  Note that the current NAT status and NAT port mapping status are indicated by the {{param|##.NAT.InterfaceSetting.{i}.Status}} parameter.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultPolicy" access="readWrite" dmr:version="2.2">
+        <description>
+          Default action for packets not matching any of the level rules. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Drop">
+              <description>
+                The firewall discards packets matching this rule.
+              </description>
+            </enumeration>
+            <enumeration value="Accept">
+              <description>
+                The firewall forwards packets matching this rule.
+              </description>
+            </enumeration>
+            <enumeration value="Reject" optional="true">
+              <description>
+                The firewall discards packets matching this rule, and sends an ICMP message to the originating host.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Drop"/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultLogPolicy" access="readWrite" dmr:version="2.2">
+        <description>
+          Enable or disable logging, in a {{object|##.DeviceInfo.VendorLogFile}}, of packets not matching any of the level rules.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Firewall.Chain.{i}." access="readWrite" numEntriesParameter="ChainNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        Firewall Chain table. Each entry contains an ordered list of {{object|Rule}} objects which can themselves reference other {{object}} instances. A hierarchy of rules can therefore be created.
+        A given Firewall Chain's rules are all created by the same entity, as indicated by the {{param|Creator}} parameter.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.2">
+        <description>
+          Human-readable name associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Creator" access="readOnly" dmr:version="2.2">
+        <description>
+          Creator of this {{object}} entry and of its {{object|Rule}}s. {{enum}}
+          Note that this is the entity that originally created the {{object}} entry.  The value of this parameter does not change if the {{object}} entry or one of its rules is subsequently changed by another entity.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Defaults">
+              <description>
+                The {{object}} entry is present in the factory default configuration.
+              </description>
+            </enumeration>
+            <enumeration value="PortMapping">
+              <description>
+                The {{object}} entry was created as a side-effect of a {{bibref|UPnP-IGD:1}} or {{bibref|TR-064}} port mapping.
+              </description>
+            </enumeration>
+            <enumeration value="WANIPv6FirewallControl">
+              <description>
+                The {{object}} entry was created by {{bibref|UPnP-IGD:2}} WANIPv6FirewallControl.
+              </description>
+            </enumeration>
+            <enumeration value="ACS">
+              <description>
+                The {{object}} entry was created by the Auto Configuration Server.
+              </description>
+            </enumeration>
+            <enumeration value="UserInterface">
+              <description>
+                The {{object}} entry was created by device user interface or command line interface.
+              </description>
+            </enumeration>
+            <enumeration value="Other">
+              <description>
+                The {{object}} entry was created by another entity.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="ACS"/>
+        </syntax>
+      </parameter>
+      <parameter name="RuleNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Firewall.Chain.{i}.Rule.{i}." access="readWrite" numEntriesParameter="RuleNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        Firewall Rule table. Each entry defines a Firewall packet selection rule. The {{param|Target}} parameter defines the action to perform for traffic matching this rule: the packet can be dropped, accepted, rejected or passed to another {{object|#}}.
+        This table MUST NOT contain dynamic Firewall rules associated with {{enum|Stateful|##.Type}} Firewall sessions.
+        All entries are created by the creator of the parent {{object|#}}, as indicated by its {{param|#.Creator}} parameter.  {{object}} entries in a {{object|#}} with a {{param|#.Creator}} of {{enum|Defaults|#.Creator}}, {{enum|ACS|#.Creator}}, {{enum|UserInterface|#.Creator}} or (maybe) {{enum|Other|#.Creator}} are referred to as ''Static'' {{object}}s.  Whether or not a {{object}} in a {{object|#}} with {{param|#.Creator}} {{enum|Other|#.Creator}} is regarded as ''Static'' is a local matter to the CPE.  Some of this object's parameter descriptions refer to whether a {{object}} is ''Static'' when specifying whether or not the parameter value can be modified.
+        For enabled table entries, if {{param|SourceInterface}} is not a valid reference and {{param|SourceAllInterfaces}} is {{false}}, or if {{param|DestInterface}} is not a valid reference and {{param|DestAllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this {{object}} entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.2">
+        <description>
+          Position of the {{object}} entry in the order of precedence. A value of ''1'' indicates the first entry considered (highest precedence). For each packet, the highest ordered entry that matches the rule criteria is applied. All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readWrite" dmr:version="2.2">
+        <description>
+          Human-readable description associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Target" access="readWrite" dmr:version="2.2">
+        <description>
+          Action to perform for traffic matching this {{object}} entry. {{enum}}
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Drop">
+              <description>
+                The firewall discards packets matching this rule.
+              </description>
+            </enumeration>
+            <enumeration value="Accept">
+              <description>
+                The firewall forwards packets matching this rule.
+              </description>
+            </enumeration>
+            <enumeration value="Reject" optional="true">
+              <description>
+                The firewall discards packets matching this rule, and sends an ICMP message to the originating host.
+              </description>
+            </enumeration>
+            <enumeration value="Return" optional="true">
+              <description>
+                The firewall doesn't consider the remaining rules (if any) in the current chain.
+              </description>
+            </enumeration>
+            <enumeration value="TargetChain" optional="true">
+              <description>
+                The rules in the chain referenced by the {{param|TargetChain}} parameter are matched.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Drop"/>
+        </syntax>
+      </parameter>
+      <parameter name="TargetChain" access="readWrite" dmr:version="2.2">
+        <description>
+          Specifies the chain to process when {{param|Target}} equals {{enum|TargetChain|Target}}.  If there are no matching rules in the referenced chain, processing continues with the next rule in this chain (if any).  In other words, {{enum|TargetChain|Target}} behaves like a subroutine call.
+          {{empty}} indicates no {{param}} is specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".Firewall.Chain." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Log" access="readWrite" dmr:version="2.2">
+        <description>
+          Enable or disable logging, in a {{object|###.DeviceInfo.VendorLogFile}}, of packets matching this {{object}}.
+          If the {{object}} is not ''Static'' (as explained in the object description), whether changes to this parameter persist across re-boot is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="CreationDate" access="readOnly" dmr:version="2.2">
+        <description>
+          Date and time when this {{object}} entry was created.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ExpiryDate" access="readWrite" dmr:version="2.2">
+        <description>
+          The time at which this {{object}} entry will expire, or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+          The only value that MUST be supported is 9999-12-31T23:59:59Z (i.e. support for rules that expire is OPTIONAL).
+          When a rule expires, the CPE MUST automatically terminate that rule and MUST automatically delete the corresponding {{object}} table entry.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="9999-12-31T23:59:59Z"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceInterface" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion. {{reference}}
+          This specifies the ingress interface associated with the entry. It MAY be a layer 1, 2 or 3 interface, however, the types of interfaces for which Rules can be instantiated is a local matter to the CPE.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceInterfaceExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the {{param|SourceInterface}} entry, if specified.
+          If {{true}}, the rule matches all packets except those that match the {{param|SourceInterface}} entry, if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceAllInterfaces" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion. This specifies that all ingress interfaces are associated with the entry. If {{true}}, the values of {{param|SourceInterface}} and {{param|SourceInterfaceExclude}} are ignored since all ingress interfaces are indicated.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestInterface" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion. {{reference}}
+          This specifies the egress interface associated with the entry. It MAY be a layer 1, 2 or 3 interface, however, the types of interfaces for which Rules can be instantiated is a local matter to the CPE.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestInterfaceExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the {{param|DestInterface}} entry, if specified.
+          If {{true}}, the rule matches all packets except those that match the {{param|DestInterface}} entry, if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestAllInterfaces" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion. This specifies that all egress interfaces are associated with the entry. If {{true}}, the values of {{param|DestInterface}} and {{param|DestInterfaceExclude}} are ignored since all ingress interfaces are indicated.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPVersion" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          IP Protocol Version (e.g. 4 for IPv4 and 6 for IPv6). A value of -1 indicates this criterion is not used for matching.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="15"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIP" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          Destination IP address. {{empty}} indicates this criterion is not used for matching.
+          Note that Firewall rules are applied after any {{object|###.NAT}} processing, so if NAT is enabled on the source interface this is always the translated address.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMask" access="readWrite" dmr:version="2.2">
+        <description>
+          Destination IP address mask, represented as an IP routing prefix using CIDR notation [RFC4632]. The IP address part MUST be {{empty}} (and, if specified, MUST be ignored).
+        </description>
+        <syntax>
+          <dataType ref="IPPrefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIPExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the (masked) {{param|DestIP}} entry, if specified.
+          If {{true}}, the rule matches all packets except those that match the (masked) {{param|DestIP}} entry, if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIP" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          Source IP address. {{empty}} indicates this criterion is not used for matching.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMask" access="readWrite" dmr:version="2.2">
+        <description>
+          Source IP address mask, represented as an IP routing prefix using CIDR notation [RFC4632]. The IP address part MUST be {{empty}} (and, if specified, MUST be ignored).
+        </description>
+        <syntax>
+          <dataType ref="IPPrefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIPExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the (masked) {{param|SourceIP}} entry, if specified.
+          If {{true}}, the rule matches all packets except those that match the (masked) {{param|SourceIP}} entry, if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          Protocol number. A value of -1 indicates this criterion is not used for matching.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="255"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the {{param|Protocol}} entry, if specified.
+          If {{true}}, the rule matches all packets except those that match the {{param|Protocol}} entry, if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPort" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          Destination port number. A value of -1 indicates this criterion is not used for matching.
+          Note that Firewall rules are applied after any {{object|###.NAT}} processing, so if NAT is enabled on the source interface this is always the translated port number.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortRangeMax" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          If specified, indicates the {{object}} criterion is to include the port range from {{param|DestPort}} through {{param}} (inclusive). If specified, {{param}} MUST be greater than or equal to {{param|DestPort}}.
+          A value of -1 indicates that no port range is specified.
+          Note that Firewall rules are applied after any {{object|###.NAT}} processing, so if NAT is enabled on the source interface this is always the translated port number.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the {{param|DestPort}} entry (or port range), if specified.
+          If {{true}}, the rule matches all packets except those that match the {{param|DestPort}} entry (or port range), if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePort" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          Source port number. A value of -1 indicates this criterion is not used for matching.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortRangeMax" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          If specified, indicates the {{object}} criterion is to include the port range from {{param|SourcePort}} through {{param}} (inclusive). If specified, {{param}} MUST be greater than or equal to {{param|SourcePort}}.
+          A value of -1 indicates that no port range is specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the {{param|SourcePort}} entry (or port range), if specified.
+          If {{true}}, the rule matches all packets except those that match the {{param|SourcePort}} entry (or port range), if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCP" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          DiffServ codepoint (defined in {{bibref|RFC2474}}).
+          If set to a Class Selector Codepoint (defined in {{bibref|RFC2474}}), all DSCP values that match the first 3 bits will be considered a valid match.
+          A value of -1 indicates this criterion is not used for matching.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="63"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the {{param|DSCP}} entry, if specified.
+          If {{true}}, the rule matchess all packets except those that match the {{param|DSCP}} entry, if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PeriodicStatistics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object configures collection of periodic statistics for the device.
+        Periodic statistics are measured over a sample interval (which can be aligned with absolute time) and are made available to the ACS as a comma-separated list of the most recent &lt;n&gt; samples.
+        This object provides a single set of global settings that affect the entire device unless overridden locally.
+      </description>
+      <parameter name="MinSampleInterval" access="readOnly" dmr:version="2.0">
+        <description>
+          Minimum sample interval in {{units}} that the CPE is able to support.
+          A value of 0 indicates no specific minimum sample interval.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxReportSamples" access="readOnly" dmr:version="2.0">
+        <description>
+          Maximum number of samples of each statistic that the CPE is able to store and report.
+          A value of 0 indicates no specific maximum number of samples.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SampleSetNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PeriodicStatistics.SampleSet.{i}." access="readWrite" numEntriesParameter="SampleSetNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Periodic statistics sample set table.  Each sample set has its own sample interval etc.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables collection of periodic statistics for this sample set.
+          When collection of periodic statistics is enabled, any stored samples are discarded, and the first sample interval begins immediately.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates availability of Sample statistics. {{enum}}
+          The {{enum|Trigger}} value is only used for triggering the ACS 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.
+        </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 ACS SHOULD now fetch the collected data.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.0">
+        <description>
+          The name of this sample set, which uniquely distinguishes each sample set.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SampleInterval" access="readWrite" dmr:version="2.0">
+        <description>
+          The sample interval in {{units}}. Each statistic is measured over this sample interval.
+          The CPE MAY reject a request to set {{param}} to less than {{param|.PeriodicStatistics.MinSampleInterval}}.
+          Sample intervals MUST begin every {{param}} {{units}}, with no delay between samples.
+          If {{param}} is changed while collection of periodic statistics is enabled, any stored samples are discarded, and the first sample interval begins immediately.
+          For example, if {{param|ReportSamples}} is 24 and {{param}} is 3600 (an hour), the CPE can store up to a day's worth of samples for each statistic.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="3600"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReportSamples" access="readWrite" dmr:version="2.0">
+        <description>
+          The number of samples that the CPE will store and report for each statistic.
+          The CPE MUST permit {{param}} to be set to at least {{param|.PeriodicStatistics.MaxReportSamples}}.
+          If {{param}} is changed while collection of periodic statistics is enabled, the CPE will truncate or extend its statistics buffers as appropriate, but statistics collection MUST NOT otherwise be affected.
+          For example, if {{param}} is 24 and {{param|SampleInterval}} is 3600 (an hour), the CPE can store up to a day's worth of samples for each statistic.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+          <default type="object" value="24"/>
+        </syntax>
+      </parameter>
+      <parameter name="TimeReference" access="readWrite" dmr:version="2.0">
+        <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 {{param|Status}} {{enum|Enabled|Status}} to {{enum|Trigger|Status}} to {{enum|Enabled|Status}} transitions that are 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 {{param|Status}} transition 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-106a2}} 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 {{param|Status}} {{enum|Enabled|Status}} to {{enum|Trigger|Status}} to {{enum|Enabled|Status}} transitions 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" dmr:version="2.0">
+        <description>
+          The number of sample intervals to be collected before transitioning {{param|Status}} from {{enum|Enabled|Status}} to {{enum|Trigger|Status}} to {{enum|Enabled|Status}}.
+          If this SampleSet is enabled and {{param}} is in the range [1:{{param|ReportSamples}}] then {{param|Status}} MUST transition from {{enum|Enabled|Status}} to {{enum|Trigger|Status}} to {{enum|Enabled|Status}} on completion of every {{param}} sample intervals.  Otherwise, the transition MUST NOT occur.
+          For example, if {{param|ReportSamples}} is 25 and {{param}} is 24, then the CPE will store 25 values for each monitored parameter and the above {{param|Status}} transition will occur as the CPE stores each 24th of 25 sample intervals, which means that the ACS could delay for up to two sample intervals before reading the stored values and would still not miss any samples (see also {{param|ForceSample}}).
+          To disable this trigger mechanism and still collect sampled statistics, {{param}} can be set to either 0 or a value greater than {{param|ReportSamples}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ForceSample" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, forces statistics for the current sample to be calculated and updated in the data model.  Setting it to {{false}} has no effect. {{hidden}}
+          If this is the first time that {{param}} has been set to {{true}} 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 {{param}} has been set to {{true}} 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 {{param}} 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 {{param}} was set to {{true}} 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 {{param}} was set to {{true}} will be updated one last time at the end of the sample interval.
+        </description>
+        <syntax command="true">
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReportStartTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The absolute time at which the sample interval for the first stored sample (for each statistic) started.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ReportEndTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The absolute time at which the sample interval for the last stored sample (for each statistic) ended.
+          If {{param|ForceSample}} has been used to force statistics for the current sample to be calculated and updated in the data model, then {{param}} MUST be updated to reflect the actual time over which stored data was collected.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SampleSeconds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Each entry indicates the number of {{units}} during which data was collected during the sample interval.
+          Individual {{param}} values can be less than {{param|SampleInterval}}, for several reasons, including:
+          : {{param|TimeReference}} has been set to a time other than the Unknown Time and the current sample interval started part of the way through a scheduled sample interval.
+          : {{param|ForceSample}} has been used to force statistics for the current sample to be calculated and updated in the data model.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ParameterNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}." access="readWrite" numEntriesParameter="ParameterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Periodic statistics parameter table for this sample set.  This table contains entries for parameters whose values are to be sampled.
+        Note that the comma-separated lists in this object (SampleSeconds, SuspectData and Values) only ever change (a) when first enabled, (b) when ForceSample is set to true (a "sneak preview" of the current sample), or (c) at the end of the sample interval.
+      </description>
+      <uniqueKey>
+        <parameter ref="Reference"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this object instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Reference" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} This is the parameter being monitored by the Periodic Statistics mechanism.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetType="parameter"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SampleMode" access="readWrite" dmr:version="2.0">
+        <description>
+          Controls how this parameter's value is sampled. {{enum}}
+          Parameters of non-numeric types can only support {{enum|Current}}.  The value of the {{param}} MUST be ignored for such parameters.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Current">
+              <description>
+                Sampled value is current value
+              </description>
+            </enumeration>
+            <enumeration value="Change">
+              <description>
+                Sampled value is change in value since start of sample interval
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Current"/>
+        </syntax>
+      </parameter>
+      <parameter name="CalculationMode" access="readWrite" dmr:version="2.0">
+        <description>
+          Controls how this parameter's statistic is calculated from the sampled value(s). {{enum}}
+          Parameters of non-numeric types can only support {{enum|Latest}}.  The value of the {{param}} MUST be ignored for such parameters.
+          {{param|SampleMode}} MUST be applied before {{param}}, i.e. the inputs to the calculation will have already accounted for {{param|SampleMode}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Latest">
+              <description>
+                Statistic is sampled value at end of sample interval
+              </description>
+            </enumeration>
+            <enumeration value="Minimum">
+              <description>
+                Statistic is minimum sampled value during sample interval
+              </description>
+            </enumeration>
+            <enumeration value="Maximum">
+              <description>
+                Statistic is maximum sampled value during sample interval
+              </description>
+            </enumeration>
+            <enumeration value="Average">
+              <description>
+                Statistic is average (mean) sampled value during sample interval
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Latest"/>
+        </syntax>
+      </parameter>
+      <parameter name="LowThreshold" access="readWrite" dmr:version="2.0">
+        <description>
+          The low threshold value that controls the calculation of {{param|Failures}}.
+          A value equal to {{param|HighThreshold}} disables the threshold/failure mechanism.
+          Parameters of non-numeric types cannot support the threshold/failure mechanism. The value of this parameter MUST be ignored for such parameters.
+        </description>
+        <syntax>
+          <int/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="HighThreshold" access="readWrite" dmr:version="2.0">
+        <description>
+          The high threshold value that controls the calculation of {{param|Failures}}.
+          A value equal to {{param|LowThreshold}} disables the threshold/failure mechanism.
+          Parameters of non-numeric types cannot support the threshold/failure mechanism. The value of this parameter MUST be ignored for such parameters.
+        </description>
+        <syntax>
+          <int/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="SampleSeconds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <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|.PeriodicStatistics.SampleSet.{i}.SampleInterval}}, for several reasons, including:
+          : Any of the reasons for which {{param|.PeriodicStatistics.SampleSet.{i}.SampleSeconds}} values might be less than {{param|.PeriodicStatistics.SampleSet.{i}.SampleInterval}}.
+          : The parameter doesn't exist, or was created or deleted during a sample interval.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SuspectData" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <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>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Values" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Each entry indicates the value of the referenced parameter, as determined by {{param|SampleMode}}, during the sample interval.
+          The statistics values in this comma-separated lists MUST be in time order, with the oldest one first and the most recent one last.
+          If the {{param|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/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Failures" access="readOnly" dmr:version="2.0">
+        <description>
+          Counts the number of times (since this object instance was last enabled) that a newly-calculated sample value (accounting for {{param|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|LowThreshold}} and less than {{param|HighThreshold}}.
+          * "out of range" : current value is less than or equal to {{param|LowThreshold}}, or greater than or equal to {{param|HighThreshold}}.
+          * "out of range (low)" : current value is less than or equal to {{param|LowThreshold}}.
+          * "out of range (high)" : current value is greater than or equal to {{param|HighThreshold}}.
+          Note that, if {{param|LowThreshold}} and {{param|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 ACS of such changes, as described in {{bibref|TR-069a2|Section 3.2.1}}.
+          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/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FaultMgmt." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters relating to Fault/Alarm Management.
+      </description>
+      <parameter name="SupportedAlarmNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxCurrentAlarmEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          The maximum number of entries allowed in the {{object|.FaultMgmt.CurrentAlarm.{i}.}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentAlarmNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="HistoryEventNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ExpeditedEventNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QueuedEventNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FaultMgmt.SupportedAlarm.{i}." access="readOnly" numEntriesParameter="SupportedAlarmNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        Supported Alarm Entries which can be raised by the device.
+        The instance numbers for this table SHOULD be maintained across firmware upgrades of the device.
+      </description>
+      <uniqueKey>
+        <parameter ref="EventType"/>
+        <parameter ref="ProbableCause"/>
+        <parameter ref="SpecificProblem"/>
+        <parameter ref="PerceivedSeverity"/>
+      </uniqueKey>
+      <parameter name="EventType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the type of event.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProbableCause" access="readOnly" dmr:version="2.4">
+        <description>
+          Qualifies the alarm and provides further information than {{param|EventType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SpecificProblem" access="readOnly" dmr:version="2.4">
+        <description>
+          Provides further qualification on the alarm beyond {{param|EventType}} and {{param|ProbableCause}}.
+          This is vendor defined and will be {{empty}} if the device doesn't support unique indexing of the table using {{param}}.
+          The string can be set to "*" to indicate the default case if only a subset of {{param}} are to be contained within the table.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PerceivedSeverity" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the relative level of urgency for operator attention, see {{bibref|ITU-X.733}}. {{enum}}
+          This will be {{empty}} if the device doesn't support unique indexing of the table using {{param}}.
+          The string can be set to "*" to indicate the default case if only a subset of {{param}} are to be contained within the table.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="">
+              <description>
+                {{empty}}
+              </description>
+            </enumeration>
+            <enumeration value="*"/>
+            <enumeration value="Cleared"/>
+            <enumeration value="Critical"/>
+            <enumeration value="Major"/>
+            <enumeration value="Minor"/>
+            <enumeration value="Warning"/>
+            <enumeration value="Indeterminate"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ReportingMechanism" access="readWrite" dmr:version="2.4">
+        <description>
+          Indicates the reporting mechanism setting of the alarm. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="0 Expedited">
+              <description>
+                The device inserts the alarm into the {{object|.FaultMgmt.ExpeditedEvent.{i}.}} table and the {{object|.FaultMgmt.ExpeditedEvent.{i}.}} table.
+              </description>
+            </enumeration>
+            <enumeration value="1 Queued">
+              <description>
+                The device inserts the alarm into the {{object|.FaultMgmt.QueuedEvent.{i}.}} table and the {{object|.FaultMgmt.QueuedEvent.{i}.}} table.
+              </description>
+            </enumeration>
+            <enumeration value="2 Logged">
+              <description>
+                The device inserts the alarm into the {{object|.FaultMgmt.HistoryEvent.{i}.}} table.
+              </description>
+            </enumeration>
+            <enumeration value="3 Disabled">
+              <description>
+                The device ignores the alarm.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FaultMgmt.CurrentAlarm.{i}." access="readOnly" numEntriesParameter="CurrentAlarmNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        Contains all currently active alarms (whose {{param|.FaultMgmt.SupportedAlarm.{i}.PerceivedSeverity}} is not {{enum|Cleared|.FaultMgmt.SupportedAlarm.{i}.PerceivedSeverity}}).
+        Newly raised alarms result in a new entry in this table being added, any changes to the alarm as a result of an update event are updated in the existing table entry, and a clear event raised against an alarm results in the alarm being removed from this table.
+        If maximum entries as indicated by {{param|.FaultMgmt.MaxCurrentAlarmEntries}} is reached, the next event overrides the object with the oldest {{param|AlarmChangedTime}}.
+        When a new alarm replaces an existing alarm, then all parameter values for that instance are considered as changed for the purposes of value change notifications to the ACS (even if their new values are identical to those of the prior alarm).
+      </description>
+      <uniqueKey>
+        <parameter ref="AlarmIdentifier"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="EventType"/>
+        <parameter ref="ProbableCause"/>
+        <parameter ref="SpecificProblem"/>
+      </uniqueKey>
+      <parameter name="AlarmIdentifier" access="readOnly" dmr:version="2.4">
+        <description>
+          Identifies one Alarm Entry in the Alarm List.  This value MUST be uniquely allocated by the device to the alarm instance during the lifetime of the individual alarm.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AlarmRaisedTime" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the date and time when the alarm was first raised by the device.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="AlarmChangedTime" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the date and time when the alarm was last changed by the device.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ManagedObjectInstance" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the instance of the Informational Object Class in which the alarm occurred by carrying the Distinguished Name (DN) of this object instance. The format of the DN is specific to the application that is using this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="512"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EventType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the type of event.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProbableCause" access="readOnly" dmr:version="2.4">
+        <description>
+          Qualifies the alarm and provides further information than {{param|EventType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SpecificProblem" access="readOnly" dmr:version="2.4">
+        <description>
+          Provides further qualification on the alarm beyond {{param|EventType}} and {{param|ProbableCause}}.
+          This is vendor defined and will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PerceivedSeverity" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the relative level of urgency for operator attention, see {{bibref|ITU-X.733}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Critical"/>
+            <enumeration value="Major"/>
+            <enumeration value="Minor"/>
+            <enumeration value="Warning"/>
+            <enumeration value="Indeterminate"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalText" access="readOnly" dmr:version="2.4">
+        <description>
+          This provides a textual string which is vendor defined.
+          This will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalInformation" access="readOnly" dmr:version="2.4">
+        <description>
+          This contains additional information about the alarm and is vendor defined.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FaultMgmt.HistoryEvent.{i}." access="readOnly" numEntriesParameter="HistoryEventNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        Alarm events added or updated in {{object|.FaultMgmt.CurrentAlarm.{i}.}} are simultaneously entered into the this table. This table also contains alarm clearing events.
+        Active alarms at the time of a power failure or reboot might not get an alarm clearing event.
+        This object has a fixed number of entries with instance numbers from 1 to {{param|.FaultMgmt.HistoryEventNumberOfEntries}}.
+        If maximum instance number {{param|.FaultMgmt.HistoryEventNumberOfEntries}} is reached, the next event overrides the object with instance number 1.  Subsequent entries override objects at sequentially increasing instance numbers.  This logic provides for automatic "rolling" of records.
+      </description>
+      <uniqueKey>
+        <parameter ref="EventTime"/>
+        <parameter ref="AlarmIdentifier"/>
+      </uniqueKey>
+      <parameter name="EventTime" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the date and time when the alarm event occurs.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="AlarmIdentifier" access="readOnly" dmr:version="2.4">
+        <description>
+          Identifies one Alarm Entry in the Alarm List.  This value MUST be uniquely allocated by the device to the alarm instance during the lifetime of the individual alarm.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NotificationType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the reason for the specific alarm notification event. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NewAlarm"/>
+            <enumeration value="ChangedAlarm"/>
+            <enumeration value="ClearedAlarm"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManagedObjectInstance" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the instance of the Informational Object Class in which the alarm occurred by carrying the Distinguished Name (DN) of this object instance. The format of the DN is specific to the application that is using this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="512"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EventType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the type of event.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProbableCause" access="readOnly" dmr:version="2.4">
+        <description>
+          Qualifies the alarm and provides further information than {{param|EventType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SpecificProblem" access="readOnly" dmr:version="2.4">
+        <description>
+          Provides further qualification on the alarm beyond {{param|EventType}} and {{param|ProbableCause}}.
+          This is vendor defined and will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PerceivedSeverity" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the relative level of urgency for operator attention, see {{bibref|ITU-X.733}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Cleared"/>
+            <enumeration value="Critical"/>
+            <enumeration value="Major"/>
+            <enumeration value="Minor"/>
+            <enumeration value="Warning"/>
+            <enumeration value="Indeterminate"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalText" access="readOnly" dmr:version="2.4">
+        <description>
+          This provides a textual string which is vendor defined.
+          This will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalInformation" access="readOnly" dmr:version="2.4">
+        <description>
+          This contains additional information about the alarm and is vendor defined.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FaultMgmt.ExpeditedEvent.{i}." access="readOnly" numEntriesParameter="ExpeditedEventNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        Alarm events added or updated in {{object|.FaultMgmt.CurrentAlarm.{i}.}} are simultaneously entered into the this table if their corresponding entry in {{object|.FaultMgmt.SupportedAlarm.{i}.}} has {{param|.FaultMgmt.SupportedAlarm.{i}.ReportingMechanism}} set to {{enum|0 Expedited|.FaultMgmt.SupportedAlarm.{i}.ReportingMechanism}}. This table also contains alarm clearing events.
+        This object has a fixed number of entries with instance numbers from 1 to {{param|.FaultMgmt.ExpeditedEventNumberOfEntries}}.
+        Initially the table starts with all instances having {{param|EventTime}} set to the Unknown Time value, as defined in {{bibref|TR-106a4}}.
+        If maximum instance number {{param|.FaultMgmt.ExpeditedEventNumberOfEntries}} is reached, the next event overrides the object with instance number 1.  Subsequent entries override objects at sequentially increasing instance numbers.  This logic provides for automatic "rolling" of records.
+        When a new alarm replaces an existing alarm, then all parameter values for that instance are considered as changed for the purposes of value change notifications to the ACS (even if their new values are identical to those of the prior alarm).
+      </description>
+      <uniqueKey>
+        <parameter ref="AlarmIdentifier"/>
+      </uniqueKey>
+      <parameter name="EventTime" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the date and time when the alarm event occurs.
+          For an unpopulated entry, the value is the Unknown Time as defined in {{bibref|TR-106a4}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="AlarmIdentifier" access="readOnly" dmr:version="2.4">
+        <description>
+          Identifies one Alarm Entry in the Alarm List.  This value MUST be uniquely allocated by the device to the alarm instance during the lifetime of the individual alarm.
+          For an unpopulated entry, the value is {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NotificationType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the reason for the specific alarm notification event. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NewAlarm"/>
+            <enumeration value="ChangedAlarm"/>
+            <enumeration value="ClearedAlarm"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManagedObjectInstance" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the instance of the Informational Object Class in which the alarm occurred by carrying the Distinguished Name (DN) of this object instance. The format of the DN is specific to the application that is using this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="512"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EventType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the type of event.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProbableCause" access="readOnly" dmr:version="2.4">
+        <description>
+          Qualifies the alarm and provides further information than {{param|EventType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SpecificProblem" access="readOnly" dmr:version="2.4">
+        <description>
+          Provides further qualification on the alarm beyond {{param|EventType}} and {{param|ProbableCause}}.
+          This is vendor defined and will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PerceivedSeverity" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the relative level of urgency for operator attention, see {{bibref|ITU-X.733}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Cleared"/>
+            <enumeration value="Critical"/>
+            <enumeration value="Major"/>
+            <enumeration value="Minor"/>
+            <enumeration value="Warning"/>
+            <enumeration value="Indeterminate"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalText" access="readOnly" dmr:version="2.4">
+        <description>
+          This provides a textual string which is vendor defined.
+          This will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalInformation" access="readOnly" dmr:version="2.4">
+        <description>
+          This contains additional information about the alarm and is vendor defined.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FaultMgmt.QueuedEvent.{i}." access="readOnly" numEntriesParameter="QueuedEventNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        Alarm events added or updated in {{object|.FaultMgmt.CurrentAlarm.{i}.}} are simultaneously entered into the this table if their corresponding entry in {{object|.FaultMgmt.SupportedAlarm.{i}.}} has {{param|.FaultMgmt.SupportedAlarm.{i}.ReportingMechanism}} set to {{enum|1 Queued|.FaultMgmt.SupportedAlarm.{i}.ReportingMechanism}}. This table also contains alarm clearing events.
+        This object has a fixed number of entries with instance numbers from 1 to {{param|.FaultMgmt.QueuedEventNumberOfEntries}}.
+        Initially the table starts with all instances having {{param|EventTime}} set to the Unknown Time value, as defined in {{bibref|TR-106a4}}.
+        If maximum instance number {{param|.FaultMgmt.QueuedEventNumberOfEntries}} is reached, the next event overrides the object with instance number 1.  Subsequent entries override objects at sequentially increasing instance numbers.  This logic provides for automatic "rolling" of records.
+        When a new alarm replaces an existing alarm, then all parameter values for that instance are considered as changed for the purposes of value change notifications to the ACS (even if their new values are identical to those of the prior alarm).
+      </description>
+      <uniqueKey>
+        <parameter ref="AlarmIdentifier"/>
+      </uniqueKey>
+      <parameter name="EventTime" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the date and time when the alarm event occurs.
+          For an unpopulated entry, the value is the Unknown Time as defined in {{bibref|TR-106a4}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="AlarmIdentifier" access="readOnly" dmr:version="2.4">
+        <description>
+          Identifies one Alarm Entry in the Alarm List.  This value MUST be uniquely allocated by the device to the alarm instance during the lifetime of the individual alarm.
+          For an unpopulated entry, the value is {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NotificationType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the reason for the specific alarm notification event. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NewAlarm"/>
+            <enumeration value="ChangedAlarm"/>
+            <enumeration value="ClearedAlarm"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManagedObjectInstance" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the instance of the Informational Object Class in which the alarm occurred by carrying the Distinguished Name (DN) of this object instance. The format of the DN is specific to the application that is using this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="512"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EventType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the type of event.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProbableCause" access="readOnly" dmr:version="2.4">
+        <description>
+          Qualifies the alarm and provides further information than {{param|EventType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SpecificProblem" access="readOnly" dmr:version="2.4">
+        <description>
+          Provides further qualification on the alarm beyond {{param|EventType}} and {{param|ProbableCause}}.
+          This is vendor defined and will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PerceivedSeverity" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the relative level of urgency for operator attention, see {{bibref|ITU-X.733}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Cleared"/>
+            <enumeration value="Critical"/>
+            <enumeration value="Major"/>
+            <enumeration value="Minor"/>
+            <enumeration value="Warning"/>
+            <enumeration value="Indeterminate"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalText" access="readOnly" dmr:version="2.4">
+        <description>
+          This provides a textual string which is vendor defined.
+          This will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalInformation" access="readOnly" dmr:version="2.4">
+        <description>
+          This contains additional information about the alarm and is vendor defined.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Security." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains general information related to managing security features on the device.
+      </description>
+      <parameter name="CertificateNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Security.Certificate.{i}." access="readOnly" numEntriesParameter="CertificateNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        This table provides information about all types of public key-based credentials, such as X.509 certificates, see {{bibref|RFC5280}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="SerialNumber"/>
+        <parameter ref="Issuer"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables this certificate.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="LastModif" access="readOnly" dmr:version="2.4">
+        <description>
+          The last modification time of this certificate.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="2.4">
+        <description>
+          The Serial Number field in an X.509 certificate, see {{bibref|RFC5280}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Issuer" access="readOnly" dmr:version="2.4">
+        <description>
+          The Issuer field in an X.509 certificate, see {{bibref|RFC5280}}; i.e. the Distinguished Name (DN) of the entity who has signed the certificate.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NotBefore" access="readOnly" dmr:version="2.4">
+        <description>
+          The beginning of the certificate validity period; i.e. the Not Before field in an X.509 certificate, see {{bibref|RFC5280}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="NotAfter" access="readOnly" dmr:version="2.4">
+        <description>
+          The end of the certificate validity period; i.e., the Not After field in an X.509 certificate, see {{bibref|RFC5280}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="Subject" access="readOnly" dmr:version="2.4">
+        <description>
+          The Distinguished Name (DN) of the entity associated with the Public Key; i.e., the Subject field in an X.509 certificate, see {{bibref|RFC5280}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SubjectAlt" access="readOnly" dmr:version="2.4">
+        <description>
+          {{list}} Each item is a DNS Name.
+          The Subject Alternative Names extension field in an X.509 certificate, see {{bibref|RFC5280}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SignatureAlgorithm" access="readOnly" dmr:version="2.4">
+        <description>
+          The algorithm used in signing the certificate; i.e. the Signature Algorithm field in an X.509 certificate, see {{bibref|RFC5280}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object is the container for all Femto related component objects, to prevent pollution of the so-called global namespace of the BBF with FAP specific objects.
+      </description>
+    </object>
+    <object name="Device.FAP.GPS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains the parameters relating to the GPS scan.
+      </description>
+      <parameter name="ScanOnBoot" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables GPS scans during the device start up.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="ScanPeriodically" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables periodic GPS scans.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicInterval" access="readWrite" dmr:version="2.4">
+        <description>
+          When {{param|ScanPeriodically}} is {{true}}, this value indicates the interval in {{units}} which GPS scan is performed.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicTime" access="readWrite" dmr:version="2.4">
+        <description>
+          An absolute time reference in UTC to determine when the CPE will initiate the periodic GPS scan. Each GPS scan MUST occur at (or as soon as possible after) this reference time plus or minus an integer multiple of the {{param|PeriodicInterval}}.
+          {{param}} is used only to set the "phase" of the GPS scan. The actual value of {{param}} can be arbitrarily far into the past or future.
+          For example, if {{param|PeriodicInterval}} is 86400 (a day) and if {{param}} is set to UTC midnight on some day (in the past, present, or future) then periodic GPS scans will occur every day at UTC midnight. These MUST begin on the very next midnight, even if {{param}} refers to a day in the future.
+          The Unknown Time value defined in {{bibref|TR-106a4|Section 3.2}} indicates that no particular time reference is specified. That is, the CPE MAY locally choose the time reference, and needs only to adhere to the specified PeriodicInformInterval.
+          If absolute time is not available to the CPE, its periodic GPS scan behavior MUST be the same as if {{param}} parameter was set to the Unknown Time value.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ContinuousGPS" access="readWrite" dmr:version="2.4">
+        <description>
+          Whether or not the device SHOULD maintain a continuous GPS lock (e.g. as a frequency stability source).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ScanTimeout" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies the time-out value in {{units}} since the scan started after which the scan will time out. A timed out scan is to be reported as {{enum|Error_TIMEOUT|ScanStatus}} with {{param|ErrorDetails}} indicating "Timed out"
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ScanStatus" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the current status of this scan.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Indeterminate">
+              <description>
+                The scan has not been executed and there are no valid scan results available
+              </description>
+            </enumeration>
+            <enumeration value="InProgress"/>
+            <enumeration value="Success"/>
+            <enumeration value="Error"/>
+            <enumeration value="Error_TIMEOUT"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorDetails" access="readOnly" dmr:version="2.4">
+        <description>
+          Provides more detail when the {{param|ScanStatus}} is either {{enum|Error|ScanStatus}} or {{enum|Error_TIMEOUT|ScanStatus}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastScanTime" access="readOnly" activeNotify="forceDefaultEnabled" dmr:version="2.4">
+        <description>
+          The date and time when the last GPS scan completed.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LastSuccessfulScanTime" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          Specifies the date and time, when the GPS scan last completed successfully.
+          This value is retained across reboot and is only reset after another scan completes successfully or {{param|GPSReset}} is set to {{true}}.
+          The values for {{param|LockedLatitude}}, {{param|LockedLongitude}} and {{param|NumberOfSatellites}} correspond to this time. If a scan has never succeeded before, the value will be the Unknown Time value, as defined in {{bibref|TR-106a4|Section 3.2}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LockedLatitude" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          This parameter specifies the latitude of the device's position in degrees, multiplied by 1 million. The positive value signifies the direction, north of the equator. The negative value signifies the direction, south of the equator.
+          Range is from: 90d00.00' South (-90,000,000) to 90d00.00' North (90,000,000).
+          Example: A latitude of 13d19.43' N would be represented as 13,323,833, derived as (13*1,000,000)+((19.43*1,000,000)/60). Latitude of 50d00.00' S would be represented as value -50,000,000.
+          This value is retained across reboots and is only reset after another scan completes successfully or {{param|GPSReset}} is set to {{true}}. If a scan has never succeeded before, the value 0 is reported.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-90000000" maxInclusive="90000000"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="LockedLongitude" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          This parameter specifies the longitude of the device's position in degrees, multiplied by 1 million. The positive value signifies the direction, east of the prime meridian. The negative value signifies the direction, west of the prime meridian.
+          Range is from: 180d00.00' West (-180,000,000) to 180d00.00' East (180,000,000).
+          Example: A longitude of 13d19.43' E would be represented as 13,323,833, derived as (13*1,000,000)+((19.43*1,000,000)/60). A longitude of 50d00.00' W would be represented as value -50,000,000.
+          This value is retained across reboots and is only reset after another scan completes successfully or {{param|GPSReset}} is set to {{true}}. If a scan has never succeeded before, the value 0 is reported.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-180000000" maxInclusive="180000000"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfSatellites" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The number of satellites that were locked during the test execution. The greater the number of satellites the better the precision of the results.
+          This value is retained across reboots and is only reset after another scan completes successfully or {{param|GPSReset}} is set to {{true}}. If a scan has never succeeded before, the value 0 is reported.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="GPSReset" access="readWrite" dmr:version="2.4">
+        <description>
+          Setting this to {{true}} will cause a reset on the GPS Hardware. Setting this to {{false}} has no effect.
+        </description>
+        <syntax command="true">
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.GPS.ContinuousGPSStatus." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        When {{param|#.ContinuousGPS}} is {{true}}, the parameters in this object contain the GPS status as it is continuously monitored.
+        When {{param|#.ContinuousGPS}} is {{false}}, the parameters in this object are not being updated and their values are not accurate.
+      </description>
+      <parameter name="CurrentFix" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The value is {{true}} if the location fix is currently valid (i.e. GPS receiver is currently tracking satellite signals), otherwise it is {{false}}. After a reboot the value is {{false}} until the GPS receivers has a valid current position.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="GotFix" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The value is {{true}} if {{param|CurrentFix}} has transitioned to {{true}} at least once since {{param|#.ContinuousGPS}} was enabled, otherwise it is {{false}}. After a reboot the value is {{false}} until {{param|CurrentFix}} has transitioned to {{true}} again.
+          The GPS coordinates ({{param|Latitude}}, {{param|Longitude}}, and {{param|Elevation}}) are not valid until {{param}} has a value of {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="TimingGood" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The value is {{true}} if the timing synchronization is good, otherwise it is {{false}}. After a reboot the value is {{false}} until the timing is synchronized again.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Latitude" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          This parameter represents the most recent latitude reading for the device's position in degrees, multiplied by 1 million. The positive value signifies the direction, north of the equator. The negative value signifies the direction, south of the equator.
+          Range is from: 90 deg 00.00' South (-90,000,000) to 90 deg 00.00' North (90,000,000).
+          Example: A latitude of 13 deg 19.43' N would be represented as 13,323,833, derived as (13*1,000,000)+((19.43*1,000,000)/60). Latitude of 50 deg 00.00' S would be represented as value -50,000,000.
+          {{param}} is not valid until {{param|GotFix}} is {{true}}.
+          If the parameter has never been set before, the value 0 is reported. The value SHOULD be maintained over a reboot.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-90000000" maxInclusive="90000000"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Longitude" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          This parameter represents the most recent longitude reading for the device's position in degrees, multiplied by 1 million. The positive value signifies the direction, east of the prime meridian. The negative value signifies the direction, west of the prime meridian.
+          Range is from: 180d00.00' West (-180,000,000) to 180d00.00' East (180,000,000).
+          Example: A longitude of 13d19.43' E would be represented as 13,323,833, derived as (13*1,000,000)+((19.43*1,000,000)/60). A longitude of 50d00.00' W would be represented as value -50,000,000.
+          {{param}} is not valid until {{param|GotFix}} is {{true}}.
+          If the parameter has never been set before, the value 0 is reported. The value SHOULD be maintained over a reboot.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-180000000" maxInclusive="180000000"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Elevation" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          This parameter represents the most recent elevation reading for the device's position in {{units}}, relative to the WGS84 ellipsoid. The positive value signifies the direction, above sea level. The negative value signifies the direction, below sea level.
+          Range is from: 5,000.000 meters below sea level (-5,000,000) to 25,000.000 meters above sea level (25,000,000).
+          {{param}} is not valid until {{param|GotFix}} is {{true}}.
+          If the parameter has never been set before, the value 0 is reported. The value SHOULD be maintained over a reboot.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-5000000" maxInclusive="25000000"/>
+            <units value="millimeters"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="LastFixTime" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          Represents the date and time when the last GPS Fix was acquired.
+          The Unknown Time value defined in {{bibref|TR-106a4|Section 3.2}} is used when {{param|GotFix}} is {{false}}. This applies too after a reboot of the device until a valid location is determined and {{param|GotFix}} transsitions to {{true}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LastFixDuration" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          Number of {{units}} of continuous GPS fix time. After a reboot this value is reset to 0.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FirstFixTimeout" access="readWrite" dmr:version="2.4">
+        <description>
+          Number of {{units}} to wait for first GPS fix before declaring a GPS fault.
+          A value of -1 means that there is no timeout and no fault logging.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="SatellitesTracked" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The number of satellites the receiver is tracking.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SatelliteTrackingInterval" access="readWrite" dmr:version="2.4">
+        <description>
+          The interval in {{units}} at which the GPS tracking information gets reported.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="60" maxInclusive="3600"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ReceiverStatus" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The output of the GPS receiver's status.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LocationType" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          Indicates whether the {{param|Latitude}}, {{param|Longitude}}, and {{param|Elevation}} values are determined via a GPS Fix (where the value of this parameter would be {{enum|Real}}) or via some other means (where the value of this parameter would be {{enum|Reference}}).
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Real"/>
+            <enumeration value="Reference"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LockTimeOutDuration" access="readWrite" dmr:version="2.4">
+        <description>
+          The timer duration, in {{units}}, for which the device waits for GPS to acquire lock.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="120" maxInclusive="86400"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.GPS.AGPSServerConfig." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters for the configuration of the Assisted Global Positioning System (A-GPS) server. See also {{bibref|3GPP-TS.25.171|Section 3.2}}
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables the {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerURL" access="readWrite" dmr:version="2.4">
+        <description>
+          A-GPS server host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServerPort" access="readWrite" dmr:version="2.4">
+        <description>
+          The port to use when communicating to the A-GPS Server.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.4">
+        <description>
+          Username to be used by the device to authenticate with the A-GPS server. This string is set to {{empty}} if no authentication is used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.4">
+        <description>
+          Password to be used by the device to authenticate with the A-GPS server. This string is set to {{empty}} if no authentication is used.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ReferenceLatitude" access="readWrite" dmr:version="2.4">
+        <description>
+          This parameter specifies the reference latitude for an A-GPS request position in degrees, multiplied by 1 million. The positive value signifies the direction, north of the equator. The negative value signifies the direction, south of the equator.
+          Range is from: 90d00.00' South (-90,000,000) to 90d00.00' North (90,000,000).
+          Example: A latitude of 13d19.43' N would be represented as 13,323,833, derived as (13*1,000,000)+((19.43*1,000,000)/60).  Latitude of 50d00.00' S would be represented as value -50,000,000.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-90000000" maxInclusive="90000000"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ReferenceLongitude" access="readWrite" dmr:version="2.4">
+        <description>
+          This parameter specifies the reference longitude for an A-GPS request position in degrees, multiplied by 1 million. The positive value signifies the direction, east of the prime meridian. The negative value signifies the direction, west of the prime meridian.
+          Range is from: 180d00.00' West (-180,000,000) to 180d00.00' East (180,000,000).
+          Example: A longitude of 13d19.43' E would be represented as 13,323,833, derived as (13*1,000,000)+((19.43*1,000,000)/60). A longitude of 50d00'00'' W would be represented as value -50,000,000.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-180000000" maxInclusive="180000000"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ServerInUse" access="readOnly" dmr:version="2.4">
+        <description>
+          The value is {{true}} if the device has successfully contacted and received A-GPS info from the A-GPS server, otherwise the value is {{false}}.
+          After a reboot the value is {{false}} until the server could be contacted again.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.PerfMgmt." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters relating to Performance Management in a Femto-related environment.
+      </description>
+      <parameter name="ConfigNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.PerfMgmt.Config.{i}." access="readWrite" numEntriesParameter="ConfigNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        This object contains parameters relating to File Management configuration for uploading of Performance Files to a designated File Server. Each table entry can be referenced by zero or more radio-specific objects contained in the FAPService instances. The periodic upload will upload data for all of the radio-specific objects that reference it.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="URL"/>
+        <parameter ref="PeriodicUploadInterval"/>
+        <parameter ref="PeriodicUploadTime"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables this entry.  If this entry is disabled then its periodic uploads are not performed.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.4">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="URL" access="readWrite" dmr:version="2.4">
+        <description>
+          URL specifying the destination file location. HTTP and HTTPS transports MUST be supported. Other transports 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.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.4">
+        <description>
+          Username to be used by the device to authenticate with the file server. This string is set to {{empty}} if no authentication is used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.4">
+        <description>
+          Password to be used by the device to authenticate with the file server. This string is set to {{empty}} if no authentication is used.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicUploadInterval" access="readWrite" dmr:version="2.4">
+        <description>
+          The duration in {{units}} of the interval for which the device MUST create a Performance File and attempt to upload the file to {{param|URL}} if {{param|Enable}} is {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicUploadTime" access="readWrite" dmr:version="2.4">
+        <description>
+          An absolute time reference in UTC to determine when the device will initiate the periodic file upload. Each file upload MUST occur at this reference time plus or minus an integer multiple of the {{param|PeriodicUploadInterval}}.
+          {{param}} is used only to set the "phase" of the periodic uploads. The actual value of {{param}} can be arbitrarily far into the past or future.
+          For example, if {{param|PeriodicUploadInterval}} is 86400 (a day) and if {{param}} is set to UTC midnight on some day (in the past, present, or future) then periodic file uploads will occur every day at UTC midnight. These MUST begin on the very next midnight, even if {{param}} refers to a day in the future.
+          The Unknown Time value as defined in {{bibref|TR-106a4|Section 3.2}} indicates that no particular time reference is specified. That is, the device MAY locally choose the time reference, and is REQUIRED only to adhere to the specified {{param|PeriodicUploadInterval}}.
+          If absolute time is not available to the device, its periodic file upload behavior MUST be the same as if the {{param}} parameter was set to the Unknown Time value.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object defines the data model for the following Femtozone APIs.
+        * Femto Awareness
+        * SMS
+        * MMS
+        * Terminal Location
+        Femto Awareness, SMS, MMS, and Terminal Location APIs are defined in the Release 1 API Specifications of the Service SIG in the Femto Forum (non public document).
+        {{bibref|TR-262|appendix I}} provides the "Theory of Operation" for the usage of this object.
+      </description>
+      <parameter name="Version" access="readOnly" dmr:version="2.4">
+        <description>
+          Version of Femto Application Platform running on this device
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable the Femto ApplicationPlatform
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.4">
+        <description>
+          Current state of the Femto Application Platform.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled">
+              <description>
+                The Femto Application Platform is not available
+              </description>
+            </enumeration>
+            <enumeration value="Enabled">
+              <description>
+                The Femto Application Platform is available
+              </description>
+            </enumeration>
+            <enumeration value="Reset">
+              <description>
+                The FemtoApplicationPlatform is in the process of being reset and will transition to the {{enum|Disabled}} state when the reset operation is completed
+              </description>
+            </enumeration>
+            <enumeration value="Initializing">
+              <description>
+                The FemtoApplicationPlatform is being initialized and will transition to the {{enum|Enabled}} state once the initialization is completed
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxNumberOfApplications" access="readOnly" dmr:version="2.4">
+        <description>
+          Determines how many Femtozone Applications can be supported by the Femto Application Platform simultaneously.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentNumberofApplications" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies how many Femtozone Applications are currently communicating with the Femto Application Platform.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Capabilities." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the capabilities of the Femtozone Application Platform and the Femtozone APIs.
+      </description>
+      <parameter name="PresenceApplicationSupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the Femto Application Platform supports Presence-Based Femtozone Applications
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FemtoAwarenessAPISupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the Femto Awareness API is supported on this device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SMSAPISupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the SMS API is supported on this device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SubscribeToNotificationsOfSMSSentToApplicationSupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the SubscribeToNotificationsOfSMSSentToApplication functionality is supported by the FAP SMS API.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QuerySMSDeliveryStatusSupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the QuerySMSDeliveryStatus functionality is supported by the FAP SMS API.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MMSAPISupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the MMS API is supported on this device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueryMMSDeliveryStatusSupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the QueryMMSDeliveryStatus functionality is supported by the FAP MMS API.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SubscribeToNotificationsOfMMSSentToApplicationSupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the SubscribeToNotificationsOfMMSSentToApplication functionality is supported by the FAP MMS API.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="TerminalLocationAPISupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the Terminal Location API is supported on this device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="AuthenticationMethodsSupported" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the supported methods that 3rd Party Applications can use to authenticate with the Femto Application Platform at initialization. Comma separated list of strings.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="Basic"/>
+            <enumeration value="Digest"/>
+            <enumeration value="DigitalSignature"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AccessLevelsSupported" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the supported access levels that 3rd Party Applications can request when authenticating with the Femto Application Platform at initialization. This access level is with respect to resources within the Femto Application Platform only (not to be confused with Access Mode parameter in .FAPService.{i}.AccessMgmt).
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="Guest"/>
+            <enumeration value="Standard"/>
+            <enumeration value="Restricted"/>
+            <enumeration value="Administrator"/>
+            <enumeration value="Debug"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SendSMSTargetAddressType" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the supported types of addresses SMSs can be sent to.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="TelUri"/>
+            <enumeration value="AnonymousReference"/>
+            <enumeration value="All"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SendMMSTargetAddressType" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the supported types of addresses MMSs can be sent to.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="TelUri"/>
+            <enumeration value="AnonymousReference"/>
+            <enumeration value="All"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Control." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the operation of the Femtozone APIs.
+      </description>
+      <parameter name="AuthenticationMethod" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies how 3rd Party Applications have to authenticate against Femto APIs in order to use it. {{reference}}
+          '''''Note:''''' The credentials are not part of the data model and have to be supplied externally.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <enumerationRef targetParam="#.Capabilities.AuthenticationMethodsSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TunnelInst" access="readWrite" dmr:version="2.4">
+        <description>
+          This is the reference to the IPsec tunnel instance to be used by the Application Platform traffic.
+          If InternetGatewayDevice:1 {{bibref|TR-098}} or Device:1 {{bibref|TR-181i1}}) is used as root data model the {{param}} MUST point to a row in the ''.FAP.Tunnel.IKESA.{i}.'' table.
+          If the root data model used is Device:2 {{bibref|TR-181i2}} than the {{param}} MUST point to an tunnel instance defined in this data model.
+          If the referenced object is deleted, the parameter value MUST be set to an empty string.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Control.FemtoAwareness." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the Femto Awareness API.
+      </description>
+      <parameter name="APIEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable FemtoAwareness API exposure on FAP
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable Request queueing for the API
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Queueing " access="readWrite" dmr:version="2.4">
+        <description>
+          Determines how FAP handles simultaneous requests from different Applications to Femto Awareness API.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="FiFo"/>
+            <enumeration value="Priority"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAPIUsersNumber" access="readWrite" dmr:version="2.4">
+        <description>
+          Determines the Max Number of different Applications that can send Requests to Femto Awareness API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FemtozoneID" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies Identifier of the Femtozone.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NotificationsUserIdentifierMSISDN" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies whether the Mobile Station International Subscriber Directory Number (MSISDN) has to be used as UserIdentifier in Femto Awareness Notifications. A value of {{true}} means that the MSISDN is send as user identifier, a value of {{false}} means that an anonymous reference is used.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SubscribeToNotificationsResponseCallbackData" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies whether the OPTIONAL Argument "Callback Data" has to be used in Responses to Requests to "Subscribe To Femto Awareness Notifications".
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueryFemtocellResponseTimezone" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies whether the OPTIONAL Argument "Timezone" has to be used in Responses to Requests to "Query Femtocell Status".
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Control.SMS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the SMS API.
+      </description>
+      <parameter name="APIEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable SMS API exposure on FAP
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable Request queueing for the API
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Queueing " access="readWrite" dmr:version="2.4">
+        <description>
+          Determines how FAP handles simultaneous requests from different Applications to SMS API.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="FiFo"/>
+            <enumeration value="Priority"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAPIUsersNumber" access="readWrite" dmr:version="2.4">
+        <description>
+          Determines the Max Number of different Applications that can send Requests to SMS API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MinSendSMSTimeInterval" access="readWrite" dmr:version="2.4">
+        <description>
+          Determines the Minimum Time Interval in {{units}} between two consecutive Send SMS Requests by the same Application.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="3599"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="EnableQuerySMSDeliveryStatus" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable "QuerySMSDeliveryStatus" Operation on SMS API. When disabled, QuerySMSDeliveryStatus Requests to SMS API are ignored.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EnableSubscribeToNotificationsOfMessageSentToApplication" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable "SubscribeToNotificationsOfMessageSentToApplication" Operation on SMS API. When disabled, SubscribeTo NotificationsOfMessageSentToApplication Requests to SMS API are ignored.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Control.MMS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the MMS API.
+      </description>
+      <parameter name="APIEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable MMS API exposure on FAP
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable Request queueing for the API
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Queueing " access="readWrite" dmr:version="2.4">
+        <description>
+          Determines how FAP handles simultaneous requests from different Applications to MMS API.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="FiFo"/>
+            <enumeration value="Priority"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAPIUsersNumber" access="readWrite" dmr:version="2.4">
+        <description>
+          Determines the Max Number of different Applications that can send Requests to MMS API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MinSendMMSTimeInterval" access="readWrite" dmr:version="2.4">
+        <description>
+          Determines the Minimum Time Interval in {{units}} between two consecutive Send MMS Requests by the same Application.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="3599"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="EnableQueryMMSDeliveryStatus" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable "QuerySMSDeliveryStatus" Operation on MMS API. When disabled, QuerySMSDeliveryStatus Requests to MMS API are ignored.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EnableSubscribeToNotificationsOfMessageSentToApplication" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable "SubscribeTo NotificationsOfMessageSentToApplication" Operation on MMS API. When disabled, SubscribeTo NotificationsOfMessageSentToApplication Requests to MMS API are ignored.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Control.TerminalLocation." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the TerminalLocation API.
+      </description>
+      <parameter name="APIEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable TerminalLocation API exposure on FAP
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable Request queueing for the API
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Queueing " access="readWrite" dmr:version="2.4">
+        <description>
+          Determines how FAP handles simultaneous requests from different Applications to TerminalLocation API.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="FiFo"/>
+            <enumeration value="Priority"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAPIUsersNumber" access="readWrite" dmr:version="2.4">
+        <description>
+          Determines the Max Number of different Applications that can send Requests to TerminalLocation API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueryMobileLocationResponseAddress" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies Terminal Address  Format to be used in QueryMobileLocation Responses.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="TelUri"/>
+            <enumeration value="AnonymousReference"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="QueryMobileLocationResponseLongitudeLatitude" access="readWrite" dmr:version="2.4">
+        <description>
+          Include or exclude FAP Longitude and Latitude arguments in Responses to QueryMobileLocation Requests.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueryMobileLocationResponseAltitude" access="readWrite" dmr:version="2.4">
+        <description>
+          Include or exclude FAP Altitude argument in Responses to QueryMobileLocation Requests .
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueryMobileLocationResponseTimestamp" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies Response Timestamp in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="86399"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Monitoring." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the monitoring of the Femtozone Application Platform and the Femtozone APIs.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables and disables this entry.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MonitoringInterval" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies the interval in {{units}} used to collect the monitoring measurements.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AuthenticationRequestsReceived" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the total number of authentication requests received by the Femto Application Platform. The counter will be reset whenever the device reboots or the {{param|Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AuthenticationRequestsRejected" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of authentication requests received by the Femto Application Platform that were rejected. The counter will be reset whenever the device reboots or the {{param|Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Monitoring.FemtoAwareness." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the Monitoring of the FemtoAwareness API.
+      </description>
+      <parameter name="APIAvailable" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the FemtoAwareness API is currently available on this device (the API could be disabled or could have exhausted its resources)
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="APIUsers" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of Applications using the Femto Awareness API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueState" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the state of the Femto Awareness API Queue.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Ready"/>
+            <enumeration value="Flushed"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="QueueNum" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of requests waiting in the Femto Awareness API Queue.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueReceived" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the Femto Awareness API Queue that have been received. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueDiscarded" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the Femto Awareness API Queue that have been discarded. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Monitoring.SMS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the Monitoring of the SMS API.
+      </description>
+      <parameter name="APIAvailable" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the SMS API is currently available on this device (the API could be disabled or could have exhausted its resources)..
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="APIUsers" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of Applications using the SMS API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueState" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the state of the SMS API Queue.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Ready"/>
+            <enumeration value="Flushed"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="QueueNum" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of requests waiting in the SMS API Queue.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueReceived" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the SMS API Queue that have been received. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueDiscarded" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the SMS API Queue that have been discarded. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Monitoring.MMS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the Monitoring of the MMS API.
+      </description>
+      <parameter name="APIAvailable" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the MMS API is currently available on this device (the API could be disabled or could have exhausted its resources)..
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="APIUsers" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of Applications using the MMS API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueState" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the state of the MMS API Queue.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Ready"/>
+            <enumeration value="Flushed"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="QueueNum" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of requests waiting in the MMS API Queue.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueReceived" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the MMS API Queue that have been received. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueDiscarded" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the MMS API Queue that have been discarded. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Monitoring.TerminalLocation." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the Monitoring of the TerminalLocation API.
+      </description>
+      <parameter name="APIAvailable" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the TerminalLocation API is currently available on this device (the API could be disabled or could have exhausted its resources)..
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="APIUsers" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of Applications using the Terminal Location API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueState" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the state of the Terminal Location API Queue.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Ready"/>
+            <enumeration value="Flushed"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="QueueNum" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of requests waiting in the Terminal Location API Queue.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueReceived" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the Terminal Location API Queue that have been received. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueDiscarded" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the Terminal Location API Queue that have been discarded. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BulkData." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.5">
+      <description>
+        This object provides bulk data collection capabilities and global collection settings that affect the entire device.
+        Bulk Data utilizes various solutions (e.g., IPDR, HTTP) to collect data from devices and transfer the data to a collection server.
+        The IPDR solution is based on a service specification described in {{bibref|TR-232}}.
+        The HTTP solution is based on transfer mechanisms described in {{bibref|TR-157a10|Annex A}}.
+        The Bulk Data Collection Profiles are measured over a reporting interval (which can be aligned with absolute time) and are made available to the collection server.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.5">
+        <description>
+          Enables or disables all collection profiles.
+          If {{false}}, bulk data will not be collected or reported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.5">
+        <description>
+          Indicates the status of the Bulk Data Collection mechanism.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Enabled">
+              <description>
+                Bulk Data Collection is enabled and working as intended.
+              </description>
+            </enumeration>
+            <enumeration value="Disabled">
+              <description>
+                Bulk Data Collection is disabled.
+              </description>
+            </enumeration>
+            <enumeration value="Error" optional="true">
+              <description>
+                Bulk Data Collection is enabled, but there is an error condition preventing the successful collection of bulk data.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MinReportingInterval" access="readOnly" dmr:version="2.5">
+        <description>
+          Minimum reporting interval in {{units}} that the CPE is capable of supporting.
+          A value of 0 indicates no minimum reporting interval.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Protocols" access="readOnly" dmr:version="2.5">
+        <description>
+          Represents the IPDR and transport protocols that this device is capable of supporting.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="Streaming">
+              <description>
+                IPDR Streaming Protocol {{bibref|IPDR-SP}}
+              </description>
+            </enumeration>
+            <enumeration value="File">
+              <description>
+                IPDR File Transfer Protocol {{bibref|IPDR-FTP}}
+              </description>
+            </enumeration>
+            <enumeration value="HTTP">
+              <description>
+                Hypertext Transfer Protocol {{bibref|RFC2616}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EncodingTypes" access="readOnly" dmr:version="2.5">
+        <description>
+          Represents the Encoding Types for the protocols that this device is capable of supporting.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="XML">
+              <description>
+                Used with the IPDR Streaming and File Protocols. {{bibref|IPDR-XML}}
+              </description>
+            </enumeration>
+            <enumeration value="XDR">
+              <description>
+                Used with the IPDR Streaming and File Protocols. {{bibref|IPDR-XDR}}
+              </description>
+            </enumeration>
+            <enumeration value="CSV">
+              <description>
+                Comma Separated Values. Used with the HTTP Protocol. {{bibref|RFC4180}}
+              </description>
+            </enumeration>
+            <enumeration value="JSON">
+              <description>
+                JavaScript Object Notation. Used with the HTTP Protocol {{bibref|RFC7159}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ParameterWildCardSupported" access="readOnly" dmr:version="2.10">
+        <description>
+          When {{true}}, the Device supports the use of wildcards to determine the parameters that are reported using a Profile.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxNumberOfProfiles" access="readOnly" dmr:version="2.5">
+        <description>
+          The maximum number of profiles that can exist at any given time.  Specifically, the maximum number of {{object|Profile.{i}.}} instances that the ACS can create.
+          If the value of this parameter is -1, then it means that the CPE doesn't have a limit to the number of profiles that can exist.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="MaxNumberOfParameterReferences" access="readOnly" dmr:version="2.5">
+        <description>
+          The maximum number of parameters that can be referenced via the bulk data collection mechanism.  Specifically, the maximum number of parameters that can be referenced via {{param|Profile.{i}.Parameter.{i}.Reference}} across all Profile and Parameter instances (including the expansion of partial paths within the Reference parameter).
+          If the value of this parameter is -1, then it means that the CPE doesn't have a limit to the number of parameter that can be referenced via the bulk data collection mechanism.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ProfileNumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BulkData.Profile.{i}." access="readWrite" numEntriesParameter="ProfileNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.5">
+      <description>
+        A set of Bulk Data Collection profiles.
+        Each profile represents a bulk data report, including its own timing configuration, communications configuration, and set of parameters.  This allows the ACS to configure multiple reports to be generated at different times for different sets of data.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.5">
+        <description>
+          Enables or disables this specific bulk data profile.
+          If {{false}}, this profile will not be collected or reported.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.5">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          The name of the profile.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfRetainedFailedReports" access="readWrite" dmr:version="2.10">
+        <description>
+          The number of failed reports to be retained and transmitted (in addition to the current report) at the end of the current reporting interval.
+          If the value of the {{param|EncodingType}} parameter is modified any outstanding failed reports are deleted.
+          If the CPE cannot retain the number of failed reports from previous reporting intervals while transmitting the report of the current reporting interval, then the oldest failed reports are deleted until the CPE is able to transmit the report from the current reporting interval.
+          A value of 0 indicates that failed reports are not to be retained for transmission in the next reporting interval.
+          A value of -1 indicates that the CPE will retain as many failed reports as possible.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.5">
+        <description>
+          The Bulk Data Protocol being used for this collection profile.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="#.Protocols"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EncodingType" access="readWrite" dmr:version="2.5">
+        <description>
+          The Bulk Data encoding type being used for this collection profile.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="#.EncodingTypes"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ReportingInterval" access="readWrite" dmr:version="2.5">
+        <description>
+          The reporting interval in {{units}}. Each report is generated based on this interval and {{param|TimeReference}}.
+          The CPE MAY reject a request to set {{param}} to less than {{param|#.MinReportingInterval}}.
+          Reporting intervals MUST begin every {{param}} {{units}}.
+          If {{param}} is changed while collection is enabled, the first reporting interval begins immediately.
+          For example, if {{param}} is 86400 (a day) and if {{param|TimeReference}} is set to UTC midnight on some day (in the past, present, or future) then the CPE will generate (and transmit, if the {{param|Protocol}} parameter is set to {{enum|Streaming|#.Protocols}}) its report at midnight every 24 hours.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="86400"/>
+        </syntax>
+      </parameter>
+      <parameter name="TimeReference" access="readWrite" dmr:version="2.5">
+        <description>
+          An absolute time reference in UTC to determine when will be transmitted.  Each reporting interval MUST complete at this reference time plus or minus an integer multiple of {{param|ReportingInterval}}, unless unable to due to higher prioritized operations.
+          {{param}} is used only to set the "phase" of the reporting intervals.  The actual value of {{param}} can be arbitrarily far into the past or future.
+          If {{param}} is changed while collection of bulk data is enabled, the first reporting interval begins immediately.
+          The Unknown Time value as defined in {{bibref|TR-106a2}} 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 reporting intervals.
+          If absolute time is not available to the CPE, its reporting interval behavior MUST be the same as if the {{param}} parameter was set to the Unknown Time value.
+          For example, if {{param|ReportingInterval}} is 86400 (a day) and if {{param}} is set to UTC midnight on some day (in the past, present, or future) then the CPE will generate (and transmit, if in a "ITPush" mode) its report at midnight every 24 hours.
+          Note that, if {{param}} is set to a time other than the Unknown Time, the first reporting interval (which has to begin immediately) will almost certainly be shorter than {{param|ReportingInterval}}).  This is why {{param}} is defined in terms of when reporting intervals complete rather than start.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="0001-01-01T00:00:00Z"/>
+        </syntax>
+      </parameter>
+      <parameter name="StreamingHost" access="readWrite" dmr:version="2.5">
+        <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}}).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="StreamingPort" access="readWrite" dmr:version="2.5">
+        <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}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="4737"/>
+        </syntax>
+      </parameter>
+      <parameter name="StreamingSessionID" access="readWrite" dmr:version="2.5">
+        <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}}).
+          An ACS 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'.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="48" maxInclusive="57"/>
+            <range minInclusive="65" maxInclusive="90"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FileTransferURL" access="readWrite" dmr:version="2.5">
+        <description>
+          This is the URL 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}}).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FileTransferUsername" access="readWrite" dmr:version="2.5">
+        <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}}).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FileTransferPassword" access="readWrite" dmr:version="2.5">
+        <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}}).
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ControlFileFormat" access="readWrite" dmr:version="2.5">
+        <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.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ParameterNumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BulkData.Profile.{i}.Parameter.{i}." access="readWrite" numEntriesParameter="ParameterNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.5" dmr:noUniqueKeys="true">
+      <description>
+        Bulk data parameter table.
+        Each entry in this table represents a parameter (or set of parameters if a partial path is provided) to be collected and reported.
+      </description>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          Name of the parameter in the report body.
+          If the value of this parameter is {{empty}}, then the value of the {{param|Reference}} parameter is used as the name.
+          When the value {{param|Reference}} parameter contains wildcards and/or partial parameter names, the rules for determining the value of this parameter are specified in {{bibref|TR-157a10|Annex A.3.2.1}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Reference" access="readWrite" dmr:version="2.5">
+        <description>
+          Represents the parameter(s) that are part of this Bulk Data collection profile. The value MUST be a path name of a parameter or an object.
+          When the {{param|##.ParameterWildCardSupported}} parameter has a value of {{true}}, patterns for instance identifiers are permitted with wildcards (an "*" character) in place of instance identifiers; any attempt to set the value otherwise MUST be rejected by the CPE.
+          In the case where a partial parameter path is specified, the sub-objects of the resolved pattern and contained parameters will be part of the bulk data collected and reported. If the path name refers to an object then it MUST end with a '.'.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetType="any"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BulkData.Profile.{i}.CSVEncoding." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10">
+      <description>
+        This object defines the properties to be used when the {{object|##.Profile}} object's {{param|#.EncodingType}} parameter value is {{enum|CSV|##.EncodingTypes}}.
+      </description>
+      <parameter name="FieldSeparator" access="readWrite" dmr:version="2.10">
+        <description>
+          Field separator to use when encoding CSV data.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value=","/>
+        </syntax>
+      </parameter>
+      <parameter name="RowSeparator" access="readWrite" dmr:version="2.10">
+        <description>
+          Row separator to use when encoding CSV data.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value="&#13;&#10;"/>
+        </syntax>
+      </parameter>
+      <parameter name="EscapeCharacter" access="readWrite" dmr:version="2.10">
+        <description>
+          Escape character to use when encoding CSV data.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value="&quot;"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReportFormat" access="readWrite" dmr:version="2.10">
+        <description>
+          This parameter describes the formatting used for reports defined by this profile as described in {{bibref|TR-157a10|Annex A.3.4}}.
+          Note: This parameter is encoded as a token in the BBF-Report-Format header field and MUST NOT include spaces or other characters excluded from token characters defined in {{bibref|RFC2616}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ParameterPerRow">
+              <description>
+                Reports are formatted with each parameter formatted as a row entry.
+              </description>
+            </enumeration>
+            <enumeration value="ParameterPerColumn">
+              <description>
+                Reports are formatted with each parameter formatted as a column entry.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="ParameterPerColumn"/>
+        </syntax>
+      </parameter>
+      <parameter name="RowTimestamp" access="readWrite" dmr:version="2.10">
+        <description>
+          The format of the timestamp to use for data inserted into the row.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Unix-Epoch">
+              <description>
+                Timestamp is inserted using the UNIX epoch time (milliseconds since Jan 1, 1970 UTC) timestamp format. If the CPE is unable to acquire a time, then the time that has elapsed since the last reboot of the device is used.
+              </description>
+            </enumeration>
+            <enumeration value="ISO-8601">
+              <description>
+                Timestamp is inserted using the ISO-8601 timestamp format. If the CPE is unable to acquire a time, then the processing described by the dateTime type in {{bibref|TR-069|Table 12}} is followed.
+              </description>
+            </enumeration>
+            <enumeration value="None">
+              <description>
+                Timestamp is not inserted in the row.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Unix-Epoch"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BulkData.Profile.{i}.JSONEncoding." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10">
+      <description>
+        This object defines the properties to be used when the {{object|##.Profile}} object's {{param|#.EncodingType}} parameter value is {{enum|JSON|##.EncodingTypes}}.
+      </description>
+      <parameter name="ReportFormat" access="readWrite" dmr:version="2.10">
+        <description>
+          This parameter describes the formatting used for the report as described in {{bibref|TR-157a10|Annex A.3.5}}.
+          Note: This parameter is encoded as a token in the BBF-Report-Format header field and MUST NOT include spaces or other characters excluded from token characters defined in {{bibref|RFC2616}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ObjectHierarchy">
+              <description>
+                Reports are formatted with each object in the object hierarchy of the data model encoded as a corresponding hierarchy of JSON Objects with the parameters of the object specified as name/value pairs of the JSON Object.
+              </description>
+            </enumeration>
+            <enumeration value="NameValuePair">
+              <description>
+                Reports are formatted with each parameter of the data model encoded as a corresponding array of JSON Objects with the parameters specified as name/value pairs.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="ObjectHierarchy"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReportTimestamp" access="readWrite" dmr:version="2.10">
+        <description>
+          The format of timestamp to use for the JSON Object named "CollectionTime" as described in {{bibref|TR-157a10}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Unix-Epoch">
+              <description>
+                Timestamp is inserted using the UNIX epoch time (milliseconds since Jan 1, 1970 UTC) timestamp format. If the CPE is unable to acquire a time, then the time that has elapsed since the last reboot of the device is used.
+              </description>
+            </enumeration>
+            <enumeration value="ISO-8601">
+              <description>
+                Timestamp is inserted using the ISO-8601 timestamp format. If the CPE is unable to acquire a time, then the processing described by the dateTime type in {{bibref|TR-069|Table 12}} is followed.
+              </description>
+            </enumeration>
+            <enumeration value="None">
+              <description>
+                Timestamp is not inserted.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Unix-Epoch"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BulkData.Profile.{i}.HTTP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10">
+      <description>
+        This object defines the properties to be used when transporting bulk data using the HTTP/HTTPS protocol. This object is used when the {{param|#.Protocol}} parameter has a value of {{enum|HTTP|##.Protocols}}. For authentication purposes the CPE MUST support HTTP Basic and Digest Access Authentication as defined in {{bibref|RFC2616}}.
+      </description>
+      <parameter name="URL" access="readWrite" dmr:version="2.10">
+        <description>
+          The URL, as defined in {{bibref|RFC3986}}, for the collection server to receive the Bulk Data transmitted by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.10">
+        <description>
+          Username used to authenticate the CPE when making a connection to the collection server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.10">
+        <description>
+          Password used to authenticate the CPE when making a connection to the collection server.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CompressionsSupported" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the HTTP Compression mechanism(s) supported by this CPE for the purposes of transferring bulk data.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="GZIP">
+              <description>
+                As defined in {{bibref|RFC2616|Section 3.5}}
+              </description>
+            </enumeration>
+            <enumeration value="Compress">
+              <description>
+                As defined in {{bibref|RFC2616|Section 3.5}}
+              </description>
+            </enumeration>
+            <enumeration value="Deflate">
+              <description>
+                As defined in {{bibref|RFC2616|Section 3.5}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Compression" access="readWrite" dmr:version="2.10">
+        <description>
+          The value of this parameter represents the HTTP Compression mechanism to be used by the CPE when transferring data to the collection server.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="CompressionsSupported" nullValue="None"/>
+          </string>
+          <default type="object" value="None"/>
+        </syntax>
+      </parameter>
+      <parameter name="MethodsSupported" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the HTTP method(s) supported by this CPE for the purposes of transferring bulk data.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="POST">
+              <description>
+                As defined in {{bibref|RFC2616|Section 9.5}}
+              </description>
+            </enumeration>
+            <enumeration value="PUT">
+              <description>
+                As defined in {{bibref|RFC2616|Section 9.6}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Method" access="readWrite" dmr:version="2.10">
+        <description>
+          The value of this parameter represents the HTTP method to be used by the CPE when transferring data to the collection server.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="MethodsSupported"/>
+          </string>
+          <default type="object" value="POST"/>
+        </syntax>
+      </parameter>
+      <parameter name="UseDateHeader" access="readWrite" dmr:version="2.10">
+        <description>
+          When {{true}}, the CPE encodes the HTTP Date Header {{bibref|RFC2616|Section 14.18}} in the HTTP client request.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="RetryEnable" access="readWrite" dmr:version="2.10">
+        <description>
+          When {{true}}, the CPE retries unsuccessful attempts to transfer data.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="RetryMinimumWaitInterval" access="readWrite" dmr:version="2.10">
+        <description>
+          Configures the data transfer retry wait interval, in seconds, as specified in {{bibref|TR-157a10|Annex A.2.2.1}}.
+          The device MUST use a random value between {{param}}  and ({{param}} * {{param|RetryIntervalMultiplier}} / 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"/>
+          </unsignedInt>
+          <default type="object" value="5"/>
+        </syntax>
+      </parameter>
+      <parameter name="RetryIntervalMultiplier" access="readWrite" dmr:version="2.10">
+        <description>
+          Configures the retry interval multiplier as specified in {{bibref|TR-157a10|Annex A.2.2.1}}.
+          This value is expressed in units of 0.001.  Hence the values of the multiplier range between 1.000 and 65.535.
+          The device MUST use a random value between {{param|RetryMinimumWaitInterval}}  and ({{param|RetryMinimumWaitInterval}} * {{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="RequestURIParameterNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PersistAcrossReboot" access="readWrite" dmr:version="2.12">
+        <description>
+          Determines whether or not data transfers that have failed are required to be persisted across reboots.
+          If {{param}} is {{true}}, then failed data transfers MUST be persisted across reboots.
+          If {{param}} is {{false}}, then failed data transfers are not required to be persisted across reboots.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BulkData.Profile.{i}.HTTP.RequestURIParameter.{i}." access="readWrite" numEntriesParameter="RequestURIParameterNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.10" dmr:noUniqueKeys="true">
+      <description>
+        This object represents an instance of a parameter to be used in the report header used as part of the HTTP Request-URI transmitted by the CPE to the collection server using the Request-URI in addition to the parameters required by {{bibref|TR-157a10|Annex A.2.1}}.
+      </description>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          Name of the Request-URI parameter.
+          If {{param}} is {{empty}}, the name of the Request-URI parameter is the value of {{param|Reference}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Reference" access="readWrite" dmr:version="2.10">
+        <description>
+          The value MUST be the path name of a parameter to be used as the Request-URI parameter.
+          If the value of this parameter is empty, then this object is not encoded in the report header.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.XMPP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        The {{object}} represents the XMPP capabilities of the device as described in {{bibref|TR-069a5|Appendix III}}.
+      </description>
+      <parameter name="ConnectionNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedServerConnectAlgorithms" access="readOnly" dmr:version="2.11">
+        <description>
+          The algorithms supported by the CPE for resolving XMPP server addresses and ports. {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="DNS-SRV">
+              <description>
+                Use the preferred connection algorithm as specified in {{bibref|RFC6120|Section 3.2.1}} where the value of the {{param|Connection.{i}.Domain}} parameter is used to look up the server address and port to use.
+              </description>
+            </enumeration>
+            <enumeration value="DNS">
+              <description>
+                Use the fallback connection mechanism as specified in {{bibref|RFC6120|Section 3.2.2}}, where the value of the {{param|Connection.{i}.Domain}} parameter is used to look up the server address, and the port is the ''xmpp-client'' port (5222).
+              </description>
+            </enumeration>
+            <enumeration value="ServerTable">
+              <description>
+                Use the instances of the {{object|Connection.{i}.Server}} table based on the values of the {{param|Connection.{i}.Server.{i}.Priority}} and {{param|Connection.{i}.Server.{i}.Weight}} parameters as the basis for reconnect. Instances MUST be reachable and reachable instances with the lowest value MUST be preferred.
+              </description>
+            </enumeration>
+            <enumeration value="WebSocket">
+              <description>
+                Use the discovery and connection algorithm as specified in {{bibref|RFC7395|Section 4}} where the value of the {{param|Connection.{i}.Domain}} parameter is used to create a secure HTTP request to discover the URL to use for the XMPP over WebSocket connection.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.XMPP.Connection.{i}." access="readWrite" numEntriesParameter="ConnectionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        The {{object}} represents a XMPP connection between the device and a server. The {{param|Username}}, {{param|Domain}} and {{param|Resource}} comprise the full identity (JabberID) of this {{object}} for this device.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Username"/>
+        <parameter ref="Domain"/>
+        <parameter ref="Resource"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables this {{object}}.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.7">
+        <description>
+          The proposed local-part of the Jabber ID of this {{object}}, and the value to be used to authenticate this {{object}} when making a connection to the Server using the procedure outlined in {{bibref|RFC6120|Section 6}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.7">
+        <description>
+          Password used to authenticate this {{object}} when making a connection to the {{object|Server}} using the procedure outlined in {{bibref|RFC6120|Section 6}}.
+          Note that on a factory reset of the CPE, the value of this parameter might be reset to its factory value.  If an ACS modifies the  value of this parameter, it SHOULD be prepared to accommodate the situation that the original value is restored as the result of a  factory reset.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Domain" access="readWrite" dmr:version="2.7">
+        <description>
+          The proposed domain-part of the Jabber ID of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Resource" access="readWrite" dmr:version="2.7">
+        <description>
+          The proposed resource-part of the Jabber ID of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="JabberID" access="readOnly" dmr:version="2.7">
+        <description>
+          The complete Jabber ID as determined by the first-hop XMPP server at time of connection establishment.  This Jabber ID will usually be the standard concatentation of the local-part (Username), domain-part (Domain), and resource-part (Resource) as defined in {{bibref|RFC6120|Section 2.1}} (local-part@domain-part/resource-part), but since the Jabber ID is owned by the first-hop XMPP Server there are cases where the value will be different.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.7">
+        <description>
+          The current operational state of this {{object}} (see {{bibref|TR-181i2|Section 4.2.2}}).  {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Disabled}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Enabled}} if and only if the interface is able to transmit and receive PDUs; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Enabled}} if still operable when the expected actions have completed);  it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Enabled"/>
+            <enumeration value="Disabled"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="Connecting"/>
+            <enumeration value="ServerNotPresent"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error_AuthenticationFailure"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChangeDate" access="readOnly" dmr:version="2.7">
+        <description>
+          The date and time at which this {{object}} entered into its current operational state.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerConnectAlgorithm" access="readWrite" dmr:version="2.7">
+        <description>
+          The algorithm the {{object}} uses when connecting with the associated lists of servers.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="#.SupportedServerConnectAlgorithms"/>
+          </string>
+          <default type="object" value="DNS-SRV"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveInterval" access="readWrite" dmr:version="2.7">
+        <description>
+          The number of {{units}} that keep alive events as specified in {{bibref|RFC6120|Section 4.6.1}} are sent by this {{object}}.
+          A value of 0 disables the keep alive functionality. A value of -1 indicates that the keep alive interval is a vendor specific implementation.
+          {{bibref|RFC6120|Section 4.6.4}} recommends not checking more frequently than every 5 minutes (or 300 {{units}}).
+        </description>
+        <syntax>
+          <long>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </long>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerConnectAttempts" access="readWrite" dmr:version="2.7">
+        <description>
+          The number of times that this {{object}} attempts to connect to a given IP address before moving on to the current server's next IP address, or to the next server if the current server has no more IP addresses.
+          If {{param}}, {{param|ServerRetryInitialInterval}}, {{param|ServerRetryIntervalMultiplier}} and {{param|ServerRetryMaxInterval}} all have their default values, the maximum reconnection wait intervals, in ''minutes'', will be ''{1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 512, 512, 512, 512, 512}''.  After the initial attempt there are 15 further attempts, making a total of 16.  The maximum reconnection wait interval is reached on the 10th retry, i.e. the 11th attempt.
+          NOTE: If this {{object}} fails to connect to any of the servers' IP addresses, fallback behavior SHOULD be as specified in {{bibref|RFC6120|Section 3.2}}.
+          NOTE: If the value of this parameter is 0, server connection and reconnection behavior is implementation-dependent.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="16"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerRetryInitialInterval" access="readWrite" dmr:version="2.7">
+        <description>
+          The maximum first reconnection wait interval, in {{units}}, as specified in {{bibref|TR-069a5|Annex K XMPP Connection Request}}.
+          The Device MUST use a random value between ''0'' and {{param}} as the first reconnection wait interval.
+          NOTE: If the value of the {{param|ServerConnectAttempts}} parameter is 0, the value of this parameter is ignored.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="60"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerRetryIntervalMultiplier" access="readWrite" dmr:version="2.7">
+        <description>
+          The reconnection interval multiplier as specified in {{bibref|TR-069a5|Annex K XMPP Connection Request}}. This value is expressed in units of 0.001. Hence the values of the multiplier range between 1.000 and 65.535.
+          For the ''n''th reconnection wait interval, the Device MUST use a random value, in ''seconds'', between ''0'' and {{param|ServerRetryInitialInterval}} * ({{param}} / 1000) ** (''n'' - ''1'').
+          NOTE: If the value of the {{param|ServerConnectAttempts}} parameter is 0, the value of this parameter is ignored.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1000" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="2000"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerRetryMaxInterval" access="readWrite" dmr:version="2.7">
+        <description>
+          The maximum reconnection wait interval, in {{units}}.
+          If the ''n''th reconnection wait interval calculated from {{param|ServerRetryInitialInterval}} and {{param|ServerRetryIntervalMultiplier}} exceeds the value of this parameter, then the Device MUST use the value of this parameter as the next reconnection wait interval.
+          NOTE: If the value of the {{param|ServerConnectAttempts}} parameter is 0, the value of this parameter is ignored.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="30720"/>
+        </syntax>
+      </parameter>
+      <parameter name="UseTLS" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter allows an ACS to configure whether or not this XMPP Connection is required to use TLS independent of whether or not the XMPP Server that is being connected to is configured for TLS "mandatory-to-negotiate".
+          If the value of {{param}} is {{true}} then the CPE will initiate TLS negotiation if not required to by the XMPP Server.
+          If the value of {{param}} is {{false}} then the CPE will not initiate TLS negotiation if not required to by the XMPP Server.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="TLSEstablished" access="readOnly" dmr:version="2.7">
+        <description>
+          This parameter represents the TLS state of this XMPP Connection.
+          If this XMPP Connection is established and is secured by TLS then the value of this parameter is {{true}}.
+          If this XMPP Connection is either not established or established but not secured by TLS then the value of this parameter is {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.XMPP.Connection.{i}.Server.{i}." access="readWrite" numEntriesParameter="ServerNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        The {{object}} represents an XMPP server to be used for a {{object|##.Connection}}.
+        This table is only relevant when {{param|##.Connection.{i}.ServerConnectAlgorithm}} is set to {{enum|ServerTable|##.Connection.{i}.ServerConnectAlgorithm}}.  If {{param|##.Connection.{i}.ServerConnectAlgorithm}} is set to {{enum|DNS-SRV|##.Connection.{i}.ServerConnectAlgorithm}} then any instances of this table are ignored by this {{object|##.Connection}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="ServerAddress"/>
+        <parameter ref="Port"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables this {{object}}.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Priority" access="readWrite" dmr:version="2.7">
+        <description>
+          The priority of this {{object}} that is used by the {{object|##.Connection}} when determining the {{object}} to connect. The {{object|##.Connection}} MUST contact the {{object}} with the lowest-numbered priority that the {{object|##.Connection}} can reach as defined in {{bibref|RFC2782}}. The selection of {{object}}s with the same {{param}} value utilizes the {{param|Weight}} parameter to determine which {{object}} is selected by the {{object|##.Connection}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Weight" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter specifies a relative weight for entries with the same {{param|Priority}}. The mechanism is defined in {{bibref|RFC2782}}. A value of -1 indicates that the implementation of this parameter is specific to the Vendor.
+        </description>
+        <syntax>
+          <long>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </long>
+        </syntax>
+      </parameter>
+      <parameter name="ServerAddress" access="readWrite" dmr:version="2.7">
+        <description>
+          Fully Qualified Domain Name (FQDN) or IP address of the XMPP server for this {{object|##.Connection}}.
+          If the value of this Parameter is a FQDN that resolves to multiple addresses then each address SHOULD be attemtped (in an implemnetation-specific order) until a connection can be made or all addresses are exhausted, in which case the next {{object}} instance (based on {{param|Priority}} and {{param|Weight}}) SHOULD be used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.7">
+        <description>
+          Port number of the XMPP server for this {{object|##.Connection}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="5222"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.XMPP.Connection.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        XMPP Connection statistics information for this resource.
+      </description>
+      <parameter name="ReceivedMessages" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of XMPP stanzas (iq, presence, or message) that have been received on this {{object|##.Connection}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedMessages" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of XMPP stanzas (iq, presence, or message) that have been transmitted by this {{object|##.Connection}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedErrorMessages" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of XMPP stanzas (iq, presence, or message) that have been received on this {{object|##.Connection}} where the type attribute had a value of "error".
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedErrorMessages" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of XMPP stanzas (iq, presence, or message) that have been transmitted by this {{object|##.Connection}} where the type attribute had a value of "error".
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object represents the management functions for the 1905 capabilities as defined in {{bibref|IEEE1905.1a}}.
+      </description>
+      <parameter name="Version" access="readOnly" dmr:version="2.9">
+        <description>
+          1905 profile version number of the AL as would be sent in a Higher Layer response message as defined in {{bibref|IEEE1905.1a|Table 6-37: 1905 profile version TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="1905.1"/>
+            <enumeration value="1905.1a"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object represents the management functions for the 1905 Abstraction Layer as defined in {{bibref|IEEE1905.1a|Section 4.4 Abstraction Layer}}.
+      </description>
+      <parameter name="IEEE1905Id" access="readOnly" dmr:version="2.9">
+        <description>
+          1905 AL MAC Address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.9">
+        <description>
+          The current operational state of the 1905 Abstraction Layer. {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Up">
+              <description>
+                NOT RECOMMENDED for use; if used it  means {{enum|Enabled}}
+              </description>
+            </enumeration>
+            <enumeration value="Down">
+              <description>
+                NOT RECOMMENDED for use; if used it  means {{enum|Disabled}}
+              </description>
+            </enumeration>
+            <enumeration value="Unknown">
+              <description>
+                NOT RECOMMENDED for use; if used it  means {{enum|Error}}
+              </description>
+            </enumeration>
+            <enumeration value="Dormant">
+              <description>
+                NOT RECOMMENDED for use; if used it  means {{enum|Error}}
+              </description>
+            </enumeration>
+            <enumeration value="NotPresent">
+              <description>
+                NOT RECOMMENDED for use; if used it  means {{enum|Error}}
+              </description>
+            </enumeration>
+            <enumeration value="LowerLayerDown">
+              <description>
+                NOT RECOMMENDED for use; if used it  means {{enum|Error}}
+              </description>
+            </enumeration>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          This parameter is NOT RECOMMENDED to be used because IEEE1905 is not an interface.  The accumulated time in {{units}} since the 1905 Abstraction Layer entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readOnly" dmr:version="2.9">
+        <description>
+          This parameter is NOT RECOMMENDED to be used because IEEE1905 is not an interface.  {{list}} {{reference}} See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetParent="#.AL.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RegistrarFreqBand" access="readOnly" dmr:version="2.9">
+        <description>
+          {{list}} See {{bibref|IEEE1905.1a|Table 6-25: SupportedFreqBand TLV}}. {{enum}}
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <enumeration value="802.11 2.4 GHz"/>
+            <enumeration value="802.11 5 GHz"/>
+            <enumeration value="802.11 60 GHz"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        The 1905 interface table (described in {{bibref|IEEE1905.1a|sub-clause 5 Abstraction Layer Management}}).
+      </description>
+      <uniqueKey>
+        <parameter ref="InterfaceId"/>
+      </uniqueKey>
+      <parameter name="InterfaceId" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of this interface.  This is the value of the intfAddress parameter defined in {{bibref|IEEE1905.1a|Table 5-2: intfDescriptor elements}}
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.9">
+        <description>
+          This parameter is NOT RECOMMENDED to be used because it is not a parameter defined in a 1905 ALME primitive or protocol TLV.  The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          It SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD normally be {{enum|Down}} when the interface cannot transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          This parameter is NOT RECOMMENDED to be used because it is not a parameter defined in a 1905 ALME primitive or protocol TLV.  The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readOnly" dmr:version="2.9">
+        <description>
+          This parameter is NOT RECOMMENDED to be used because it is not a parameter defined in a 1905 ALME primitive or protocol TLV.  {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceStackReference" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Path name of an interface object described by this 1905 {{object}}. Referenced interface object MUST have a MACAddress and the InterfaceId MUST be the same as the interface object MACAddress.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MediaType" access="readOnly" dmr:version="2.9">
+        <description>
+          Media type of this {{object}}. This is derived from the value of the intfType parameter defined in {{bibref|IEEE1905.1a|Tables 5.2: intfDescriptor elements}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IEEE 802.3u">
+              <description>
+                IEEE 802.3u Fast Ethernet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.3ab">
+              <description>
+                IEEE 802.3ab Gigabit Ethernet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11b">
+              <description>
+                IEEE 802.11b (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11g">
+              <description>
+                IEEE 802.11g (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11a">
+              <description>
+                IEEE 802.11a (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11n 2.4">
+              <description>
+                IEEE 802.11n (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11n 5.0">
+              <description>
+                IEEE 802.11n (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11ac">
+              <description>
+                IEEE 802.11ac (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11ad">
+              <description>
+                IEEE 802.11ad (60GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11af">
+              <description>
+                IEEE 802.11af
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 1901 Wavelet">
+              <description>
+                IEEE 1901 Wavelet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 1901 FFT">
+              <description>
+                IEEE 1901 FFT
+              </description>
+            </enumeration>
+            <enumeration value="MoCAv1.1">
+              <description>
+                MoCAv1.1
+              </description>
+            </enumeration>
+            <enumeration value="Generic PHY"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyOUI" access="readOnly" dmr:version="2.9">
+        <description>
+          OUI of the Generic Phy networking technology of the local interface that would be included in a Generic Phy Device Information Type TLV defined in {{bibref|IEEE1905.1a|Tables 6-29: Generic Phy Device Information type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyVariant" access="readOnly" dmr:version="2.9">
+        <description>
+          Variant Index of the Generic Phy networking technology of the local interface that would be included in a Generic Phy Device Information Type TLV defined in {{bibref|IEEE1905.1a|Tables 6-29: Generic Phy Device Information type TLV}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="1" maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyURL" access="readOnly" dmr:version="2.9">
+        <description>
+          URL to Generic Phy XML Description of the Generic Phy networking technology of the local interface that would be included in a Generic Phy Device Information Type TLV defined in {{bibref|IEEE1905.1a|Table 6-29: Generic Phy device information type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SetIntfPowerStateEnabled" access="readWrite" dmr:version="2.9">
+        <description>
+          Enables or disables the Abstraction Layer's ability to set the power state for the interface. Boolean can be {{true}} for "enabled" and {{false}} for "disabled".
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PowerState" access="readWrite" dmr:version="2.9">
+        <description>
+          The Power State of this {{object}}. This is derived from the value of the powerState parameter as defined in {{bibref|IEEE1905.1a|Tables 5.3: ALME-SET-INTF-PWR-STATE.request parameters and Table 5.7: ALME-GET-INTF-PWR-STATE.response parameters}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="On"/>
+            <enumeration value="Power_Save">
+              <description>
+                not used when written
+              </description>
+            </enumeration>
+            <enumeration value="Off"/>
+            <enumeration value="Unsupported">
+              <description>
+                not used when written
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorPropertiesNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LinkNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.Interface.{i}.VendorProperties.{i}." access="readOnly" numEntriesParameter="VendorPropertiesNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        This object defines the vendor specific properties (vendorSpecificInfo field) of this {{object|##.Interface}} as defined in {{bibref|IEEE1905.1a|Table 5-2: intfDescriptor elements}}.
+      </description>
+      <parameter name="OUI" access="readOnly" dmr:version="2.9">
+        <description>
+          Organizationally unique identifier of a manufacturer of this {{object|##.Interface}}.  Represented as a six hexadecimal-digit value using all upper-case letters and including any leading zeros according to {{bibref|IEEE1905.1a|Table 5-20: VendorSpecificInfo information element}}.  {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Information" access="readOnly" dmr:version="2.9">
+        <description>
+          A hexbinary string used to to provide vendor specific information about this {{object|##.Interface}}. This is the value of the vendorSpecificInfo parameter defined in {{bibref|IEEE1905.1a|Table 5-20: VendorSpecificInfo information element}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.Interface.{i}.Link.{i}." access="readOnly" numEntriesParameter="LinkNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object defines the 1905 neighbors and link properties.
+      </description>
+      <uniqueKey>
+        <parameter ref="InterfaceId"/>
+        <parameter ref="IEEE1905Id"/>
+      </uniqueKey>
+      <parameter name="InterfaceId" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of the interface of the Neighbor for this {{object}}. This value comes from the neighbor’s Topology discovery message as defined in {{bibref|IEEE1905.1a|Table 6-9: MAC address typeTLV}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="IEEE1905Id" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of the 1905 AL entity of the Neighbor device on this {{object}}. This value comes from the neighbor’s Topology discovery message as defined in {{bibref|IEEE1905.1a|Table 6-8: AL MAC address type TLV}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MediaType" access="readOnly" dmr:version="2.9">
+        <description>
+          Media type of this {{object}}. This value is derived from the neighbor’s Topology response message 1905 device information type TLV Media Type field as defined in {{bibref|IEEE1905.1a|Table 6-12: Media type}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IEEE 802.3u">
+              <description>
+                IEEE 802.3u Fast Ethernet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.3ab">
+              <description>
+                IEEE 802.3ab Gigabit Ethernet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11b">
+              <description>
+                IEEE 802.11b (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11g">
+              <description>
+                IEEE 802.11g (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11a">
+              <description>
+                IEEE 802.11a (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11n 2.4">
+              <description>
+                IEEE 802.11n (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11n 5.0">
+              <description>
+                IEEE 802.11n (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11ac">
+              <description>
+                IEEE 802.11ac (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11ad">
+              <description>
+                IEEE 802.11ad (60GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11af">
+              <description>
+                IEEE 802.11af
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 1901 Wavelet">
+              <description>
+                IEEE 1901 Wavelet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 1901 FFT">
+              <description>
+                IEEE 1901 FFT
+              </description>
+            </enumeration>
+            <enumeration value="MoCAv1.1">
+              <description>
+                MoCAv1.1
+              </description>
+            </enumeration>
+            <enumeration value="Generic PHY"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyOUI" access="readOnly" dmr:version="2.9">
+        <description>
+          OUI of the Generic Phy networking technology of the interface of the Neighbor for this {{object|#.Link}}. This value is from a Generic Phy response message field as defined in {{bibref|IEEE1905.1a|Tables 6-29: Generic Phy Device Information type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyVariant" access="readOnly" dmr:version="2.9">
+        <description>
+          Variant Index of the Generic Phy networking technology of the interface of the Neighbor for this {{object|#.Link}}. This value is from a Generic Phy response message variant index field as defined in {{bibref|IEEE1905.1a|Tables 6-29: Generic Phy Device Information type TLV}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="1" maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyURL" access="readOnly" dmr:version="2.9">
+        <description>
+          URL to Generic Phy XML Description of the Generic Phy networking technology of the interface of the Neighbor for this {{object|#.Link}}. This value is from a Generic Phy response message URL to Generic Phy field as defined in {{bibref|IEEE1905.1a|Table 6-29: Generic Phy device information type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.Interface.{i}.Link.{i}.Metric." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object represents the metrics for this {{object|##.Link}} as defined in {{bibref|IEEE1905.1a|Tables 6-18: 1905 transmitter link metrics and Table 6-20: 1905 receiver link metrics}}.
+      </description>
+      <parameter name="IEEE802dot1Bridge" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates whether or not the 1905 link includes one or more IEEE 802.1 bridges. If {{false}}, the 1905 link does not include an IEEE 802.1 bridge. If {{true}}, the 1905 link does include one or more IEEE 802.1 bridges.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Estimated number of lost {{units}} on the transmit side of the link {{bibref|IEEE1905.1a|Table 6-18: 1905 transmitter link metrics}} during a measurement period.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Estimated number of lost {{units}} on the receive side of the link {{bibref|IEEE1905.1a|Table 6-20: 1905 receiver link metrics}} during a measurement period.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Estimated number of {{units}} sent to the Neighbor on this {{object|##.Link}}, in the same measurement period used to estimate {{param|PacketErrors}}.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Estimated number of {{units}} received from this Neighbor on this {{object|##.Link}} {{bibref|IEEE1905.1a|Table 6-20: 1905 receiver link metrics}}, in the same measurement period used to estimate {{param|PacketErrors}}.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="MACThroughputCapacity" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The maximum MAC throughput in {{units}} between this {{object|###.Interface}} and the Neighbor on this {{object|##.Link}} that is estimated at this {{object|###.Interface}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mb/s"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LinkAvailability" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The estimated average {{units}} of time that the {{object|##.Link}} is available for data transmissions.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+            <units value="percent"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PHYRate" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The Physical Layer (PHY) rate in {{units}} between this {{object|###.Interface}} and the Neighbor on this {{object|##.Link}} that is estimated at this {{object|###.Interface}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mb/s"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RSSI" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The estimated Received Signal Strength Indicator (RSSI) ratio in {{units}} between this {{object|###.Interface}} and the Neighbor on this {{object|##.Link}} that is estimated at the receive side of this {{object|###.Interface}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+            <units value="dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.ForwardingTable." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object represents the rules to forward PDUs between interfaces within the 1905 Abstraction Layer.
+      </description>
+      <parameter name="SetForwardingEnabled" access="readWrite" dmr:version="2.9">
+        <description>
+          Abstraction Layer ability to set, modify, and remove {{object|ForwardingRule}} entries for interfaces. Boolean can be {{true}} for "enabled" and {{false}} for "disabled".
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingRuleNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.ForwardingTable.ForwardingRule.{i}." access="readWrite" numEntriesParameter="ForwardingRuleNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        The 1905 fowarding rule for the ALME-SET-FWD-RULE.request and ALME-GET-FWD-RULES.response with classification criteria as defined in {{bibref|IEEE1905.1a|Table 5-9: ClassificationSet elements}}.
+      </description>
+      <parameter name="InterfaceList" access="readWrite" dmr:version="2.9">
+        <description>
+          The list of interfaces to which a frame satisfying the following classification criteria should be forwarded (intfAddressList parameter as defined in {{bibref|IEEE1905.1a|Table 5-8: ALME-SET-FWD-RULE.request parameters and Table 5-12: fwdRuleList elements}}). {{list}} Each list item MUST be the path name of an object, which MUST be a row of an {{object|##.Interface}} object. If the referenced item is deleted, the corresponding item MUST be removed from the list. {{noreference}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="##.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="MACDestinationAddress" access="readWrite" dmr:version="2.9">
+        <description>
+          Classification criterion.
+          The destination MAC address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MACDestinationAddressFlag" access="readWrite" dmr:version="2.9">
+        <description>
+          If {{false}}, the classification criterion {{param|MACDestinationAddress}} is ignored.  If {{true}}, the classification criterion {{param|MACDestinationAddress}} is used.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="MACSourceAddress" access="readWrite" dmr:version="2.9">
+        <description>
+          Classification criterion.
+          The source MAC address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MACSourceAddressFlag" access="readWrite" dmr:version="2.9">
+        <description>
+          If {{false}}, the classification criterion {{param|MACSourceAddress}} is ignored.  If {{true}}, the classification criterion {{param|MACSourceAddress}} is used.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="EtherType" access="readWrite" dmr:version="2.9">
+        <description>
+          Classification criterion.
+          Ether Type Field in a frame.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="EtherTypeFlag" access="readWrite" dmr:version="2.9">
+        <description>
+          If {{false}}, the classification criterion {{param|EtherType}} is ignored.  If {{true}}, the classification {{param|EtherType}} is used.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Vid" access="readWrite" dmr:version="2.9">
+        <description>
+          Classification criterion.
+          IEEE 802.1Q VLAN ID in a frame.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="4095"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="VidFlag" access="readWrite" dmr:version="2.9">
+        <description>
+          If {{false}}, the classification criterion {{param|Vid}} is ignored.  If {{true}}, the classification {{param|Vid}} is used.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PCP" access="readWrite" dmr:version="2.9">
+        <description>
+          Classification criterion.
+          IEEE 802.1Q Priority Code Point field.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PCPFlag" access="readWrite" dmr:version="2.9">
+        <description>
+          If {{false}}, the classification criterion {{param|PCP}} is ignored.  If {{true}}, the classification {{param|PCP}} is used.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object represents the 1905 Network Topology capabilities of this device.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.9">
+        <description>
+          Enables or disables the 1905 Network Topology reporting (via TR-069). When {{true}}, the device clears and (re)populates the {{object|IEEE1905Device}} and {{object|ChangeLog}} tables. When {{false}}, the contents of the {{object|IEEE1905Device}} and {{object|ChangeLog}} tables have no meaning.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.9">
+        <description>
+          When {{param|Enable}} is set to {{true}}, this parameter indicates the transient phase of the discovery of the {{object}}.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Incomplete">
+              <description>
+                Indicates that the device is populating the topology object during the transient phase.
+              </description>
+            </enumeration>
+            <enumeration value="Available">
+              <description>
+                Indicates that the transient phase is over and the device is maintaining and updating the topology object as changes occur.
+              </description>
+            </enumeration>
+            <enumeration value="Error_Misconfigured">
+              <description>
+                NOT RECOMMENDED for use; if used, indicates that a necessary configuration value is undefined or invalid.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxChangeLogEntries" access="readWrite" dmr:version="2.9">
+        <description>
+          The maximum number of entries allowed in the {{object|ChangeLog}} table.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" dmr:version="2.9">
+        <description>
+          {{reference}} If the {{object|ChangeLog}} is modified the parameter is modified to reflect the last entry added to the {{object|ChangeLog}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="ChangeLog." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IEEE1905DeviceNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ChangeLogNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.ChangeLog.{i}." access="readOnly" numEntriesParameter="ChangeLogNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        This object represents log entries for changes in the 1905 Network Topology. The Change Log is a First In First Out queue where the oldest entries (defined by values of the {{param|TimeStamp}} parameter) are deleted once the log is full.
+      </description>
+      <parameter name="TimeStamp" access="readOnly" dmr:version="2.9">
+        <description>
+          Date and Time at which the entry was added to the {{object}} table.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EventType" access="readOnly" dmr:version="2.9">
+        <description>
+          Type of event for this entry. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NewNeighbor">
+              <description>
+                Entry represents a discovery of a Neighbor.
+              </description>
+            </enumeration>
+            <enumeration value="LostNeighbor">
+              <description>
+                Entry represents the loss of a Neighbor.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ReporterDeviceId" access="readOnly" dmr:version="2.9">
+        <description>
+          1905 AL MAC Address of device which reported the change.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReporterInterfaceId" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of the interface of the reporting device on which the change has been detected.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="NeighborType" access="readOnly" dmr:version="2.9">
+        <description>
+          Type of Neighbor for this event. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IEEE1905"/>
+            <enumeration value="Non-IEEE1905"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NeighborId" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of the Neighbor of this event. If the value of the {{param|EventType}} parameter is {{enum|NewNeighbor|EventType}}, then the value of this parameter represents the MAC Address of the new Neighbor that joined the network; if the value of the {{param|EventType}} parameter is {{enum|LostNeighbor|EventType}}, then the value of this parameter represents the MAC Address of the Neighbor that left the network.
+          If value of the {{param|NeighborType}} parameter is {{enum|IEEE1905|NeighborType}}, then the value of this parameter is the 1905 AL MAC Address of the Neighbor.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}." access="readOnly" numEntriesParameter="IEEE1905DeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object represents an instance of discovered 1905 Devices in the network (received Topology discovery message as defined in {{bibref|IEEE1905.1a|Clause 6.3.1}}).
+      </description>
+      <uniqueKey>
+        <parameter ref="IEEE1905Id"/>
+      </uniqueKey>
+      <parameter name="IEEE1905Id" access="readOnly" dmr:version="2.9">
+        <description>
+          1905 AL MAC Address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.9">
+        <description>
+          1905 profile version number in Higher Layer Response message as defined in {{bibref|IEEE1905.1a|Table 6-37: 1905 profile version TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="1905.1"/>
+            <enumeration value="1905.1a"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RegistrarFreqBand" access="readOnly" dmr:version="2.9">
+        <description>
+          {{list}} of frequency bands identified as supported for a registrar role in an AP-autoconfiguration response message as defined in {{bibref|IEEE1905.1a|Table 6-25: SupportedFreqBand TLV}} {{enum}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <enumeration value="802.11 2.4 GHz"/>
+            <enumeration value="802.11 5 GHz"/>
+            <enumeration value="802.11 60 GHz"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FriendlyName" access="readOnly" dmr:version="2.9">
+        <description>
+          Friendly Name String received in Higher Layer response message as defined in {{bibref|IEEE1905.1a|Table 6-30: Device Identification Type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerName" access="readOnly" dmr:version="2.9">
+        <description>
+          Manufacturer Name String received in Higher Layer response message as defined in {{bibref|IEEE1905.1a|Table 6-30: Device Identification Type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerModel" access="readOnly" dmr:version="2.9">
+        <description>
+          Manufacturer Model String received in Higher Layer response message as defined in {{bibref|IEEE1905.1a|Table 6-30: Device Identification Type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ControlURL" access="readOnly" dmr:version="2.9">
+        <description>
+          Control URL received in Higher Layer response message as defined in defined in {{bibref|IEEE1905.1a|Table 6-31: Control URL Type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorPropertiesNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4AddressNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6AddressNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="NonIEEE1905NeighborNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IEEE1905NeighborNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="L2NeighborNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BridgingTupleNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IPv4Address.{i}." access="readOnly" numEntriesParameter="IPv4AddressNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object represents represents all IPv4 addresses reported for a MAC address (AL or interface) in a Higher Layer response message for the IEEE1905Device as defined in {{bibref|IEEE1905.1a|Table 6-32: IPv4 type TLV}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+        <parameter ref="IPv4Address"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4Address" access="readOnly" dmr:version="2.9">
+        <description>
+          IPv4 Address.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4AddressType" access="readOnly" dmr:version="2.9">
+        <description>
+          The IPv4 Address Type of this {{param|IPv4Address}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Unknown"/>
+            <enumeration value="DHCP"/>
+            <enumeration value="Static"/>
+            <enumeration value="Auto-IP"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DHCPServer" access="readOnly" dmr:version="2.9">
+        <description>
+          Either IPv4 address of DHCPv4 server or IPv6 address of DHCPv6 server.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IPv6Address.{i}." access="readOnly" numEntriesParameter="IPv6AddressNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object represents represents all IPv6 addresses reported for a MAC address (AL or interface) in a Higher Layer response message for the IEEE1905Device as defined in {{bibref|IEEE1905.1a|Table 6-34: IPv6 type TLV}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+        <parameter ref="IPv6Address"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6Address" access="readOnly" dmr:version="2.9">
+        <description>
+          IPv6 Address.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6AddressType" access="readOnly" dmr:version="2.9">
+        <description>
+          The IPv6 Address Type of this {{param|IPv6Address}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Unknown"/>
+            <enumeration value="LinkLocal"/>
+            <enumeration value="DHCP"/>
+            <enumeration value="Static"/>
+            <enumeration value="SLAAC"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6AddressOrigin" access="readOnly" dmr:version="2.9">
+        <description>
+          "::" or the IPv6 address of the origin of this IPv6 address.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.VendorProperties.{i}." access="readOnly" numEntriesParameter="VendorPropertiesNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        This object represents vendor specific information received in a message with a Vendor specific TLV (as defined in in {{bibref|IEEE1905.1a|Table 6-7: Vendor specific TLV}}).
+      </description>
+      <parameter name="MessageType" access="readOnly" dmr:version="2.9">
+        <description>
+          The Message type of a message received from this IEEE1905Device that contained a Vendor specific TLV, as defined in {{bibref|IEEE1905.1a|Table 6-4: Message type}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="1" maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="OUI" access="readOnly" dmr:version="2.9">
+        <description>
+          This is the value of the Vendor specific OUI defined in {{bibref|IEEE1905.1a|Table 6-7: Vendor specific TLV}}.  {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Information" access="readOnly" dmr:version="2.9">
+        <description>
+          A hexbinary string used to provide vendor specific information. This is the value of the Vendor specific information parameter defined in {{bibref|IEEE1905.1a|Table 6-7: Vendor specific TLV}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object represents an instance of an interface for the {{object|##.IEEE1905Device}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="InterfaceId"/>
+      </uniqueKey>
+      <parameter name="InterfaceId" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of the interface. This comes from the Topology response message as defined in {{bibref|IEEE1905.1a|Table 6-10: 1905 device information type TLV}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MediaType" access="readOnly" dmr:version="2.9">
+        <description>
+          Media type of this {{object}}. This comes from the Topology response message as defined in {{bibref|IEEE1905.1a|Table 6-10: 1905 device information type TLV}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IEEE 802.3u">
+              <description>
+                IEEE 802.3u Fast Ethernet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.3ab">
+              <description>
+                IEEE 802.3ab Gigabit Ethernet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11b">
+              <description>
+                IEEE 802.11b (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11g">
+              <description>
+                IEEE 802.11g (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11a">
+              <description>
+                IEEE 802.11a (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11n 2.4">
+              <description>
+                IEEE 802.11n (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11n 5.0">
+              <description>
+                IEEE 802.11n (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11ac">
+              <description>
+                IEEE 802.11ac (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11ad">
+              <description>
+                IEEE 802.11ad (60GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11af">
+              <description>
+                IEEE 802.11af
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 1901 Wavelet">
+              <description>
+                IEEE 1901 Wavelet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 1901 FFT">
+              <description>
+                IEEE 1901 FFT
+              </description>
+            </enumeration>
+            <enumeration value="MoCAv1.1">
+              <description>
+                MoCAv1.1
+              </description>
+            </enumeration>
+            <enumeration value="Generic PHY"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PowerState" access="readOnly" dmr:version="2.9">
+        <description>
+          The Power State of this {{object}}. "{{enum|Off}}" is used for interfaces identified in a Power Off Interface TLV as defined in {{bibref|IEEE1905.1a|Table 6-38}}. "{{enum|On}}" is used for all other interfaces. "{{enum|Power_Save}}" and "{{enum|Unsupported}}" are not used at this time. Updated as a result of a received Interface Power Change response with “request completed” or “alternate change made” Interface Power Change status as defined in {{bibref|IEEE1905.1a|Table 6-40: Interface Power Change status TLV}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="On"/>
+            <enumeration value="Power_Save"/>
+            <enumeration value="Off"/>
+            <enumeration value="Unsupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyOUI" access="readOnly" dmr:version="2.9">
+        <description>
+          {{param}} of this {{object|#.Interface}}. {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyVariant" access="readOnly" dmr:version="2.9">
+        <description>
+          Variant Index of the Generic Phy networking technology of this {{object|#.Interface}}. This value is from a Generic Phy response message variant index field as defined in {{bibref|IEEE1905.1a|Table 6-29: Generic Phy device information type TLV}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="1" maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyURL" access="readOnly" dmr:version="2.9">
+        <description>
+          URL to Generic Phy XML Description of the Generic Phy networking technology of this {{object|#.Interface}}. This value is from a Generic Phy response message URL to generic phy field as defined in {{bibref|IEEE1905.1a|Table 6-29: Generic Phy device information type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkMembership" access="readOnly" dmr:version="2.9">
+        <description>
+          MACAddress Field from Media specific information for an 802.11 interface provided in a Topology response message 1905 device information type TLV as defined in {{bibref|IEEE1905.1a|Table 6-13: IEEE 802.11 specific information}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Role" access="readOnly" dmr:version="2.9">
+        <description>
+          Field from Media specific information for an 802.11 interface provided in a Topology response message 1905 device information type TLV as defined in {{bibref|IEEE1905.1a|Table 6-13: IEEE 802.11 specific information}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AP"/>
+            <enumeration value="non-AP/non-PCP STA"/>
+            <enumeration value="Wi-Fi P2P Client"/>
+            <enumeration value="Wi-Fi P2P Group Owner"/>
+            <enumeration value="802.11adPCP"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="APChannelBand" access="readOnly" dmr:version="2.9">
+        <description>
+          Hexadecimal digit. Field from Media specific information for an 802.11 interface provided in a Topology response message 1905 device information type TLV as defined in {{bibref|IEEE1905.1a|Table 6-13: IEEE 802.11 specific information}}
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="1" maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="FrequencyIndex1" access="readOnly" dmr:version="2.9">
+        <description>
+          Field from Media specific information for an 802.11 interface provided in a Topology response message 1905 device information type TLV as defined in {{bibref|IEEE1905.1a|Table 6-13: IEEE 802.11 specific information}}
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="1" maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="FrequencyIndex2" access="readOnly" dmr:version="2.9">
+        <description>
+          Field from Media specific information for an 802.11 interface provided in a Topology response message 1905 device information type TLV as defined in {{bibref|IEEE1905.1a|Table 6-13: IEEE 802.11 specific information}}
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="1" maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.NonIEEE1905Neighbor.{i}." access="readOnly" numEntriesParameter="NonIEEE1905NeighborNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object represents an instance of a Non-IEEE1905 Neighbor for the {{object|##.IEEE1905Device}}. These fields come from a Topology response message as defined in {{bibref|IEEE1905.1a|Table 6-14: Non-1905 neighbor device TLV}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="LocalInterface"/>
+        <parameter ref="NeighborInterfaceId"/>
+      </uniqueKey>
+      <parameter name="LocalInterface" access="readOnly" dmr:version="2.9">
+        <description>
+          {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="##.IEEE1905Device.{i}.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NeighborInterfaceId" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of the interface for the {{object}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.L2Neighbor.{i}." access="readOnly" numEntriesParameter="L2NeighborNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object represents an instance of an L2 Neighbor for the {{object|##.IEEE1905Device}}. These fields come from a Topology response message as defined in {{bibref|IEEE1905.1a|Table 6-41: L2 neighbor device TLV}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="LocalInterface"/>
+        <parameter ref="NeighborInterfaceId"/>
+      </uniqueKey>
+      <parameter name="LocalInterface" access="readOnly" dmr:version="2.9">
+        <description>
+          {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="##.IEEE1905Device.{i}.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NeighborInterfaceId" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of the {{object}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="BehindInterfaceIds" access="readOnly" dmr:version="2.9">
+        <description>
+          {{list}} Behind MAC Addresses of the {{object}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}." access="readOnly" numEntriesParameter="IEEE1905NeighborNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object represents an instance of an {{object}} for the {{object|##.IEEE1905Device}}. These values are from the Topology response message as defined in {{bibref|IEEE1905.1a|Table 6-15: 1905 neighbor device TLV}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="LocalInterface"/>
+        <parameter ref="NeighborDeviceId"/>
+      </uniqueKey>
+      <parameter name="LocalInterface" access="readOnly" dmr:version="2.9">
+        <description>
+          {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="##.IEEE1905Device.{i}.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NeighborDeviceId" access="readOnly" dmr:version="2.9">
+        <description>
+          1905 AL MAC Address of the Neighbor.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MetricNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}.Metric.{i}." access="readOnly" numEntriesParameter="MetricNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        This object represents the metrics included in a Link metric response from the IEEE1905Device where {{param|#.LocalInterface}} is the MAC address of an interface in the receiving 1905 AL as defined in {{bibref|IEEE1905.1a|Table 6-17: 1905 transmitter link metric TLV}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="NeighborMACAddress"/>
+      </uniqueKey>
+      <parameter name="NeighborMACAddress" access="readOnly" dmr:version="2.9">
+        <description>
+          The MAC address of an interface in a neighbor 1905 device as defined in {{bibref|IEEE1905.1a|Table 6-17: 1905 transmitter link metric TLV or Table 6-19: 1905 receiver link metric TLV}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="IEEE802dot1Bridge" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates whether or not the 1905 link includes one or more IEEE 802.1 bridges. If {{false}}, the 1905 link does not include an IEEE 802.1 bridge. If {{true}}, the 1905 link does include one or more IEEE 802.1 bridges.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketErrors" access="readOnly" dmr:version="2.9">
+        <description>
+          Estimated number of lost {{units}} on the transmit side of the link {{bibref|IEEE1905.1a|Table 6-18: 1905 transmitter link metrics}} during a measurement period.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketErrorsReceived" access="readOnly" dmr:version="2.9">
+        <description>
+          Estimated number of lost {{units}} on the receive side of the link {{bibref|IEEE1905.1a|Table 6-20: 1905 receiver link metrics}} during a measurement period.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedPackets" access="readOnly" dmr:version="2.9">
+        <description>
+          Estimated number of {{units}} sent to the Neighbor on this link, in the same measurement period used to estimate {{param|PacketErrors}}.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.9">
+        <description>
+          Estimated number of {{units}} received from this Neighbor {{bibref|IEEE1905.1a|Table 6-20: 1905 receiver link metrics}} on this link, in the same measurement period used to estimate {{param|PacketErrors}}.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="MACThroughputCapacity" access="readOnly" dmr:version="2.9">
+        <description>
+          The maximum MAC throughput in {{units}} between this Interface and the Neighbor on this link that is estimated at this Interface.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mb/s"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LinkAvailability" access="readOnly" dmr:version="2.9">
+        <description>
+          The estimated average {{units}} of time that this link is idle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+            <units value="percent"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PHYRate" access="readOnly" dmr:version="2.9">
+        <description>
+          The Physical Layer (PHY) rate in {{units}} between this Interface and the Neighbor on this link that is estimated at this Interface.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mb/s"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RSSI" access="readOnly" dmr:version="2.9">
+        <description>
+          The estimated Received Signal Strength Indicator (RSSI) ratio in {{units}} between this Interface and the Neighbor on this link that is estimated at the receive side of this Interface.  Note: This parameter is valid only for IEEE 802.11 Neighbors.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+            <units value="dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.BridgingTuple.{i}." access="readOnly" numEntriesParameter="BridgingTupleNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        This object represents an instance of an {{object}} for the {{object|##.IEEE1905Device}}. These values come from the 1905 Device’s Topology response message as defined in {{bibref|IEEE1905.1a|Table 6-11: Device bridging capability TLV}}.
+      </description>
+      <parameter name="InterfaceList" access="readOnly" dmr:version="2.9">
+        <description>
+          {{list}} {{reference}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="##.IEEE1905Device.{i}.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.Security." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object represents the Security configuration for the 1905 device as defined in {{bibref|IEEE1905.1a|Section 9.2 Security Setup Methods}}.
+      </description>
+      <parameter name="SetupMethod" access="readWrite" dmr:version="2.9">
+        <description>
+          {{list}} Supported security setup method(s) for the network. {{enum}}
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <enumeration value="UCPK">
+              <description>
+                User Configured Passphrase or Key
+              </description>
+            </enumeration>
+            <enumeration value="PBC">
+              <description>
+                Push Button Configuration
+              </description>
+            </enumeration>
+            <enumeration value="NFCNK">
+              <description>
+                Near-field Communication Network Key
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.9">
+        <description>
+          1905 network passphrase for generating security keys.
+        </description>
+        <syntax hidden="true">
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkingRegistrar." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object represents the detected Network Registrars detection function for the IEEE 1905 network. They are determined by received AP-autoconfiguration response messages with Registrar role, with supported band as defined in {{bibref|IEEE1905.1a|Table 6-25: SupportedFreqBand TLV}}
+      </description>
+      <parameter name="Registrar2dot4" access="readOnly" dmr:version="2.9">
+        <description>
+          {{list}} 1905 AL MAC addresses as determined by source MAC address in received AP-autoconfiguration response messages with supported frequency band of 802.11 2.4 GHz.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Registrar5" access="readOnly" dmr:version="2.9">
+        <description>
+          {{list}} 1905 AL MAC addresses as determined by source MAC address in received AP-autoconfiguration response messages with supported frequency band of 802.11 5 GHz.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Registrar60" access="readOnly" dmr:version="2.9">
+        <description>
+          {{list}} 1905 AL MAC addresses as determined by source MAC address in received AP-autoconfiguration response messages with supported frequency band of 802.11 60 GHz.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        MQTT Base object describing all MQTT related parameters and objects {{bibref|MQTT31}},
+      </description>
+      <parameter name="ClientNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BrokerNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Capabilities." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        Indicates the MQTT capabilities of the device.
+      </description>
+      <parameter name="ProtocolVersionsSupported" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the supported protocol versions. {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="3.1">
+              <description>
+                Protocol according to {{bibref|MQTT31}}
+              </description>
+            </enumeration>
+            <enumeration value="3.1.1">
+              <description>
+                Protocol according to {{bibref|MQTT311}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TransportProtocolSupported" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the supported transport protocols. {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="TCP/IP"/>
+            <enumeration value="TLS"/>
+            <enumeration value="WebSocket"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxNumberOfClientSubscriptions" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the maximum number of subscriptions per MQTT client, which can be stored in the {{object|#.Client.{i}.Subscription}} table. A value of 0 means no limit.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxNumberOfBrokerBridges" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the maximum number of bridges, which can be configured in the {{object|#.Broker.{i}.Bridge}} table. A value of 0 means no limit.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxNumberOfBrokerBridgeSubscriptions" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the maximum number of subscriptions, which can be stored per bridge instance in the {{object|#.Broker.{i}.Bridge.{i}.Subscription}} table. A value of 0 means no limit.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Client.{i}." access="readWrite" numEntriesParameter="ClientNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        MQTT client table. Contains a list of configured MQTT clients.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          The textual name of the MQTT client.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Allows to enable or disable the MQTT client.
+          If a MQTT client gets enabled then the MQTT client has first to establish a MQTT broker session and then subscribe for all enabled topics in the {{object|Subscription.}} table. In case the {{param|CleanSession}} is set to {{false}} a subscription MUST only be sent for topics which haven't been subscribed before (see {{bibref|MQTT311|3.1.2.4}}).
+          If a connected MQTT client gets disabled ({{param|Status}} is either {{enum|Connecting|Status}} or {{enum|Connected|Status}}) then the MQTT client has to send a MQTT DISCONNECT message to disconnect from the MQTT broker ({{bibref|MQTT31|3.14}} or {{bibref|MQTT311|3.14}}), before setting the {{param|Status}} to {{enum|Disabled|Status}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the status of this MQTT client. {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid (e.g. The MQTT client can not use the defined port, because it is blocked)
+          The {{enum|Error_BrokerUnreachable}} value indicates that the connection to the MQTT broker could not be established.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Connecting"/>
+            <enumeration value="Connected"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error_BrokerUnreachable"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ClientID" access="readWrite" dmr:version="2.10">
+        <description>
+          The MQTT client identifier used in the CONNECT message (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.3.1}}). This parameter MUST NOT be {{empty}}, the CPE has to provide a default value for the parameter, which can be changed by the ACS.
+          A change of this parameter is only communicated to the MQTT broker with the next MQTT CONNECT message. If the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="1" maxLength="23"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.10">
+        <description>
+          Username used to authenticate the CPE when making a connection to the MQTT broker. {{bibref|MQTT31|3.1}} recommends that the username has 12 characters or fewer, but this is not required.
+          If this parameter is {{empty}} no authentication parameters are sent in the MQTT CONNECT message.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.10">
+        <description>
+          Password used to authenticate the CPE when making a connection to the MQTT broker (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.3.4}}).
+          This password is only sent in the MQTT CONNECT message if {{param|Username}} is not {{empty}}.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TransportProtocol" access="readWrite" dmr:version="2.10">
+        <description>
+          Indicates the transport protocol to be used for the MQTT broker connection.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="#.Capabilities.TransportProtocolSupported"/>
+          </string>
+          <default type="object" value="TCP/IP"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolVersion" access="readWrite" dmr:version="2.10">
+        <description>
+          Specifies the MQTT protocol version used in the communication with the MQTT broker.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="#.Capabilities.ProtocolVersionsSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CleanSession" access="readWrite" dmr:version="2.10">
+        <description>
+          The value of the MQTT clean session flag in the MQTT CONNECT message (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.4}}). If this flag is set to {{true}} (default), the MQTT broker will delete all subscription information after a Disconnect.
+          A change of this parameter is only effective after the next MQTT CONNECT message to the MQTT broker. If the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="MessageRetryTime" access="readWrite" dmr:version="2.10">
+        <description>
+          Message retry time in {{units}} defines the wait time before a MQTT message that expects a response (QoS value of message is &gt; 0, or PUBLISH, PUBREL, SUBSCRIBE, UNSUBSCRIBE message) is resent, because the response is not received (see {{bibref|MQTT31|4.2}} and {{bibref|MQTT311|4.4}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="5"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectRetryTime" access="readWrite" dmr:version="2.10">
+        <description>
+          Connect retry time in {{units}} defines the wait time before a failed MQTT broker connection is retried.
+          A failure can either be on the connection level (the TCP/IP or TLS can not be established) or on the Protocol level, the MQTT client does not receive a MQTT CONNACK message on a MQTT CONNECT message sent.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="30"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveTime" access="readWrite" dmr:version="2.10">
+        <description>
+          Keep Alive Time in {{units}} defines the maximum wait time after which a message has to be sent to the MQTT broker (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.10}}). If no regular messages can be sent a MQTT PINGREQ is sent.
+          A value of zero (0) means no keep alive message are sent and the MQTT client is not disconnected by the server.
+          A change of this parameter is only effective after the next MQTT CONNECT message to the MQTT broker. If the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="60"/>
+        </syntax>
+      </parameter>
+      <parameter name="ForceReconnect" access="readWrite" dmr:version="2.10">
+        <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 parameter has no effect.
+          This action parameter may be used to immediately apply changes in the MQTT connection settings.
+        </description>
+        <syntax command="true">
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="BrokerAddress" access="readWrite" dmr:version="2.10">
+        <description>
+          Host name or IP address of the MQTT Broker.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BrokerPort" access="readWrite" dmr:version="2.10">
+        <description>
+          Port number of the MQTT broker.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="1883"/>
+        </syntax>
+      </parameter>
+      <parameter name="WillEnable" access="readWrite" dmr:version="2.10">
+        <description>
+          Enables or disables the will handling (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.5}}).. Changing this parameter while the MQTT client is connected will cause the client to disconnect and reconnect.
+          If the connection gets enabled and this parameter is set to {{true}} and either the parameter {{param|WillTopic}} or {{param|WillValue}} are {{empty}}, the CPE MUST set the {{param|Status}} to {{enum|Error_Misconfigured|Status}} (see {{bibref|MQTT311|3.1.2.5}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="WillTopic" access="readWrite" dmr:version="2.10">
+        <description>
+          The Topic sent in the Will Message (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.5}}). This parameter is only used if {{param|WillEnable}} is set to {{true}}.
+          A change of this parameter is only communicated to the MQTT broker with the next MQTT CONNECT message.
+          If the will handling is enabled (Paramter {{param|WillEnable}} is set to {{true}}) and the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="WillValue" access="readWrite" dmr:version="2.10">
+        <description>
+          The value sent in the Will Message (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.5}}). This parameter is only used if {{param|WillEnable}} is set to {{true}}.
+          A change of this parameter is only communicated to the MQTT broker with the next MQTT CONNECT message.
+          If the will handling is enabled (Paramter {{param|WillEnable}} is set to {{true}}) and the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="WillQoS" access="readWrite" dmr:version="2.10">
+        <description>
+          The MQTT QoS level assigned with the will message (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.6}}). This parameter is only used if {{param|WillEnable}} is set to {{true}}.
+          A change of this parameter is only communicated to the MQTT broker with the next MQTT CONNECT message.
+          If the will handling is enabled (Paramter {{param|WillEnable}} is set to {{true}}) and the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="2"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="WillRetain" access="readWrite" dmr:version="2.10">
+        <description>
+          Indicate to the MQTT broker to retain the Will over a Disconnect (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.7}}). This parameter is only used if {{param|WillEnable}} is set to {{true}}.
+          A change of this parameter is only communicated to the MQTT broker with the next MQTT CONNECT message.
+          If the will handling is enabled (Paramter {{param|WillEnable}} is set to {{true}}) and the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SubscriptionNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Client.{i}.Subscription.{i}." access="readWrite" numEntriesParameter="SubscriptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        List of MQTT subscriptions handled by the MQTT client.
+        The MQTT client MUST subscribe with the MQTT broker for all subscription instances, whose parameter {{param|Enable}} is set to {{true}}, when it establishes a new connection to the MQTT broker. Disabled subscription instances with {{param|Enable}} set to {{false}} will be ignored during connection establishment.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Topic"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Setting Enable to {{true}} means the topic is subscribed at the MQTT broker with a MQTT SUBSCRIBE message, setting it to {{false}} will unsubscribe the topic from the MQTT broker with a MQTT UNSUBSCRIBE message. If the MQTT client is already connected with the Broker ({{param|#.Status}} is {{enum|Connected|#.Status}}), the MQTT SUBSCRIBE or UNSUBSCRIBE message is sent directly, otherwise it is sent after the next successful connect.
+          The actual status of the subscription is indicated with {{param|Status}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the status of this subscription. {{enum}}
+          The {{enum|Subscribed}} value indicates that the topic was successfully subscribed with the MQTT broker, the MQTT client received the SUBACK message for this topic from the server.
+          The {{enum|Subscribing}} value MAY be used by the CPE to indicate that the a SUBSCRIBE message for this topic was sent, and the CPE is waiting for a SUBACK message.
+          The {{enum|Unsubscribed}} value indicates that the topic is not reqistered with the MQTT broker.
+          The {{enum|Unsubscribing}} value MAY be used by the CPE to indicate that the an UNSUBSCRIBE message for this topic was sent, and the CPE is waiting for an UNSUBACK message.
+          If the {{param|Enable}} is set to {{false}} the status MUST be either {{enum|Unsubscribed}} or if the unsubscription failed {{enum|Error}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Unsubscribed"/>
+            <enumeration value="Subscribed"/>
+            <enumeration value="Subscribing" optional="true"/>
+            <enumeration value="Unsubscribing" optional="true"/>
+            <enumeration value="Error"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Topic" access="readWrite" dmr:version="2.10">
+        <description>
+          Name of the subscribed topic. Topic names may contain wildcards according to the rules specified in {{bibref|MQTT31|Appendix A}} and {{bibref|MQTT311|4.7}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="65535"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="QoS" access="readWrite" dmr:version="2.10">
+        <description>
+          The MQTT QoS level assigned with the subscription (see {{bibref|MQTT31|4.1}} and {{bibref|MQTT311|4.3}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="2"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Client.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        Contains the MQTT client statistics and usage information.
+        The CPE MUST reset the Stats parameters after the MQTT client gets (re-)enabled or if the MQTT client connects with a new MQTT broker (e.g. {{param|#.BrokerAddress}} has changed). The CPE MAY retain the values across a reboot if it reconnects with the same MQTT broker.
+      </description>
+      <parameter name="BrokerConnectionEstablished" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Time when the MQTT broker connection was established.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LastPublishMessageSent" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Time when the last publish message was sent to the MQTT broker.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LastPublishMessageReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Time when the last publish message was received from the MQTT broker.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="PublishSent" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of publish messages sent to the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PublishReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of publish messages received from to the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="SubscribeSent" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of subscribe messages sent to the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnSubscribeSent" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of unsubscribe messages sent to the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MQTTMessagesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Total number of MQTT messages sent to the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MQTTMessagesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Total number of MQTT messages received from the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of connection errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="PublishErrors" access="readOnly" dmr:version="2.10">
+        <description>
+          Number of errors which prevented sending publish messages.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Broker.{i}." access="readWrite" numEntriesParameter="BrokerNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        MQTT broker table. Contains a list of configured MQTT brokers.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          The textual name of the MQTT broker.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Allows to enable or disable the MQTT broker.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the status of the MQTT broker.  {{enum}}
+          The "{{enum|Error_Misconfigured}}" value indicates that a necessary configuration value is undefined or invalid.
+          The "{{enum|Error}}" value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.10">
+        <description>
+          Port used by the MQTT Broker.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="1883"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.10">
+        <description>
+          If {{empty}} is specified, the CPE MUST bind the MQTT broker to all available interfaces.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.10">
+        <description>
+          Username used to authenticate the MQTT clients, which connect to the MQTT broker.
+          If this parameter is {{empty}} no authentication is used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.10">
+        <description>
+          Password used used to authenticate the MQTT clients, which connect to the MQTT broker.
+          This password is only used if {{param|Username}} is not {{empty}}.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BridgeNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Broker.{i}.Bridge.{i}." access="readWrite" numEntriesParameter="BridgeNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        Configures MQTT bridges, which are used to communicate with other MQTT brokers.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          The textual name of the MQTT bridge used for identification.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Allows to enable or disable the MQTT Bridge.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the status of this MQTT Bridge. {{enum}}
+          The {{enum|Disabled}} value indicates that the MQTT bridge is not in service; parameter {{param|Enable}} is set to {{false}}.
+          The {{enum|Connecting}} value indicates that the MQTT bridge is currently established.
+          The {{enum|Connected}} value indicates that the MQTT bridge is currently active.
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid (e.g. No active Server entry, the MQTT broker can not use the defined bridge port, because it is blocked)
+          The {{enum|Error_BrokerUnreachable}} value indicates that the MQTT bridge connection to the remote MQTT broker could not be established.
+          The {{enum|Error}} value MAY be used to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Connecting"/>
+            <enumeration value="Connected"/>
+            <enumeration value="Enabled" status="deleted"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error_BrokerUnreachable"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ClientID" access="readWrite" dmr:version="2.10">
+        <description>
+          The MQTT client identifier used in the CONNECT message (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.3.1}}). This parameter MUST NOT be {{empty}}, the CPE has to provide a default value for the parameter, which may be changed by the ACS.
+          A change of this parameter is only communicated to the remote MQTT broker with the next MQTT CONNECT message. If the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="1" maxLength="23"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.10">
+        <description>
+          Username used to authenticate the MQTT broker when making a connection over the MQTT bridge (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.3.4}}). {{bibref|MQTT31|3.1}} recommends that the username has 12 characters or fewer, but this is not required.
+          If this parameter is {{empty}} no authentication parameters are sent in the MQTT CONNECT message.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.10">
+        <description>
+          Password used to authenticate the MQTT broker when making a connection over the MQTT bridge (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.3.4}}).
+          The password is only sent if {{param|Username}} is not {{empty}}.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TransportProtocol" access="readWrite" dmr:version="2.10">
+        <description>
+          Indicates the transport protocol to be used for the MQTT bridge connection.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="##.Capabilities.TransportProtocolSupported"/>
+          </string>
+          <default type="object" value="TCP/IP"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolVersion" access="readWrite" dmr:version="2.10">
+        <description>
+          Specifies the MQTT protocol version used in the MQTT bridge connection.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="##.Capabilities.ProtocolVersionsSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CleanSession" access="readWrite" dmr:version="2.10">
+        <description>
+          The value of the MQTT clean session flag in the MQTT bridge connection (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.4}}). If this flag is set to {{true}} (default), the remote MQTT broker will delete all subscription information after a Disconnect.
+          A change of this parameter is only effective after the next MQTT CONNECT message to the remote MQTT broker. If the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="MessageRetryTime" access="readWrite" dmr:version="2.10">
+        <description>
+          Message retry time in {{units}} defines the wait time before a MQTT message that expects a response (QoS value of message is &gt; 0, or PUBLISH, PUBREL, SUBSCRIBE, UNSUBSCRIBE message) is resent, because the response is not received (see {{bibref|MQTT31|4.2}} and {{bibref|MQTT311|4.4}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="5"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectRetryTime" access="readWrite" dmr:version="2.10">
+        <description>
+          Connect retry time in {{units}} defines the wait time before a failed bridge connection is retried.
+          A failure can either be on the connection level (e.g. the TCP/IP or TLS conection can not be established) or on the Protocol level, the MQTT client does not receive a MQTT CONNACK message on a MQTT CONNECT message sent.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="30"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveTime" access="readWrite" dmr:version="2.10">
+        <description>
+          Keep Alive Time in {{units}} defines the maximum wait time after which a message has to be sent to the remote MQTT broker (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.10}}). If no regular messages can be sent a MQTT PINGREQ is sent.
+          A value of zero (0) means no keep alive message are sent and the bridge is not disconnected by the server.
+          A change of this parameter is only effective after the next MQTT CONNECT message to the remote MQTT broker. If the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="60"/>
+        </syntax>
+      </parameter>
+      <parameter name="ForceReconnect" access="readWrite" dmr:version="2.10">
+        <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 parameter has no effect.
+          This action parameter may be used to immediately apply changes in the MQTT connection settings.
+        </description>
+        <syntax command="true">
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerSelectionAlgorithm" access="readWrite" dmr:version="2.10">
+        <description>
+          The algorithm used to select a server entry from the {{object|Server}} table
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Priority">
+              <description>
+                Select the server from the {{object|Server.}} table according to the sequence defined with the {{param|Server.{i}.Priority}} and {{param|Server.{i}.Weight}} values.
+              </description>
+            </enumeration>
+            <enumeration value="RoundRobin">
+              <description>
+                Select the servers round robin.
+              </description>
+            </enumeration>
+            <enumeration value="Random">
+              <description>
+                Select the servers randomly.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServerConnection" access="readOnly" dmr:version="2.10">
+        <description>
+          {{reference|the {{object|Server.}} instance that is used for this {{object}}, while the {{param|Status}} is {{enum|Connecting|Status}} or {{enum|Connected|Status}}. If the MQTT bridge is not connected the value MUST be an empty string}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.Bridge.{i}.Server." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServerNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SubscriptionNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Broker.{i}.Bridge.{i}.Server.{i}." access="readWrite" numEntriesParameter="ServerNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10">
+      <description>
+        Each {{object}} instance represents a MQTT bridge server to be used for a {{object|##.Bridge}}. A remote MQTT broker, which is connected by a MQTT bridge can be reachable via several host addresses each represented by its own {{object}} table entry. For an active MQTT bridge at least one enabled entry has to exist.
+        If a MQTT bridge gets enabled by setting the parameter {{param|##.Bridge.{i}.Enable}} to {{true}}, which either has an empty {{object}} table or the {{object}} table only contains instances whose {{param|Enable}} is set to {{false}}, the {{param|##.Bridge.{i}.Status}} has to be set to {{enum|Error_Misconfigured|##.Bridge.{i}.Status}}.
+        Any attempt to delete an instance, which is currently in use ({{param|##.Bridge.{i}.ServerConnection}} refers to the instance to be deleted), has to be rejected.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Address"/>
+        <parameter ref="Port"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Enables or disables this {{object}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Priority" access="readWrite" dmr:version="2.10">
+        <description>
+          The priority of this {{object}} that is used by the {{object|##.Bridge}} when determining the {{object}} to connect to. The {{object|##.Bridge}} MUST contact the {{object}} with the lowest-numbered priority that the {{object|##.Bridge}} can reach as defined in {{bibref|RFC2782}}. The selection of {{object}}s with the same {{param}} value utilizes the {{param|Weight}} parameter to determine which {{object}} is selected by the {{object|##.Bridge}}.
+          This value is only used if {{param|##.Bridge.{i}.ServerSelectionAlgorithm}} is set to {{enum|Priority|##.Bridge.{i}.ServerSelectionAlgorithm}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Weight" access="readWrite" dmr:version="2.10">
+        <description>
+          This parameter specifies a relative weight for entries with the same {{param|Priority}}. The mechanism is defined in {{bibref|RFC2782}}. A value of -1 indicates that the implementation of this parameter is specific to the Vendor.
+          This value is only used if {{param|##.Bridge.{i}.ServerSelectionAlgorithm}} is set to {{enum|Priority|##.Bridge.{i}.ServerSelectionAlgorithm}}.
+        </description>
+        <syntax>
+          <long>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </long>
+        </syntax>
+      </parameter>
+      <parameter name="Address" access="readWrite" dmr:version="2.10">
+        <description>
+          Fully Qualified Domain Name (FQDN) or IP address of the MQTT broker server this {{object|##.Bridge}} connects to.
+          If the value of this parameter is a FQDN that resolves to multiple addresses then each address SHOULD be attempted (in an implementation-specific order) until a connection can be made or all addresses are exhausted, in which case the next {{object}} instance (based on rules defined over the selected {{param|##.Bridge.{i}.ServerSelectionAlgorithm}}) SHOULD be used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.10">
+        <description>
+          Port number of the MQTT broker server this {{object|##.Bridge}} connects to.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="1883"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Broker.{i}.Bridge.{i}.Subscription.{i}." access="readWrite" numEntriesParameter="SubscriptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10">
+      <description>
+        List of MQTT subscriptions handled over the bridge.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Topic"/>
+        <parameter ref="Direction"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Setting Enable to {{true}} activates the handling of this subscription instance. In case of incoming directions ({{param|Direction}} is either {{enum|in|Direction}} or {{enum|both|Direction}}) the topic is subscribed over the bridge at the remote MQTT broker with a MQTT SUBSCRIBE message if {{param}} is set to {{true}} or unsubscribed from the remote MQTT broker with a MQTT UNSUBSCRIBE message if the value is set to {{false}}.
+          The actual status of the subscription is indicated with {{param|Status}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the status of this subscription. {{enum}}
+          The {{enum|Enabled}} value indicates that the this subscription is active. In case of incoming directions ({{param|Direction}} is either {{enum|in|Direction}} or {{enum|both|Direction}}) the topic was successfully subscribed with the remote MQTT broker.
+          The {{enum|Disabled}} value indicates that this subscription is not used.
+          The {{enum|Error}} value indicates that an error occured (e.g. an subscription could not be made with the remote MQTT broker) and the subscription is not in use.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Enabled"/>
+            <enumeration value="Disabled"/>
+            <enumeration value="Error"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Topic" access="readWrite" dmr:version="2.10">
+        <description>
+          Name of the subscribed topic. Topic names may contain wildcards according to the rules specified in {{bibref|MQTT31|Appendix A}} and {{bibref|MQTT311|4.7}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="65535"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Direction" access="readWrite" dmr:version="2.10">
+        <description>
+          The direction of the subscription. {{enum}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="out">
+              <description>
+                Indicates that all matching topics will be sent over the bridge to the next MQTT broker.
+              </description>
+            </enumeration>
+            <enumeration value="in">
+              <description>
+                Indicates that all matching topics will be received over the bridge from the next MQTT broker.
+              </description>
+            </enumeration>
+            <enumeration value="both">
+              <description>
+                Indicates that all matching topics will be sent and received over the bridge.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="QoS" access="readWrite" dmr:version="2.10">
+        <description>
+          The MQTT QoS level assigned with the subscription (see {{bibref|MQTT31|4.1}} and {{bibref|MQTT311|4.3}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="2"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LocalPrefix" access="readWrite" dmr:version="2.10">
+        <description>
+          The local prefix is used for remapping received topics to the local topics of the MQTT broker and to select the topics to be sent over bridge to the remote MQTT broker.
+          * In incoming direction ({{param|Direction}} is either {{enum|in|Direction}} or {{enum|both|Direction}}):
+          : For remote topics received over the bridge the MQTT broker adds the LocalPrefix in front of the received topic, before processing it.
+          :: '' ''
+          : ''Example:''
+          :: Topic is "/bus/+", LocalPrefix is "/local", Direction is "in"
+          :: MQTT broker receives message with topic "/bus/tr181" over bridge =&gt; MQTT broker uses topic "/local/bus/tr181" for internal processing
+          * In outgoing direction ({{param|Direction}} is either {{enum|out|Direction}} or {{enum|both|Direction}}):
+          : For selection of the topics to be sent over the bridge the MQTT broker uses the combination of {{param}} and {{param|Topic}} to match the topics to be sent over bridge, and removes the {{param}} from the selected topic before sending it over the bridge.
+          :: '' ''
+          : ''Example:''
+          :: Topic is "/bus/+", LocalPrefix is "/local", Direction is "out"
+          :: MQTT broker receives message with topic "/local/bus/tr181" from a MQTT client =&gt; MQTT broker sends topic "/bus/tr181" to remote MQTT broker
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="RemotePrefix" access="readWrite" dmr:version="2.10">
+        <description>
+          The remote prefix is used for remapping topics to the remote MQTT broker topic lists.
+          * In incoming direction ({{param|Direction}} is either {{enum|in|Direction}} or {{enum|both|Direction}}):
+          : For remote topics received over the bridge the MQTT broker removes the remote prefix topic from the received topic (before handling the {{param|LocalPrefix}}), before processing it.
+          :: '' ''
+          : ''Example:''
+          :: Topic is "/bus/+", LocalPrefix is "/local", RemotePrefix is "/remote", Direction is "in"
+          :: MQTT broker receives message with topic "/remote/bus/tr181" over bridge =&gt; MQTT broker uses topic "/local/bus/tr181" for internal processing
+          : During activation of the bridge, the MQTT broker prepends the {{param|Topic}} with {{param}} topic and subscribes to the remote MQTT broker with it, in order to receive all applicable remote topics.
+          :: '' ''
+          : ''Example:''
+          :: Topic is "/bus/+", RemotePrefix is "/remote", Direction is "in"
+          :: MQTT broker sends a subscription to the remote MQTT broker with the topic "/remote/bus/+".
+          * In outgoing direction ({{param|Direction}} is either {{enum|out|Direction}} or {{enum|both|Direction}}):
+          : For all topics to be sent over the bridge ({{param|Direction}} is either {{enum|out|Direction}} or {{enum|both|Direction}}), the RemotePrefix will be prepended to the topic after the {{param|LocalPrefix}} has been processed and before sending the message over the bridge.
+          :: '' ''
+          : ''Example:''
+          :: Topic is "/bus/+", LocalPrefix is "/local", RemotePrefix is "/remote" Direction is "out"
+          :: MQTT broker receives message with topic "/local/bus/tr181" from a MQTT client =&gt; MQTT broker sends topic "/remote/bus/tr181" to remote MQTT broker
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Broker.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        The MQTT broker statistics values. These will reset with each MQTT broker start, either after reboot or if the MQTT broker gets (re-)enabled.
+      </description>
+      <parameter name="TotalNumberOfClients" access="readOnly" dmr:version="2.10">
+        <description>
+          Total number of MQTT clients registered with the MQTT broker.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfActiveClients" access="readOnly" dmr:version="2.10">
+        <description>
+          Number of MQTT clients, which have a connection with the MQTT broker established.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfInactiveClients" access="readOnly" dmr:version="2.10">
+        <description>
+          Number of MQTT clients, which have no connection with the MQTT broker established.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Subscriptions" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of subscriptions held by the MQTT broker.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PublishSent" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of publish messages sent by the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PublishReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of publish messages received by the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MQTTMessagesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Total number of MQTT messages sent by the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MQTTMessagesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Total number of MQTT messages received by the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of connection errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="PublishErrors" access="readOnly" dmr:version="2.10">
+        <description>
+          Number of errors which prevented sending publish messages
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DynamicDNS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10">
+      <description>
+        Properties for Dynamic DNS.
+      </description>
+      <parameter name="ClientNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedServices" access="readOnly" dmr:version="2.10">
+        <description>
+          List of Dynamic DNS service names that are supported by the CPE.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DynamicDNS.Client.{i}." access="readWrite" numEntriesParameter="ClientNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10">
+      <description>
+        Client properties for Dynamic DNS.
+        A dynamic DNS client is responsible for verifying IP address changes and updating information from a subscribed account on a Dynamic DNS Server.
+        For enabled table entries, if {{param|Server}} is not a valid reference then the table entry is inoperable and the CPE MUST set the {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="Server"/>
+        <parameter ref="Username"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Enables or disables this Dynamic DNS Client.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.10">
+        <description>
+          Status of this Dynamic DNS Client.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Connecting">
+              <description>
+                The Dynamic DNS Client is trying to connect to the Server.
+              </description>
+            </enumeration>
+            <enumeration value="Authenticating">
+              <description>
+                The Dynamic DNS Client is in the authentication phase.
+              </description>
+            </enumeration>
+            <enumeration value="Updated">
+              <description>
+                The Dynamic DNS Client has performed an update request since the last IP address change.
+              </description>
+            </enumeration>
+            <enumeration value="Error_Misconfigured">
+              <description>
+                Error due to configuration.
+              </description>
+            </enumeration>
+            <enumeration value="Error">
+              <description>
+                An error has occurred during the communication with the Server. The {{param|LastError}} parameter is updated with the detail of this error.
+              </description>
+            </enumeration>
+            <enumeration value="Disabled">
+              <description>
+                The Client is disabled.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="LastError" access="readOnly" dmr:version="2.10">
+        <description>
+          The last error this Dynamic DNS Client has encountered.
+          The parameter MAY instead indicate a vendor-specific cause, which MUST use the format defined in {{bibref|TR-106}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NO_ERROR"/>
+            <enumeration value="MISCONFIGURATION_ERROR"/>
+            <enumeration value="DNS_ERROR"/>
+            <enumeration value="CONNECTION_ERROR"/>
+            <enumeration value="AUTHENTICATION_ERROR"/>
+            <enumeration value="TIMEOUT_ERROR"/>
+            <enumeration value="PROTOCOL_ERROR"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Server" access="readWrite" dmr:version="2.10">
+        <description>
+          The DynamicDNS server associated with this Dynamic DNS Client.
+          {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="Device.DynamicDNS.Server." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.10">
+        <description>
+          The IP interface over which update queries to the server are sent.
+          {{reference}}
+          If an empty string is specified, the CPE MUST use its routing policy (Forwarding table entries), to determine the appropriate interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="Device.IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.10">
+        <description>
+          Username used by this Dynamic DNS Client to authenticate with the Server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.10">
+        <description>
+          Password used by this Dynamic DNS Client to authenticate with the Server.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="HostnameNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DynamicDNS.Client.{i}.Hostname.{i}." access="readWrite" numEntriesParameter="HostnameNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10">
+      <description>
+        Each table entry represents a fully qualified domain name updated by this Dynamic DNS Client.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Enables or disables this Hostname.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.10">
+        <description>
+          Status of this Hostname.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Registered">
+              <description>
+                The Hostname has been updated with the current IP address.
+              </description>
+            </enumeration>
+            <enumeration value="UpdateNeeded">
+              <description>
+                The IP address has changed since last update.
+              </description>
+            </enumeration>
+            <enumeration value="Updating">
+              <description>
+                The Client is trying to update this Hostname.
+              </description>
+            </enumeration>
+            <enumeration value="Error">
+              <description>
+                The Hostname doesn't exist for this Dynamic DNS account.
+              </description>
+            </enumeration>
+            <enumeration value="Disabled">
+              <description>
+                The Hostname is disabled.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          Fully qualified domain name that has to be updated with the IP address.
+          If the name is set to another value, the Client MUST immediately send an update request to the Server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" dmr:version="2.10">
+        <description>
+          The date time of the last successful update of this name to the Dynamic DNS Server.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DynamicDNS.Server.{i}." access="readWrite" numEntriesParameter="ServerNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10">
+      <description>
+        Table of Dynamic DNS servers available for this CPE.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Enables or disables Dynamic DNS Server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          The textual name of the Dynamic DNS Server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceName" access="readWrite" dmr:version="2.10">
+        <description>
+          Dynamic DNS service used to contact this server.
+          {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <enumerationRef targetParam="Device.DynamicDNS.SupportedServices"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServerAddress" access="readWrite" dmr:version="2.10">
+        <description>
+          Host name or IP address of the Dynamic DNS server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServerPort" access="readWrite" dmr:version="2.10">
+        <description>
+          Port number of the Dynamic DNS server.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedProtocols" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the protocols that are supported by the CPE for sending requests to the Dynamic DNS server. {{list}} This list depends on the Dynamic DNS service defined by the {{param|ServiceName}} parameter.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="HTTP">
+              <description>
+                As defined in {{bibref|RFC2616}}
+              </description>
+            </enumeration>
+            <enumeration value="HTTPS">
+              <description>
+                As defined in {{bibref|RFC2818}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.10">
+        <description>
+          Indicates the protocol used to send requests to the Dynamic DNS server.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="SupportedProtocols"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CheckInterval" access="readWrite" dmr:version="2.10">
+        <description>
+          Interval (in {{units}}) between two checks for IP change.
+          A value of zero indicates that the CPE knows when IP changes and doesn’t need to check it periodically.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RetryInterval" access="readWrite" dmr:version="2.10">
+        <description>
+          Initial retry interval (in {{units}}) after a failed request. This parameter can be used as a fixed value or as part of a retry interval calculation.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxRetries" access="readWrite" dmr:version="2.10">
+        <description>
+          Maximum number of retries after a failed request. When the maximum number is reached, no further requests are sent until the context changes.
+          A value of 0 means that there are no retries after a failed request.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LEDs." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object describes the LEDs on the device.
+      </description>
+      <parameter name="LEDNumberOfEntries" access="readOnly" dmr:version="2.11">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LEDs.LED.{i}." access="readOnly" numEntriesParameter="LEDNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.11">
+      <description>
+        Each instance of this object describes an LED on the device.
+        The default illumination characteristics (e.g., Color, Brightness) of an in use LED is vendor specific. When a cycle completes (i.e., {{param|CyclePeriodRepetitions}} = 0), the LED reverts back to its default illumination characteristics.
+        When the value of the {{param|Status}} parameter is {{enum|Controlled|Status}}, then the value of {{param|CycleElementNumberOfEntries}} and {{param|CycleElementNumberOfEntries}} parameters SHOULD be 0.
+        When the value of the {{param|RelativeXPosition}} and {{param|RelativeYPosition}} parameters are 0, this indicates that the position of the LED is unknown.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.11">
+        <description>
+          The internal name used to identify this LED.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.11">
+        <description>
+          The status of the LED.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled">
+              <description>
+                The LED is currently not in use.
+              </description>
+            </enumeration>
+            <enumeration value="InUse">
+              <description>
+                The LED is currently being used by the CPE.
+              </description>
+            </enumeration>
+            <enumeration value="Controlled">
+              <description>
+                Indicates that the LED is controlled from an electronic circuit which cannot be monitored.
+              </description>
+            </enumeration>
+            <enumeration value="Error">
+              <description>
+                The LED status cannot be determined by the CPE.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Reason" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The textual purpose that represents the visual display of the LED (e.g., Broadband Down).
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="CyclePeriodRepetitions" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The number of cycle periods left for this LED. As each cycle period is completed this parameter is reduced by 1. A value of -1 indicates an infinite number of cycle period repetitions.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Location" access="readOnly" dmr:version="2.11">
+        <description>
+          The location of the LED as the user looks at the front of the device in its typical orientation (e.g., on-end, flat).
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Front"/>
+            <enumeration value="Back"/>
+            <enumeration value="Left"/>
+            <enumeration value="Right"/>
+            <enumeration value="Top"/>
+            <enumeration value="Bottom"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RelativeXPosition" access="readOnly" dmr:version="2.11">
+        <description>
+          The relative x position of the LED from left to right (x) and top to bottom (y) as the user looks at the device from the orientation identified in the {{param|Location}} parameter in its typical orientation (e.g., on-end, flat).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RelativeYPosition" access="readOnly" dmr:version="2.11">
+        <description>
+          The relative y position of the LED from left to right (x) and top to bottom (y) as the user looks at the device from the orientation identified in the {{param|Location}} parameter in its typical orientation (e.g., on-end, flat).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CycleElementNumberOfEntries" access="readOnly" dmr:version="2.11">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LEDs.LED.{i}.CycleElement.{i}." access="readWrite" numEntriesParameter="CycleElementNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.11">
+      <description>
+        Each instance of this object describes the LED characteristics for a portion of the LED cycle period.
+        The pattern of lighting for the LED corresponding to this table (i.e., the LED cycle period) is defined by the illumination of the LED according to the entries in this table, taken sequentially in the order specified by the {{param|Order}} parameter, with the duration for the portion of the LED illumination corresponding to a given instance specified by the {{param|Duration}} parameter.
+        The other parameters of the instance of this object (e.g., Color, Brightness) describes the illumination characteristics applied to the LED for this {{object}} instance.
+        The length of the complete LED cycle is the sum of the Duration parameters for all of the entries in this table.
+      </description>
+      <uniqueKey>
+        <parameter ref="Order"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.11">
+        <description>
+          Enables or disables this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.11">
+        <description>
+          The relative order of this {{object}} in the LED's cycle period.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Color" access="readWrite" dmr:version="2.11">
+        <description>
+          The color being displayed by the LED RGB hexadecimal notation (e.g., FF0088).
+          Note: If the parameter is set to an unsupported color the CPE MUST NOT infer a different color.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="Duration" access="readWrite" dmr:version="2.11">
+        <description>
+          The duration, in {{units}}, for this element of the cycle period.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FadeInterval" access="readWrite" dmr:version="2.11">
+        <description>
+          The interval corresponding to this {{object}} instance, in {{units}}, from the starting from the target illumination characteristics of the previous {{object}} instance to the target illumination characteristics of this {{object}} instance.
+          The transition to the target illumination characteristics is uniformly interpolated "perceptually" over the value of this {{param}} parameter.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LEDs.LED.{i}.CurrentCycleElement." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object describes the status of the current cycle element for this LED.
+      </description>
+      <parameter name="CycleElementReference" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This object describes the current properties of the {{object|#.CycleElement.{i}}} object instance that is currently active.
+          {{reference}} If the LED instances does not have a current cycle element active, this parameter MUST be set to {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.CycleElement." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Color" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The color, formatted as RGB hexadecimal notation (e.g., FF0088), that is currently being displayed by the LED.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="Duration" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The remaining duration, in {{units}}, for this element of the cycle period.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BASAPM." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object represents the objects necessary to manage and control the functionality for tests that utilize the Broadband Access Service Attributes and Performance Metrics measurement test framework as defined in by {{bibref|TR-304}}.
+      </description>
+      <parameter name="MeasurementEndpointNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BASAPM.MeasurementEndpoint.{i}." access="readWrite" numEntriesParameter="MeasurementEndpointNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents the measurement endpoint that provides additional contextual information regarding the measurement agent.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="MeasurementAgent"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MeasurementAgent" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|##.LMAP.MeasurementAgent}} object that is associated with this measurement endpoint.}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="##.LMAP.MeasurementAgent." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceOwnership" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter describes the ownership of the device that hosts the measurement endpoint.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ISP">
+              <description>
+                ISP Owned Device
+              </description>
+            </enumeration>
+            <enumeration value="Customer">
+              <description>
+                Customer Owned Device
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="OperationalDomain" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter describes the operational domain for this measurement endpoint
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InternetDomain" access="readWrite" dmr:version="2.12">
+        <description>
+          The top level Internet domain used to identify this measurement endpoint.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UseMeasurementEndpointInReports" access="readWrite" dmr:version="2.12">
+        <description>
+          If the value of this parameter is {{false}} then the Measurement Endpoint MUST not be included in measurement reports.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BASAPM.MeasurementEndpoint.{i}.ISPDevice." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object represents the information necessary to utilize an ISP owned device within the measurement endpoint.
+      </description>
+      <parameter name="ReferencePoint" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter describes the measurement reference point of the measurement endpoint.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="STP">
+              <description>
+                Internet Source Test Point
+              </description>
+            </enumeration>
+            <enumeration value="IDTP">
+              <description>
+                Internet Drain Test Point
+              </description>
+            </enumeration>
+            <enumeration value="RNTP">
+              <description>
+                Regional Network Test Point
+              </description>
+            </enumeration>
+            <enumeration value="IRTP">
+              <description>
+                Internal Regional Test Point
+              </description>
+            </enumeration>
+            <enumeration value="MTP">
+              <description>
+                Metro Test Point
+              </description>
+            </enumeration>
+            <enumeration value="IATP">
+              <description>
+                Internal Access Test Point
+              </description>
+            </enumeration>
+            <enumeration value="UNITP">
+              <description>
+                User Network Interface Test Point
+              </description>
+            </enumeration>
+            <enumeration value="CEDTP">
+              <description>
+                Customer End Device Test Point
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GeographicalLocation" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|###.DeviceInfo.Location}} object that describes the geographic location of the measurement endpoint}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="###.DeviceInfo.Location." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BASAPM.MeasurementEndpoint.{i}.CustomerDevice." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object represents the information necessary to utilize customer owned device within the measurement endpoint.
+      </description>
+      <parameter name="EquipmentIdentifier" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter describes the customer equipment identifier of the measurement endpoint.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CustomerIdentifier" access="readWrite" dmr:version="2.12">
+        <description>
+          The unique customer identifier within the operational domain for this measurement endpoint.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object represents the objects necessary to manage and control the functionality for Large-Scale Measurement of Broadband Performance{{bibref|RFC7594}} as defined in by {{bibref|LMAPIFM}}.
+      </description>
+      <parameter name="MeasurementAgentNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ReportNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="EventNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}." access="readWrite" numEntriesParameter="MeasurementAgentNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents the measurement agent that performs measurement tasks and reporting functions defined in {{bibref|RFC7594}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Identifier"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.12">
+        <description>
+          Version of the measurement agent.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="LastStarted" access="readOnly" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, in UTC that the measurement agent was successfully started.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="CapabilityTags" access="readOnly" dmr:version="2.12">
+        <description>
+          Capabilities of the measurement agent that cannot be expressed elsewhere in the data model.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Identifier" access="readWrite" dmr:version="2.12">
+        <description>
+          Identifier of the {{object}} instance.
+        </description>
+        <syntax>
+          <dataType ref="UUID"/>
+        </syntax>
+      </parameter>
+      <parameter name="GroupIdentifier" access="readWrite" dmr:version="2.12">
+        <description>
+          Identifier of the measurement group of interest to which the measurement agent belongs.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MeasurementPoint" access="readWrite" dmr:version="2.12">
+        <description>
+          Identifier of the measurement point indicating where the measurement agent is located on a path as defined in [bibref|RFC7398}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UseAgentIdentifierInReports" access="readWrite" dmr:version="2.12">
+        <description>
+          If the value of the {{param|Identifier}} parameter is not {{empty}} and the value of this parameter is {{false}} then the value of the {{param|Identifier}} parameter MUST not be included in measurement reports.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="UseGroupIdentifierInReports" access="readWrite" dmr:version="2.12">
+        <description>
+          If the value of the {{param|GroupIdentifier}} parameter is not {{empty}} and the value of this parameter is {{false}} then the value of the {{param|GroupIdentifier}} parameter MUST not be included in measurement reports.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="UseMeasurementPointInReports" access="readWrite" dmr:version="2.12">
+        <description>
+          If the value of the {{param|MeasurementPoint}} parameter is not {{empty}} and the value of this parameter is {{false}} then the value of the {{param|MeasurementPoint}} parameter MUST not be included in measurement reports.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PublicCredential" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|##.Security.Certificate}} object that is used to identify this measurement agent}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="##.Security.Certificate." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PrivateCredential" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|##.Security.Certificate}} object that is used to contain the private keys for this measurement agent}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="##.Security.Certificate." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EventLog" access="readOnly" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|##.DeviceInfo.VendorLogFile}} object that is used to record events for this measurement agent}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="##.DeviceInfo.VendorLogFile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TaskCapabilityNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TaskNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CommunicationChannelNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="InstructionNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.TaskCapability.{i}." access="readOnly" numEntriesParameter="TaskCapabilityNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents a capabilities, in the context of a task, that are supported by the measurement agent. Types of capabilities include: Report tasks, Configuration Tasks and Instruction Tasks.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Name" access="readOnly" dmr:version="2.12">
+        <description>
+          Name of the supported task.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.12">
+        <description>
+          Version of the task.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TaskCapabilityRegistryNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.TaskCapability.{i}.Registry.{i}." access="readOnly" numEntriesParameter="TaskCapabilityRegistryNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents a registry function and an associated list of roles supported by this measurement agent
+      </description>
+      <uniqueKey>
+        <parameter ref="RegistryEntry"/>
+      </uniqueKey>
+      <parameter name="RegistryEntry" access="readOnly" dmr:version="2.12">
+        <description>
+          A URI ({{bibref|RFC3986}}) that is the value of the task registry entry as defined in {{bibref|LMAPREG}} or a value for a task that is understood by the measurement agent, measurement controller and measurement collector.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Roles" access="readOnly" dmr:version="2.12">
+        <description>
+          {{list| representing the roles of the function}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Controller." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This objects represents the measurement controller that is assigned to a measurement agent.
+      </description>
+      <parameter name="ControllerTimeout" access="readWrite" dmr:version="2.12">
+        <description>
+          The timer, in {{units}}, that is started after each successful contact with a measurement controller.
+          When the timer reaches the timeout en event is raised indicating that connectivity to the controller has been lost.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="0"/>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ControlSchedules" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|a {{object|#.Schedule}} object}}
+          This parameter lists the available control schedules for invoking control tasks by the measurement agent.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.Schedule." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ControlTasks" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|a {{object|#.Task}} object}}
+          This parameter lists the available control tasks that can be invoked by the measurement agent.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.Task." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ControlChannels" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|a {{object|#.CommunicationChannel}} object}}
+          The measurement agent to measurement controller channel is used for conveying results of communication sessions with the configuration, instruction status and logging information elements defined in defined in {{bibref|LMAPIFM}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.CommunicationChannel." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}." access="readWrite" numEntriesParameter="ScheduleNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents a schedule that is associated with a set of scheduled actions to be performed by a measurement agent.
+        Note: Actions of an occurrence of this {{object}} are gracefully terminated by the defining either the {{param|End}} or {{param|Duration}} parameters. Only one of these parameters may be defined at a time.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.12">
+        <description>
+          Name of the schedule.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="State" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the Schedule. Only one instance of the schedule is active. An active schedule is defined where the {{param}} parameter has a value of {{enum|Running|State}}.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Enabled"/>
+            <enumeration value="Suppressed"/>
+            <enumeration value="Disabled"/>
+            <enumeration value="Running"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Start" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|##.Event}} object that is used define the event to start an occurrence of this {{object}}}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="##.Event." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="End" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|##.Event}} object that is used define the event to gracefully terminate all actions associated with an occurrence of this {{object}}}}.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="##.Event." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Duration" access="readWrite" dmr:version="2.12">
+        <description>
+          When the {{param}} value is not 0, this parameter is used define the duration, in {{units}}, where after this duration all actions associated with an occurrence of this {{object}} are gracefully terminated.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tags" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|each entry represents tags that are to be reported together with the measurement results.}}
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SuppressionTags" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|representing the suppression tags to be matched}}
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutionMode" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter describes the execution method to apply to this schedule for the associated Actions.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Sequential">
+              <description>
+                 Actions are executed in sequence as defined by the value of the {{param|Action.{i}.Order}} parameter.
+                The first Scheduled Action of the DestinationOutput is provided the input.
+              </description>
+            </enumeration>
+            <enumeration value="Parallel">
+              <description>
+                Actions are executed in parallel.
+                The all Scheduled Actions of the DestinationOutput are provided the input.
+              </description>
+            </enumeration>
+            <enumeration value="Pipelined">
+              <description>
+                Actions are executed in sequence where the output of one Action is used as the input of subsequent Action.
+                The first Scheduled Action of the DestinationOutput is provided the input.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Pipelined"/>
+        </syntax>
+      </parameter>
+      <parameter name="LastInvocation" access="readOnly" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, in UTC that the {{object}} was invoked by the measurement agent.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="Storage" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The amount of secondary storage, in {{units}}, allocated to an instance of this {{object}}.
+          The value of this parameter reflects the amount of allocated physical storage and not the storage used by logical data records.
+          For example the secondary storage can be the storage allocated in a file system holding temporary data.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="bytes"/>
+          </unsignedLong>
+        </syntax>
+      </parameter>
+      <parameter name="ActionNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object represents the statistics associated with this object.
+      </description>
+      <parameter name="Invocations" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of invocations of this schedule. This counter does not include suppressed invocations or invocations that were prevented due to an overlap with a previous invocation of this schedule.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="Suppressions" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of suppressed executions of this schedule.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="Overlaps" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of executions prevented due to overlaps with a previous invocation of this schedule.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="Failures" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of failed executions of this schedule. A failed execution is an execution where at least one action failed.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}." access="readWrite" numEntriesParameter="ActionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents an action that is associated with the this {{object|##.Schedule}} object.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object|##.Schedule.{i}.Action}} object.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="State" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the {{object}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Enabled"/>
+            <enumeration value="Suppressed"/>
+            <enumeration value="Disabled"/>
+            <enumeration value="Running"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.12">
+        <description>
+          The order of the scheduled action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Task" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|##.Task}} object used in this scheduled action}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="##.Task." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="OutputDestination" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|a {{object|##.Schedule}} object used to receive the output(s) of this scheduled action}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="##.Schedule." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SuppressionTags" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|representing the suppression tags to be matched}}
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Tags" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|each entry represents tags that are to be reported together with the measurement results.}}
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Storage" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The amount of secondary storage, in {{units}}, allocated to an instance of this {{object}}.
+          The value of this parameter reflects the amount of allocated physical storage and not the storage used by logical data records.
+          For example the secondary storage can be the storage allocated in a file system holding temporary data.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="bytes"/>
+          </unsignedLong>
+        </syntax>
+      </parameter>
+      <parameter name="LastInvocation" access="readOnly" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, in UTC that the {{object}} was invoked by the measurement agent.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LastSuccessfulCompletion" access="readOnly" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, in UTC of a successful completion of the {{object}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LastSuccessfulStatusCode" access="readOnly" dmr:version="2.12">
+        <description>
+          The status code returned by successful execution of the {{object}}. A value of 0 indicates successful completion.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="LastSuccessfulMessage" access="readOnly" dmr:version="2.12">
+        <description>
+          The message associated with the successful completion of the {{object}}.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="LastFailedCompletion" access="readOnly" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, in UTC of a failure to complete the {{object}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LastFailedStatusCode" access="readOnly" dmr:version="2.12">
+        <description>
+          The status code returned by failed execution of the {{object}}. A value of 0 indicates successful completion.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="LastFailedMessage" access="readOnly" dmr:version="2.12">
+        <description>
+          The message associated with the failure to complete the task.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object represents the statistics associated with this object.
+      </description>
+      <parameter name="Invocations" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of invocations of this action. This counter does not include suppressed invocations or invocations that were prevented due to an overlap with a previous invocation of this schedule.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="Suppressions" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of suppressed executions of this action.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="Overlaps" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of executions prevented due to overlaps with a previous invocation of this action.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="Failures" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of failed executions of this action. A failed execution is an execution where at least one action failed.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}.Option.{i}." access="readWrite" numEntriesParameter="OptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents an option associated with the Scheduled Action. When an option with the same Name exists between the Seheduled Action's Option and The Task's option, the option of the Scheduled Action takes precedence over the option associated with the Task.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.12">
+        <description>
+          The order of the Option.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.12">
+        <description>
+          The name of the option.
+          When the value of this parameter is equal to "channel", the option value specifies the Communication Channel used for this scheduled task.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.12">
+        <description>
+          The value associated with the Option.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Task.{i}." access="readWrite" numEntriesParameter="TaskNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        The {{object}} object defines the configuration for a task that can be performed by {{object|##.MeasurementAgent}} objects.
+        Tasks are performed by {{object|##.MeasurementAgent}} objects when a {{object|#.Schedule}} object invokes the Task.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.12">
+        <description>
+          Name of the task.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Tags" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|each entry represents tags that are to be reported together with the measurement results.}}
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RegistryNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Task.{i}.Registry.{i}." access="readWrite" numEntriesParameter="RegistryNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents a registry function and an associated list of roles for this task
+      </description>
+      <uniqueKey>
+        <parameter ref="RegistryEntry"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="RegistryEntry" access="readWrite" dmr:version="2.12">
+        <description>
+          A URI ({{bibref|RFC3986}}) that is the value of the task registry entry as defined in {{bibref|LMAPREG}} or a value for a task that is understood by the measurement agent, measurement controller and measurement collector.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Roles" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list| representing the roles of the function}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Task.{i}.Option.{i}." access="readWrite" numEntriesParameter="OptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents an option associated with the task.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.12">
+        <description>
+          The order of the Option.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.12">
+        <description>
+          The name of the option.
+          When the value of this parameter is equal to "channel", the option value specifies the Communication Channel used for this task.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.12">
+        <description>
+          The value associated with the Option.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.CommunicationChannel.{i}." access="readWrite" numEntriesParameter="CommunicationChannelNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents the properties communication channel used to establish communication between a measurement agent and other elements of the LMAP framework (e.g., measurement controller, measurement collector). The value of the {{param|Name}} parameter used for conveying information is defined as an option in the Task's or scheduled Task's option parameter.
+        When this object uses the BulkData capability, a {{object|###.BulkData.Profile.{i}}} object instance referred to by this object.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.12">
+        <description>
+          Name of the channel.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UseBulkDataProfile" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables the ability to use a bulk data profile for this communication channel
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="BulkDataProfile" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|###.BulkData.Profile}} object that is used to represent communication channel}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="###.BulkData.Profile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Target" access="readWrite" dmr:version="2.12">
+        <description>
+          The URL of the LMAP component that is the target of this communication channel.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TargetPublicCredential" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|###.Security.Certificate}} object that is used to identify the target of this channel}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="###.Security.Certificate." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|an interface object used to restrict the data transmitted or received using this channel to a specific interface}} If the value of this parameter is {{empty}} the data that is transmitted or received using this channel is able to use any available interface.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Instruction.{i}." access="readWrite" numEntriesParameter="InstructionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        The {{object}} object defines the instruction to the measurement agent by the measurement controller. At most one {{object}} object for the {{object|##.MeasurementAgent}} instance is enabled at a time. .
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, in UTC that the {{object}} object or its sub-object's configuration was changed by a measurement agent's controller.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="InstructionSchedules" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|a {{object|#.Schedule}} object}}
+          This parameter lists the available instruction schedules for invoking control tasks by the measurement agent.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.Schedule." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InstructionTasks" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|a {{object|#.Task}} object}}
+          This parameter lists the available instruction tasks that can be invoked by the measurement agent.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.Task." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ReportChannels" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|a {{object|#.CommunicationChannel}} object}}
+          This parameter defines the corresponding report channels to be used when reporting results of tasks to a measurement collector.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.CommunicationChannel." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MeasurementSuppressionNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Instruction.{i}.MeasurementSuppression.{i}." access="readWrite" numEntriesParameter="MeasurementSuppressionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object defines the schedules and actions that are suppressed based on criteria defined in the {{param|SuppressionMatch}} parameter.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.12">
+        <description>
+          Name of the suppression object.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="State" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the {{object}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Enabled"/>
+            <enumeration value="Active"/>
+            <enumeration value="Disabled"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="StopRunning" access="readWrite" dmr:version="2.12">
+        <description>
+          When {{true}}, the measurement agent is instructed to stop running schedules or actions that have been matched by this object.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Start" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|###.Event}} object that is used define the event that to start an occurrence of this {{object}}}} When {{empty}} the default behavior is to perform the suspension event immediately.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="###.Event." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="End" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|###.Event}} object that is used define the event to gracefully suspend all actions associated with an occurrence of this {{object}}}} When {{empty}} the default behavior is for the suspension period to be indefinite.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="###.Event." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SuppressionMatch" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|representing the match patterns to be used for applying suppression to {{object|##.Schedule.{i}}} (and their actions) and all {{object|##.Schedule.{i}.Action.{i}}} object instances that have a matched using their SuppressionTags parameters}} The match pattern syntax is defined in {{bibref|LMAPIFM}}.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Report.{i}." access="readOnly" numEntriesParameter="ReportNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12" dmr:noUniqueKeys="true">
+      <description>
+        This {{object}} object instance represents a report that is generated by a reporting task where the reporting task is defined as a {{object|#.MeasurementAgent.{i}.Task.{i}}} and executed as a scheduled action ({{object|#.MeasurementAgent.{i}.Schedule.{i}.Action.{i}}}).
+        The {{object}} replicates the {{object|#.MeasurementAgent.{i}}} object instance's data at the time of the action exection.
+        When a {{object|##.BulkData.Profile.{i}}} object instance is used to communicate a {{object}} instance, the CPE adds a {{object|##.BulkData.Profile.{i}.Parameter.{i}}} object instance referring to this {{object}} object instance.
+      </description>
+      <parameter name="ReportDate" access="readOnly" dmr:version="2.12">
+        <description>
+          The report date and time, based on {{bibref|RFC3339}}, that the report was sent to the collector.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="AgentIdentifier" access="readOnly" dmr:version="2.12">
+        <description>
+          Identifier of the measurement agent at the time the measurement was run.
+        </description>
+        <syntax>
+          <dataType ref="UUID"/>
+        </syntax>
+      </parameter>
+      <parameter name="GroupIdentifier" access="readOnly" dmr:version="2.12">
+        <description>
+          Identifier of the measurement group of interest to which the MA belongs.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="MeasurementPoint" access="readOnly" dmr:version="2.12">
+        <description>
+          Identifier of the measurement point indicating where the measurement agent is located on a path as defined in {{bibref|RFC7398}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ResultNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Report.{i}.Result.{i}." access="readOnly" numEntriesParameter="ResultNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12" dmr:noUniqueKeys="true">
+      <description>
+        The {{object}} object provides the meta-data of the result report of a single executed action that produced the result.
+      </description>
+      <uniqueKey>
+        <parameter ref="ScheduleName"/>
+        <parameter ref="ActionName"/>
+        <parameter ref="StartTime"/>
+      </uniqueKey>
+      <parameter name="TaskName" access="readOnly" dmr:version="2.12">
+        <description>
+          Name of the task that produced the result.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleName" access="readOnly" dmr:version="2.12">
+        <description>
+          Name of the schedule that produced the result.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ActionName" access="readOnly" dmr:version="2.12">
+        <description>
+          Name of the action that produced the result.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EventTime" access="readOnly" dmr:version="2.12">
+        <description>
+          The date and time, based on {{bibref|RFC3339}}, that the event that triggered the schedule of the action that produced the reported result values in UTC.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="StartTime" access="readOnly" dmr:version="2.12">
+        <description>
+          The date and time, based on {{bibref|RFC3339}}, that the action started in UTC.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EndTime" access="readOnly" dmr:version="2.12">
+        <description>
+          The date and time, based on {{bibref|RFC3339}}, that the action was completed in UTC.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="CycleNumber" access="readOnly" dmr:version="2.12">
+        <description>
+          The cycle number derived from the {{param|EventTime}}.
+          The cycle number is the time, in UTC, closest to the {{param|EventTime}} that is a multiple of the cycle interval of the event that triggered the execution of the schedule.
+          The value is valid if the event that triggered the execution of the schedule has a defined cycle interval. An {{empty}} value represent an invalid CycleNumber.
+          {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <pattern value="YYYYMMDD.HHMMSS"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The status code returned by the execution of the action.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="Tags" access="readOnly" dmr:version="2.12">
+        <description>
+          {{list|each entry represents tags defined for the schedule, task and action objects that produced this result}}
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ResultConflictNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ResultReportTableNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Report.{i}.Result.{i}.Option.{i}." access="readOnly" numEntriesParameter="OptionNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents an option associated with the task or action object that produced the result.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Order" access="readOnly" dmr:version="2.12">
+        <description>
+          The order of the Option.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.12">
+        <description>
+          The name of the Option.
+          When the value of this parameter is equal to "channel", the option value specifies the Communication Channel used for this task.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.12">
+        <description>
+          The value associated with the Option.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Report.{i}.Result.{i}.Conflict.{i}." access="readOnly" numEntriesParameter="ResultConflictNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents actions that might have impacted the results being reported.
+      </description>
+      <uniqueKey>
+        <parameter ref="ScheduleName"/>
+        <parameter ref="ActionName"/>
+        <parameter ref="TaskName"/>
+      </uniqueKey>
+      <parameter name="TaskName" access="readOnly" dmr:version="2.12">
+        <description>
+          Name of the task.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleName" access="readOnly" dmr:version="2.12">
+        <description>
+          Name of the schedule.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ActionName" access="readOnly" dmr:version="2.12">
+        <description>
+          Name of the action.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Report.{i}.Result.{i}.ReportTable.{i}." access="readOnly" numEntriesParameter="ResultReportTableNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12" dmr:noUniqueKeys="true">
+      <description>
+        This {{object}} object instances represents a row of results.
+      </description>
+      <parameter name="ColumnLabels" access="readOnly" dmr:version="2.12">
+        <description>
+          {{list}} This parameter contains the column labels used for the result.
+          The column labels are ordered with the corresponding entries in the {{object|ResultRow}} table.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ResultReportRowNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RegistryNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Report.{i}.Result.{i}.ReportTable.{i}.ResultRow.{i}." access="readOnly" numEntriesParameter="ResultReportRowNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12" dmr:noUniqueKeys="true">
+      <description>
+        This {{object}} object instances represents a row of results for the report.
+      </description>
+      <parameter name="Values" access="readOnly" dmr:version="2.12">
+        <description>
+          {{list}} This parameter contains an ordered set of values that align to the columns defined in the {{param|#.ColumnLabels}} parameter.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Report.{i}.Result.{i}.ReportTable.{i}.Registry.{i}." access="readOnly" numEntriesParameter="RegistryNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents a registry function and an associated list of roles for this result report.
+      </description>
+      <uniqueKey>
+        <parameter ref="RegistryEntry"/>
+      </uniqueKey>
+      <parameter name="RegistryEntry" access="readOnly" dmr:version="2.12">
+        <description>
+          A URI ({{bibref|RFC3986}}) that is the value of the registry entry as defined in {{bibref|LMAPREG}} or a value for a task that is understood by the measurement agent, measurement controller and measurement collector.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Roles" access="readOnly" dmr:version="2.12">
+        <description>
+          {{list| representing the roles of the function}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Event.{i}." access="readWrite" numEntriesParameter="EventNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object defines the information associated with an event used within the measurement agent. Event instances may be referenced by various objects within the LMAP model.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.12">
+        <description>
+          Name of the Event.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter describes the type of {{object}} for this object instance. The timing of the event occurrence is adjusted based on the value of the {{param|RandomnessSpread}} parameter.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="PeriodicTiming">
+              <description>
+                Periodic Timing Event. When selected one or more event occurrences are emitted based on the parameters defined in the {{object|PeriodicTimer}} object.
+              </description>
+            </enumeration>
+            <enumeration value="CalendarTiming">
+              <description>
+                Calendar Timing Event. When selected one or more event occurrences are emitted based on the parameters defined in the {{object|CalendarTimer}} object.
+              </description>
+            </enumeration>
+            <enumeration value="OneOffTiming">
+              <description>
+                One-off Timing Event. When selected a single event occurrence is emitted based on the parameters defined in the {{object|OneOff}} object.
+              </description>
+            </enumeration>
+            <enumeration value="Immediate">
+              <description>
+                Immediate Timing Event. When selected a single event occurrence is emitted as soon as possible.
+              </description>
+            </enumeration>
+            <enumeration value="Startup">
+              <description>
+                Startup Timing Event. When selected a single event occurrence is emitted when the corresponding measurement agent starts up.
+              </description>
+            </enumeration>
+            <enumeration value="ControllerLost">
+              <description>
+                Controller Lost Event. When selected a single event occurrence is emitted when the connectivity to the controller is lost.
+              </description>
+            </enumeration>
+            <enumeration value="ControllerConnected">
+              <description>
+                Controller Connected Event. When selected a single event occurrence is emitted when the connectivity to the controller is established.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Immediate"/>
+        </syntax>
+      </parameter>
+      <parameter name="RandomnessSpread" access="readWrite" dmr:version="2.12">
+        <description>
+          The spread, in {{units}}, of the Uniform Discrete random distribution algorithm. A value of 0 means that the random algorithm is not applied.
+        </description>
+        <syntax>
+          <int>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="CycleInterval" access="readWrite" dmr:version="2.12">
+        <description>
+          The duration of the time interval, in {{units}}, that used to calculate cycle numbers.
+        </description>
+        <syntax>
+          <int>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Event.{i}.PeriodicTimer." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object defines a periodic timer instance. The periodic timer instance has attributes for when the timer is to begin ({{param|StartTime}}) and end ({{param|EndTime}}) as well as the interval to use.
+      </description>
+      <parameter name="StartTime" access="readWrite" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, that the {{object}} instance is to begin operation.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EndTime" access="readWrite" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, that the {{object}} instance is to end operation.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="Interval" access="readWrite" dmr:version="2.12">
+        <description>
+          The tolerable duration, in {{units}}, of the interval for this {{object}} instance.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Event.{i}.CalendarTimer." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object defines a calendar timer instance.
+        The calendar timer instance has attributes for when the timer is to begin ({{param|StartTime}}) and end ({{param|EndTime}}) as well as the schedule of the recurrence.
+        The algrorithm that defines how the schedule elements are evaluated is defined in {{bibref|LMAPIFM}}.
+        If the value of any of the {{param|ScheduleMonths}}, {{param|ScheduleDaysOfMonth}}, {{param|ScheduleDaysOfWeek}}, {{param|ScheduleHoursOfDay}}, {{param|ScheduleMinutesOfHour}} or {{param|ScheduleSecondsOfMinute}} is {{empty}} then any actions that use this object will not be invoked.
+      </description>
+      <parameter name="StartTime" access="readWrite" dmr:version="2.12">
+        <description>
+          Date and time that the {{object}} instance is to begin this operation.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EndTime" access="readWrite" dmr:version="2.12">
+        <description>
+          Date and time that the {{object}} instance is to end this operation.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleMonths" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter represents either a list of the months of year that are applied to the schedule or an asterisk (*) that represents all the elements of the list.
+          Each entry in the months of the year list can be a numeric value or the name of the month (january (1), february (2), march (3), april (4), may (5), june (6), july (7), august (8), september (9), october (10), november (11), december (12)).
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleDaysOfMonth" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter represents either a list of the days of the month (1-31) that are applied to the schedule or an asterisk (*) that represents all the elements of the list.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleDaysOfWeek" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter represents either a list of the days of the week that are applied to the schedule or an asterisk (*) that represents all the elements of the list.
+          Each entry in the days of the week list can be a numeric value or the name of the day (sunday (1), monday (2), tuesday (3), wednesday (4), thursday (5), friday (6), saturday (7)).
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleHoursOfDay" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter represents either a list of the hours of the day (0-23) that are applied to the schedule or an asterisk (*) that represents all the elements of the list.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleMinutesOfHour" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter represents either a list of the minutes of the hour (0-59) that are applied to the schedule or an asterisk (*) that represents all the elements of the list.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleSecondsOfMinute" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter represents either a list of the minutes of the hour (0-59) that are applied to the schedule or an asterisk (*) that represents all the elements of the list.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="EnableScheduleTimezoneOffset" access="readWrite" dmr:version="2.12">
+        <description>
+          When {{true}}, the value of the {{param|ScheduleTimezoneOffset}} parameter is applied to the schedule elements.
+          When {{false}}, the device's system timezone offset is applied to the schedule elements.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleTimezoneOffset" access="readWrite" dmr:version="2.12">
+        <description>
+          The timezone offset, in {{units}}, to be applied to the schedule elements.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-23" maxInclusive="23"/>
+            <units value="hours"/>
+          </int>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Event.{i}.OneOff." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object defines a one off timer instance.
+      </description>
+      <parameter name="StartTime" access="readWrite" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, that the {{object}} instance is to begin operation.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <profile name="Download:1" dmr:version="2.0">
+      <object ref="Device.IP.Diagnostics." requirement="present">
+        <parameter ref="IPv4DownloadDiagnosticsSupported" requirement="readOnly"/>
+        <parameter ref="IPv6DownloadDiagnosticsSupported" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IP.Diagnostics.DownloadDiagnostics." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="DownloadURL" requirement="readWrite"/>
+        <parameter ref="DownloadTransports" requirement="readOnly"/>
+        <parameter ref="DSCP" requirement="readWrite"/>
+        <parameter ref="EthernetPriority" requirement="readWrite"/>
+        <parameter ref="ROMTime" requirement="readOnly"/>
+        <parameter ref="BOMTime" requirement="readOnly"/>
+        <parameter ref="EOMTime" requirement="readOnly"/>
+        <parameter ref="TestBytesReceived" requirement="readOnly"/>
+        <parameter ref="TotalBytesReceived" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DownloadTCP:1" dmr:version="2.0">
+      <object ref="Device.IP.Diagnostics.DownloadDiagnostics." requirement="present">
+        <parameter ref="TCPOpenRequestTime" requirement="readOnly"/>
+        <parameter ref="TCPOpenResponseTime" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Upload:1" dmr:version="2.0">
+      <object ref="Device.IP.Diagnostics." requirement="present">
+        <parameter ref="IPv4UploadDiagnosticsSupported" requirement="readOnly"/>
+        <parameter ref="IPv6UploadDiagnosticsSupported" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IP.Diagnostics.UploadDiagnostics." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="UploadURL" requirement="readWrite"/>
+        <parameter ref="UploadTransports" requirement="readOnly"/>
+        <parameter ref="DSCP" requirement="readWrite"/>
+        <parameter ref="EthernetPriority" requirement="readWrite"/>
+        <parameter ref="ROMTime" requirement="readOnly"/>
+        <parameter ref="BOMTime" requirement="readOnly"/>
+        <parameter ref="EOMTime" requirement="readOnly"/>
+        <parameter ref="TestFileLength" requirement="readOnly"/>
+        <parameter ref="TotalBytesSent" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UploadTCP:1" dmr:version="2.0">
+      <object ref="Device.IP.Diagnostics.UploadDiagnostics." requirement="present">
+        <parameter ref="TCPOpenRequestTime" requirement="readOnly"/>
+        <parameter ref="TCPOpenResponseTime" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UDPEcho:1" dmr:version="2.0">
+      <object ref="Device.IP.Diagnostics.UDPEchoConfig." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="SourceIPAddress" requirement="readWrite"/>
+        <parameter ref="UDPPort" requirement="readWrite"/>
+        <parameter ref="PacketsReceived" requirement="readOnly"/>
+        <parameter ref="PacketsResponded" requirement="readOnly"/>
+        <parameter ref="BytesReceived" requirement="readOnly"/>
+        <parameter ref="BytesResponded" requirement="readOnly"/>
+        <parameter ref="TimeFirstPacketReceived" requirement="readOnly"/>
+        <parameter ref="TimeLastPacketReceived" requirement="readOnly"/>
+        <parameter ref="EchoPlusSupported" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UDPEchoPlus:1" dmr:version="2.0">
+      <object ref="Device.IP.Diagnostics.UDPEchoConfig." requirement="present">
+        <parameter ref="EchoPlusEnabled" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="SupportedDataModel:1" dmr:version="2.0">
+      <object ref="Device.DeviceInfo." requirement="present">
+        <parameter ref="SupportedDataModelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DeviceInfo.SupportedDataModel.{i}." requirement="present">
+        <parameter ref="URL" requirement="readOnly"/>
+        <parameter ref="URN" requirement="readOnly"/>
+        <parameter ref="Features" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="MemoryStatus:1" dmr:version="2.0">
+      <object ref="Device.DeviceInfo.MemoryStatus." requirement="present">
+        <parameter ref="Total" requirement="readOnly"/>
+        <parameter ref="Free" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ProcessStatus:1" dmr:version="2.0">
+      <object ref="Device.DeviceInfo.ProcessStatus." requirement="present">
+        <parameter ref="CPUUsage" requirement="readOnly"/>
+        <parameter ref="ProcessNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DeviceInfo.ProcessStatus.Process.{i}." requirement="present">
+        <parameter ref="PID" requirement="readOnly"/>
+        <parameter ref="Command" requirement="readOnly"/>
+        <parameter ref="Size" requirement="readOnly"/>
+        <parameter ref="Priority" requirement="readOnly"/>
+        <parameter ref="CPUTime" requirement="readOnly"/>
+        <parameter ref="State" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="TempStatus:1" dmr:version="2.0">
+      <object ref="Device.DeviceInfo.TemperatureStatus." requirement="present">
+        <parameter ref="TemperatureSensorNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DeviceInfo.TemperatureStatus.TemperatureSensor.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="ResetTime" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Value" requirement="readOnly"/>
+        <parameter ref="LastUpdate" requirement="readOnly"/>
+        <parameter ref="MinValue" requirement="readOnly"/>
+        <parameter ref="MinTime" requirement="readOnly"/>
+        <parameter ref="MaxValue" requirement="readOnly"/>
+        <parameter ref="MaxTime" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="User:1" dmr:version="2.0">
+      <object ref="Device.Users." requirement="present">
+        <parameter ref="UserNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Users.User.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Username" requirement="readWrite"/>
+        <parameter ref="Password" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="UPnPDev:1" dmr:version="2.0">
+      <object ref="Device.UPnP." requirement="present"/>
+      <object ref="Device.UPnP.Device." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="UPnPMediaServer" requirement="readWrite"/>
+        <parameter ref="UPnPMediaRenderer" requirement="readWrite"/>
+        <parameter ref="UPnPWLANAccessPoint" requirement="readWrite"/>
+        <parameter ref="UPnPQoSDevice " requirement="readWrite"/>
+        <parameter ref="UPnPQoSPolicyHolder" requirement="readWrite"/>
+        <parameter ref="UPnPIGD" requirement="readWrite"/>
+      </object>
+      <object ref="Device.UPnP.Device.Capabilities." requirement="present">
+        <parameter ref="UPnPArchitecture" requirement="readOnly"/>
+        <parameter ref="UPnPMediaServer" requirement="readOnly"/>
+        <parameter ref="UPnPMediaRenderer" requirement="readOnly"/>
+        <parameter ref="UPnPWLANAccessPoint" requirement="readOnly"/>
+        <parameter ref="UPnPBasicDevice" requirement="readOnly"/>
+        <parameter ref="UPnPQoSDevice" requirement="readOnly"/>
+        <parameter ref="UPnPQoSPolicyHolder" requirement="readOnly"/>
+        <parameter ref="UPnPIGD" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UPnPDiscBasic:1" dmr:version="2.0">
+      <object ref="Device.UPnP." requirement="present"/>
+      <object ref="Device.UPnP.Discovery." requirement="present">
+        <parameter ref="RootDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.UPnP.Discovery.RootDevice.{i}." requirement="present">
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="UUID" requirement="readOnly"/>
+        <parameter ref="USN" requirement="readOnly"/>
+        <parameter ref="LeaseTime" requirement="readOnly"/>
+        <parameter ref="Location" requirement="readOnly"/>
+        <parameter ref="Server" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UPnPDiscAdv:1" extends="UPnPDiscBasic:1" dmr:version="2.0">
+      <object ref="Device.UPnP.Discovery." requirement="present">
+        <parameter ref="DeviceNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ServiceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.UPnP.Discovery.Device.{i}." requirement="present">
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="UUID" requirement="readOnly"/>
+        <parameter ref="USN" requirement="readOnly"/>
+        <parameter ref="LeaseTime" requirement="readOnly"/>
+        <parameter ref="Location" requirement="readOnly"/>
+        <parameter ref="Server" requirement="readOnly"/>
+      </object>
+      <object ref="Device.UPnP.Discovery.Service.{i}." requirement="present">
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="USN" requirement="readOnly"/>
+        <parameter ref="LeaseTime" requirement="readOnly"/>
+        <parameter ref="Location" requirement="readOnly"/>
+        <parameter ref="Server" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UPnPDiscAdv:2" base="UPnPDiscAdv:1" dmr:version="2.6">
+      <object ref="Device.UPnP.Discovery.Device.{i}." requirement="present">
+        <parameter ref="LastUpdate" requirement="readOnly"/>
+        <parameter ref="Host" requirement="readOnly"/>
+      </object>
+      <object ref="Device.UPnP.Discovery.Service.{i}." requirement="present">
+        <parameter ref="LastUpdate" requirement="readOnly"/>
+        <parameter ref="Host" requirement="readOnly"/>
+        <parameter ref="ParentDevice" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="SelfTestDiag:1" dmr:version="2.0">
+      <object ref="Device.SelfTestDiagnostics." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Results" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="NSLookupDiag:1" dmr:version="2.0">
+      <object ref="Device.DNS.Diagnostics.NSLookupDiagnostics." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="HostName" requirement="readWrite"/>
+        <parameter ref="DNSServer" requirement="readWrite"/>
+        <parameter ref="Timeout" requirement="readWrite"/>
+        <parameter ref="NumberOfRepetitions" requirement="readWrite"/>
+        <parameter ref="SuccessCount" requirement="readOnly"/>
+        <parameter ref="ResultNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DNS.Diagnostics.NSLookupDiagnostics.Result.{i}." requirement="present">
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="AnswerType" requirement="readOnly"/>
+        <parameter ref="HostNameReturned" requirement="readOnly"/>
+        <parameter ref="IPAddresses" requirement="readOnly"/>
+        <parameter ref="DNSServerIP" requirement="readOnly"/>
+        <parameter ref="ResponseTime" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="SimpleFirewall:1" dmr:version="2.0">
+      <object ref="Device.Firewall." requirement="present">
+        <parameter ref="Config" requirement="readWrite"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="AdvancedFirewall:1" extends="SimpleFirewall:1" dmr:version="2.2">
+      <object ref="Device.Firewall." requirement="present">
+        <parameter ref="AdvancedLevel" requirement="readWrite"/>
+        <parameter ref="Type" requirement="readOnly"/>
+        <parameter ref="LevelNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ChainNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Firewall.Level.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Chain" requirement="readOnly"/>
+        <parameter ref="PortMappingEnabled" requirement="readWrite">
+          <description>
+            REQUIRED only for devices that support NAT.
+          </description>
+        </parameter>
+        <parameter ref="DefaultPolicy" requirement="readWrite"/>
+        <parameter ref="DefaultLogPolicy" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Firewall.Chain.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Creator" requirement="readOnly"/>
+        <parameter ref="RuleNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Firewall.Chain.{i}.Rule.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Target" requirement="readWrite"/>
+        <parameter ref="TargetChain" requirement="readWrite"/>
+        <parameter ref="SourceInterface" requirement="readWrite"/>
+        <parameter ref="SourceInterfaceExclude" requirement="readWrite"/>
+        <parameter ref="SourceAllInterfaces" requirement="readWrite"/>
+        <parameter ref="DestInterface" requirement="readWrite"/>
+        <parameter ref="DestInterfaceExclude" requirement="readWrite"/>
+        <parameter ref="DestAllInterfaces" requirement="readWrite"/>
+        <parameter ref="IPVersion" requirement="readWrite"/>
+        <parameter ref="DestIP" requirement="readWrite"/>
+        <parameter ref="DestMask" requirement="readWrite"/>
+        <parameter ref="DestIPExclude" requirement="readWrite"/>
+        <parameter ref="SourceIP" requirement="readWrite"/>
+        <parameter ref="SourceMask" requirement="readWrite"/>
+        <parameter ref="SourceIPExclude" requirement="readWrite"/>
+        <parameter ref="Protocol" requirement="readWrite"/>
+        <parameter ref="ProtocolExclude" requirement="readWrite"/>
+        <parameter ref="DestPort" requirement="readWrite"/>
+        <parameter ref="DestPortRangeMax" requirement="readWrite"/>
+        <parameter ref="DestPortExclude" requirement="readWrite"/>
+        <parameter ref="SourcePort" requirement="readWrite"/>
+        <parameter ref="SourcePortRangeMax" requirement="readWrite"/>
+        <parameter ref="SourcePortExclude" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="USBHostsBasic:1" dmr:version="2.0">
+      <object ref="Device.USB.USBHosts." requirement="present">
+        <parameter ref="HostNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.USB.USBHosts.Host.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Type" requirement="readOnly"/>
+        <parameter ref="USBVersion" requirement="readOnly"/>
+        <parameter ref="DeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.USB.USBHosts.Host.{i}.Device.{i}." requirement="present">
+        <parameter ref="DeviceNumber" requirement="readOnly"/>
+        <parameter ref="USBVersion" requirement="readOnly"/>
+        <parameter ref="DeviceClass" requirement="readOnly"/>
+        <parameter ref="DeviceSubClass" requirement="readOnly"/>
+        <parameter ref="DeviceVersion" requirement="readOnly"/>
+        <parameter ref="DeviceProtocol" requirement="readOnly"/>
+        <parameter ref="ProductID" requirement="readOnly"/>
+        <parameter ref="VendorID" requirement="readOnly"/>
+        <parameter ref="Manufacturer" requirement="readOnly"/>
+        <parameter ref="ProductClass" requirement="readOnly"/>
+        <parameter ref="SerialNumber" requirement="readOnly"/>
+        <parameter ref="Port" requirement="readOnly"/>
+        <parameter ref="Rate" requirement="readOnly"/>
+        <parameter ref="Parent" requirement="readOnly"/>
+        <parameter ref="MaxChildren" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="PeriodicStatsBase:1" dmr:version="2.0">
+      <object ref="Device.PeriodicStatistics." requirement="present">
+        <parameter ref="MinSampleInterval" requirement="readOnly"/>
+        <parameter ref="MaxReportSamples" requirement="readOnly"/>
+        <parameter ref="SampleSetNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.PeriodicStatistics.SampleSet.{i}." requirement="createDelete">
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="SampleInterval" requirement="readWrite"/>
+        <parameter ref="ReportSamples" requirement="readWrite"/>
+        <parameter ref="ReportStartTime" requirement="readOnly"/>
+        <parameter ref="ReportEndTime" requirement="readOnly"/>
+        <parameter ref="SampleSeconds" requirement="readOnly"/>
+        <parameter ref="ParameterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}." requirement="createDelete">
+        <parameter ref="Reference" requirement="readWrite"/>
+        <parameter ref="SampleSeconds" requirement="readOnly"/>
+        <parameter ref="SuspectData" requirement="readOnly"/>
+        <parameter ref="Values" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="_Baseline:1" dmr:version="2.0">
+      <object ref="Device." requirement="present">
+        <parameter ref="InterfaceStackNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DeviceInfo." requirement="present">
+        <parameter ref="Manufacturer" requirement="readOnly"/>
+        <parameter ref="ManufacturerOUI" requirement="readOnly"/>
+        <parameter ref="ModelName" requirement="readOnly"/>
+        <parameter ref="Description" requirement="readOnly"/>
+        <parameter ref="SerialNumber" requirement="readOnly"/>
+        <parameter ref="HardwareVersion" requirement="readOnly"/>
+        <parameter ref="SoftwareVersion" requirement="readOnly"/>
+        <parameter ref="ProvisioningCode" requirement="readWrite"/>
+        <parameter ref="UpTime" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LANConfigSecurity." requirement="present">
+        <parameter ref="ConfigPassword" requirement="readWrite"/>
+      </object>
+      <object ref="Device.DNS." requirement="present"/>
+      <object ref="Device.DNS.Client." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="ServerNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DNS.Client.Server.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="DNSServer" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="Type" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="_Baseline:2" base="_Baseline:1" dmr:version="2.2">
+      <object ref="Device.InterfaceStack.{i}." requirement="present">
+        <parameter ref="HigherLayer" requirement="readOnly"/>
+        <parameter ref="LowerLayer" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DNS." requirement="present">
+        <parameter ref="SupportedRecordTypes" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="_Baseline:3" base="_Baseline:2" dmr:version="2.4">
+      <object ref="Device." requirement="present">
+        <parameter ref="RootDataModelVersion" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Optical:1" dmr:version="2.4">
+      <object ref="Device.Optical." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Optical.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="OpticalSignalLevel" requirement="readOnly"/>
+        <parameter ref="TransmitOpticalLevel" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Optical.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"/>
+      </object>
+    </profile>
+    <profile name="EthernetRMONStats:1" dmr:version="2.4">
+      <object ref="Device.Ethernet." requirement="present">
+        <parameter ref="RMONStatsNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Ethernet.RMONStats.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readOnly"/>
+        <parameter ref="Bytes" requirement="readOnly"/>
+        <parameter ref="Packets" requirement="readOnly"/>
+        <parameter ref="CRCErroredPackets" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Ghn:1" dmr:version="2.4">
+      <object ref="Device.Ghn." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Ghn.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="FirmwareVersion" requirement="readOnly"/>
+        <parameter ref="TargetDomainNames" requirement="readWrite"/>
+        <parameter ref="DomainName" requirement="readOnly"/>
+        <parameter ref="DomainNameIdentifier" requirement="readOnly"/>
+        <parameter ref="DomainId" requirement="readOnly"/>
+        <parameter ref="DeviceId" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="NodeTypeDMCapable" requirement="readOnly"/>
+        <parameter ref="NodeTypeSCCapable" requirement="readOnly"/>
+        <parameter ref="NodeTypeDMConfig" requirement="readOnly"/>
+        <parameter ref="NodeTypeDMStatus" requirement="readOnly"/>
+        <parameter ref="NodeTypeSCStatus" requirement="readOnly"/>
+        <parameter ref="AssociatedDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Ghn.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"/>
+      </object>
+      <object ref="Device.Ghn.Interface.{i}.AssociatedDevice.{i}." requirement="present">
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="DeviceId" requirement="readOnly"/>
+        <parameter ref="TxPhyRate" requirement="readOnly"/>
+        <parameter ref="RxPhyRate" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DNSRelay:1" dmr:version="2.0">
+      <object ref="Device.DNS." requirement="present"/>
+      <object ref="Device.DNS.Relay." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="ForwardNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DNS.Relay.Forwarding.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="DNSServer" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="Type" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Routing:1" dmr:version="2.0">
+      <object ref="Device.Routing." requirement="present">
+        <parameter ref="RouterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.RIP." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="SupportedModes" requirement="readOnly"/>
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.RIP.InterfaceSetting.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AcceptRA" requirement="readWrite"/>
+        <parameter ref="SendRA" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Routing.Router.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="IPv4ForwardingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.Router.{i}.IPv4Forwarding.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="DestIPAddress" requirement="readWrite"/>
+        <parameter ref="DestSubnetMask" requirement="readWrite"/>
+        <parameter ref="GatewayIPAddress" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="ForwardingMetric" requirement="readWrite"/>
+        <parameter ref="StaticRoute" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Routing:2" base="Routing:1" dmr:version="2.2">
+      <object ref="Device.Routing.Router.{i}.IPv4Forwarding.{i}." requirement="createDelete">
+        <parameter ref="Origin" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IPv6Routing:1" dmr:version="2.2">
+      <object ref="Device.Routing." requirement="present">
+        <parameter ref="RouterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.RIP." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="SupportedModes" requirement="readOnly"/>
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.RIP.InterfaceSetting.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AcceptRA" requirement="readWrite"/>
+        <parameter ref="SendRA" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Routing.RouteInformation." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.RouteInformation.InterfaceSetting.{i}." requirement="present">
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readOnly"/>
+        <parameter ref="SourceRouter" requirement="readOnly"/>
+        <parameter ref="PreferredRouteFlag" requirement="readOnly"/>
+        <parameter ref="Prefix" requirement="readOnly"/>
+        <parameter ref="RouteLifetime" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.Router.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="IPv6ForwardingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.Router.{i}.IPv6Forwarding.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="DestIPPrefix" requirement="readWrite"/>
+        <parameter ref="NextHop" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="ForwardingMetric" requirement="readWrite"/>
+        <parameter ref="Origin" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IPInterface:1" dmr:version="2.0">
+      <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="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="Type" requirement="readOnly"/>
+        <parameter ref="Reset" requirement="readWrite"/>
+        <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="VLANTermination:1" dmr:version="2.0">
+      <object ref="Device.Ethernet." requirement="present">
+        <parameter ref="VLANTerminationNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Ethernet.VLANTermination.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="VLANID" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Ethernet.VLANTermination.{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="EthernetLink:1" dmr:version="2.0">
+      <object ref="Device.Ethernet." requirement="present">
+        <parameter ref="LinkNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Ethernet.Link.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Ethernet.Link.{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="Bridge:1" dmr:version="2.0">
+      <object ref="Device.Bridging." requirement="present">
+        <parameter ref="MaxBridgeEntries" requirement="readOnly"/>
+        <parameter ref="MaxDBridgeEntries" requirement="readOnly"/>
+        <parameter ref="BridgeNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="PortNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}.Port.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="ManagementPort" requirement="readWrite"/>
+        <parameter ref="PortState" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}.Port.{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="VLANBridge:1" dmr:version="2.0">
+      <object ref="Device.Bridging." requirement="present">
+        <parameter ref="MaxBridgeEntries" requirement="readOnly"/>
+        <parameter ref="MaxDBridgeEntries" requirement="readOnly"/>
+        <parameter ref="MaxQBridgeEntries" requirement="readOnly"/>
+        <parameter ref="MaxVLANEntries" requirement="readOnly"/>
+        <parameter ref="BridgeNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Standard" requirement="readWrite"/>
+        <parameter ref="PortNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="VLANNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="VLANPortNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}.Port.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="ManagementPort" requirement="readWrite"/>
+        <parameter ref="DefaultUserPriority" requirement="readWrite"/>
+        <parameter ref="PriorityRegeneration" requirement="readWrite"/>
+        <parameter ref="PortState" requirement="readOnly"/>
+        <parameter ref="PVID" requirement="readWrite"/>
+        <parameter ref="AcceptableFrameTypes" requirement="readWrite"/>
+        <parameter ref="IngressFiltering" requirement="readWrite"/>
+        <parameter ref="PriorityTagging" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}.Port.{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>
+      <object ref="Device.Bridging.Bridge.{i}.VLAN.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="VLANID" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}.VLANPort.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="VLAN" requirement="readWrite"/>
+        <parameter ref="Port" requirement="readWrite"/>
+        <parameter ref="Untagged" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BridgeFilter:1" dmr:version="2.0">
+      <object ref="Device.Bridging." requirement="present">
+        <parameter ref="MaxFilterEntries" requirement="readOnly"/>
+        <parameter ref="FilterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Bridging.Filter.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Bridge" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="VLANIDFilter" requirement="readWrite"/>
+        <parameter ref="EthertypeFilterList" requirement="readWrite"/>
+        <parameter ref="EthertypeFilterExclude" requirement="readWrite"/>
+        <parameter ref="SourceMACAddressFilterList" requirement="readWrite"/>
+        <parameter ref="SourceMACAddressFilterExclude" requirement="readWrite"/>
+        <parameter ref="DestMACAddressFilterList" requirement="readWrite"/>
+        <parameter ref="DestMACAddressFilterExclude" requirement="readWrite"/>
+        <parameter ref="SourceMACFromVendorClassIDFilter" requirement="readWrite"/>
+        <parameter ref="SourceMACFromVendorClassIDFilterExclude" requirement="readWrite"/>
+        <parameter ref="SourceMACFromVendorClassIDMode" requirement="readWrite"/>
+        <parameter ref="DestMACFromVendorClassIDFilter" requirement="readWrite"/>
+        <parameter ref="DestMACFromVendorClassIDFilterExclude" requirement="readWrite"/>
+        <parameter ref="DestMACFromVendorClassIDMode" requirement="readWrite"/>
+        <parameter ref="SourceMACFromClientIDFilter" requirement="readWrite"/>
+        <parameter ref="SourceMACFromClientIDFilterExclude" requirement="readWrite"/>
+        <parameter ref="DestMACFromClientIDFilter" requirement="readWrite"/>
+        <parameter ref="DestMACFromClientIDFilterExclude" requirement="readWrite"/>
+        <parameter ref="SourceMACFromUserClassIDFilter" requirement="readWrite"/>
+        <parameter ref="SourceMACFromUserClassIDFilterExclude" requirement="readWrite"/>
+        <parameter ref="DestMACFromUserClassIDFilter" requirement="readWrite"/>
+        <parameter ref="DestMACFromUserClassIDFilterExclude" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BridgeFilter:2" base="BridgeFilter:1" dmr:version="2.2">
+      <object ref="Device.Bridging.Filter.{i}." requirement="createDelete">
+        <parameter ref="DHCPType" requirement="readWrite"/>
+        <parameter ref="SourceMACFromVendorClassIDFilter" requirement="readWrite">
+          <description>
+            REQUIRED only for IPv4 capable devices.
+          </description>
+        </parameter>
+        <parameter ref="DestMACFromVendorClassIDFilter" requirement="readWrite">
+          <description>
+            REQUIRED only for IPv4 capable devices.
+          </description>
+        </parameter>
+        <parameter ref="SourceMACFromVendorClassIDFilterv6" requirement="readWrite">
+          <description>
+            REQUIRED only for IPv6 capable devices.
+          </description>
+        </parameter>
+        <parameter ref="DestMACFromVendorClassIDFilterv6" requirement="readWrite">
+          <description>
+            REQUIRED only for IPv6 capable devices.
+          </description>
+        </parameter>
+      </object>
+    </profile>
+    <profile name="BridgeL3L4Filter:1" extends="BridgeFilter:2" dmr:version="2.6">
+      <object ref="Device.Bridging.Filter.{i}." requirement="createDelete">
+        <parameter ref="DestIP" requirement="readWrite"/>
+        <parameter ref="DestMask" requirement="readWrite"/>
+        <parameter ref="DestIPExclude" requirement="readWrite"/>
+        <parameter ref="SourcePort" requirement="readWrite"/>
+        <parameter ref="SourcePortRangeMax" requirement="readWrite"/>
+        <parameter ref="SourceIP" requirement="readWrite"/>
+        <parameter ref="SourceMask" requirement="readWrite"/>
+        <parameter ref="SourceIPExclude" requirement="readWrite"/>
+        <parameter ref="SourcePortExclude" requirement="readWrite"/>
+        <parameter ref="Protocol" requirement="readWrite"/>
+        <parameter ref="ProtocolExclude" requirement="readWrite"/>
+        <parameter ref="DestPort" requirement="readWrite"/>
+        <parameter ref="DestPortExclude" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="ATMLink:1" dmr:version="2.0">
+      <object ref="Device.ATM." requirement="present">
+        <parameter ref="LinkNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ATM.Link.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="LinkType" requirement="readWrite"/>
+        <parameter ref="DestinationAddress" requirement="readWrite"/>
+        <parameter ref="Encapsulation" requirement="readWrite"/>
+        <parameter ref="FCSPreserved" requirement="readWrite"/>
+        <parameter ref="VCSearchList" requirement="readWrite"/>
+        <parameter ref="AAL" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ATM.Link.{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"/>
+        <parameter ref="TransmittedBlocks" requirement="readOnly"/>
+        <parameter ref="ReceivedBlocks" requirement="readOnly"/>
+        <parameter ref="CRCErrors" requirement="readOnly"/>
+        <parameter ref="HECErrors" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="PTMLink:1" dmr:version="2.0">
+      <object ref="Device.PTM." requirement="present">
+        <parameter ref="LinkNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.PTM.Link.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+      </object>
+      <object ref="Device.PTM.Link.{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="EthernetInterface:1" dmr:version="2.0">
+      <object ref="Device.Ethernet." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Ethernet.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readWrite"/>
+        <parameter ref="DuplexMode" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Ethernet.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="EthernetInterface:2" base="EthernetInterface:1" dmr:version="2.7">
+      <object ref="Device.Ethernet.Interface.{i}." requirement="present">
+        <parameter ref="CurrentBitRate" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ProviderBridge:1" dmr:version="2.7">
+      <object ref="Device.Bridging." requirement="present">
+        <parameter ref="MaxProviderBridgeEntries" requirement="readOnly"/>
+        <parameter ref="ProviderBridgeNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}.Port.{i}." requirement="createDelete">
+        <parameter ref="ServiceAccessPrioritySelection" requirement="readWrite"/>
+        <parameter ref="ServiceAccessPriorityTranslation" requirement="readWrite"/>
+        <parameter ref="Type" requirement="readWrite"/>
+        <parameter ref="TPID" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}.Port.{i}.PriorityCodePoint." requirement="present">
+        <parameter ref="PCPSelection" requirement="readWrite"/>
+        <parameter ref="UseDEI" requirement="readWrite"/>
+        <parameter ref="RequireDropEncoding" requirement="readWrite"/>
+        <parameter ref="PCPEncoding" requirement="readWrite"/>
+        <parameter ref="PCPDecoding" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Bridging.ProviderBridge.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Type" requirement="readWrite"/>
+        <parameter ref="SVLANcomponent" requirement="readWrite"/>
+        <parameter ref="CVLANcomponents" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Ethernet.VLANTermination.{i}." requirement="createDelete">
+        <parameter ref="TPID" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="ProviderBridgeQoS:1" dmr:version="2.7">
+      <object ref="Device.QoS." requirement="present">
+        <parameter ref="DefaultInnerEthernetPriorityMark" requirement="readWrite"/>
+      </object>
+      <object ref="Device.QoS.Classification.{i}." requirement="createDelete">
+        <parameter ref="InnerEthernetPriorityCheck" requirement="readWrite"/>
+        <parameter ref="InnerEthernetPriorityExclude" requirement="readWrite"/>
+        <parameter ref="InnerEthernetPriorityMark" requirement="readWrite"/>
+        <parameter ref="EthernetDEICheck" requirement="readWrite"/>
+        <parameter ref="EthernetDEIExclude" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="ADSL:1" dmr:version="2.0">
+      <description>
+        Note: This profile is valid for G.992.1 modems.
+      </description>
+      <object ref="Device.DSL." requirement="present">
+        <parameter ref="LineNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ChannelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="UpstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="DownstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="UpstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="DownstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="UpstreamAttenuation" requirement="readOnly"/>
+        <parameter ref="DownstreamAttenuation" requirement="readOnly"/>
+        <parameter ref="UpstreamPower" requirement="readOnly"/>
+        <parameter ref="DownstreamPower" requirement="readOnly"/>
+        <parameter ref="XTURVendor" requirement="readOnly"/>
+        <parameter ref="XTURCountry" requirement="readOnly"/>
+        <parameter ref="XTUCVendor" requirement="readOnly"/>
+        <parameter ref="XTUCCountry" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{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="TotalStart" requirement="readOnly"/>
+        <parameter ref="ShowtimeStart" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{i}.Stats.Total." requirement="present">
+        <parameter ref="ErroredSecs" requirement="readOnly"/>
+        <parameter ref="SeverelyErroredSecs" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{i}.Stats.Showtime." requirement="present">
+        <parameter ref="ErroredSecs" requirement="readOnly"/>
+        <parameter ref="SeverelyErroredSecs" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="UpstreamCurrRate" requirement="readOnly"/>
+        <parameter ref="DownstreamCurrRate" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{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="TotalStart" requirement="readOnly"/>
+        <parameter ref="ShowtimeStart" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{i}.Stats.Total." requirement="present">
+        <parameter ref="XTURFECErrors" requirement="readOnly"/>
+        <parameter ref="XTUCFECErrors" requirement="readOnly"/>
+        <parameter ref="XTURHECErrors" requirement="readOnly"/>
+        <parameter ref="XTUCHECErrors" requirement="readOnly"/>
+        <parameter ref="XTURCRCErrors" requirement="readOnly"/>
+        <parameter ref="XTUCCRCErrors" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{i}.Stats.Showtime." requirement="present">
+        <parameter ref="XTURFECErrors" requirement="readOnly"/>
+        <parameter ref="XTUCFECErrors" requirement="readOnly"/>
+        <parameter ref="XTURHECErrors" requirement="readOnly"/>
+        <parameter ref="XTUCHECErrors" requirement="readOnly"/>
+        <parameter ref="XTURCRCErrors" requirement="readOnly"/>
+        <parameter ref="XTUCCRCErrors" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ADSL2:1" dmr:version="2.0">
+      <description>
+        Note: This profile is valid for G.992.3 and G.992.5 modems.
+      </description>
+      <object ref="Device.DSL." requirement="present">
+        <parameter ref="LineNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ChannelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="StandardsSupported" requirement="readOnly"/>
+        <parameter ref="StandardUsed" requirement="readOnly"/>
+        <parameter ref="UpstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="DownstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="UpstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="DownstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="UpstreamPower" requirement="readOnly"/>
+        <parameter ref="DownstreamPower" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{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"/>
+      </object>
+      <object ref="Device.DSL.Line.{i}.TestParams." requirement="present">
+        <parameter ref="HLOGpsds" requirement="readOnly"/>
+        <parameter ref="HLOGpsus" requirement="readOnly"/>
+        <parameter ref="HLOGMTds" requirement="readOnly"/>
+        <parameter ref="HLOGMTus" requirement="readOnly"/>
+        <parameter ref="QLNpsds" requirement="readOnly"/>
+        <parameter ref="QLNpsus" requirement="readOnly"/>
+        <parameter ref="QLNMTds" requirement="readOnly"/>
+        <parameter ref="QLNMTus" requirement="readOnly"/>
+        <parameter ref="SNRpsds" requirement="readOnly"/>
+        <parameter ref="SNRpsus" requirement="readOnly"/>
+        <parameter ref="SNRMTds" requirement="readOnly"/>
+        <parameter ref="SNRMTus" requirement="readOnly"/>
+        <parameter ref="LATNds" requirement="readOnly"/>
+        <parameter ref="LATNus" requirement="readOnly"/>
+        <parameter ref="SATNds" requirement="readOnly"/>
+        <parameter ref="SATNus" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LinkEncapsulationSupported" requirement="readOnly"/>
+        <parameter ref="LinkEncapsulationUsed" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{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="TotalStart" requirement="readOnly"/>
+        <parameter ref="ShowtimeStart" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ADSL2:2" base="ADSL2:1" dmr:version="2.8">
+      <object ref="Device.DSL.Line.{i}." requirement="present">
+        <parameter ref="XTSE" requirement="readOnly"/>
+        <parameter ref="XTSUsed" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{i}." requirement="present">
+        <parameter ref="ACTNDR" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="VDSL2:1" dmr:version="2.0">
+      <object ref="Device.DSL." requirement="present">
+        <parameter ref="LineNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ChannelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="StandardsSupported" requirement="readOnly"/>
+        <parameter ref="StandardUsed" requirement="readOnly"/>
+        <parameter ref="AllowedProfiles" requirement="readOnly"/>
+        <parameter ref="CurrentProfile" requirement="readOnly"/>
+        <parameter ref="UPBOKLE" requirement="readOnly"/>
+        <parameter ref="UpstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="DownstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="UpstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="DownstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="UpstreamAttenuation" requirement="readOnly"/>
+        <parameter ref="DownstreamAttenuation" requirement="readOnly"/>
+        <parameter ref="UpstreamPower" requirement="readOnly"/>
+        <parameter ref="DownstreamPower" requirement="readOnly"/>
+        <parameter ref="TRELLISds" requirement="readOnly"/>
+        <parameter ref="TRELLISus" requirement="readOnly"/>
+        <parameter ref="ACTSNRMODEds" requirement="readOnly"/>
+        <parameter ref="ACTSNRMODEus" requirement="readOnly"/>
+        <parameter ref="ACTUALCE" requirement="readOnly"/>
+        <parameter ref="SNRMpbds" requirement="readOnly"/>
+        <parameter ref="SNRMpbus" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{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"/>
+      </object>
+      <object ref="Device.DSL.Line.{i}.TestParams." requirement="present">
+        <parameter ref="HLOGGds" requirement="readOnly"/>
+        <parameter ref="HLOGGus" requirement="readOnly"/>
+        <parameter ref="HLOGpsds" requirement="readOnly"/>
+        <parameter ref="HLOGpsus" requirement="readOnly"/>
+        <parameter ref="HLOGMTds" requirement="readOnly"/>
+        <parameter ref="HLOGMTus" requirement="readOnly"/>
+        <parameter ref="QLNGds" requirement="readOnly"/>
+        <parameter ref="QLNGus" requirement="readOnly"/>
+        <parameter ref="QLNpsds" requirement="readOnly"/>
+        <parameter ref="QLNpsus" requirement="readOnly"/>
+        <parameter ref="QLNMTds" requirement="readOnly"/>
+        <parameter ref="QLNMTus" requirement="readOnly"/>
+        <parameter ref="SNRGds" requirement="readOnly"/>
+        <parameter ref="SNRGus" requirement="readOnly"/>
+        <parameter ref="SNRpsds" requirement="readOnly"/>
+        <parameter ref="SNRpsus" requirement="readOnly"/>
+        <parameter ref="SNRMTds" requirement="readOnly"/>
+        <parameter ref="SNRMTus" requirement="readOnly"/>
+        <parameter ref="LATNds" requirement="readOnly"/>
+        <parameter ref="LATNus" requirement="readOnly"/>
+        <parameter ref="SATNds" requirement="readOnly"/>
+        <parameter ref="SATNus" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LinkEncapsulationSupported" requirement="readOnly"/>
+        <parameter ref="LinkEncapsulationUsed" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{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="TotalStart" requirement="readOnly"/>
+        <parameter ref="ShowtimeStart" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="VDSL2:2" base="VDSL2:1" dmr:version="2.8">
+      <object ref="Device.DSL.Line.{i}." requirement="present">
+        <parameter ref="XTSE" requirement="readOnly"/>
+        <parameter ref="XTSUsed" requirement="readOnly"/>
+        <parameter ref="UPBOKLEPb" requirement="readOnly"/>
+        <parameter ref="UPBOKLERPb" requirement="readOnly"/>
+        <parameter ref="ACTRAMODEds" requirement="readOnly"/>
+        <parameter ref="ACTRAMODEus" requirement="readOnly"/>
+        <parameter ref="ACTINPROCds" requirement="readOnly"/>
+        <parameter ref="ACTINPROCus" requirement="readOnly"/>
+        <parameter ref="SNRMROCds" requirement="readOnly"/>
+        <parameter ref="SNRMROCus" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{i}." requirement="present">
+        <parameter ref="ACTNDR" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="VDSL2:3" base="VDSL2:2" dmr:version="2.12">
+      <object ref="Device.DSL.Line.{i}." requirement="present">
+        <parameter ref="UpstreamAttenuation" status="deleted" requirement="readOnly"/>
+        <parameter ref="DownstreamAttenuation" status="deleted" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="CellularInterfaceBase:1" dmr:version="2.8">
+      <object ref="Device.Cellular." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="AccessPointNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Cellular.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="NetworkInUse" requirement="readOnly"/>
+        <parameter ref="CurrentAccessTechnology" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Cellular.Interface.{i}.USIM." requirement="present">
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="MSISDN" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Cellular.AccessPoint.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="APN" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="CellularInterfaceExtended:1" extends="CellularInterfaceBase:1" dmr:version="2.8">
+      <object ref="Device.Cellular." requirement="present">
+        <parameter ref="RoamingEnabled" requirement="readWrite"/>
+        <parameter ref="RoamingStatus" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Cellular.Interface.{i}." requirement="present">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="IMEI" requirement="readOnly"/>
+        <parameter ref="SupportedAccessTechnologies" requirement="readOnly"/>
+        <parameter ref="PreferredAccessTechnology" requirement="readWrite"/>
+        <parameter ref="NetworkRequested" requirement="readOnly"/>
+        <parameter ref="AvailableNetworks" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Cellular.Interface.{i}.USIM." requirement="present">
+        <parameter ref="IMSI" requirement="readOnly"/>
+        <parameter ref="ICCID" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="CellularInterfaceStats:1" dmr:version="2.8">
+      <object ref="Device.Cellular.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"/>
+      </object>
+    </profile>
+    <profile name="LLDPBaseline:1" dmr:version="2.8">
+      <object ref="Device.LLDP." requirement="present"/>
+      <object ref="Device.LLDP.Discovery." requirement="present">
+        <parameter ref="DeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LLDP.Discovery.Device.{i}." requirement="present">
+        <parameter ref="Interface" requirement="readOnly"/>
+        <parameter ref="ChassisIDSubtype" requirement="readOnly"/>
+        <parameter ref="ChassisID" requirement="readOnly"/>
+        <parameter ref="Host" requirement="readOnly"/>
+        <parameter ref="PortNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LLDP.Discovery.Device.{i}.Port.{i}." requirement="present">
+        <parameter ref="PortIDSubtype" requirement="readOnly"/>
+        <parameter ref="PortID" requirement="readOnly"/>
+        <parameter ref="TTL" requirement="readOnly"/>
+        <parameter ref="PortDescription" requirement="readOnly"/>
+        <parameter ref="LastUpdate" requirement="readOnly"/>
+        <parameter ref="MACAddressList" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="LLDPRemOrgDefInfo:1" dmr:version="2.8">
+      <object ref="Device.LLDP.Discovery.Device.{i}.Port.{i}.LinkInformation." requirement="present">
+        <parameter ref="InterfaceType" requirement="readOnly"/>
+        <parameter ref="MACForwardingTable" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LLDP.Discovery.Device.{i}.DeviceInformation." requirement="present">
+        <parameter ref="DeviceCategory" requirement="readOnly"/>
+        <parameter ref="ManufacturerOUI" requirement="readOnly"/>
+        <parameter ref="ModelName" requirement="readOnly"/>
+        <parameter ref="ModelNumber" requirement="readOnly"/>
+        <parameter ref="VendorSpecificNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LLDP.Discovery.Device.{i}.DeviceInformation.VendorSpecific.{i}." requirement="present">
+        <parameter ref="OrganizationCode" requirement="readOnly"/>
+        <parameter ref="InformationType" requirement="readOnly"/>
+        <parameter ref="Information" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="GREBasic:1" dmr:version="2.8">
+      <object ref="Device.GRE." requirement="present">
+        <parameter ref="TunnelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.GRE.Tunnel.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="RemoteEndpoints" requirement="readWrite"/>
+        <parameter ref="KeepAlivePolicy" requirement="readWrite"/>
+        <parameter ref="KeepAliveTimeout" requirement="readWrite"/>
+        <parameter ref="KeepAliveThreshold" requirement="readWrite"/>
+        <parameter ref="DeliveryHeaderProtocol" requirement="readWrite"/>
+        <parameter ref="ConnectedRemoteEndpoint" requirement="readOnly"/>
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.GRE.Tunnel.{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"/>
+      </object>
+      <object ref="Device.GRE.Tunnel.{i}.Interface.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readOnly"/>
+        <parameter ref="ProtocolIdOverride" requirement="readWrite"/>
+        <parameter ref="UseChecksum" requirement="readWrite"/>
+      </object>
+      <object ref="Device.GRE.Tunnel.{i}.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"/>
+      </object>
+    </profile>
+    <profile name="GREAdv:1" extends="GREBasic:1" dmr:version="2.8">
+      <object ref="Device.GRE." requirement="present">
+        <parameter ref="FilterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.GRE.Tunnel.{i}.Stats." requirement="present">
+        <parameter ref="KeepAliveSent" requirement="readOnly"/>
+        <parameter ref="KeepAliveReceived" requirement="readOnly"/>
+      </object>
+      <object ref="Device.GRE.Tunnel.{i}.Interface.{i}." requirement="createDelete">
+        <parameter ref="KeyIdentifierGenerationPolicy" requirement="readWrite"/>
+        <parameter ref="KeyIdentifier" requirement="readWrite"/>
+        <parameter ref="UseSequenceNumber" requirement="readWrite"/>
+      </object>
+      <object ref="Device.GRE.Tunnel.{i}.Interface.{i}.Stats." requirement="present">
+        <parameter ref="DiscardChecksumReceived" requirement="readOnly"/>
+        <parameter ref="DiscardSequenceNumberReceived" requirement="readOnly"/>
+      </object>
+      <object ref="Device.GRE.Filter.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AllInterfaces" requirement="readWrite"/>
+        <parameter ref="VLANIDCheck" requirement="readWrite"/>
+        <parameter ref="VLANIDExclude" requirement="readWrite"/>
+        <parameter ref="DSCPMarkPolicy" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="MAPBasic:1" dmr:version="2.8">
+      <object ref="Device.MAP." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="DomainNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MAP.Domain.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="TransportMode" requirement="readOnly"/>
+        <parameter ref="WANInterface" requirement="readOnly"/>
+        <parameter ref="IPv6Prefix" requirement="readWrite"/>
+        <parameter ref="BRIPv6Prefix" requirement="readWrite"/>
+        <parameter ref="RuleNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MAP.Domain.{i}.Rule.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="IPv6Prefix" requirement="readWrite"/>
+        <parameter ref="IPv4Prefix" requirement="readWrite"/>
+        <parameter ref="IsFMR" requirement="readWrite"/>
+      </object>
+      <object ref="Device.MAP.Domain.{i}.Interface." requirement="present"/>
+    </profile>
+    <profile name="MAPAdv:1" extends="MAPBasic:1" dmr:version="2.8">
+      <object ref="Device.MAP.Domain.{i}." requirement="present">
+        <parameter ref="PSIDOffset" requirement="readWrite"/>
+        <parameter ref="PSIDLength" requirement="readWrite"/>
+        <parameter ref="PSID" requirement="readWrite"/>
+        <parameter ref="IncludeSystemPorts" requirement="readWrite"/>
+      </object>
+      <object ref="Device.MAP.Domain.{i}.Rule.{i}." requirement="createDelete">
+        <parameter ref="EABitsLength" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BondedDSL:1" dmr:version="2.0">
+      <object ref="Device.DSL." requirement="present">
+        <parameter ref="BondingGroupNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readOnly"/>
+        <parameter ref="GroupStatus" requirement="readOnly"/>
+        <parameter ref="BondScheme" requirement="readOnly"/>
+        <parameter ref="GroupCapacity" requirement="readOnly"/>
+        <parameter ref="RunningTime" requirement="readOnly"/>
+        <parameter ref="BondedChannelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{i}.BondedChannel.{i}." requirement="present">
+        <parameter ref="Channel" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{i}.BondedChannel.{i}.Ethernet." requirement="present"/>
+      <object ref="Device.DSL.BondingGroup.{i}.BondedChannel.{i}.Ethernet.Stats." requirement="present">
+        <parameter ref="UnderflowErrorsSent" requirement="readOnly"/>
+        <parameter ref="CRCErrorsReceived" requirement="readOnly"/>
+        <parameter ref="AlignmentErrorsReceived" requirement="readOnly"/>
+        <parameter ref="ShortPacketsReceived" requirement="readOnly"/>
+        <parameter ref="LongPacketsReceived" requirement="readOnly"/>
+        <parameter ref="OverflowErrorsReceived" requirement="readOnly"/>
+        <parameter ref="PauseFramesReceived" requirement="readOnly"/>
+        <parameter ref="FramesDropped" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{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="TotalStart" requirement="readOnly"/>
+        <parameter ref="CurrentDayStart" requirement="readOnly"/>
+        <parameter ref="QuarterHourStart" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{i}.Stats.Total." requirement="present">
+        <parameter ref="FailureReasons" requirement="readOnly"/>
+        <parameter ref="UpstreamRate" requirement="readOnly"/>
+        <parameter ref="DownstreamRate" requirement="readOnly"/>
+        <parameter ref="UpstreamPacketLoss" requirement="readOnly"/>
+        <parameter ref="DownstreamPacketLoss" requirement="readOnly"/>
+        <parameter ref="FailureCount" requirement="readOnly"/>
+        <parameter ref="ErroredSeconds" requirement="readOnly"/>
+        <parameter ref="SeverelyErroredSeconds" requirement="readOnly"/>
+        <parameter ref="UnavailableSeconds" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{i}.Stats.CurrentDay." requirement="present">
+        <parameter ref="FailureReasons" requirement="readOnly"/>
+        <parameter ref="UpstreamRate" requirement="readOnly"/>
+        <parameter ref="DownstreamRate" requirement="readOnly"/>
+        <parameter ref="UpstreamPacketLoss" requirement="readOnly"/>
+        <parameter ref="DownstreamPacketLoss" requirement="readOnly"/>
+        <parameter ref="FailureCount" requirement="readOnly"/>
+        <parameter ref="ErroredSeconds" requirement="readOnly"/>
+        <parameter ref="SeverelyErroredSeconds" requirement="readOnly"/>
+        <parameter ref="UnavailableSeconds" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{i}.Stats.QuarterHour." requirement="present">
+        <parameter ref="FailureReasons" requirement="readOnly"/>
+        <parameter ref="UpstreamRate" requirement="readOnly"/>
+        <parameter ref="DownstreamRate" requirement="readOnly"/>
+        <parameter ref="UpstreamPacketLoss" requirement="readOnly"/>
+        <parameter ref="DownstreamPacketLoss" requirement="readOnly"/>
+        <parameter ref="FailureCount" requirement="readOnly"/>
+        <parameter ref="ErroredSeconds" requirement="readOnly"/>
+        <parameter ref="SeverelyErroredSeconds" requirement="readOnly"/>
+        <parameter ref="UnavailableSeconds" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{i}.Ethernet." requirement="present"/>
+      <object ref="Device.DSL.BondingGroup.{i}.Ethernet.Stats." requirement="present">
+        <parameter ref="PAFErrors" requirement="readOnly"/>
+        <parameter ref="PAFSmallFragments" requirement="readOnly"/>
+        <parameter ref="PAFLargeFragments" requirement="readOnly"/>
+        <parameter ref="PAFBadFragments" requirement="readOnly"/>
+        <parameter ref="PAFLostFragments" requirement="readOnly"/>
+        <parameter ref="PAFLateFragments" requirement="readOnly"/>
+        <parameter ref="PAFLostStarts" requirement="readOnly"/>
+        <parameter ref="PAFLostEnds" requirement="readOnly"/>
+        <parameter ref="PAFOverflows" requirement="readOnly"/>
+        <parameter ref="PauseFramesSent" requirement="readOnly"/>
+        <parameter ref="CRCErrorsReceived" requirement="readOnly"/>
+        <parameter ref="AlignmentErrorsReceived" requirement="readOnly"/>
+        <parameter ref="ShortPacketsReceived" requirement="readOnly"/>
+        <parameter ref="LongPacketsReceived" requirement="readOnly"/>
+        <parameter ref="OverflowErrorsReceived" requirement="readOnly"/>
+        <parameter ref="FramesDropped" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="HPNA:1" dmr:version="2.0">
+      <object ref="Device.HPNA." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HPNA.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="FirmwareVersion" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="NetworkUtilization" requirement="readOnly"/>
+        <parameter ref="PossibleConnectionTypes" requirement="readOnly"/>
+        <parameter ref="ConnectionType" requirement="readOnly"/>
+        <parameter ref="PossibleSpectralModes" requirement="readOnly"/>
+        <parameter ref="SpectralMode" requirement="readOnly"/>
+        <parameter ref="MTU" requirement="readOnly"/>
+        <parameter ref="NoiseMargin" requirement="readOnly"/>
+        <parameter ref="MinMulticastRate" requirement="readOnly"/>
+        <parameter ref="NegMulticastRate" requirement="readOnly"/>
+        <parameter ref="MasterSelectionMode" requirement="readOnly"/>
+        <parameter ref="AssociatedDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HPNA.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"/>
+      </object>
+      <object ref="Device.HPNA.Interface.{i}.AssociatedDevice.{i}." requirement="present">
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="NodeID" requirement="readOnly"/>
+        <parameter ref="IsMaster" requirement="readOnly"/>
+        <parameter ref="Synced" requirement="readOnly"/>
+        <parameter ref="TotalSyncTime" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="PHYDiagnosticsEnable" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="HPNAQoS:1" dmr:version="2.0">
+      <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>
+      <object ref="Device.HPNA.Diagnostics.PerformanceMonitoring.Channels.Channel.{i}." requirement="present">
+        <parameter ref="FlowSpec" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="HeartbeatPolicy:1" dmr:version="2.12">
+      <description>
+        Note that support for this profile implies support for the requirements of {{bibref|TR-069|Annex O}}.
+      </description>
+      <object ref="Device.ManagementServer.HeartbeatPolicy." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="ReportingInterval" requirement="readWrite"/>
+        <parameter ref="InitiationTime" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="HPNADiagnostics:1" dmr:version="2.0">
+      <object ref="Device.HPNA.Diagnostics.PerformanceMonitoring." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="SampleInterval" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HPNA.Diagnostics.PerformanceMonitoring.Nodes." requirement="present">
+        <parameter ref="CurrentStart" requirement="readOnly"/>
+        <parameter ref="CurrentEnd" requirement="readOnly"/>
+        <parameter ref="NodeNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HPNA.Diagnostics.PerformanceMonitoring.Nodes.Node.{i}." requirement="present">
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="BytesSent" requirement="readOnly"/>
+        <parameter ref="BytesReceived" requirement="readOnly"/>
+        <parameter ref="PacketsSent" requirement="readOnly"/>
+        <parameter ref="PacketsReceived" requirement="readOnly"/>
+        <parameter ref="BroadcastPacketsSent" requirement="readOnly"/>
+        <parameter ref="BroadcastPacketsReceived" requirement="readOnly"/>
+        <parameter ref="MulticastPacketsSent" requirement="readOnly"/>
+        <parameter ref="MulticastPacketsReceived" requirement="readOnly"/>
+        <parameter ref="PacketsCrcErrored" requirement="readOnly"/>
+        <parameter ref="PacketsCrcErroredHost" requirement="readOnly"/>
+        <parameter ref="PacketsShortErrored" requirement="readOnly"/>
+        <parameter ref="PacketsShortErroredHost" requirement="readOnly"/>
+        <parameter ref="RxPacketsDropped" requirement="readOnly"/>
+        <parameter ref="TxPacketsDropped" requirement="readOnly"/>
+        <parameter ref="ControlRequestLocal" requirement="readOnly"/>
+        <parameter ref="ControlReplyLocal" requirement="readOnly"/>
+        <parameter ref="ControlRequestRemote" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HPNA.Diagnostics.PerformanceMonitoring.Channels." requirement="present">
+        <parameter ref="TimeStamp" requirement="readOnly"/>
+        <parameter ref="ChannelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HPNA.Diagnostics.PerformanceMonitoring.Channels.Channel.{i}." requirement="present">
+        <parameter ref="HPNASrcMACAddress" requirement="readOnly"/>
+        <parameter ref="HPNADestMACAddress" requirement="readOnly"/>
+        <parameter ref="HostSrcMACAddress" requirement="readOnly"/>
+        <parameter ref="HostDestMACAddress" requirement="readOnly"/>
+        <parameter ref="PHYRate" requirement="readOnly"/>
+        <parameter ref="BaudRate" requirement="readOnly"/>
+        <parameter ref="SNR" requirement="readOnly"/>
+        <parameter ref="PacketsSent" requirement="readOnly"/>
+        <parameter ref="PacketsReceived" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HPNA.Diagnostics.PHYThroughput." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="NumPacketsInBurst" requirement="readWrite"/>
+        <parameter ref="BurstInterval" requirement="readWrite"/>
+        <parameter ref="TestPacketPayloadLength" requirement="readWrite"/>
+        <parameter ref="PayloadEncoding" requirement="readWrite"/>
+        <parameter ref="PayloadDataGen" requirement="readWrite"/>
+        <parameter ref="PayloadType" requirement="readWrite"/>
+        <parameter ref="PriorityLevel" requirement="readWrite"/>
+        <parameter ref="ResultNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HPNA.Diagnostics.PHYThroughput.Result.{i}." requirement="present">
+        <parameter ref="SrcMACAddress" requirement="readOnly"/>
+        <parameter ref="DestMACAddress" requirement="readOnly"/>
+        <parameter ref="PHYRate" requirement="readOnly"/>
+        <parameter ref="BaudRate" requirement="readOnly"/>
+        <parameter ref="SNR" requirement="readOnly"/>
+        <parameter ref="PacketsReceived" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="HomePlug:1" dmr:version="2.0">
+      <object ref="Device.HomePlug." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HomePlug.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="LogicalNetwork" requirement="readWrite"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="FirmwareVersion" requirement="readOnly"/>
+        <parameter ref="ForceCCo" requirement="readWrite"/>
+        <parameter ref="NetworkPassword" requirement="readWrite"/>
+        <parameter ref="OtherNetworksPresent" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="AssociatedDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HomePlug.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="MPDUTxAck" requirement="readOnly"/>
+        <parameter ref="MPDUTxCol" requirement="readOnly"/>
+        <parameter ref="MPDUTxFailed" requirement="readOnly"/>
+        <parameter ref="MPDURxAck" requirement="readOnly"/>
+        <parameter ref="MPDURxFailed" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HomePlug.Interface.{i}.AssociatedDevice.{i}." requirement="present">
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="TxPhyRate" requirement="readOnly"/>
+        <parameter ref="RxPhyRate" requirement="readOnly"/>
+        <parameter ref="SNRPerTone" requirement="readOnly"/>
+        <parameter ref="AvgAttenuation" requirement="readOnly"/>
+        <parameter ref="EndStationMACs" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="MoCA:1" dmr:version="2.0">
+      <object ref="Device.MoCA." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MoCA.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="FirmwareVersion" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="HighestVersion" requirement="readOnly"/>
+        <parameter ref="CurrentVersion" requirement="readOnly"/>
+        <parameter ref="NetworkCoordinator" requirement="readOnly"/>
+        <parameter ref="PrivacyEnabledSetting" requirement="readWrite"/>
+        <parameter ref="PrivacyEnabled" requirement="readOnly"/>
+        <parameter ref="FreqCapabilityMask" requirement="readOnly"/>
+        <parameter ref="FreqCurrentMaskSetting" requirement="readWrite"/>
+        <parameter ref="FreqCurrentMask" requirement="readOnly"/>
+        <parameter ref="CurrentOperFreq" requirement="readOnly"/>
+        <parameter ref="KeyPassphrase" requirement="readWrite"/>
+        <parameter ref="NodeID" requirement="readOnly"/>
+        <parameter ref="AssociatedDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MoCA.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"/>
+      </object>
+    </profile>
+    <profile name="UPA:1" dmr:version="2.0">
+      <object ref="Device.UPA." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.UPA.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="FirmwareVersion" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="NodeType" requirement="readWrite"/>
+        <parameter ref="LogicalNetwork" requirement="readWrite"/>
+        <parameter ref="EncryptionMethod" requirement="readWrite"/>
+        <parameter ref="EncryptionKey" requirement="readWrite"/>
+        <parameter ref="EstApplicationThroughput" requirement="readOnly"/>
+        <parameter ref="ActiveNotchEnable" requirement="readWrite"/>
+        <parameter ref="ActiveNotchNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="AssociatedDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.UPA.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"/>
+      </object>
+      <object ref="Device.UPA.Interface.{i}.ActiveNotch.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="StartFreq" requirement="readWrite"/>
+        <parameter ref="StopFreq" requirement="readWrite"/>
+        <parameter ref="Depth" requirement="readWrite"/>
+      </object>
+      <object ref="Device.UPA.Interface.{i}.AssociatedDevice.{i}." requirement="present">
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="Port" requirement="readOnly"/>
+        <parameter ref="LogicalNetwork" requirement="readOnly"/>
+        <parameter ref="PhyTxThroughput" requirement="readOnly"/>
+        <parameter ref="PhyRxThroughput" requirement="readOnly"/>
+        <parameter ref="RealPhyRxThroughput" requirement="readOnly"/>
+        <parameter ref="EstimatedPLR" requirement="readOnly"/>
+        <parameter ref="MeanEstimatedAtt" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UPADiagnostics:1" dmr:version="2.0">
+      <object ref="Device.UPA.Diagnostics.InterfaceMeasurement." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Type" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="Port" requirement="readWrite"/>
+        <parameter ref="Measurements" requirement="readOnly"/>
+        <parameter ref="RxGain" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="WiFiRadio:1" dmr:version="2.0">
+      <object ref="Device.WiFi." requirement="present">
+        <parameter ref="RadioNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.Radio.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="SupportedFrequencyBands" requirement="readOnly"/>
+        <parameter ref="OperatingFrequencyBand" requirement="readWrite"/>
+        <parameter ref="SupportedStandards" requirement="readOnly"/>
+        <parameter ref="OperatingStandards" requirement="readWrite"/>
+        <parameter ref="RegulatoryDomain" requirement="readWrite"/>
+        <parameter ref="PossibleChannels" requirement="readOnly"/>
+        <parameter ref="Channel" requirement="readWrite"/>
+        <parameter ref="AutoChannelSupported" requirement="readOnly"/>
+        <parameter ref="AutoChannelEnable" requirement="readWrite"/>
+        <parameter ref="TransmitPowerSupported" requirement="readOnly"/>
+        <parameter ref="TransmitPower" requirement="readWrite"/>
+        <parameter ref="ExtensionChannel" requirement="readWrite"/>
+        <parameter ref="GuardInterval" requirement="readWrite"/>
+        <parameter ref="MCS" requirement="readWrite"/>
+        <parameter ref="IEEE80211hSupported" requirement="readOnly"/>
+        <parameter ref="IEEE80211hEnabled" requirement="readWrite"/>
+        <parameter ref="ChannelsInUse" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.Radio.{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"/>
+      </object>
+    </profile>
+    <profile name="WiFiSSID:1" dmr:version="2.0">
+      <object ref="Device.WiFi." requirement="present">
+        <parameter ref="SSIDNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.SSID.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="BSSID" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="SSID" requirement="readWrite"/>
+      </object>
+      <object ref="Device.WiFi.SSID.{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"/>
+      </object>
+    </profile>
+    <profile name="WiFiAccessPoint:1" dmr:version="2.0">
+      <object ref="Device.WiFi." requirement="present">
+        <parameter ref="AccessPointNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.AccessPoint.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="SSIDReference" requirement="readWrite"/>
+        <parameter ref="SSIDAdvertisementEnabled" requirement="readWrite"/>
+        <parameter ref="WMMCapability" requirement="readOnly"/>
+        <parameter ref="UAPSDCapability" requirement="readOnly"/>
+        <parameter ref="WMMEnable" requirement="readWrite"/>
+        <parameter ref="UAPSDEnable" requirement="readWrite"/>
+        <parameter ref="AssociatedDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.AccessPoint.{i}.Security." requirement="present">
+        <parameter ref="ModesSupported" requirement="readOnly"/>
+        <parameter ref="ModeEnabled" requirement="readWrite"/>
+        <parameter ref="WEPKey" requirement="readWrite"/>
+        <parameter ref="PreSharedKey" requirement="readWrite"/>
+        <parameter ref="KeyPassphrase" requirement="readWrite"/>
+        <parameter ref="RekeyingInterval" requirement="readWrite"/>
+        <parameter ref="RadiusServerIPAddr" requirement="readWrite"/>
+        <parameter ref="RadiusServerPort" requirement="readWrite"/>
+        <parameter ref="RadiusSecret" requirement="readWrite"/>
+      </object>
+      <object ref="Device.WiFi.AccessPoint.{i}.WPS." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="ConfigMethodsSupported" requirement="readOnly"/>
+        <parameter ref="ConfigMethodsEnabled" requirement="readWrite"/>
+      </object>
+      <object ref="Device.WiFi.AccessPoint.{i}.AssociatedDevice.{i}." requirement="createDelete">
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="AuthenticationState" requirement="readOnly"/>
+        <parameter ref="LastDataDownlinkRate" requirement="readOnly"/>
+        <parameter ref="LastDataUplinkRate" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="WiFiAccessPoint:2" base="WiFiAccessPoint:1" dmr:version="2.9">
+      <object ref="Device.WiFi.AccessPoint.{i}." requirement="present">
+        <parameter ref="MACAddressControlEnabled" requirement="readWrite"/>
+        <parameter ref="AllowedMACAddress" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="WiFiEndPoint:1" dmr:version="2.0">
+      <object ref="Device.WiFi." requirement="present">
+        <parameter ref="EndPointNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.EndPoint.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="ProfileReference" requirement="readWrite"/>
+        <parameter ref="SSIDReference" requirement="readOnly"/>
+        <parameter ref="ProfileNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.EndPoint.{i}.Stats." requirement="present">
+        <parameter ref="LastDataDownlinkRate" requirement="readOnly"/>
+        <parameter ref="LastDataUplinkRate" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.EndPoint.{i}.Security." requirement="present">
+        <parameter ref="ModesSupported" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.EndPoint.{i}.Profile.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="SSID" requirement="readWrite"/>
+        <parameter ref="Location" requirement="readWrite"/>
+        <parameter ref="Priority" requirement="readWrite"/>
+      </object>
+      <object ref="Device.WiFi.EndPoint.{i}.Profile.{i}.Security." requirement="present">
+        <parameter ref="ModeEnabled" requirement="readWrite"/>
+        <parameter ref="WEPKey" requirement="readWrite"/>
+        <parameter ref="PreSharedKey" requirement="readWrite"/>
+        <parameter ref="KeyPassphrase" requirement="readWrite"/>
+      </object>
+      <object ref="Device.WiFi.EndPoint.{i}.WPS." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="ConfigMethodsSupported" requirement="readOnly"/>
+        <parameter ref="ConfigMethodsEnabled" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="USBInterface:1" dmr:version="2.0">
+      <object ref="Device.USB." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.USB.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="Port" requirement="readOnly"/>
+      </object>
+      <object ref="Device.USB.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="USBPort:1" dmr:version="2.0">
+      <object ref="Device.USB." requirement="present">
+        <parameter ref="PortNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.USB.Port.{i}." requirement="present">
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Standard" requirement="readOnly"/>
+        <parameter ref="Type" requirement="readOnly"/>
+        <parameter ref="Receptacle" requirement="readOnly"/>
+        <parameter ref="Rate" requirement="readOnly"/>
+        <parameter ref="Power" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="NAT:1" dmr:version="2.0">
+      <object ref="Device.NAT." requirement="createDelete">
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="PortMappingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.NAT.InterfaceSetting.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+      </object>
+      <object ref="Device.NAT.PortMapping.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AllInterfaces" requirement="readWrite"/>
+        <parameter ref="LeaseDuration" requirement="readOnly"/>
+        <parameter ref="RemoteHost" requirement="readWrite"/>
+        <parameter ref="ExternalPort" requirement="readWrite"/>
+        <parameter ref="InternalPort" requirement="readWrite"/>
+        <parameter ref="Protocol" requirement="readWrite"/>
+        <parameter ref="InternalClient" requirement="readWrite"/>
+        <parameter ref="Description" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="QoS:1" dmr:version="2.0">
+      <object ref="Device.QoS." requirement="present">
+        <parameter ref="MaxClassificationEntries" requirement="readOnly"/>
+        <parameter ref="ClassificationNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="MaxAppEntries" requirement="readOnly"/>
+        <parameter ref="AppNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="MaxFlowEntries" requirement="readOnly"/>
+        <parameter ref="FlowNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="MaxPolicerEntries" requirement="readOnly"/>
+        <parameter ref="PolicerNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="MaxQueueEntries" requirement="readOnly"/>
+        <parameter ref="QueueNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ShaperNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="DefaultForwardingPolicy" requirement="readWrite"/>
+        <parameter ref="DefaultPolicer" requirement="readWrite"/>
+        <parameter ref="DefaultQueue" requirement="readWrite"/>
+        <parameter ref="DefaultDSCPMark" requirement="readWrite"/>
+        <parameter ref="DefaultEthernetPriorityMark" requirement="readWrite"/>
+        <parameter ref="AvailableAppList" requirement="readOnly"/>
+        <parameter ref="DefaultTrafficClass" requirement="readWrite"/>
+      </object>
+      <object ref="Device.QoS.Classification.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AllInterfaces" requirement="readWrite"/>
+        <parameter ref="DestIP" requirement="readWrite"/>
+        <parameter ref="DestMask" requirement="readWrite"/>
+        <parameter ref="DestIPExclude" requirement="readWrite"/>
+        <parameter ref="SourceIP" requirement="readWrite"/>
+        <parameter ref="SourceMask" requirement="readWrite"/>
+        <parameter ref="SourceIPExclude" requirement="readWrite"/>
+        <parameter ref="Protocol" requirement="readWrite"/>
+        <parameter ref="ProtocolExclude" requirement="readWrite"/>
+        <parameter ref="DestPort" requirement="readWrite"/>
+        <parameter ref="DestPortRangeMax" requirement="readWrite"/>
+        <parameter ref="DestPortExclude" requirement="readWrite"/>
+        <parameter ref="SourcePort" requirement="readWrite"/>
+        <parameter ref="SourcePortRangeMax" requirement="readWrite"/>
+        <parameter ref="SourcePortExclude" requirement="readWrite"/>
+        <parameter ref="SourceMACAddress" requirement="readWrite"/>
+        <parameter ref="SourceMACExclude" requirement="readWrite"/>
+        <parameter ref="DestMACAddress" requirement="readWrite"/>
+        <parameter ref="DestMACExclude" requirement="readWrite"/>
+        <parameter ref="DSCPCheck" requirement="readWrite"/>
+        <parameter ref="DSCPExclude" requirement="readWrite"/>
+        <parameter ref="DSCPMark" requirement="readWrite"/>
+        <parameter ref="EthernetPriorityCheck" requirement="readWrite"/>
+        <parameter ref="EthernetPriorityExclude" requirement="readWrite"/>
+        <parameter ref="EthernetPriorityMark" requirement="readWrite"/>
+        <parameter ref="VLANIDCheck" requirement="readWrite"/>
+        <parameter ref="VLANIDExclude" requirement="readWrite"/>
+        <parameter ref="ForwardingPolicy" requirement="readWrite"/>
+        <parameter ref="Policer" requirement="readWrite"/>
+        <parameter ref="TrafficClass" requirement="readWrite"/>
+      </object>
+      <object ref="Device.QoS.Policer.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="CommittedRate" requirement="readWrite"/>
+        <parameter ref="CommittedBurstSize" requirement="readWrite"/>
+        <parameter ref="MeterType" requirement="readWrite"/>
+        <parameter ref="PossibleMeterTypes" requirement="readOnly"/>
+        <parameter ref="ConformingAction" requirement="readWrite"/>
+        <parameter ref="NonConformingAction" requirement="readWrite"/>
+        <parameter ref="TotalCountedPackets" requirement="readOnly"/>
+        <parameter ref="TotalCountedBytes" requirement="readOnly"/>
+        <parameter ref="ExcessBurstSize" requirement="readWrite"/>
+        <parameter ref="PeakRate" requirement="readWrite"/>
+        <parameter ref="PeakBurstSize" requirement="readWrite"/>
+        <parameter ref="PartialConformingAction" requirement="readWrite"/>
+      </object>
+      <object ref="Device.QoS.Queue.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AllInterfaces" requirement="readWrite"/>
+        <parameter ref="BufferLength" requirement="readOnly"/>
+        <parameter ref="Weight" requirement="readWrite"/>
+        <parameter ref="Precedence" requirement="readWrite"/>
+        <parameter ref="REDThreshold" requirement="readWrite"/>
+        <parameter ref="REDPercentage" requirement="readWrite"/>
+        <parameter ref="DropAlgorithm" requirement="readWrite"/>
+        <parameter ref="SchedulerAlgorithm" requirement="readWrite"/>
+        <parameter ref="ShapingRate" requirement="readWrite"/>
+        <parameter ref="ShapingBurstSize" requirement="readWrite"/>
+        <parameter ref="TrafficClasses" requirement="readWrite"/>
+      </object>
+      <object ref="Device.QoS.Shaper.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="ShapingRate" requirement="readWrite"/>
+        <parameter ref="ShapingBurstSize" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Routing.Router.{i}.IPv4Forwarding.{i}." requirement="notSpecified">
+        <parameter ref="ForwardingPolicy" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="QoS:2" base="QoS:1" dmr:version="2.2">
+      <object ref="Device.Routing.Router.{i}.IPv4Forwarding.{i}." requirement="notSpecified">
+        <description>
+          REQUIRED only for IPv4 capable devices.
+        </description>
+      </object>
+      <object ref="Device.Routing.Router.{i}.IPv6Forwarding.{i}." requirement="notSpecified">
+        <description>
+          REQUIRED only for IPv6 capable devices.
+        </description>
+        <parameter ref="ForwardingPolicy" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="QoSDynamicFlow:1" dmr:version="2.0">
+      <object ref="Device.QoS.App.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="ProtocolIdentifier" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="DefaultForwardingPolicy" requirement="readWrite"/>
+        <parameter ref="DefaultPolicer" requirement="readWrite"/>
+        <parameter ref="DefaultDSCPMark" requirement="readWrite"/>
+        <parameter ref="DefaultEthernetPriorityMark" requirement="readWrite"/>
+        <parameter ref="DefaultTrafficClass" requirement="readWrite"/>
+      </object>
+      <object ref="Device.QoS.Flow.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Type" requirement="readWrite"/>
+        <parameter ref="TypeParameters" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="App" requirement="readWrite"/>
+        <parameter ref="ForwardingPolicy" requirement="readWrite"/>
+        <parameter ref="Policer" requirement="readWrite"/>
+        <parameter ref="DSCPMark" requirement="readWrite"/>
+        <parameter ref="EthernetPriorityMark" requirement="readWrite"/>
+        <parameter ref="TrafficClass" requirement="readWrite"/>
+      </object>
+      <object ref="Device.QoS.Classification.{i}." requirement="notSpecified">
+        <parameter ref="App" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="QoSStats:1" dmr:version="2.0">
+      <object ref="Device.QoS." requirement="present">
+        <parameter ref="QueueStatsNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.QoS.Policer.{i}." requirement="notSpecified">
+        <parameter ref="TotalCountedPackets" requirement="readOnly"/>
+        <parameter ref="TotalCountedBytes" requirement="readOnly"/>
+        <parameter ref="ConformingCountedPackets" requirement="readOnly"/>
+        <parameter ref="ConformingCountedBytes" requirement="readOnly"/>
+        <parameter ref="NonConformingCountedPackets" requirement="readOnly"/>
+        <parameter ref="NonConformingCountedBytes" requirement="readOnly"/>
+      </object>
+      <object ref="Device.QoS.QueueStats.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Queue" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="OutputPackets" requirement="readOnly"/>
+        <parameter ref="OutputBytes" requirement="readOnly"/>
+        <parameter ref="DroppedPackets" requirement="readOnly"/>
+        <parameter ref="DroppedBytes" requirement="readOnly"/>
+        <parameter ref="QueueOccupancyPackets" requirement="readOnly"/>
+        <parameter ref="QueueOccupancyPercentage" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="NeighborDiscovery:1" dmr:version="2.2">
+      <object ref="Device.NeighborDiscovery." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.NeighborDiscovery.InterfaceSetting.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="RetransTimer" requirement="readWrite"/>
+        <parameter ref="RtrSolicitationInterval" requirement="readWrite"/>
+        <parameter ref="MaxRtrSolicitations" requirement="readWrite"/>
+        <parameter ref="NUDEnable" requirement="readWrite"/>
+        <parameter ref="RSEnable" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="RouterAdvertisement:1" dmr:version="2.2">
+      <object ref="Device.RouterAdvertisement." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.RouterAdvertisement.InterfaceSetting.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="MaxRtrAdvInterval" requirement="readWrite"/>
+        <parameter ref="MinRtrAdvInterval" requirement="readWrite"/>
+        <parameter ref="AdvDefaultLifetime" requirement="readWrite"/>
+        <parameter ref="AdvManagedFlag" requirement="readWrite"/>
+        <parameter ref="AdvOtherConfigFlag" requirement="readWrite"/>
+        <parameter ref="AdvMobileAgentFlag" requirement="readWrite"/>
+        <parameter ref="AdvPreferredRouterFlag" requirement="readWrite"/>
+        <parameter ref="AdvNDProxyFlag" requirement="readWrite"/>
+        <parameter ref="AdvLinkMTU" requirement="readWrite"/>
+        <parameter ref="AdvReachableTime" requirement="readWrite"/>
+        <parameter ref="AdvRetransTimer" requirement="readWrite"/>
+        <parameter ref="AdvCurHopLimit" requirement="readWrite"/>
+        <parameter ref="OptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.RouterAdvertisement.InterfaceSetting.{i}.Option.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Tag" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="IPv6rd:1" dmr:version="2.2">
+      <object ref="Device.IPv6rd." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPv6rd.InterfaceSetting.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="BorderRelayIPv4Addresses" requirement="readWrite"/>
+        <parameter ref="AllTrafficToBorderRelay" requirement="readWrite"/>
+        <parameter ref="SPIPv6Prefix" requirement="readWrite"/>
+        <parameter ref="IPv4MaskLength" requirement="readWrite"/>
+        <parameter ref="AddressSource" requirement="readWrite"/>
+        <parameter ref="TunnelInterface" requirement="readOnly"/>
+        <parameter ref="TunneledInterface" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DSLite:1" dmr:version="2.2">
+      <object ref="Device.DSLite." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSLite.InterfaceSetting.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="EndpointAssignmentPrecedence" requirement="readWrite"/>
+        <parameter ref="EndpointName" requirement="readWrite"/>
+        <parameter ref="EndpointAddress" requirement="readWrite"/>
+        <parameter ref="Origin" requirement="readOnly"/>
+        <parameter ref="TunnelInterface" requirement="readOnly"/>
+        <parameter ref="TunneledInterface" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DSLite:2" base="DSLite:1" dmr:version="2.5">
+      <object ref="Device.DSLite.InterfaceSetting.{i}." requirement="present">
+        <parameter ref="EndpointAddressTypePrecedence" requirement="readWrite"/>
+        <parameter ref="EndpointAddressInUse" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Hosts:1" dmr:version="2.0">
+      <object ref="Device.Hosts." requirement="present">
+        <parameter ref="HostNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Hosts.Host.{i}." requirement="present">
+        <parameter ref="IPAddress" requirement="readOnly"/>
+        <parameter ref="AddressSource" requirement="readOnly"/>
+        <parameter ref="LeaseTimeRemaining" requirement="readOnly"/>
+        <parameter ref="PhysAddress" requirement="readOnly"/>
+        <parameter ref="HostName" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+        <parameter ref="Layer1Interface" requirement="readOnly"/>
+        <parameter ref="Layer3Interface" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Hosts:2" base="Hosts:1" dmr:version="2.2">
+      <object ref="Device.Hosts.Host.{i}." requirement="present">
+        <parameter ref="DHCPClient" requirement="readOnly"/>
+        <parameter ref="AssociatedDevice" requirement="readOnly"/>
+        <parameter ref="IPv4AddressNumberOfEntries" requirement="readOnly">
+          <description>
+            REQUIRED only for IPv4 capable devices.
+          </description>
+        </parameter>
+        <parameter ref="IPv6AddressNumberOfEntries" requirement="readOnly">
+          <description>
+            REQUIRED only for IPv6 capable devices.
+          </description>
+        </parameter>
+      </object>
+      <object ref="Device.Hosts.Host.{i}.IPv4Address.{i}." requirement="present">
+        <description>
+          REQUIRED only for IPv4 capable devices.
+        </description>
+        <parameter ref="IPAddress" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Hosts.Host.{i}.IPv6Address.{i}." requirement="present">
+        <description>
+          REQUIRED only for IPv6 capable devices.
+        </description>
+        <parameter ref="IPAddress" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="CaptivePortal:1" dmr:version="2.0">
+      <object ref="Device.CaptivePortal." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="AllowedList" requirement="readWrite"/>
+        <parameter ref="URL" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="Time:1" dmr:version="2.0">
+      <object ref="Device.Time." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="NTPServer1" requirement="readWrite"/>
+        <parameter ref="NTPServer2" requirement="readWrite"/>
+        <parameter ref="CurrentLocalTime" requirement="readOnly"/>
+        <parameter ref="LocalTimeZone" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="IEEE8021xAuthentication:1" dmr:version="2.0">
+      <object ref="Device.IEEE8021x." requirement="present">
+        <parameter ref="SupplicantNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE8021x.Supplicant.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="PAEState" requirement="readOnly"/>
+        <parameter ref="EAPIdentity" requirement="readWrite"/>
+        <parameter ref="MaxStart" requirement="readWrite"/>
+        <parameter ref="StartPeriod" requirement="readWrite"/>
+        <parameter ref="HeldPeriod" requirement="readWrite"/>
+        <parameter ref="AuthPeriod" requirement="readWrite"/>
+        <parameter ref="AuthenticationCapabilities" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE8021x.Supplicant.{i}.Stats." requirement="present">
+        <parameter ref="ReceivedFrames" requirement="readOnly"/>
+        <parameter ref="TransmittedFrames" requirement="readOnly"/>
+        <parameter ref="TransmittedStartFrames" requirement="readOnly"/>
+        <parameter ref="TransmittedLogoffFrames" requirement="readOnly"/>
+        <parameter ref="TransmittedResponseIdFrames" requirement="readOnly"/>
+        <parameter ref="TransmittedResponseFrames" requirement="readOnly"/>
+        <parameter ref="ReceivedRequestIdFrames" requirement="readOnly"/>
+        <parameter ref="ReceivedRequestFrames" requirement="readOnly"/>
+        <parameter ref="ReceivedInvalidFrames" requirement="readOnly"/>
+        <parameter ref="ReceivedLengthErrorFrames" requirement="readOnly"/>
+        <parameter ref="LastFrameVersion" requirement="readOnly"/>
+        <parameter ref="LastFrameSourceMACAddress" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE8021x.Supplicant.{i}.EAPMD5." requirement="present">
+        <description>
+          802.1x Authentication provisioning information used for MD5 shared secret exchange. This object will not exist  if EAP-MD5 is not a supported authentication type.
+        </description>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="SharedSecret" requirement="readWrite"/>
+      </object>
+      <object ref="Device.IEEE8021x.Supplicant.{i}.EAPTLS." requirement="present">
+        <description>
+          802.1x Authentication provisioning information used for TLS certificate authentication. This object will not  exist if the EAP-TLS is not a supported authentication type.
+        </description>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="MutualAuthenticationEnable" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="IEEE8021xAuthentication:2" base="IEEE8021xAuthentication:1" dmr:version="2.7">
+      <object ref="Device.IEEE8021x.Supplicant.{i}." requirement="present">
+        <parameter ref="Interface" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="DHCPv4Client:1" dmr:version="2.0">
+      <object ref="Device.DHCPv4." requirement="present">
+        <parameter ref="ClientNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Client.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Renew" requirement="readWrite"/>
+        <parameter ref="IPAddress" requirement="readOnly"/>
+        <parameter ref="SubnetMask" requirement="readOnly"/>
+        <parameter ref="IPRouters" requirement="readOnly"/>
+        <parameter ref="DNSServers" requirement="readOnly"/>
+        <parameter ref="LeaseTimeRemaining" requirement="readOnly"/>
+        <parameter ref="DHCPServer" requirement="readOnly"/>
+        <parameter ref="SentOptionNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ReqOptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Client.{i}.SentOption.{i}." requirement="createDelete">
+        <description>
+          This table is REQUIRED to support sending of option 60 (Vendor Class Identifier) and option 77 (User Class Identifier) values.
+        </description>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Tag" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readWrite"/>
+      </object>
+      <object ref="Device.DHCPv4.Client.{i}.ReqOption.{i}." requirement="createDelete">
+        <description>
+          This table is REQUIRED to support requesting of option 60 (Vendor Class Identifier), option 61 (Client Identifier) and option 77 (User Class Identifier) values.
+        </description>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Tag" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IPPingDetailed:1" dmr:version="2.7">
+      <object ref="Device.IP.Diagnostics.IPPing." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="Host" requirement="readWrite"/>
+        <parameter ref="NumberOfRepetitions" requirement="readWrite"/>
+        <parameter ref="Timeout" requirement="readWrite"/>
+        <parameter ref="DataBlockSize" requirement="readWrite"/>
+        <parameter ref="DSCP" requirement="readWrite"/>
+        <parameter ref="SuccessCount" requirement="readOnly"/>
+        <parameter ref="FailureCount" requirement="readOnly"/>
+        <parameter ref="AverageResponseTimeDetailed" requirement="readOnly"/>
+        <parameter ref="MinimumResponseTimeDetailed" requirement="readOnly"/>
+        <parameter ref="MaximumResponseTimeDetailed" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IPPing:1" dmr:version="2.0">
+      <object ref="Device.IP.Diagnostics.IPPing." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="Host" requirement="readWrite"/>
+        <parameter ref="NumberOfRepetitions" requirement="readWrite"/>
+        <parameter ref="Timeout" requirement="readWrite"/>
+        <parameter ref="DataBlockSize" requirement="readWrite"/>
+        <parameter ref="DSCP" requirement="readWrite"/>
+        <parameter ref="SuccessCount" requirement="readOnly"/>
+        <parameter ref="FailureCount" requirement="readOnly"/>
+        <parameter ref="AverageResponseTime" requirement="readOnly"/>
+        <parameter ref="MinimumResponseTime" requirement="readOnly"/>
+        <parameter ref="MaximumResponseTime" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="TraceRoute:1" dmr:version="2.0">
+      <object ref="Device.IP.Diagnostics.TraceRoute." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="Host" requirement="readWrite"/>
+        <parameter ref="NumberOfTries" requirement="readWrite"/>
+        <parameter ref="Timeout" requirement="readWrite"/>
+        <parameter ref="DataBlockSize" requirement="readWrite"/>
+        <parameter ref="DSCP" requirement="readWrite"/>
+        <parameter ref="MaxHopCount" requirement="readWrite"/>
+        <parameter ref="ResponseTime" requirement="readOnly"/>
+        <parameter ref="RouteHopsNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IP.Diagnostics.TraceRoute.RouteHops.{i}." requirement="present">
+        <parameter ref="Host" requirement="readOnly"/>
+        <parameter ref="HostAddress" requirement="readOnly"/>
+        <parameter ref="ErrorCode" requirement="readOnly"/>
+        <parameter ref="RTTimes" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ATMLoopback:1" dmr:version="2.0">
+      <object ref="Device.ATM.Diagnostics.F5Loopback." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="NumberOfRepetitions" requirement="readWrite"/>
+        <parameter ref="Timeout" requirement="readWrite"/>
+        <parameter ref="SuccessCount" requirement="readOnly"/>
+        <parameter ref="FailureCount" requirement="readOnly"/>
+        <parameter ref="AverageResponseTime" requirement="readOnly"/>
+        <parameter ref="MinimumResponseTime" requirement="readOnly"/>
+        <parameter ref="MaximumResponseTime" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DSLDiagnostics:1" dmr:version="2.0">
+      <description>
+        Note: This profile is valid for G.992.1 modems.
+      </description>
+      <object ref="Device.DSL.Diagnostics.ADSLLineTest." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="ACTPSDds" requirement="readOnly"/>
+        <parameter ref="ACTPSDus" requirement="readOnly"/>
+        <parameter ref="ACTATPds" requirement="readOnly"/>
+        <parameter ref="ACTATPus" requirement="readOnly"/>
+        <parameter ref="HLINSCds" requirement="readOnly"/>
+        <parameter ref="HLINpsds" requirement="readOnly"/>
+        <parameter ref="QLNpsds" requirement="readOnly"/>
+        <parameter ref="SNRpsds" requirement="readOnly"/>
+        <parameter ref="BITSpsds" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ADSL2Diagnostics:1" dmr:version="2.0">
+      <description>
+        Note: This profile is valid for G.992.3 and G.992.5 modems.
+      </description>
+      <object ref="Device.DSL.Diagnostics.ADSLLineTest." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="ACTPSDds" requirement="readOnly"/>
+        <parameter ref="ACTPSDus" requirement="readOnly"/>
+        <parameter ref="ACTATPds" requirement="readOnly"/>
+        <parameter ref="ACTATPus" requirement="readOnly"/>
+        <parameter ref="HLINSCds" requirement="readOnly"/>
+        <parameter ref="HLINSCus" requirement="readOnly"/>
+        <parameter ref="HLINpsds" requirement="readOnly"/>
+        <parameter ref="HLINpsus" requirement="readOnly"/>
+        <parameter ref="HLOGpsds" requirement="readOnly"/>
+        <parameter ref="HLOGpsus" requirement="readOnly"/>
+        <parameter ref="HLOGMTds" requirement="readOnly"/>
+        <parameter ref="HLOGMTus" requirement="readOnly"/>
+        <parameter ref="QLNpsds" requirement="readOnly"/>
+        <parameter ref="QLNpsus" requirement="readOnly"/>
+        <parameter ref="QLNMTds" requirement="readOnly"/>
+        <parameter ref="QLNMTus" requirement="readOnly"/>
+        <parameter ref="SNRpsds" requirement="readOnly"/>
+        <parameter ref="SNRpsus" requirement="readOnly"/>
+        <parameter ref="SNRMTds" requirement="readOnly"/>
+        <parameter ref="SNRMTus" requirement="readOnly"/>
+        <parameter ref="LATNpbds" requirement="readOnly"/>
+        <parameter ref="LATNpbus" requirement="readOnly"/>
+        <parameter ref="SATNds" requirement="readOnly"/>
+        <parameter ref="SATNus" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="VDSL2Diagnostics:1" dmr:version="2.0">
+      <description>
+        Note: This profile is valid for G.993.2 modems.
+      </description>
+      <object ref="Device.DSL.Diagnostics.ADSLLineTest." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="ACTPSDds" requirement="readOnly"/>
+        <parameter ref="ACTPSDus" requirement="readOnly"/>
+        <parameter ref="ACTATPds" requirement="readOnly"/>
+        <parameter ref="ACTATPus" requirement="readOnly"/>
+        <parameter ref="HLINSCds" requirement="readOnly"/>
+        <parameter ref="HLINSCus" requirement="readOnly"/>
+        <parameter ref="HLINGds" requirement="readOnly"/>
+        <parameter ref="HLINGus" requirement="readOnly"/>
+        <parameter ref="HLINpsds" requirement="readOnly"/>
+        <parameter ref="HLINpsus" requirement="readOnly"/>
+        <parameter ref="HLOGGds" requirement="readOnly"/>
+        <parameter ref="HLOGGus" requirement="readOnly"/>
+        <parameter ref="HLOGpsds" requirement="readOnly"/>
+        <parameter ref="HLOGpsus" requirement="readOnly"/>
+        <parameter ref="HLOGMTds" requirement="readOnly"/>
+        <parameter ref="HLOGMTus" requirement="readOnly"/>
+        <parameter ref="QLNGds" requirement="readOnly"/>
+        <parameter ref="QLNGus" requirement="readOnly"/>
+        <parameter ref="QLNpsds" requirement="readOnly"/>
+        <parameter ref="QLNpsus" requirement="readOnly"/>
+        <parameter ref="QLNMTds" requirement="readOnly"/>
+        <parameter ref="QLNMTus" requirement="readOnly"/>
+        <parameter ref="SNRGds" requirement="readOnly"/>
+        <parameter ref="SNRGus" requirement="readOnly"/>
+        <parameter ref="SNRpsds" requirement="readOnly"/>
+        <parameter ref="SNRpsus" requirement="readOnly"/>
+        <parameter ref="SNRMTds" requirement="readOnly"/>
+        <parameter ref="SNRMTus" requirement="readOnly"/>
+        <parameter ref="LATNpbds" requirement="readOnly"/>
+        <parameter ref="LATNpbus" requirement="readOnly"/>
+        <parameter ref="SATNds" requirement="readOnly"/>
+        <parameter ref="SATNus" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DHCPv4Server:1" dmr:version="2.0">
+      <object ref="Device.DHCPv4." requirement="present"/>
+      <object ref="Device.DHCPv4.Server." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="PoolNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Server.Pool.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="MinAddress" requirement="readWrite"/>
+        <parameter ref="MaxAddress" requirement="readWrite"/>
+        <parameter ref="ReservedAddresses" requirement="readWrite"/>
+        <parameter ref="SubnetMask" requirement="readWrite"/>
+        <parameter ref="DNSServers" requirement="readWrite"/>
+        <parameter ref="DomainName" requirement="readWrite"/>
+        <parameter ref="IPRouters" requirement="readWrite"/>
+        <parameter ref="LeaseTime" requirement="readWrite"/>
+        <parameter ref="OptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Server.Pool.{i}.Option.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Tag" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="DHCPv4CondServing:1" extends="DHCPv4Server:1" dmr:version="2.0">
+      <object ref="Device.DHCPv4.Server.Pool.{i}." requirement="createDelete">
+        <parameter ref="VendorClassID" requirement="readWrite"/>
+        <parameter ref="ClientID" requirement="readWrite"/>
+        <parameter ref="UserClassID" requirement="readWrite"/>
+        <parameter ref="Chaddr" requirement="readWrite"/>
+        <parameter ref="ChaddrMask" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="DHCPv4Relay:1" dmr:version="2.0">
+      <object ref="Device.DHCPv4." requirement="present"/>
+      <object ref="Device.DHCPv4.Relay." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="ForwardingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Relay.Forwarding.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="LocallyServed" requirement="readWrite"/>
+        <parameter ref="DHCPServerIPAddress" requirement="readWrite"/>
+        <parameter ref="VendorClassID" requirement="readWrite"/>
+        <parameter ref="ClientID" requirement="readWrite"/>
+        <parameter ref="UserClassID" requirement="readWrite"/>
+        <parameter ref="Chaddr" requirement="readWrite"/>
+        <parameter ref="ChaddrMask" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="DHCPv4ServerClientInfo:1" dmr:version="2.2">
+      <object ref="Device.DHCPv4.Server.Pool.{i}." requirement="createDelete">
+        <parameter ref="ClientNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Server.Pool.{i}.Client.{i}." requirement="present">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Chaddr" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+        <parameter ref="IPv4AddressNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="OptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Server.Pool.{i}.Client.{i}.IPv4Address.{i}." requirement="present">
+        <parameter ref="IPAddress" requirement="readOnly"/>
+        <parameter ref="LeaseTimeRemaining" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Server.Pool.{i}.Client.{i}.Option.{i}." requirement="present">
+        <parameter ref="Tag" requirement="readOnly"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DHCPv6Client:1" dmr:version="2.2">
+      <object ref="Device.DHCPv6." requirement="present">
+        <parameter ref="ClientNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Client.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="DUID" requirement="readOnly"/>
+        <parameter ref="RequestAddresses" requirement="readWrite"/>
+        <parameter ref="RequestPrefixes" requirement="readWrite"/>
+        <parameter ref="RapidCommit" requirement="readWrite"/>
+        <parameter ref="Renew" requirement="readWrite"/>
+        <parameter ref="SuggestedT1" requirement="readWrite"/>
+        <parameter ref="SuggestedT2" requirement="readWrite"/>
+        <parameter ref="SupportedOptions" requirement="readOnly"/>
+        <parameter ref="RequestedOptions" requirement="readWrite"/>
+        <parameter ref="SentOptionNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ReceivedOptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Client.{i}.SentOption.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Tag" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readWrite"/>
+      </object>
+      <object ref="Device.DHCPv6.Client.{i}.ReceivedOption.{i}." requirement="present">
+        <parameter ref="Tag" requirement="readOnly"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DHCPv6Server:1" dmr:version="2.2">
+      <object ref="Device.DHCPv6." requirement="present"/>
+      <object ref="Device.DHCPv6.Server." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="PoolNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Server.Pool.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="IANAEnable" requirement="readWrite"/>
+        <parameter ref="IAPDEnable" requirement="readWrite"/>
+        <parameter ref="IANAPrefixes" requirement="readOnly"/>
+        <parameter ref="IAPDAddLength" requirement="readWrite"/>
+        <parameter ref="OptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Server.Pool.{i}.Option.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Tag" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="DHCPv6ServerAdv:1" extends="DHCPv6Server:1" dmr:version="2.2">
+      <object ref="Device.DHCPv6.Server.Pool.{i}." requirement="createDelete">
+        <parameter ref="DUID" requirement="readWrite"/>
+        <parameter ref="VendorClassID" requirement="readWrite"/>
+        <parameter ref="UserClassID" requirement="readWrite"/>
+        <parameter ref="SourceAddress" requirement="readWrite"/>
+        <parameter ref="SourceAddressMask" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="DHCPv6ServerClientInfo:1" dmr:version="2.2">
+      <object ref="Device.DHCPv6.Server.Pool.{i}." requirement="createDelete">
+        <parameter ref="ClientNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Server.Pool.{i}.Client.{i}." requirement="present">
+        <parameter ref="SourceAddress" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+        <parameter ref="IPv6AddressNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="IPv6PrefixNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="OptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Server.Pool.{i}.Client.{i}.IPv6Address.{i}." requirement="present">
+        <parameter ref="IPAddress" requirement="readOnly"/>
+        <parameter ref="PreferredLifetime" requirement="readOnly"/>
+        <parameter ref="ValidLifetime" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Server.Pool.{i}.Client.{i}.IPv6Prefix.{i}." requirement="present">
+        <parameter ref="Prefix" requirement="readOnly"/>
+        <parameter ref="PreferredLifetime" requirement="readOnly"/>
+        <parameter ref="ValidLifetime" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Server.Pool.{i}.Client.{i}.Option.{i}." requirement="present">
+        <parameter ref="Tag" requirement="readOnly"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Processors:1" dmr:version="2.1">
+      <object ref="Device.DeviceInfo.Processor.{i}." requirement="present">
+        <parameter ref="Architecture" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="VendorLogFiles:1" dmr:version="2.1">
+      <object ref="Device.DeviceInfo.VendorLogFile.{i}." requirement="present">
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="MaximumSize" requirement="readOnly"/>
+        <parameter ref="Persistent" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DUStateChngComplPolicy:1" dmr:version="2.1">
+      <object ref="Device.ManagementServer.DUStateChangeComplPolicy." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="OperationTypeFilter" requirement="readWrite"/>
+        <parameter ref="ResultTypeFilter" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="Location:1" dmr:version="2.4">
+      <object ref="Device.DeviceInfo." requirement="present">
+        <parameter ref="LocationNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DeviceInfo.Location.{i}." requirement="createDelete">
+        <parameter ref="Source" requirement="readOnly"/>
+        <parameter ref="AcquiredTime" requirement="readOnly"/>
+        <parameter ref="ExternalSource" requirement="readOnly"/>
+        <parameter ref="ExternalProtocol" requirement="readOnly"/>
+        <parameter ref="DataObject" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="FaultMgmtSupportedAlarms:1" dmr:version="2.4">
+      <object ref="Device.FaultMgmt." requirement="present">
+        <parameter ref="SupportedAlarmNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FaultMgmt.SupportedAlarm.{i}." requirement="present">
+        <parameter ref="EventType" requirement="readOnly"/>
+        <parameter ref="ProbableCause" requirement="readOnly"/>
+        <parameter ref="SpecificProblem" requirement="readOnly"/>
+        <parameter ref="PerceivedSeverity" requirement="readOnly"/>
+        <parameter ref="ReportingMechanism" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="FaultMgmtActive:1 " dmr:version="2.4">
+      <object ref="Device.FaultMgmt." requirement="present">
+        <parameter ref="CurrentAlarmNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FaultMgmt.CurrentAlarm.{i}." requirement="present">
+        <parameter ref="AlarmIdentifier" requirement="readOnly"/>
+        <parameter ref="AlarmRaisedTime" requirement="readOnly"/>
+        <parameter ref="AlarmChangedTime" requirement="readOnly"/>
+        <parameter ref="EventType" requirement="readOnly"/>
+        <parameter ref="ProbableCause" requirement="readOnly"/>
+        <parameter ref="PerceivedSeverity" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="FaultMgmtHistory:1" dmr:version="2.4">
+      <object ref="Device.FaultMgmt." requirement="present">
+        <parameter ref="HistoryEventNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FaultMgmt.HistoryEvent.{i}." requirement="present">
+        <parameter ref="EventTime" requirement="readOnly"/>
+        <parameter ref="AlarmIdentifier" requirement="readOnly"/>
+        <parameter ref="NotificationType" requirement="readOnly"/>
+        <parameter ref="EventType" requirement="readOnly"/>
+        <parameter ref="ProbableCause" requirement="readOnly"/>
+        <parameter ref="PerceivedSeverity" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="FaultMgmtExpedited:1" dmr:version="2.4">
+      <object ref="Device.FaultMgmt." requirement="present">
+        <parameter ref="ExpeditedEventNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FaultMgmt.ExpeditedEvent.{i}." requirement="present">
+        <parameter ref="EventTime" requirement="readOnly"/>
+        <parameter ref="AlarmIdentifier" requirement="readOnly"/>
+        <parameter ref="NotificationType" requirement="readOnly"/>
+        <parameter ref="EventType" requirement="readOnly"/>
+        <parameter ref="ProbableCause" requirement="readOnly"/>
+        <parameter ref="PerceivedSeverity" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="FaultMgmtQueued:1" dmr:version="2.4">
+      <object ref="Device.FaultMgmt." requirement="present">
+        <parameter ref="QueuedEventNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FaultMgmt.QueuedEvent.{i}." requirement="present">
+        <parameter ref="EventTime" requirement="readOnly"/>
+        <parameter ref="AlarmIdentifier" requirement="readOnly"/>
+        <parameter ref="NotificationType" requirement="readOnly"/>
+        <parameter ref="EventType" requirement="readOnly"/>
+        <parameter ref="ProbableCause" requirement="readOnly"/>
+        <parameter ref="PerceivedSeverity" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="FAP_GPS:1" dmr:version="2.4">
+      <object ref="Device.FAP.GPS." requirement="present">
+        <parameter ref="ScanOnBoot" requirement="readWrite"/>
+        <parameter ref="ScanPeriodically" requirement="readWrite"/>
+        <parameter ref="PeriodicInterval" requirement="readWrite"/>
+        <parameter ref="PeriodicTime" requirement="readWrite"/>
+        <parameter ref="ContinuousGPS" requirement="readWrite"/>
+        <parameter ref="ScanTimeout" requirement="readWrite"/>
+        <parameter ref="ScanStatus" requirement="readOnly"/>
+        <parameter ref="ErrorDetails" requirement="readOnly"/>
+        <parameter ref="LastScanTime" requirement="readOnly"/>
+        <parameter ref="LastSuccessfulScanTime" requirement="readOnly"/>
+        <parameter ref="LockedLatitude" requirement="readOnly"/>
+        <parameter ref="LockedLongitude" requirement="readOnly"/>
+        <parameter ref="NumberOfSatellites" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="FAP_PerfMgmt:1" dmr:version="2.4">
+      <object ref="Device.FAP.PerfMgmt." requirement="present">
+        <parameter ref="ConfigNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FAP.PerfMgmt.Config.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="URL" requirement="readWrite"/>
+        <parameter ref="Username" requirement="readWrite"/>
+        <parameter ref="Password" requirement="readWrite"/>
+        <parameter ref="PeriodicUploadInterval" requirement="readWrite"/>
+        <parameter ref="PeriodicUploadTime" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="FAP_ApplicationPlatform:1" dmr:version="2.4">
+      <object ref="Device.FAP.ApplicationPlatform." requirement="present">
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="MaxNumberOfApplications" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FAP.ApplicationPlatform.Control." requirement="present">
+        <parameter ref="AuthenticationMethod" requirement="readWrite"/>
+      </object>
+      <object ref="Device.FAP.ApplicationPlatform.Control.FemtoAwareness." requirement="present">
+        <parameter ref="APIEnable" requirement="readWrite"/>
+        <parameter ref="MaxAPIUsersNumber" requirement="readWrite"/>
+        <parameter ref="FemtozoneID" requirement="readWrite"/>
+      </object>
+      <object ref="Device.FAP.ApplicationPlatform.Control.SMS." requirement="present">
+        <parameter ref="APIEnable" requirement="readWrite"/>
+        <parameter ref="MaxAPIUsersNumber" requirement="readWrite"/>
+        <parameter ref="MinSendSMSTimeInterval" requirement="readWrite"/>
+      </object>
+      <object ref="Device.FAP.ApplicationPlatform.Control.MMS." requirement="present">
+        <parameter ref="APIEnable" requirement="readWrite"/>
+        <parameter ref="MaxAPIUsersNumber" requirement="readWrite"/>
+        <parameter ref="MinSendMMSTimeInterval" requirement="readWrite"/>
+      </object>
+      <object ref="Device.FAP.ApplicationPlatform.Control.TerminalLocation." requirement="present">
+        <parameter ref="APIEnable" requirement="readWrite"/>
+        <parameter ref="MaxAPIUsersNumber" requirement="readWrite"/>
+        <parameter ref="QueryMobileLocationResponseAddress" requirement="readWrite"/>
+        <parameter ref="QueryMobileLocationResponseLongitudeLatitude" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BulkDataColl:1" dmr:version="2.5">
+      <object ref="Device.BulkData." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="MinReportingInterval" requirement="readOnly"/>
+        <parameter ref="Protocols" requirement="readOnly"/>
+        <parameter ref="EncodingTypes" requirement="readOnly"/>
+        <parameter ref="ProfileNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.BulkData.Profile.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Protocol" requirement="readWrite"/>
+        <parameter ref="EncodingType" requirement="readWrite"/>
+        <parameter ref="ReportingInterval" requirement="readWrite"/>
+        <parameter ref="TimeReference" requirement="readWrite"/>
+        <parameter ref="ParameterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.BulkData.Profile.{i}.Parameter.{i}." requirement="createDelete">
+        <parameter ref="Reference" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BulkDataReports:1" extends="BulkDataColl:1" dmr:version="2.10">
+      <object ref="Device.BulkData." requirement="present">
+        <parameter ref="ParameterWildCardSupported" requirement="readOnly"/>
+      </object>
+      <object ref="Device.BulkData.Profile.{i}." requirement="createDelete">
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="NumberOfRetainedFailedReports" requirement="readWrite"/>
+      </object>
+      <object ref="Device.BulkData.Profile.{i}.Parameter.{i}." requirement="createDelete">
+        <parameter ref="Name" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BulkDataJSONEncoding:1" extends="BulkDataColl:1" dmr:version="2.10">
+      <object ref="Device.BulkData.Profile.{i}.JSONEncoding." requirement="present">
+        <parameter ref="ReportFormat" requirement="readWrite"/>
+        <parameter ref="ReportTimestamp" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BulkDataCSVEncoding:1" extends="BulkDataColl:1" dmr:version="2.10">
+      <object ref="Device.BulkData.Profile.{i}.CSVEncoding." requirement="present">
+        <parameter ref="FieldSeparator" requirement="readWrite"/>
+        <parameter ref="RowSeparator" requirement="readWrite"/>
+        <parameter ref="EscapeCharacter" requirement="readWrite"/>
+        <parameter ref="ReportFormat" requirement="readWrite"/>
+        <parameter ref="RowTimestamp" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BulkDataHTTP:1" extends="BulkDataColl:1" dmr:version="2.10">
+      <object ref="Device.BulkData.Profile.{i}.HTTP." requirement="present">
+        <parameter ref="URL" requirement="readWrite"/>
+        <parameter ref="Username" requirement="readWrite"/>
+        <parameter ref="Password" requirement="readWrite"/>
+        <parameter ref="CompressionsSupported" requirement="readOnly"/>
+        <parameter ref="Compression" requirement="readWrite"/>
+        <parameter ref="MethodsSupported" requirement="readOnly"/>
+        <parameter ref="Method" requirement="readWrite"/>
+        <parameter ref="UseDateHeader" requirement="readWrite"/>
+        <parameter ref="RetryEnable" requirement="readWrite"/>
+        <parameter ref="RetryMinimumWaitInterval" requirement="readWrite"/>
+        <parameter ref="RetryIntervalMultiplier" requirement="readWrite"/>
+        <parameter ref="RequestURIParameterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.BulkData.Profile.{i}.HTTP.RequestURIParameter.{i}." requirement="createDelete">
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Reference" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BulkDataFileTransfer:1" extends="BulkDataColl:1" dmr:version="2.5">
+      <object ref="Device.BulkData.Profile.{i}." requirement="createDelete">
+        <parameter ref="FileTransferURL" requirement="readWrite"/>
+        <parameter ref="FileTransferUsername" requirement="readWrite"/>
+        <parameter ref="FileTransferPassword" requirement="readWrite"/>
+        <parameter ref="ControlFileFormat" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BulkDataStreaming:1" extends="BulkDataColl:1" dmr:version="2.5">
+      <object ref="Device.BulkData.Profile.{i}." requirement="createDelete">
+        <parameter ref="StreamingHost" requirement="readWrite"/>
+        <parameter ref="StreamingPort" requirement="readWrite"/>
+        <parameter ref="StreamingSessionID" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="IPsec:1" dmr:version="2.5">
+      <object ref="Device.IPsec." requirement="present">
+        <parameter ref="AHSupported" requirement="readOnly"/>
+        <parameter ref="IKEv2SupportedEncryptionAlgorithms" requirement="readOnly"/>
+        <parameter ref="ESPSupportedEncryptionAlgorithms" requirement="readOnly"/>
+        <parameter ref="IKEv2SupportedPseudoRandomFunctions" requirement="readOnly"/>
+        <parameter ref="SupportedIntegrityAlgorithms" requirement="readOnly"/>
+        <parameter ref="SupportedDiffieHellmanGroupTransforms" requirement="readOnly"/>
+        <parameter ref="MaxFilterEntries" requirement="readOnly"/>
+        <parameter ref="MaxProfileEntries" requirement="readOnly"/>
+        <parameter ref="FilterNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ProfileNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="TunnelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPsec.Stats." requirement="present">
+        <parameter ref="NegotiationFailures" requirement="readOnly"/>
+        <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="UnknownSPIErrors" requirement="readOnly"/>
+        <parameter ref="DecryptionErrors" requirement="readOnly"/>
+        <parameter ref="IntegrityErrors" requirement="readOnly"/>
+        <parameter ref="OtherReceiveErrors" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPsec.Filter.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AllInterfaces" requirement="readWrite"/>
+        <parameter ref="DestIP" requirement="readWrite"/>
+        <parameter ref="DestMask" requirement="readWrite"/>
+        <parameter ref="DestIPExclude" requirement="readWrite"/>
+        <parameter ref="SourceIP" requirement="readWrite"/>
+        <parameter ref="SourceMask" requirement="readWrite"/>
+        <parameter ref="SourceIPExclude" requirement="readWrite"/>
+        <parameter ref="Protocol" requirement="readWrite"/>
+        <parameter ref="ProtocolExclude" requirement="readWrite"/>
+        <parameter ref="DestPort" requirement="readWrite"/>
+        <parameter ref="DestPortRangeMax" requirement="readWrite"/>
+        <parameter ref="DestPortExclude" requirement="readWrite"/>
+        <parameter ref="SourcePort" requirement="readWrite"/>
+        <parameter ref="SourcePortRangeMax" requirement="readWrite"/>
+        <parameter ref="SourcePortExclude" requirement="readWrite"/>
+        <parameter ref="ProcessingChoice" requirement="readWrite"/>
+        <parameter ref="Profile" requirement="readWrite"/>
+      </object>
+      <object ref="Device.IPsec.Profile.{i}." requirement="createDelete">
+        <parameter ref="MaxChildSAs" requirement="readWrite"/>
+        <parameter ref="RemoteEndpoints" requirement="readWrite"/>
+        <parameter ref="ForwardingPolicy" requirement="readWrite"/>
+        <parameter ref="Protocol" requirement="readWrite"/>
+        <parameter ref="IKEv2AuthenticationMethod" requirement="readWrite"/>
+        <parameter ref="IKEv2AllowedEncryptionAlgorithms" requirement="readWrite"/>
+        <parameter ref="ESPAllowedEncryptionAlgorithms" requirement="readWrite"/>
+        <parameter ref="IKEv2AllowedPseudoRandomFunctions" requirement="readWrite"/>
+        <parameter ref="IKEv2AllowedIntegrityAlgorithms" requirement="readWrite"/>
+        <parameter ref="ESPAllowedIntegrityAlgorithms" requirement="readWrite"/>
+        <parameter ref="IKEv2AllowedDiffieHellmanGroupTransforms" requirement="readWrite"/>
+      </object>
+      <object ref="Device.IPsec.Tunnel.{i}." requirement="present">
+        <parameter ref="TunnelInterface" requirement="readOnly"/>
+        <parameter ref="TunneledInterface" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPsec.Tunnel.{i}.Stats." requirement="present">
+        <parameter ref="DecryptionErrors" requirement="readOnly"/>
+        <parameter ref="IntegrityErrors" requirement="readOnly"/>
+        <parameter ref="OtherReceiveErrors" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IPsecAdv:1" extends="IPsec:1" dmr:version="2.5">
+      <object ref="Device.IPsec." requirement="present">
+        <parameter ref="IKEv2SANumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPsec.IKEv2SA.{i}." requirement="present">
+        <parameter ref="Tunnel" requirement="readOnly"/>
+        <parameter ref="LocalAddress" requirement="readOnly"/>
+        <parameter ref="RemoteAddress" requirement="readOnly"/>
+        <parameter ref="CreationTime" requirement="readOnly"/>
+        <parameter ref="ChildSANumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPsec.IKEv2SA.{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="DecryptionErrors" requirement="readOnly"/>
+        <parameter ref="IntegrityErrors" requirement="readOnly"/>
+        <parameter ref="OtherReceiveErrors" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPsec.IKEv2SA.{i}.ChildSA.{i}." requirement="present">
+        <parameter ref="InboundSPI" requirement="readOnly"/>
+        <parameter ref="OutboundSPI" requirement="readOnly"/>
+        <parameter ref="CreationTime" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPsec.IKEv2SA.{i}.ChildSA.{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="DecryptionErrors" requirement="readOnly"/>
+        <parameter ref="IntegrityErrors" requirement="readOnly"/>
+        <parameter ref="OtherReceiveErrors" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DNS_SD:1" dmr:version="2.6">
+      <object ref="Device.DNS.SD." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="ServiceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DNS.SD.Service.{i}." requirement="present">
+        <parameter ref="InstanceName" requirement="readOnly"/>
+        <parameter ref="ApplicationProtocol" requirement="readOnly"/>
+        <parameter ref="TransportProtocol" requirement="readOnly"/>
+        <parameter ref="Domain" requirement="readOnly"/>
+        <parameter ref="Port" requirement="readOnly"/>
+        <parameter ref="Target" requirement="readOnly"/>
+        <parameter ref="Priority" requirement="readOnly"/>
+        <parameter ref="Weight" requirement="readOnly"/>
+        <parameter ref="TimeToLive" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="LastUpdate" requirement="readOnly"/>
+        <parameter ref="Host" requirement="readOnly"/>
+        <parameter ref="TextRecordNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DNS.SD.Service.{i}.TextRecord.{i}." requirement="present">
+        <parameter ref="Key" requirement="readOnly"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="XMPPBasic:1" dmr:version="2.7">
+      <object ref="Device.XMPP." requirement="present">
+        <parameter ref="ConnectionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.XMPP.Connection.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Username" requirement="readWrite"/>
+        <parameter ref="Password" requirement="readWrite"/>
+        <parameter ref="Domain" requirement="readWrite"/>
+        <parameter ref="Resource" requirement="readWrite"/>
+        <parameter ref="JabberID" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="LastChangeDate" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="XMPPAdvanced:1" extends="XMPPBasic:1" dmr:version="2.7">
+      <object ref="Device.XMPP.Connection.{i}." requirement="createDelete">
+        <parameter ref="ServerConnectAlgorithm" requirement="readWrite"/>
+        <parameter ref="KeepAliveInterval" requirement="readWrite"/>
+        <parameter ref="ServerNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="UseTLS" requirement="readWrite"/>
+        <parameter ref="TLSEstablished" requirement="readOnly"/>
+      </object>
+      <object ref="Device.XMPP.Connection.{i}.Server.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Priority" requirement="readWrite"/>
+        <parameter ref="Weight" requirement="readWrite"/>
+        <parameter ref="ServerAddress" requirement="readWrite"/>
+        <parameter ref="Port" requirement="readWrite"/>
+      </object>
+      <object ref="Device.XMPP.Connection.{i}.Stats." requirement="present">
+        <parameter ref="ReceivedMessages" requirement="readOnly"/>
+        <parameter ref="TransmittedMessages" requirement="readOnly"/>
+        <parameter ref="ReceivedErrorMessages" requirement="readOnly"/>
+        <parameter ref="TransmittedErrorMessages" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="XMPPReconnect:1" dmr:version="2.7">
+      <object ref="Device.XMPP.Connection.{i}." requirement="createDelete">
+        <parameter ref="ServerConnectAttempts" requirement="readWrite"/>
+        <parameter ref="ServerRetryInitialInterval" requirement="readWrite"/>
+        <parameter ref="ServerRetryIntervalMultiplier" requirement="readWrite"/>
+        <parameter ref="ServerRetryMaxInterval" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="InformParameters:1" dmr:version="2.8">
+      <object ref="Device.ManagementServer." requirement="present">
+        <parameter ref="InformParameterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ManagementServer.InformParameter.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="ParameterName" requirement="readWrite"/>
+        <parameter ref="EventList" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="UDPEchoDiag:1" dmr:version="2.9">
+      <object ref="Device.IP.Diagnostics.UDPEchoDiagnostics." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="Host" requirement="readWrite"/>
+        <parameter ref="NumberOfRepetitions" requirement="readWrite"/>
+        <parameter ref="EnableIndividualPacketResults" requirement="readWrite"/>
+        <parameter ref="Timeout" requirement="readWrite"/>
+        <parameter ref="DataBlockSize" requirement="readWrite"/>
+        <parameter ref="DSCP" requirement="readWrite"/>
+        <parameter ref="InterTransmissionTime" requirement="readWrite"/>
+        <parameter ref="SuccessCount" requirement="readOnly"/>
+        <parameter ref="FailureCount" requirement="readOnly"/>
+        <parameter ref="AverageResponseTime" requirement="readOnly"/>
+        <parameter ref="MinimumResponseTime" requirement="readOnly"/>
+        <parameter ref="MaximumResponseTime" requirement="readOnly"/>
+        <parameter ref="IndividualPacketResultNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IP.Diagnostics.UDPEchoDiagnostics.IndividualPacketResult.{i}." requirement="present">
+        <parameter ref="PacketSuccess" requirement="readOnly"/>
+        <parameter ref="PacketSendTime" requirement="readOnly"/>
+        <parameter ref="PacketReceiveTime" requirement="readOnly"/>
+        <parameter ref="TestGenSN" requirement="readOnly"/>
+        <parameter ref="TestRespSN" requirement="readOnly"/>
+        <parameter ref="TestRespRcvTimeStamp" requirement="readOnly"/>
+        <parameter ref="TestRespReplyTimeStamp" requirement="readOnly"/>
+        <parameter ref="TestRespReplyFailureCount" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ServerSelectionDiag:1" dmr:version="2.9">
+      <object ref="Device.IP.Diagnostics.ServerSelectionDiagnostics." requirement="present">
+        <parameter ref="DiagnosticsState" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="HostList" requirement="readWrite"/>
+        <parameter ref="NumberOfRepetitions" requirement="readWrite"/>
+        <parameter ref="Timeout" requirement="readWrite"/>
+        <parameter ref="FastestHost" requirement="readOnly"/>
+        <parameter ref="AverageResponseTime" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="GatewayInfo:1" dmr:version="2.0">
+      <object ref="Device.GatewayInfo." requirement="present">
+        <parameter ref="ManufacturerOUI" requirement="readOnly"/>
+        <parameter ref="ProductClass" requirement="readOnly"/>
+        <parameter ref="SerialNumber" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905." requirement="present">
+        <parameter ref="Version" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL." requirement="present">
+        <parameter ref="IEEE1905Id" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.Interface.{i}." requirement="present">
+        <parameter ref="InterfaceId" requirement="readOnly"/>
+        <parameter ref="MediaType" requirement="readOnly"/>
+        <parameter ref="GenericPhyOUI" requirement="readOnly"/>
+        <parameter ref="GenericPhyVariant" requirement="readOnly"/>
+        <parameter ref="GenericPhyURL" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.Security." requirement="present">
+        <parameter ref="SetupMethod" requirement="readWrite"/>
+        <parameter ref="Password" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905TopologyMetric:1" extends="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905.AL.NetworkTopology." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="IEEE1905DeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}." requirement="present">
+        <parameter ref="IEEE1905Id" requirement="readOnly"/>
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="IEEE1905NeighborNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}." requirement="present">
+        <parameter ref="LocalInterface" requirement="readOnly"/>
+        <parameter ref="NeighborDeviceId" requirement="readOnly"/>
+        <parameter ref="MetricNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}.Metric.{i}." requirement="present">
+        <parameter ref="NeighborMACAddress" requirement="readOnly"/>
+        <parameter ref="IEEE802dot1Bridge" requirement="readOnly"/>
+        <parameter ref="PacketErrors" requirement="readOnly"/>
+        <parameter ref="PacketErrorsReceived" requirement="readOnly"/>
+        <parameter ref="TransmittedPackets" requirement="readOnly"/>
+        <parameter ref="PacketsReceived" requirement="readOnly"/>
+        <parameter ref="MACThroughputCapacity" requirement="readOnly"/>
+        <parameter ref="LinkAvailability" requirement="readOnly"/>
+        <parameter ref="PHYRate" requirement="readOnly"/>
+        <parameter ref="RSSI" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905TopologyNeighbor:1" extends="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905.AL.NetworkTopology." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="IEEE1905DeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}." requirement="present">
+        <parameter ref="IEEE1905Id" requirement="readOnly"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="NonIEEE1905NeighborNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="IEEE1905NeighborNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="L2NeighborNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}." requirement="present">
+        <parameter ref="LocalInterface" requirement="readOnly"/>
+        <parameter ref="NeighborDeviceId" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.Interface.{i}." requirement="present">
+        <parameter ref="InterfaceId" requirement="readOnly"/>
+        <parameter ref="MediaType" requirement="readOnly"/>
+        <parameter ref="PowerState" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.NonIEEE1905Neighbor.{i}." requirement="present">
+        <parameter ref="LocalInterface" requirement="readOnly"/>
+        <parameter ref="NeighborInterfaceId" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.L2Neighbor.{i}." requirement="present">
+        <parameter ref="LocalInterface" requirement="readOnly"/>
+        <parameter ref="NeighborInterfaceId" requirement="readOnly"/>
+        <parameter ref="BehindInterfaceIds" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905TopologyHigherLayer:1" extends="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905.AL.NetworkTopology." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="IEEE1905DeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}." requirement="present">
+        <parameter ref="IEEE1905Id" requirement="readOnly"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="FriendlyName" requirement="readOnly"/>
+        <parameter ref="ManufacturerName" requirement="readOnly"/>
+        <parameter ref="ManufacturerModel" requirement="readOnly"/>
+        <parameter ref="ControlURL" requirement="readOnly"/>
+        <parameter ref="IPv4AddressNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="IPv6AddressNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IPv4Address.{i}." requirement="present">
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="IPv4Address" requirement="readOnly"/>
+        <parameter ref="IPv4AddressType" requirement="readOnly"/>
+        <parameter ref="DHCPServer" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IPv6Address.{i}." requirement="present">
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="IPv6Address" requirement="readOnly"/>
+        <parameter ref="IPv6AddressType" requirement="readOnly"/>
+        <parameter ref="IPv6AddressOrigin" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905Power:1" extends="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905.AL.Interface.{i}." requirement="present">
+        <parameter ref="SetIntfPowerStateEnabled" requirement="readWrite"/>
+        <parameter ref="PowerState" requirement="readWrite"/>
+        <parameter ref="VendorPropertiesNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.Interface.{i}.VendorProperties.{i}." requirement="present">
+        <parameter ref="OUI" requirement="readOnly"/>
+        <parameter ref="Information" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905InterfaceSelection:1" extends="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905.AL.Interface.{i}." requirement="present">
+        <parameter ref="SetIntfPowerStateEnabled" requirement="readWrite"/>
+        <parameter ref="PowerState" requirement="readWrite"/>
+        <parameter ref="VendorPropertiesNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.Interface.{i}.VendorProperties.{i}." requirement="present">
+        <parameter ref="OUI" requirement="readOnly"/>
+        <parameter ref="Information" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.ForwardingTable." requirement="present">
+        <parameter ref="SetForwardingEnabled" requirement="readOnly"/>
+        <parameter ref="ForwardingRuleNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.ForwardingTable.ForwardingRule.{i}." requirement="createDelete">
+        <parameter ref="InterfaceList" requirement="readWrite"/>
+        <parameter ref="MACDestinationAddress" requirement="readWrite"/>
+        <parameter ref="MACDestinationAddressFlag" requirement="readWrite"/>
+        <parameter ref="MACSourceAddress" requirement="readWrite"/>
+        <parameter ref="MACSourceAddressFlag" requirement="readWrite"/>
+        <parameter ref="EtherType" requirement="readWrite"/>
+        <parameter ref="EtherTypeFlag" requirement="readWrite"/>
+        <parameter ref="Vid" requirement="readWrite"/>
+        <parameter ref="VidFlag" requirement="readWrite"/>
+        <parameter ref="PCP" requirement="readWrite"/>
+        <parameter ref="PCPFlag" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905LinkMetric:1" extends="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905.AL.Interface.{i}." requirement="present">
+        <parameter ref="SetIntfPowerStateEnabled" requirement="readWrite"/>
+        <parameter ref="PowerState" requirement="readWrite"/>
+        <parameter ref="LinkNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="VendorPropertiesNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.Interface.{i}.VendorProperties.{i}." requirement="present">
+        <parameter ref="OUI" requirement="readOnly"/>
+        <parameter ref="Information" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.Interface.{i}.Link.{i}." requirement="present">
+        <parameter ref="InterfaceId" requirement="readOnly"/>
+        <parameter ref="IEEE1905Id" requirement="readOnly"/>
+        <parameter ref="MediaType" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.Interface.{i}.Link.{i}.Metric." requirement="present">
+        <parameter ref="PacketErrors" requirement="readOnly"/>
+        <parameter ref="PacketErrorsReceived" requirement="readOnly"/>
+        <parameter ref="TransmittedPackets" requirement="readOnly"/>
+        <parameter ref="PacketsReceived" requirement="readOnly"/>
+        <parameter ref="MACThroughputCapacity" requirement="readOnly"/>
+        <parameter ref="LinkAvailability" requirement="readOnly"/>
+        <parameter ref="PHYRate" requirement="readOnly"/>
+        <parameter ref="RSSI" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905NetworkTopology:1" extends="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905.AL.NetworkTopology." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="MaxChangeLogEntries" requirement="readWrite"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="IEEE1905DeviceNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ChangeLogNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.ChangeLog.{i}." requirement="present">
+        <parameter ref="TimeStamp" requirement="readOnly"/>
+        <parameter ref="EventType" requirement="readOnly"/>
+        <parameter ref="ReporterDeviceId" requirement="readOnly"/>
+        <parameter ref="ReporterInterfaceId" requirement="readOnly"/>
+        <parameter ref="NeighborType" requirement="readOnly"/>
+        <parameter ref="NeighborId" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}." requirement="present">
+        <parameter ref="IEEE1905Id" requirement="readOnly"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="NonIEEE1905NeighborNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="IEEE1905NeighborNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="BridgingTupleNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.BridgingTuple.{i}." requirement="present">
+        <parameter ref="InterfaceList" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}." requirement="present">
+        <parameter ref="LocalInterface" requirement="readOnly"/>
+        <parameter ref="NeighborDeviceId" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.Interface.{i}." requirement="present">
+        <parameter ref="InterfaceId" requirement="readOnly"/>
+        <parameter ref="MediaType" requirement="readOnly"/>
+        <parameter ref="PowerState" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.NonIEEE1905Neighbor.{i}." requirement="present">
+        <parameter ref="LocalInterface" requirement="readOnly"/>
+        <parameter ref="NeighborInterfaceId" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="MQTTClientBase:1" dmr:version="2.10">
+      <description>
+        Provides basic MQTT client control and statistics
+      </description>
+      <object ref="Device.MQTT." requirement="present">
+        <parameter ref="ClientNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MQTT.Client.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="BrokerAddress" requirement="readWrite"/>
+        <parameter ref="BrokerPort" requirement="readWrite"/>
+        <parameter ref="CleanSession" requirement="readWrite"/>
+        <parameter ref="KeepAliveTime" requirement="readWrite"/>
+        <parameter ref="SubscriptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MQTT.Client.{i}.Stats." requirement="present">
+        <parameter ref="BrokerConnectionEstablished" requirement="readOnly"/>
+        <parameter ref="MQTTMessagesSent" requirement="readOnly"/>
+        <parameter ref="MQTTMessagesReceived" requirement="readOnly"/>
+        <parameter ref="ConnectionErrors" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="MQTTClientSubscribe:1" base="MQTTClientBase:1" dmr:version="2.10">
+      <description>
+        Adds client subscription control and access to received topics
+      </description>
+      <object ref="Device.MQTT.Client.{i}.Subscription.{i}." requirement="present">
+        <parameter ref="Topic" requirement="readWrite"/>
+        <parameter ref="QoS" requirement="readOnly"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="MQTTBrokerBase:1" dmr:version="2.10">
+      <description>
+        Provides basic MQTT broker control and statistics
+      </description>
+      <object ref="Device.MQTT." requirement="present">
+        <parameter ref="BrokerNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MQTT.Broker.{i}." requirement="present">
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="Port" requirement="readWrite"/>
+      </object>
+      <object ref="Device.MQTT.Broker.{i}.Stats." requirement="present">
+        <parameter ref="TotalNumberOfClients" requirement="readOnly"/>
+        <parameter ref="NumberOfActiveClients" requirement="readOnly"/>
+        <parameter ref="MQTTMessagesSent" requirement="readOnly"/>
+        <parameter ref="MQTTMessagesReceived" requirement="readOnly"/>
+        <parameter ref="ConnectionErrors" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="MQTTBrokerBridgeBase:1" base="MQTTBrokerBase:1" dmr:version="2.10">
+      <description>
+        Adds parameters for MQTT network interconnection with Bridges
+      </description>
+      <object ref="Device.MQTT.Broker.{i}." requirement="present">
+        <parameter ref="BridgeNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MQTT.Broker.{i}.Bridge.{i}." requirement="present">
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="ServerConnection" requirement="readOnly"/>
+        <parameter ref="ServerNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="SubscriptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MQTT.Broker.{i}.Bridge.{i}.Server.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Priority" requirement="readWrite"/>
+        <parameter ref="Address" requirement="readWrite"/>
+        <parameter ref="Port" requirement="readWrite"/>
+      </object>
+      <object ref="Device.MQTT.Broker.{i}.Bridge.{i}.Subscription.{i}." requirement="present">
+        <parameter ref="Topic" requirement="readWrite"/>
+        <parameter ref="Direction" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="QoS" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="MQTTBrokerExtended:1" base="MQTTBrokerBase:1" dmr:version="2.10">
+      <description>
+        Adds client authentication and extends statistics
+      </description>
+      <object ref="Device.MQTT.Broker.{i}." requirement="present">
+        <parameter ref="Username" requirement="readWrite"/>
+        <parameter ref="Password" requirement="readWrite"/>
+      </object>
+      <object ref="Device.MQTT.Broker.{i}.Stats." requirement="present">
+        <parameter ref="NumberOfInactiveClients" requirement="readOnly"/>
+        <parameter ref="PublishSent" requirement="readOnly"/>
+        <parameter ref="PublishReceived" requirement="readOnly"/>
+        <parameter ref="PublishErrors" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ZigBeeInterface:1" dmr:version="2.10">
+      <object ref="Device.ZigBee." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="IEEEAddress" requirement="readOnly"/>
+        <parameter ref="NetworkAddress" requirement="readOnly"/>
+        <parameter ref="ZDOReference" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ZigBeeAssociatedDevices:1" extends="ZigBeeInterface:1" dmr:version="2.10">
+      <object ref="Device.ZigBee.Interface.{i}." requirement="present">
+        <parameter ref="AssociatedDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.Interface.{i}.AssociatedDevice.{i}." requirement="present">
+        <parameter ref="IEEEAddress" requirement="readOnly"/>
+        <parameter ref="NetworkAddress" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+        <parameter ref="ZDOReference" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ZigBeeDisc:1" dmr:version="2.10">
+      <object ref="Device.ZigBee.Discovery." requirement="present">
+        <parameter ref="AreaNetworkNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.Discovery.AreaNetwork.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="LastUpdate" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Coordinator" requirement="readWrite"/>
+        <parameter ref="ZDOReference" requirement="readOnly"/>
+        <parameter ref="ZDOList" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ZDOBasic:1" dmr:version="2.10">
+      <object ref="Device.ZigBee." requirement="present">
+        <parameter ref="ZDONumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}." requirement="present">
+        <parameter ref="IEEEAddress" requirement="readOnly"/>
+        <parameter ref="NetworkAddress" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.NodeDescriptor." requirement="present">
+        <parameter ref="LogicalType" requirement="readOnly"/>
+        <parameter ref="ComplexDescriptorSupported" requirement="readOnly"/>
+        <parameter ref="UserDescriptorSupported" requirement="readOnly"/>
+        <parameter ref="FrequencyBand" requirement="readOnly"/>
+        <parameter ref="MACCapability" requirement="readOnly"/>
+        <parameter ref="ManufactureCode" requirement="readOnly"/>
+        <parameter ref="MaximumBufferSize" requirement="readOnly"/>
+        <parameter ref="MaximumIncomingTransferSize" requirement="readOnly"/>
+        <parameter ref="MaximumOutgoingTransferSize" requirement="readOnly"/>
+        <parameter ref="ServerMask" requirement="readOnly"/>
+        <parameter ref="DescriptorCapability" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.PowerDescriptor." requirement="present">
+        <parameter ref="CurrentPowerMode" requirement="readOnly"/>
+        <parameter ref="AvailablePowerSource" requirement="readOnly"/>
+        <parameter ref="CurrentPowerSource" requirement="readOnly"/>
+        <parameter ref="CurrentPowerSourceLevel" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ZDOAdv:1" extends="ZDOBasic:1" dmr:version="2.10">
+      <object ref="Device.ZigBee.ZDO.{i}." requirement="present">
+        <parameter ref="BindingTableNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="GroupNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ApplicationEndpointNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.UserDescriptor." requirement="present">
+        <parameter ref="DescriptorAvailable" requirement="readOnly"/>
+        <parameter ref="Description" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.ComplexDescriptor." requirement="present">
+        <parameter ref="DescriptorAvailable" requirement="readOnly"/>
+        <parameter ref="Language" requirement="readOnly"/>
+        <parameter ref="CharacterSet" requirement="readOnly"/>
+        <parameter ref="ManufacturerName" requirement="readOnly"/>
+        <parameter ref="ModelName" requirement="readOnly"/>
+        <parameter ref="SerialNumber" requirement="readOnly"/>
+        <parameter ref="DeviceURL" requirement="readOnly"/>
+        <parameter ref="Icon" requirement="readOnly"/>
+        <parameter ref="IconURL" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.Security." requirement="present">
+        <parameter ref="TrustCenterAddress" requirement="readOnly"/>
+        <parameter ref="SecurityLevel" requirement="readOnly"/>
+        <parameter ref="TimeOutPeriod" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.Network." requirement="present">
+        <parameter ref="NeighborNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.Network.Neighbor.{i}." requirement="present">
+        <parameter ref="Neighbor" requirement="readOnly"/>
+        <parameter ref="LQI" requirement="readOnly"/>
+        <parameter ref="Relationship" requirement="readOnly"/>
+        <parameter ref="PermitJoin" requirement="readOnly"/>
+        <parameter ref="Depth" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.NodeManager." requirement="present">
+        <parameter ref="RoutingTableNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.NodeManager.RoutingTable.{i}." requirement="present">
+        <parameter ref="DestinationAddress" requirement="readOnly"/>
+        <parameter ref="NextHopAddress" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="MemoryConstrained" requirement="readOnly"/>
+        <parameter ref="ManyToOne" requirement="readOnly"/>
+        <parameter ref="RouteRecordRequired" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.Binding.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="SourceEndpoint" requirement="readWrite"/>
+        <parameter ref="SourceAddress" requirement="readWrite"/>
+        <parameter ref="ClusterId" requirement="readWrite"/>
+        <parameter ref="DestinationAddressMode" requirement="readWrite"/>
+        <parameter ref="DestinationEndpoint" requirement="readWrite"/>
+        <parameter ref="IEEEDestinationAddress" requirement="readWrite"/>
+        <parameter ref="GroupDestinationAddress" requirement="readWrite"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.Group.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="GroupId" requirement="readWrite"/>
+        <parameter ref="EndpointList" requirement="readWrite"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.ApplicationEndpoint.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="EndpointId" requirement="readWrite"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.ApplicationEndpoint.{i}.SimpleDescriptor." requirement="present">
+        <parameter ref="ProfileId" requirement="readWrite"/>
+        <parameter ref="DeviceId" requirement="readOnly"/>
+        <parameter ref="DeviceVersion" requirement="readOnly"/>
+        <parameter ref="InputClusterList" requirement="readWrite"/>
+        <parameter ref="OutputClusterList" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="ZigBeeStats:1" extends="ZigBeeInterface:1" dmr:version="2.10">
+      <object ref="Device.ZigBee.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="UnknownPacketsReceived" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="LEDBasic:1" dmr:version="2.11">
+      <object ref="Device.LEDs." requirement="present">
+        <parameter ref="LEDNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LEDs.LED.{i}." requirement="present">
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Reason" requirement="readOnly"/>
+        <parameter ref="CyclePeriodRepetitions" requirement="readOnly"/>
+        <parameter ref="Location" requirement="readOnly"/>
+        <parameter ref="RelativeXPosition" requirement="readOnly"/>
+        <parameter ref="RelativeYPosition" requirement="readOnly"/>
+        <parameter ref="CycleElementNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LEDs.LED.{i}.CycleElement.{i}." requirement="present">
+        <parameter ref="Order" requirement="readOnly"/>
+        <parameter ref="Color" requirement="readOnly"/>
+        <parameter ref="Duration" requirement="readOnly"/>
+        <parameter ref="FadeInterval" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LEDs.LED.{i}.CurrentCycleElement." requirement="present">
+        <parameter ref="CycleElementReference" requirement="readOnly"/>
+        <parameter ref="Color" requirement="readOnly"/>
+        <parameter ref="Duration" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="LEDAdv:1" dmr:version="2.11">
+      <object ref="Device.LEDs." requirement="present">
+        <parameter ref="LEDNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LEDs.LED.{i}." requirement="present">
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Reason" requirement="readOnly"/>
+        <parameter ref="CyclePeriodRepetitions" requirement="readOnly"/>
+        <parameter ref="Location" requirement="readOnly"/>
+        <parameter ref="RelativeXPosition" requirement="readOnly"/>
+        <parameter ref="RelativeYPosition" requirement="readOnly"/>
+        <parameter ref="CycleElementNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LEDs.LED.{i}.CycleElement.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Color" requirement="readWrite"/>
+        <parameter ref="Duration" requirement="readWrite"/>
+        <parameter ref="FadeInterval" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LEDs.LED.{i}.CurrentCycleElement." requirement="present">
+        <parameter ref="CycleElementReference" requirement="readOnly"/>
+        <parameter ref="Color" requirement="readOnly"/>
+        <parameter ref="Duration" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DeviceImage:1" dmr:version="2.11">
+      <object ref="Device.DeviceInfo." requirement="present">
+        <parameter ref="DeviceImageNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DeviceInfo.DeviceImageFile.{i}." requirement="present">
+        <parameter ref="Location" requirement="readOnly"/>
+        <parameter ref="Image" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="FAST:1" dmr:version="2.11">
+      <description>
+        Note: This profile is valid for G.9701 modems.
+      </description>
+      <object ref="Device.FAST." requirement="present">
+        <parameter ref="LineNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FAST.Line.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="AllowedProfiles" requirement="readOnly"/>
+        <parameter ref="CurrentProfile" requirement="readOnly"/>
+        <parameter ref="UPBOKLE" requirement="readOnly"/>
+        <parameter ref="UpstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="DownstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="UpstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="DownstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="UpstreamAttenuation" requirement="readOnly"/>
+        <parameter ref="DownstreamAttenuation" requirement="readOnly"/>
+        <parameter ref="UpstreamPower" requirement="readOnly"/>
+        <parameter ref="DownstreamPower" requirement="readOnly"/>
+        <parameter ref="SNRMRMCds" requirement="readOnly"/>
+        <parameter ref="SNRMRMCus" requirement="readOnly"/>
+        <parameter ref="FEXTCANCELds" requirement="readOnly"/>
+        <parameter ref="FEXTCANCELus" requirement="readOnly"/>
+        <parameter ref="ETRds" requirement="readOnly"/>
+        <parameter ref="ETRus" requirement="readOnly"/>
+        <parameter ref="ATTETRds" requirement="readOnly"/>
+        <parameter ref="ATTETRus" requirement="readOnly"/>
+        <parameter ref="MINEFTR" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FAST.Line.{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"/>
+      </object>
+      <object ref="Device.FAST.Line.{i}.TestParams." requirement="present">
+        <parameter ref="SNRGds" requirement="readOnly"/>
+        <parameter ref="SNRGus" requirement="readOnly"/>
+        <parameter ref="SNRpsds" requirement="readOnly"/>
+        <parameter ref="SNRpsus" requirement="readOnly"/>
+        <parameter ref="SNRMTds" requirement="readOnly"/>
+        <parameter ref="SNRMTus" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UserInformationBasic:1" dmr:version="2.11">
+      <object ref="Device.UserInterface.Messages." requirement="present">
+        <parameter ref="Title" requirement="readWrite"/>
+        <parameter ref="SubTitle" requirement="readWrite"/>
+        <parameter ref="Text" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="UserInformationExtended:1" dmr:version="2.11">
+      <object ref="Device.UserInterface.Messages." requirement="present">
+        <parameter ref="Title" requirement="readWrite"/>
+        <parameter ref="SubTitle" requirement="readWrite"/>
+        <parameter ref="Text" requirement="readWrite"/>
+        <parameter ref="IconType" requirement="readWrite"/>
+        <parameter ref="MessageColor" requirement="readWrite"/>
+        <parameter ref="BackgroundColor" requirement="readWrite"/>
+        <parameter ref="TitleColor" requirement="readWrite"/>
+        <parameter ref="SubTitleColor" requirement="readWrite"/>
+        <parameter ref="RequestedNumberOfRepetitions" requirement="readWrite"/>
+        <parameter ref="ExecutedNumberOfRepetitions" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="L2TPv3Basic:1" dmr:version="2.12">
+      <object ref="Device.L2TPv3." requirement="present">
+        <parameter ref="TunnelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="RemoteEndpoints" requirement="readWrite"/>
+        <parameter ref="KeepAlivePolicy" requirement="readWrite"/>
+        <parameter ref="KeepAliveTimeout" requirement="readWrite"/>
+        <parameter ref="KeepAliveThreshold" requirement="readWrite"/>
+        <parameter ref="DeliveryHeaderProtocol" requirement="readWrite"/>
+        <parameter ref="TunnelEncapsulation" requirement="readWrite"/>
+        <parameter ref="ConnectedRemoteEndpoint" requirement="readOnly"/>
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{i}.UDP." requirement="present">
+        <parameter ref="SourcePort" requirement="readWrite"/>
+        <parameter ref="RemotePort" requirement="readWrite"/>
+        <parameter ref="EnableChecksum" requirement="readWrite"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{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"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{i}.Interface.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readOnly"/>
+        <parameter ref="SessionID" requirement="readWrite"/>
+        <parameter ref="CookiePolicy" requirement="readWrite"/>
+        <parameter ref="Cookie" requirement="readWrite"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{i}.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"/>
+      </object>
+    </profile>
+    <profile name="L2TPv3Adv:1" extends="L2TPv3Basic:1" dmr:version="2.12">
+      <object ref="Device.L2TPv3." requirement="present">
+        <parameter ref="FilterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{i}." requirement="createDelete">
+        <parameter ref="DefaultDSCPMark" requirement="readWrite"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{i}.Stats." requirement="present">
+        <parameter ref="KeepAliveSent" requirement="readOnly"/>
+        <parameter ref="KeepAliveReceived" requirement="readOnly"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{i}.Interface.{i}.Stats." requirement="present">
+        <parameter ref="DiscardChecksumReceived" requirement="readOnly"/>
+        <parameter ref="DiscardSequenceNumberReceived" requirement="readOnly"/>
+      </object>
+      <object ref="Device.L2TPv3.Filter.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AllInterfaces" requirement="readWrite"/>
+        <parameter ref="VLANIDCheck" requirement="readWrite"/>
+        <parameter ref="VLANIDExclude" requirement="readWrite"/>
+        <parameter ref="DSCPMarkPolicy" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="VXLANBasic:1" dmr:version="2.12">
+      <object ref="Device.VXLAN." requirement="present">
+        <parameter ref="TunnelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.VXLAN.Tunnel.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="RemoteEndpoints" requirement="readWrite"/>
+        <parameter ref="KeepAlivePolicy" requirement="readWrite"/>
+        <parameter ref="KeepAliveTimeout" requirement="readWrite"/>
+        <parameter ref="KeepAliveThreshold" requirement="readWrite"/>
+        <parameter ref="DeliveryHeaderProtocol" requirement="readWrite"/>
+        <parameter ref="ConnectedRemoteEndpoint" requirement="readOnly"/>
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="SourcePort" requirement="readWrite"/>
+        <parameter ref="RemotePort" requirement="readWrite"/>
+      </object>
+      <object ref="Device.VXLAN.Tunnel.{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"/>
+      </object>
+      <object ref="Device.VXLAN.Tunnel.{i}.Interface.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readOnly"/>
+        <parameter ref="VNI" requirement="readWrite"/>
+      </object>
+      <object ref="Device.VXLAN.Tunnel.{i}.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"/>
+      </object>
+    </profile>
+    <profile name="VXLANAdv:1" extends="VXLANBasic:1" dmr:version="2.12">
+      <object ref="Device.VXLAN." requirement="present">
+        <parameter ref="FilterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.VXLAN.Tunnel.{i}." requirement="createDelete">
+        <parameter ref="DefaultDSCPMark" requirement="readWrite"/>
+      </object>
+      <object ref="Device.VXLAN.Tunnel.{i}.Stats." requirement="present">
+        <parameter ref="KeepAliveSent" requirement="readOnly"/>
+        <parameter ref="KeepAliveReceived" requirement="readOnly"/>
+      </object>
+      <object ref="Device.VXLAN.Tunnel.{i}.Interface.{i}.Stats." requirement="present">
+        <parameter ref="DiscardChecksumReceived" requirement="readOnly"/>
+        <parameter ref="DiscardSequenceNumberReceived" requirement="readOnly"/>
+      </object>
+      <object ref="Device.VXLAN.Filter.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AllInterfaces" requirement="readWrite"/>
+        <parameter ref="VLANIDCheck" requirement="readWrite"/>
+        <parameter ref="VLANIDExclude" requirement="readWrite"/>
+        <parameter ref="DSCPMarkPolicy" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="LMAPPreconfiguration:1" dmr:version="2.12">
+      <object ref="Device.LMAP." requirement="present">
+        <parameter ref="MeasurementAgentNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="CapabilityTags" requirement="readOnly"/>
+        <parameter ref="Identifier" requirement="readWrite"/>
+        <parameter ref="PublicCredential" requirement="readWrite"/>
+        <parameter ref="PrivateCredential" requirement="readWrite"/>
+        <parameter ref="EventLog" requirement="readOnly"/>
+        <parameter ref="TaskCapabilityNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ScheduleNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="TaskNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="CommunicationChannelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Controller." requirement="present">
+        <parameter ref="ControllerTimeout" requirement="readWrite"/>
+        <parameter ref="ControlSchedules" requirement="readWrite"/>
+        <parameter ref="ControlTasks" requirement="readWrite"/>
+        <parameter ref="ControlChannels" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.TaskCapability.{i}." requirement="present">
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="TaskCapabilityRegistryNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.TaskCapability.{i}.Registry.{i}." requirement="present">
+        <parameter ref="RegistryEntry" requirement="readOnly"/>
+        <parameter ref="Roles" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Start" requirement="readWrite"/>
+        <parameter ref="End" requirement="readWrite"/>
+        <parameter ref="Duration" requirement="readWrite"/>
+        <parameter ref="Tags" requirement="readWrite"/>
+        <parameter ref="SuppressionTags" requirement="readWrite"/>
+        <parameter ref="ExecutionMode" requirement="readWrite"/>
+        <parameter ref="ActionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Task" requirement="readWrite"/>
+        <parameter ref="SuppressionTags" requirement="readWrite"/>
+        <parameter ref="Tags" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}.Option.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Task.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Tags" requirement="readWrite"/>
+        <parameter ref="OptionNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="RegistryNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Task.{i}.Registry.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="RegistryEntry" requirement="readWrite"/>
+        <parameter ref="Roles" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Task.{i}.Option.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.CommunicationChannel.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="UseBulkDataProfile" requirement="readWrite"/>
+        <parameter ref="Target" requirement="readWrite"/>
+        <parameter ref="TargetPublicCredential" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.Event.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Type" requirement="readWrite"/>
+        <parameter ref="RandomnessSpread" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.Event.{i}.PeriodicTimer." requirement="present">
+        <parameter ref="StartTime" requirement="readWrite"/>
+        <parameter ref="EndTime" requirement="readWrite"/>
+        <parameter ref="Interval" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.Event.{i}.CalendarTimer." requirement="present">
+        <parameter ref="StartTime" requirement="readWrite"/>
+        <parameter ref="EndTime" requirement="readWrite"/>
+        <parameter ref="ScheduleMonths" requirement="readWrite"/>
+        <parameter ref="ScheduleDaysOfMonth" requirement="readWrite"/>
+        <parameter ref="ScheduleDaysOfWeek" requirement="readWrite"/>
+        <parameter ref="ScheduleHoursOfDay" requirement="readWrite"/>
+        <parameter ref="ScheduleMinutesOfHour" requirement="readWrite"/>
+        <parameter ref="ScheduleSecondsOfMinute" requirement="readWrite"/>
+        <parameter ref="EnableScheduleTimezoneOffset" requirement="readWrite"/>
+        <parameter ref="ScheduleTimezoneOffset" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.Event.{i}.OneOff." requirement="present">
+        <parameter ref="StartTime" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="LMAPController:1" extends="LMAPPreconfiguration:1" dmr:version="2.12">
+      <object ref="Device.LMAP.MeasurementAgent.{i}." requirement="createDelete">
+        <parameter ref="LastStarted" requirement="readOnly"/>
+        <parameter ref="GroupIdentifier" requirement="readWrite"/>
+        <parameter ref="MeasurementPoint" requirement="readWrite"/>
+        <parameter ref="UseAgentIdentifierInReports" requirement="readWrite"/>
+        <parameter ref="UseGroupIdentifierInReports" requirement="readWrite"/>
+        <parameter ref="UseMeasurementPointInReports" requirement="readWrite"/>
+        <parameter ref="InstructionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Controller." requirement="present">
+        <parameter ref="ControllerTimeout" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}." requirement="createDelete">
+        <parameter ref="State" requirement="readOnly"/>
+        <parameter ref="LastInvocation" requirement="readOnly"/>
+        <parameter ref="Storage" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Stats." requirement="present">
+        <parameter ref="Invocations" requirement="readOnly"/>
+        <parameter ref="Suppressions" requirement="readOnly"/>
+        <parameter ref="Overlaps" requirement="readOnly"/>
+        <parameter ref="Failures" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}." requirement="createDelete">
+        <parameter ref="State" requirement="readOnly"/>
+        <parameter ref="LastInvocation" requirement="readOnly"/>
+        <parameter ref="Storage" requirement="readOnly"/>
+        <parameter ref="LastSuccessfulCompletion" requirement="readOnly"/>
+        <parameter ref="LastSuccessfulStatusCode" requirement="readOnly"/>
+        <parameter ref="LastSuccessfulMessage" requirement="readOnly"/>
+        <parameter ref="LastFailedCompletion" requirement="readOnly"/>
+        <parameter ref="LastFailedStatusCode" requirement="readOnly"/>
+        <parameter ref="LastFailedMessage" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}.Stats." requirement="present">
+        <parameter ref="Invocations" requirement="readOnly"/>
+        <parameter ref="Suppressions" requirement="readOnly"/>
+        <parameter ref="Overlaps" requirement="readOnly"/>
+        <parameter ref="Failures" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Instruction.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="InstructionSchedules" requirement="readWrite"/>
+        <parameter ref="InstructionTasks" requirement="readWrite"/>
+        <parameter ref="ReportChannels" requirement="readWrite"/>
+        <parameter ref="MeasurementSuppressionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Instruction.{i}.MeasurementSuppression.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="State" requirement="readOnly"/>
+        <parameter ref="StopRunning" requirement="readWrite"/>
+        <parameter ref="Start" requirement="readWrite"/>
+        <parameter ref="End" requirement="readWrite"/>
+        <parameter ref="SuppressionMatch" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.Event.{i}." requirement="createDelete">
+        <parameter ref="CycleInterval" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="LMAPCollector:1" dmr:version="2.12">
+      <object ref="Device.LMAP.Report.{i}." requirement="present">
+        <parameter ref="ReportDate" requirement="readOnly"/>
+        <parameter ref="AgentIdentifier" requirement="readOnly"/>
+        <parameter ref="GroupIdentifier" requirement="readOnly"/>
+        <parameter ref="MeasurementPoint" requirement="readOnly"/>
+        <parameter ref="ResultNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.Report.{i}.Result.{i}." requirement="present">
+        <parameter ref="TaskName" requirement="readOnly"/>
+        <parameter ref="ScheduleName" requirement="readOnly"/>
+        <parameter ref="ActionName" requirement="readOnly"/>
+        <parameter ref="EventTime" requirement="readOnly"/>
+        <parameter ref="CycleNumber" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Tags" requirement="readOnly"/>
+        <parameter ref="OptionNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ResultConflictNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ResultReportTableNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.Report.{i}.Result.{i}.Option.{i}." requirement="present">
+        <parameter ref="Order" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.Report.{i}.Result.{i}.Conflict.{i}." requirement="present">
+        <parameter ref="TaskName" requirement="readOnly"/>
+        <parameter ref="ScheduleName" requirement="readOnly"/>
+        <parameter ref="ActionName" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.Report.{i}.Result.{i}.ReportTable.{i}." requirement="present">
+        <parameter ref="ColumnLabels" requirement="readOnly"/>
+        <parameter ref="ResultReportRowNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="RegistryNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.Report.{i}.Result.{i}.ReportTable.{i}.ResultRow.{i}." requirement="present">
+        <parameter ref="Values" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.Report.{i}.Result.{i}.ReportTable.{i}.Registry.{i}." requirement="present">
+        <parameter ref="RegistryEntry" requirement="readOnly"/>
+        <parameter ref="Roles" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="BASAPM:1" dmr:version="2.12">
+      <object ref="Device.BASAPM." requirement="present">
+        <parameter ref="MeasurementEndpointNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.BASAPM.MeasurementEndpoint.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="MeasurementAgent" requirement="readWrite"/>
+        <parameter ref="DeviceOwnership" requirement="readWrite"/>
+        <parameter ref="OperationalDomain" requirement="readWrite"/>
+        <parameter ref="InternetDomain" requirement="readWrite"/>
+        <parameter ref="UseMeasurementEndpointInReports" requirement="readWrite"/>
+      </object>
+      <object ref="Device.BASAPM.MeasurementEndpoint.{i}.ISPDevice." requirement="present">
+        <parameter ref="ReferencePoint" requirement="readWrite"/>
+        <parameter ref="GeographicalLocation" requirement="readWrite"/>
+      </object>
+      <object ref="Device.BASAPM.MeasurementEndpoint.{i}.CustomerDevice." requirement="present">
+        <parameter ref="EquipmentIdentifier" requirement="readWrite"/>
+        <parameter ref="CustomerIdentifier" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="TWAMPReflectorBasic:1" dmr:version="2.12">
+      <object ref="Device.IP.Interface.{i}." requirement="createDelete">
+        <parameter ref="TWAMPReflectorNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IP.Interface.{i}.TWAMPReflector.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Port" requirement="readWrite"/>
+        <parameter ref="MaximumTTL" requirement="readWrite"/>
+        <parameter ref="IPAllowedList" requirement="readWrite"/>
+        <parameter ref="PortAllowedList" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="AutonXferComplPolicy:1" dmr:version="2.0">
+      <object ref="Device.ManagementServer.AutonomousTransferCompletePolicy." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="TransferTypeFilter" requirement="readWrite"/>
+        <parameter ref="FileTypeFilter" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="DownloadAnnounce:1" dmr:version="2.0">
+      <object ref="Device.ManagementServer.DownloadAvailability." requirement="present"/>
+      <object ref="Device.ManagementServer.DownloadAvailability.Announcement." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="GroupNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ManagementServer.DownloadAvailability.Announcement.Group.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="URL" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="DownloadQuery:1" dmr:version="2.0">
+      <object ref="Device.ManagementServer.DownloadAvailability." requirement="present"/>
+      <object ref="Device.ManagementServer.DownloadAvailability.Query." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="URL" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="Baseline:1" extends="_Baseline:1" dmr:version="2.0">
+      <object ref="Device.ManagementServer." requirement="present">
+        <parameter ref="URL" requirement="readWrite"/>
+        <parameter ref="Username" requirement="readWrite"/>
+        <parameter ref="Password" requirement="readWrite"/>
+        <parameter ref="PeriodicInformEnable" requirement="readWrite"/>
+        <parameter ref="PeriodicInformInterval" requirement="readWrite"/>
+        <parameter ref="PeriodicInformTime" requirement="readWrite"/>
+        <parameter ref="ParameterKey" requirement="readOnly"/>
+        <parameter ref="ConnectionRequestURL" requirement="readOnly"/>
+        <parameter ref="ConnectionRequestUsername" requirement="readWrite"/>
+        <parameter ref="ConnectionRequestPassword" requirement="readWrite"/>
+        <parameter ref="UpgradesManaged" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="Baseline:2" base="Baseline:1" extends="_Baseline:2" dmr:version="2.2"/>
+    <profile name="Baseline:3" base="Baseline:2" extends="_Baseline:3" dmr:version="2.4"/>
+    <profile name="DeviceAssociation:1" dmr:version="2.0">
+      <description>
+        This profile implies support for all of the Gateway requirements defined in {{bibref|TR-069|Annex F}}.
+      </description>
+      <object ref="Device.ManagementServer." requirement="notSpecified">
+        <parameter ref="ManageableDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ManagementServer.ManageableDevice.{i}." requirement="present">
+        <parameter ref="ManufacturerOUI" requirement="readOnly"/>
+        <parameter ref="SerialNumber" requirement="readOnly"/>
+        <parameter ref="ProductClass" requirement="readOnly"/>
+        <parameter ref="Host" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UDPConnReq:1" dmr:version="2.0">
+      <description>
+        This profile only applies to Internet Gateway Devices that are acting as CPE behind a NAT gateway as described in {{bibref|TR-069|Annex G}}, and implies support for all of the CPE requirements defined within Annex G.
+      </description>
+      <object ref="Device.ManagementServer." requirement="notSpecified">
+        <parameter ref="UDPConnectionRequestAddress" requirement="readOnly"/>
+        <parameter ref="STUNEnable" requirement="readWrite"/>
+        <parameter ref="STUNServerAddress" requirement="readWrite"/>
+        <parameter ref="STUNServerPort" requirement="readWrite"/>
+        <parameter ref="STUNUsername" requirement="readWrite"/>
+        <parameter ref="STUNPassword" requirement="readWrite"/>
+        <parameter ref="STUNMaximumKeepAlivePeriod" requirement="readWrite"/>
+        <parameter ref="STUNMinimumKeepAlivePeriod" requirement="readWrite"/>
+        <parameter ref="NATDetected" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="StandbyPolicy:1" dmr:version="2.7">
+      <description>
+        Note that support for this profile implies support for the requirements of {{bibref|TR-069a5|Annex L}}.
+      </description>
+      <object ref="Device.ManagementServer.StandbyPolicy." requirement="present">
+        <parameter ref="CRUnawarenessMaxDuration" requirement="readWrite"/>
+        <parameter ref="MaxMissedPeriodic" requirement="readWrite"/>
+        <parameter ref="NotifyMissedScheduled" requirement="readWrite"/>
+        <parameter ref="NetworkAwarenessCapable" requirement="readOnly"/>
+        <parameter ref="SelfTimerCapable" requirement="readOnly"/>
+        <parameter ref="CRAwarenessRequested" requirement="readWrite"/>
+        <parameter ref="PeriodicAwarenessRequested" requirement="readWrite"/>
+        <parameter ref="ScheduledAwarenessRequested" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="XMPPConnReq:1" extends="XMPPBasic:1" dmr:version="2.7">
+      <object ref="Device.ManagementServer." requirement="present">
+        <parameter ref="SupportedConnReqMethods" requirement="readOnly"/>
+        <parameter ref="ConnReqXMPPConnection" requirement="readWrite"/>
+        <parameter ref="ConnReqAllowedJabberIDs" requirement="readWrite"/>
+        <parameter ref="ConnReqJabberID" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="SupportedDataModel:2" base="SupportedDataModel:1" dmr:version="2.6">
+      <object ref="Device.DeviceInfo.SupportedDataModel.{i}." requirement="present">
+        <parameter ref="UUID" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="SM_ExecEnvs:1" dmr:version="2.1">
+      <object ref="Device.SoftwareModules." requirement="present">
+        <parameter ref="ExecEnvNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.SoftwareModules.ExecEnv.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Type" requirement="readOnly"/>
+        <parameter ref="Vendor" requirement="readOnly"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="AllocatedDiskSpace" requirement="readOnly"/>
+        <parameter ref="AvailableDiskSpace" requirement="readOnly"/>
+        <parameter ref="AllocatedMemory" requirement="readOnly"/>
+        <parameter ref="AvailableMemory" requirement="readOnly"/>
+        <parameter ref="ActiveExecutionUnits" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="SM_DeployAndExecUnits:1" dmr:version="2.1">
+      <object ref="Device.SoftwareModules." requirement="present">
+        <parameter ref="DeploymentUnitNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ExecutionUnitNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.SoftwareModules.DeploymentUnit.{i}." requirement="present">
+        <parameter ref="UUID" requirement="readOnly"/>
+        <parameter ref="DUID" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Resolved" requirement="readOnly"/>
+        <parameter ref="URL" requirement="readOnly"/>
+        <parameter ref="Description" requirement="readOnly"/>
+        <parameter ref="Vendor" requirement="readOnly"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="VendorLogList" requirement="readOnly"/>
+        <parameter ref="VendorConfigList" requirement="readOnly"/>
+        <parameter ref="ExecutionUnitList" requirement="readOnly"/>
+        <parameter ref="ExecutionEnvRef" requirement="readOnly"/>
+      </object>
+      <object ref="Device.SoftwareModules.ExecutionUnit.{i}." requirement="present">
+        <parameter ref="EUID" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="ExecEnvLabel" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="RequestedState" requirement="readWrite"/>
+        <parameter ref="ExecutionFaultCode" requirement="readOnly"/>
+        <parameter ref="ExecutionFaultMessage" requirement="readOnly"/>
+        <parameter ref="Vendor" requirement="readOnly"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="Description" requirement="readOnly"/>
+        <parameter ref="References" requirement="readOnly"/>
+        <parameter ref="AssociatedProcessList" requirement="readOnly"/>
+        <parameter ref="VendorLogList" requirement="readOnly"/>
+        <parameter ref="VendorConfigList" requirement="readOnly"/>
+        <parameter ref="SupportedDataModelList" requirement="readOnly"/>
+        <parameter ref="ExecutionEnvRef" requirement="readOnly"/>
+      </object>
+      <object ref="Device.SoftwareModules.ExecutionUnit.{i}.Extensions." requirement="present"/>
+    </profile>
+    <profile name="SM_Baseline:1" dmr:version="2.1">
+      <object ref="Device.SoftwareModules." requirement="present">
+        <parameter ref="ExecEnvNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="DeploymentUnitNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ExecutionUnitNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.SoftwareModules.ExecEnv.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Type" requirement="readOnly"/>
+        <parameter ref="Vendor" requirement="readOnly"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="ActiveExecutionUnits" requirement="readOnly"/>
+      </object>
+      <object ref="Device.SoftwareModules.DeploymentUnit.{i}." requirement="present">
+        <parameter ref="UUID" requirement="readOnly"/>
+        <parameter ref="DUID" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Resolved" requirement="readOnly"/>
+        <parameter ref="URL" requirement="readOnly"/>
+        <parameter ref="Vendor" requirement="readOnly"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="ExecutionUnitList" requirement="readOnly"/>
+        <parameter ref="ExecutionEnvRef" requirement="readOnly"/>
+      </object>
+      <object ref="Device.SoftwareModules.ExecutionUnit.{i}." requirement="present">
+        <parameter ref="EUID" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="ExecEnvLabel" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="RequestedState" requirement="readWrite"/>
+        <parameter ref="ExecutionFaultCode" requirement="readOnly"/>
+        <parameter ref="ExecutionFaultMessage" requirement="readOnly"/>
+        <parameter ref="Vendor" requirement="readOnly"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="References" requirement="readOnly"/>
+        <parameter ref="SupportedDataModelList" requirement="readOnly"/>
+      </object>
+      <object ref="Device.SoftwareModules.ExecutionUnit.{i}.Extensions." requirement="present"/>
+    </profile>
+    <profile name="ETSIM2MSCLBaseline:1" dmr:version="2.6">
+      <object ref="Device.ETSIM2M.SCL.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="AnnouncedToSCLList" requirement="readWrite"/>
+        <parameter ref="SAFPolicySetNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="AreaNwkInstanceNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="AreaNwkDeviceInfoInstanceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ETSIM2M.SCL.{i}.Discovery." requirement="present">
+        <parameter ref="MaxNumberOfDiscovRecords" requirement="readWrite"/>
+        <parameter ref="MaxSizeOfDiscovAnswer" requirement="readWrite"/>
+      </object>
+      <object ref="Device.ETSIM2M.SCL.{i}.Reregistration." requirement="present">
+        <parameter ref="RegTargetNSCLList" requirement="readWrite"/>
+        <parameter ref="RegSearchStrings" requirement="readWrite"/>
+        <parameter ref="RegAccessRightID" requirement="readWrite"/>
+        <parameter ref="RegExpirationDuration" requirement="readWrite"/>
+      </object>
+      <object ref="Device.ETSIM2M.SCL.{i}.Reregistration.ActionStatus." requirement="present">
+        <parameter ref="Progress" requirement="readOnly"/>
+        <parameter ref="FinalStatus" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="PolicyScope" requirement="readWrite"/>
+        <parameter ref="ANPPolicyNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.ANPPolicy.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="ANName" requirement="readWrite"/>
+        <parameter ref="BlockPeriodNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="RequestCategoryNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.ANPPolicy.{i}.BlockPeriod.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="FailedAttempts" requirement="readWrite"/>
+        <parameter ref="BlockDuration" requirement="readWrite"/>
+      </object>
+      <object ref="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.ANPPolicy.{i}.RequestCategory.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="RCAT" requirement="readWrite"/>
+        <parameter ref="ScheduleNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.ANPPolicy.{i}.RequestCategory.{i}.Schedule.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Schedules" requirement="readWrite"/>
+        <parameter ref="AbsTimeSpanNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.ANPPolicy.{i}.RequestCategory.{i}.Schedule.{i}.AbsTimeSpan.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="StartTime" requirement="readWrite"/>
+        <parameter ref="EndTime" requirement="readWrite"/>
+      </object>
+      <object ref="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.M2MSPPolicy." requirement="present">
+        <parameter ref="DefaultRCATValue" requirement="readWrite"/>
+        <parameter ref="RequestCategoryNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ETSIM2M.SCL.{i}.SAFPolicySet.{i}.M2MSPPolicy.RequestCategory.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="RCAT" requirement="readWrite"/>
+        <parameter ref="TolerableDelay" requirement="readWrite"/>
+        <parameter ref="Thresh" requirement="readWrite"/>
+        <parameter ref="Mem" requirement="readWrite"/>
+        <parameter ref="RankedANList" requirement="readWrite"/>
+      </object>
+      <object ref="Device.ETSIM2M.SCL.{i}.AreaNwkInstance.{i}." requirement="present">
+        <parameter ref="ID" requirement="readOnly"/>
+        <parameter ref="AreaNwkType" requirement="readOnly"/>
+        <parameter ref="ListOfDevices" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ETSIM2M.SCL.{i}.AreaNwkDeviceInfoInstance.{i}." requirement="present">
+        <parameter ref="AreaNwkInstance" requirement="readOnly"/>
+        <parameter ref="Host" requirement="readOnly"/>
+        <parameter ref="ListOfDeviceNeighbors" requirement="readOnly"/>
+        <parameter ref="ListOfDeviceApplications" requirement="readOnly"/>
+        <parameter ref="SleepInterval" requirement="readWrite"/>
+        <parameter ref="SleepDuration" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="TempStatusAdv:1" extends="TempStatus:1" dmr:version="2.0">
+      <object ref="Device.DeviceInfo.TemperatureStatus.TemperatureSensor.{i}." requirement="present">
+        <parameter ref="Reset" requirement="readWrite"/>
+        <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: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" dmr:version="2.0">
+      <object ref="Device.USB.USBHosts.Host.{i}." requirement="present">
+        <parameter ref="Reset" requirement="readWrite"/>
+        <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" dmr:version="2.0">
+      <object ref="Device.PeriodicStatistics.SampleSet.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="TimeReference" requirement="readWrite"/>
+        <parameter ref="FetchSamples" requirement="readWrite"/>
+        <parameter ref="ForceSample" requirement="readWrite"/>
+      </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:2" base="IPInterface:1" dmr: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: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="readWrite"/>
+        <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"/>
+        <parameter ref="Reset" requirement="readWrite"/>
+        <parameter ref="IPv6AddressNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="IPv6PrefixNumberOfEntries" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="PPPInterface:1" dmr:version="2.0">
+      <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="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="Reset" requirement="readWrite"/>
+        <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: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="DHCPv6ClientServerIdentity:1" extends="DHCPv6Client:1" dmr:version="2.2">
+      <object ref="Device.DHCPv6.Client.{i}." requirement="createDelete">
+        <parameter ref="ServerNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Client.{i}.Server.{i}." requirement="present">
+        <parameter ref="SourceAddress" requirement="readOnly"/>
+        <parameter ref="DUID" requirement="readOnly"/>
+        <parameter ref="InformationRefreshTime" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Client.{i}.ReceivedOption.{i}." requirement="present">
+        <parameter ref="Server" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="MQTTClientExtended:1" base="MQTTClientBase:1" dmr: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"/>
+        <parameter ref="ForceReconnect" requirement="readWrite"/>
+        <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>
+  </model>
+</dm:document>
diff --git a/tools/tr-181-2-12-0-usp-full.xml b/tools/tr-181-2-12-0-usp-full.xml
new file mode 100644
index 0000000000000000000000000000000000000000..08e0d1bcad2394cdb04d96a3bb78185954d2b810
--- /dev/null
+++ b/tools/tr-181-2-12-0-usp-full.xml
@@ -0,0 +1,56662 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- DO NOT EDIT; generated by Broadband Forum report.pl#422 (2018/03/28 version) on 2018/03/29 at 09:47:23.
+     report.pl -exitcode=fatals -altnotifreqstyle -ignoreenableparameter -immutablenonfunctionalkeys -cwmpindex=.. -nofontstyles -nowarnreport -quiet -report=xml -outfile=tr-181-2-12-0-usp-full.xml tr-181-2-12-0-usp.xml
+     See https://github.com/BroadbandForum/cwmp-xml-tools/tree/master/Report_Tool. -->
+<!--
+  USP Device:2.12 Root Object definition
+
+  Copyright (c) 2010-2018, Broadband Forum
+
+  The undersigned members have elected to grant the copyright to
+  their contributed material used in this software:
+    Copyright (c) 2017-2018 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.
+
+  Summary:
+    USP Device:2.12 Root Object definition.
+
+  Editors:
+    * John Blackford, ARRIS
+    * Tim Carey, Nokia
+    * Tim Spets, Greenwave System
+    * Klaus Wich, Huawei
+
+  Broadband User Service Work Area Directors:
+    * Jason Walls, QA Cafe
+    * John Blackford, ARRIS
+
+  Issue History (Filename: Approval Date: Publication Date: Changes):
+    * tr-181-2-0-0.xml: May 2010:
+      - corresponds to TR-181 Issue 2.
+    * tr-181-2-1-0.xml: November 2010:
+      - corresponds to TR-181 Issue 2 Amendment 1.
+    * tr-181-2-2-0.xml: March 2011:
+      - corresponds to TR-181 Issue 2 Amendment 2.
+    * tr-181-2-3-0.xml: September 2011:
+      - corresponds to TR-181 Issue 2 Amendment 3.
+    * tr-181-2-4-0.xml: November 2011:
+      - corresponds to TR-181 Issue 2 Amendment 4.
+    * tr-181-2-5-0.xml: May 2012:
+      - corresponds to TR-181 Issue 2 Amendment 5.
+    * tr-181-2-6-0.xml: November 2012:
+      - corresponds to TR-181 Issue 2 Amendment 6.
+    * tr-181-2-7-0.xml: November 2013: January 17, 2014
+      - corresponds to TR-181 Issue 2 Amendment 7.
+    * tr-181-2-8-0.xml: 8 September 2014: 17 September 2014:
+      - corresponds to TR-181 Issue 2 Amendment 8.
+    * tr-181-2-9-0.xml:  1 December 2014:  4 February 2015:
+      - Added WiFi MAC Address Filtering
+      - Added Traceroute fixes
+      - Added IEEE 1905 data model
+      - Incorporated TR-143a1
+    * tr-181-2-10-0.xml: 9 November 2015: 13 November 2015:
+      - corresponds to TR-181 Issue 2 Amendment 10.
+    * tr-181-2-11-0.xml: 18 July 2016: 12 August 2016
+      - corresponds to TR-181 Issue 2 Amendment 11.
+    * tr-181-2-12-0-usp.xml: 26 March 2018: 26 March 2018
+      - corresponds to TR-181 Issue 2 Amendment 12.
+-->
+<dm:document xmlns:dm="urn:broadband-forum-org:cwmp:datamodel-1-6"
+             xmlns:dmr="urn:broadband-forum-org:cwmp:datamodel-report-0-1"
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+             xsi:schemaLocation="urn:broadband-forum-org:cwmp:datamodel-1-6 http://www.broadband-forum.org/cwmp/cwmp-datamodel-1-6.xsd urn:broadband-forum-org:cwmp:datamodel-report-0-1 http://www.broadband-forum.org/cwmp/cwmp-datamodel-report.xsd"
+             spec="urn:broadband-forum-org:tr-181-2-12-0-usp" file="tr-181-2-12-0-usp-full.xml">
+  <description>
+    {{docname|Device:2 Root Data Model for USP (TR-369)}}
+    {{appdate|March 2018}}
+    {{trname|TR-181i2a12}}
+    * Added USP Local agent support (TR-369)
+    * Added Firmware Image support
+    * Added Ethernet Link Aggregation Group
+    * Added additional Wi-Fi and WAN statistics
+    * Added support for Two-Way Active Measurement Protocol (TWAMP) reflector
+    * Added support for Layer Two Tunneling Protocol version 3 (L2TPv3)
+    * Added support for Virtual eXtensible Local Area Network (VXLAN) tunnels
+    * Added support for Broadband Access Service Attributes and Performance Metrics measurement test framework (BASAPM)
+    * Added support for Large-Scale Measurement of Broadband Performance (LMAP)
+  </description>
+  <dataType name="IPAddress">
+    <description>
+      IP address, i.e. IPv4 address (or IPv4 subnet mask) or IPv6 address.
+      All IPv4 addresses and subnet masks MUST be represented as strings in IPv4 dotted-decimal notation.  Here are some examples of valid IPv4 address textual representations:
+      * 216.52.29.100
+      * 192.168.1.254
+      All IPv6 addresses MUST be represented using any of the 3 standard textual representations defined in {{bibref|RFC4291}} Sections 2.2.1, 2.2.2 and 2.2.3.  Both lower-case and upper-case letters can be used, but use of lower-case letters is RECOMMENDED.  Here are some examples of valid IPv6 address textual representations:
+      * 1080:0:0:800:ba98:3210:11aa:12dd
+      * 1080::800:ba98:3210:11aa:12dd
+      * 0:0:0:0:0:0:13.1.68.3
+      IPv6 addresses MUST NOT include zone identifiers. Zone identifiers are discussed in {{bibref|RFC4007|Section 6}}.
+      Unspecified or inapplicable addresses (or IPv4 subnet masks) MUST be represented as empty strings unless otherwise specified by the parameter definition.
+    </description>
+    <string>
+      <size maxLength="45"/>
+    </string>
+  </dataType>
+  <dataType name="IPv4Address" base="IPAddress">
+    <description>
+      IPv4 address (or subnet mask).
+      Can be any IPv4 address that is permitted by the ''IPAddress'' data type.
+    </description>
+    <size maxLength="15"/>
+  </dataType>
+  <dataType name="IPv6Address" base="IPAddress">
+    <description>
+      IPv6 address.
+      Can be any IPv6 address that is permitted by the ''IPAddress'' data type.
+    </description>
+    <size maxLength="45"/>
+  </dataType>
+  <dataType name="IPPrefix">
+    <description>
+      IPv4 or IPv6 routing prefix in Classless Inter-Domain Routing (CIDR) notation {{bibref|RFC4632}}. This is specified as an IP address followed by an appended "/n" suffix, where ''n'' (the prefix size) is an integer in the range 0-32 (for IPv4) or 0-128 (for IPv6) that indicates the number of (leftmost) '1' bits of the routing prefix. 
+      * IPv4 example: 192.168.1.0/24
+      * IPv6 example: 2001:edff:fe6a:f76::/64
+      If the IP address part is unspecified or inapplicable, it MUST be {{empty}} unless otherwise specified by the parameter definition.  In this case the IP prefix will be of the form "/n".
+      If the entire IP prefix is unspecified or inapplicable, it MUST be {{empty}} unless otherwise specified by the parameter definition.
+    </description>
+    <string>
+      <size maxLength="49"/>
+    </string>
+  </dataType>
+  <dataType name="IPv4Prefix" base="IPPrefix">
+    <description>
+      IPv4 address prefix. 
+      Can be any IPv4 prefix that is permitted by the ''IPPrefix'' data type.
+    </description>
+    <size maxLength="18"/>
+  </dataType>
+  <dataType name="IPv6Prefix" base="IPPrefix">
+    <description>
+      IPv6 address prefix.
+      Can be any IPv6 prefix that is permitted by the ''IPPrefix'' data type.
+    </description>
+    <size maxLength="49"/>
+  </dataType>
+  <dataType name="MACAddress">
+    <description>
+      All MAC addresses are represented as strings of 12 hexadecimal digits (digits 0-9, letters A-F or a-f) displayed as six pairs of digits separated by colons.  Unspecified or inapplicable MAC addresses MUST be represented as empty strings unless otherwise specified by the parameter definition.
+    </description>
+    <string>
+      <size maxLength="17"/>
+      <pattern value=""/>
+      <pattern value="([0-9A-Fa-f][0-9A-Fa-f]:){5}([0-9A-Fa-f][0-9A-Fa-f])"/>
+    </string>
+  </dataType>
+  <dataType name="StatsCounter32">
+    <description>
+      A 32-bit statistics parameter, e.g. a byte counter.
+      This data type SHOULD NOT be used for statistics parameters whose values might become greater than the maximum value that can be represented as an ''unsignedInt'' (i.e. 0xffffffff, referred to below as ''maxval''). ''StatsCounter64'' SHOULD be used for such parameters.
+      The value ''maxval'' indicates that no data is available for this parameter.  In the unlikely event that the actual value of the statistic is ''maxval'', the CPE SHOULD return ''maxval - 1''.
+      The actual value of the statistic might be greater than ''maxval''. Such values SHOULD wrap around through zero.
+      The term ''packet'' is to be interpreted as the transmission unit appropriate to the protocol layer in question, e.g. an IP packet or an Ethernet frame.
+    </description>
+    <unsignedInt>
+    </unsignedInt>
+  </dataType>
+  <dataType name="StatsCounter64">
+    <description>
+      A 64-bit statistics parameter, e.g. a byte counter.
+      This data type SHOULD be used for all statistics parameters whose values might become greater than the maximum value that can be represented as an ''unsignedInt''.
+      The maximum value that can be represented as an ''unsignedLong'' (i.e. 0xffffffffffffffff) indicates that no data is available for this parameter.
+      The term ''packet'' is to be interpreted as the transmission unit appropriate to the protocol layer in question, e.g. an IP packet or an Ethernet frame.
+    </description>
+    <unsignedLong>
+    </unsignedLong>
+  </dataType>
+  <dataType name="Alias">
+    <description>
+      A non-volatile unique key used to reference this instance. Alias provides a mechanism for a Controller to label this instance for future reference.
+      The following mandatory constraints MUST be enforced:
+      * The value MUST NOT be empty.
+      * The value MUST start with a letter.
+      * If the value is not assigned by the Controller at creation time, the Agent MUST assign a value with an "cpe-" prefix.
+      The value MUST NOT change once it's been assigned.
+    </description>
+    <string>
+      <size maxLength="64"/>
+    </string>
+  </dataType>
+  <dataType name="Dbm1000">
+    <description>
+      The value is measured in ''dBm/1000'', i.e. the value divided by 1000 is dB relative to 1 mW.  For example, -12345 means -12.345 dBm, 0 means 0 dBm (1 mW) and 12345 means 12.345 dBm.
+    </description>
+    <int>
+    </int>
+  </dataType>
+  <dataType name="UUID">
+    <description>
+      Universally Unique Identifier.  See {{bibref|RFC4122}}.
+    </description>
+    <string>
+      <size minLength="36" maxLength="36"/>
+      <pattern value="[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}"/>
+    </string>
+  </dataType>
+  <dataType name="IEEE_EUI64">
+    <description>
+      The IEEE EUI 64-bit identifier as defined in {{bibref|EUI64}}. The IEEE defined 64-bit extended unique identifier (EUI-64) is a concatenation of:
+      * The 24-bit (OUI-24) or 36-bit (OUI-36) company_id value assigned by the IEEE Registration Authority (IEEE-RA), and
+      * The extension identifier (40 bits for OUI-24 or 28 bits for OUI-36) assigned by the organization with that company_id assignment.
+    </description>
+    <string>
+      <size maxLength="23"/>
+      <pattern value=""/>
+      <pattern value="([0-9A-Fa-f][0-9A-Fa-f]:){7}([0-9A-Fa-f][0-9A-Fa-f])"/>
+    </string>
+  </dataType>
+  <dataType name="ZigBeeNetworkAddress">
+    <description>
+      The ZigBee 16-bit network address (NWK) as defined in {{bibref|ZigBee2007}}. The address is assigned to a device by the network layer and used by the network layer for routing messages between devices.
+    </description>
+    <string>
+      <size maxLength="4"/>
+      <pattern value=""/>
+      <pattern value="([0-9A-Fa-f]){4}"/>
+    </string>
+  </dataType>
+  <dataType name="DiagnosticsState">
+    <description>
+      Indicates the availability of diagnostics data. Enumeration of:
+      {{enum}}
+      If the ACS sets the value of this parameter to {{enum|Requested}}, the CPE MUST initiate the corresponding diagnostic test. When writing, the only allowed values are {{enum|Requested}} and {{enum|Canceled}}. To ensure the use of the proper test parameters (the writable parameters in this object), the test parameters MUST be set, and any errors or inconsistencies in the test parameters MUST be detected, either prior to or at the same time as (in the same SetParameterValues) setting this parameter to {{enum|Requested}}.
+      When requested, the CPE SHOULD wait until after completion of the communication session with the ACS before starting the diagnostic test.
+      When the test is completed, the value of this parameter MUST be either {{enum|Complete}} (if the test completed successfully), or one of the ''Error'' values listed above.
+      If the value of this parameter is anything other than {{enum|Complete}}, the values of the results parameters for this test are indeterminate.
+      When the diagnostic initiated by the ACS is completed (successfully or not), but not if it is canceled for any reason, the CPE MUST establish a new connection to the ACS to allow the ACS to view the results, indicating the Event code ''8 DIAGNOSTICS COMPLETE'' in the Inform message.
+      After the diagnostic is complete, the value of all result parameters (all read-only parameters in this object) MUST be retained by the CPE until either this diagnostic is run again, or the CPE reboots. After a reboot, if the CPE has not retained the result parameters from the most recent test, it MUST set the value of this parameter to {{enum|None}}.
+      Modifying any of the writable parameters in this object except for this one MUST result in the value of this parameter being set to {{enum|None}}.
+      While the test is in progress, modifying any of the writable parameters in this object except for this one MUST result in the test being terminated and the value of this parameter being set to {{enum|None}}.
+      While the test is in progress, setting this parameter to {{enum|Requested}} (and possibly modifying other writable parameters in this object) MUST result in the test being terminated and then restarted using the current values of the test parameters.
+      While the test is in progress, setting this parameter to {{enum|Canceled}} MUST result in the test being canceled and the value of this parameter being set to {{enum|None}}. If the CPE does not support the {{enum|Canceled}} value, it MUST return a SPV error with "Invalid Parameter value" (9007) to the ACS instead.
+    </description>
+    <string>
+      <enumeration value="None" access="readOnly"/>
+      <enumeration value="Requested"/>
+      <enumeration value="Canceled" optional="true"/>
+      <enumeration value="Complete" access="readOnly"/>
+      <enumeration value="Error" access="readOnly" optional="true"/>
+    </string>
+  </dataType>
+  <dataType name="JSONObject">
+    <description>
+      A JSON Object as defined in {{bibref|RFC7159|Section 4}}.
+    </description>
+    <string>
+    </string>
+  </dataType>
+  <dataType name="PSMBreakPointIndexAndLevel">
+    <description>
+      # The PSM breakpoint sub-carrier index in the range [0:4095], and
+      # the value of the level of the PSM at this sub-carrier expressed in ''0.1 dBm/Hz'' with an offset of -140 dBm/Hz.
+      Both values are represented as unsignedInt.
+      {{bibref|G.9964|Clause 5.2}} defines limits on PSM breakpoint levels.
+    </description>
+    <list minItems="2" maxItems="2"/>
+    <unsignedInt>
+    </unsignedInt>
+  </dataType>
+  <bibliography>
+    <reference id="3GPP-HSPA">
+      <name>High Speed Packet data Access (HSPA)</name>
+      <organization>3GPP</organization>
+      <hyperlink>http://www.3gpp.org/technologies/keywords-acronyms/99-hspa</hyperlink>
+    </reference>
+    <reference id="3GPP-TS.25.171">
+      <name>3GPP TS 25.171</name>
+      <title>Requirements for support of Assisted Global Positioning System (A-GPS)</title>
+      <organization>3GPP RAN WG4</organization>
+      <hyperlink>http://www.3gpp.org/ftp/Specs/html-info/25171.htm</hyperlink>
+    </reference>
+    <reference id="802.11-2007">
+      <name>IEEE Std 802.11-2007</name>
+      <title>Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications</title>
+      <organization>IEEE</organization>
+      <date>2007</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.11-2007.pdf</hyperlink>
+    </reference>
+    <reference id="802.11-2012">
+      <name>IEEE Std 802.11-2012</name>
+      <title>Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications</title>
+      <organization>IEEE</organization>
+      <date>March 2012</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.11-2012.pdf</hyperlink>
+    </reference>
+    <reference id="802.11a-1999">
+      <name>IEEE Std 802.11a-1999</name>
+      <title>High-speed Physical Layer in the 5 GHz band</title>
+      <organization>IEEE</organization>
+      <date>1999</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.11a-1999.pdf</hyperlink>
+    </reference>
+    <reference id="802.11ac-2013">
+      <name>IEEE Std 802.11ac-2013</name>
+      <organization>IEEE</organization>
+      <hyperlink>http://www.ieee802.org/11/Reports/tgac_update.htm</hyperlink>
+    </reference>
+    <reference id="802.11b-1999">
+      <name>IEEE Std 802.11b-1999</name>
+      <title>Higher Speed Physical Layer Extension in the 2.4 GHz band</title>
+      <organization>IEEE</organization>
+      <date>1999</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.11b-1999.pdf</hyperlink>
+    </reference>
+    <reference id="802.11g-2003">
+      <name>IEEE Std 802.11g-2003</name>
+      <title>Further Higher Data Rate Extension in the 2.4 GHz Band</title>
+      <organization>IEEE</organization>
+      <date>2003</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.11g-2003.pdf</hyperlink>
+    </reference>
+    <reference id="802.11h-2003">
+      <name>IEEE Std 802.11h-2003</name>
+      <title>Spectrum and Transmit Power Management Extensions</title>
+      <organization>IEEE</organization>
+      <date>2003</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.11h-2003.pdf</hyperlink>
+    </reference>
+    <reference id="802.11n-2009">
+      <name>IEEE Std 802.11n-2009</name>
+      <title>Amendment 5: Enhancements for Higher Throughput</title>
+      <organization>IEEE</organization>
+      <date>2009</date>
+      <hyperlink>http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?reload=true&amp;arnumber=5307322</hyperlink>
+    </reference>
+    <reference id="802.1AB-2009">
+      <name>IEEE Std 802.1AB-2009</name>
+      <title>Station and Media Access Control Connectivity Discovery</title>
+      <organization>IEEE</organization>
+      <date>2009</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.1AB-2009.pdf</hyperlink>
+    </reference>
+    <reference id="802.1ad-2005">
+      <name>IEEE Std 802.1ad-2005</name>
+      <title>Virtual Bridged Local Area Networks Amendment 4: Provider Bridges</title>
+      <organization>IEEE</organization>
+      <date>May 2005</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.1ad-2005.pdf</hyperlink>
+    </reference>
+    <reference id="802.1AX-2014">
+      <name>IEEE Std 802.1AX-2014</name>
+      <title>IEEE Standard for Local and metropolitan area networks -- Link Aggregation</title>
+      <organization>IEEE</organization>
+      <date>2014</date>
+      <hyperlink>http://ieeexplore.ieee.org/servlet/opac?punumber=6997981</hyperlink>
+    </reference>
+    <reference id="802.1D-2004">
+      <name>IEEE Std 802.1D-2004</name>
+      <title>Media Access Control (MAC) Bridges</title>
+      <organization>IEEE</organization>
+      <date>2004</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.1D-2004.pdf</hyperlink>
+    </reference>
+    <reference id="802.1Q-2005">
+      <name>IEEE Std 802.1Q-2005</name>
+      <title>Virtual Bridged Local Area Networks</title>
+      <organization>IEEE</organization>
+      <date>2006</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.1Q-2005.pdf</hyperlink>
+    </reference>
+    <reference id="802.1Q-2011">
+      <name>IEEE Std 802.1Q-2011</name>
+      <title>MAC Bridges and Virtual Bridge Local Area Networks</title>
+      <organization>IEEE</organization>
+      <date>2011</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.1Q-2011.pdf</hyperlink>
+    </reference>
+    <reference id="802.1x-2004">
+      <name>IEEE Std 802.1x-2004</name>
+      <title>Standards for Local and Metropolitan Area Networks: Port based Network Access Control</title>
+      <organization>IEEE</organization>
+      <date>2004</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.1X-2004.pdf</hyperlink>
+    </reference>
+    <reference id="802.3-2015">
+      <name>IEEE Std 802.3-2015</name>
+      <title>IEEE Standard for Ethernet</title>
+      <organization>IEEE</organization>
+      <date>2015</date>
+      <hyperlink>http://ieeexplore.ieee.org/servlet/opac?punumber=7428774</hyperlink>
+    </reference>
+    <reference id="802.3-2012_section6">
+      <name>IEEE 802.3-2012 - Section Six</name>
+      <title>IEEE Standard for Ethernet - Section Six</title>
+      <organization>IEEE</organization>
+      <date>December 2012</date>
+      <hyperlink>http://standards.ieee.org/getieee802/download/802.3-2012_section6.pdf</hyperlink>
+    </reference>
+    <reference id="BLUE">
+      <name>Blue</name>
+      <title>A New Class of Active Queue Management Algorithms</title>
+      <hyperlink>http://www.thefengs.com/wuchang/work/blue</hyperlink>
+    </reference>
+    <reference id="DLNA-NDIG">
+      <name>DLNA Networked Device Interoperability Guidelines</name>
+      <title>DLNA Networked Device Interoperability Guidelines, Volume 2: Media Format Profiles.</title>
+      <organization>DLNA</organization>
+      <date>October 2006</date>
+      <hyperlink>http://www.dlna.org/industry/certification/guidelines/</hyperlink>
+    </reference>
+    <reference id="DNS-SD">
+      <name>RFC 6763</name>
+      <title>DNS-Based Service Discovery</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2013</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6763</hyperlink>
+    </reference>
+    <reference id="DSLite">
+      <name>RFC 6333</name>
+      <title>Dual-Stack Lite Broadband Deployments Following IPv4 Exhaustion</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2011</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6333</hyperlink>
+    </reference>
+    <reference id="DSLite-options">
+      <name>RFC 6334</name>
+      <title>Dynamic Host Configuation Protocol for IPv6 (DHCPv6) Option for Dual-Stack Lite</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2011</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6334</hyperlink>
+    </reference>
+    <reference id="ETSIBRAN">
+      <name>ETSI EN 301 893</name>
+      <title>Broadband Radio Access Networks (BRAN); 5 GHz high performance RLAN; Harmonized EN covering the essential requirements of article 3.2 of the RTTE Directive</title>
+      <organization>ETSI</organization>
+      <hyperlink>http://www.etsi.org/deliver/etsi_en/301800_301899/301893/01.08.01_60/en_301893v010801p.pdf</hyperlink>
+    </reference>
+    <reference id="G.988">
+      <name>G.988</name>
+      <title>ONU management and control interface (OMCI) specification</title>
+      <organization>ITU-T</organization>
+      <date>2010</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.988-201010-P/en</hyperlink>
+    </reference>
+    <reference id="G.9701">
+      <name>G.9701</name>
+      <title>Fast access to subscriber terminals (G.fast)- Physical layer specification</title>
+      <organization>ITU-T</organization>
+      <date>2014</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.9701-201412-P</hyperlink>
+    </reference>
+    <reference id="G.9954">
+      <name>G.9954</name>
+      <title>Phoneline networking transceivers - Enhanced physical, media access, and link layer specifications (HPNA 3.0 and 3.1)</title>
+      <organization>ITU-T</organization>
+      <date>2007</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.9954/en</hyperlink>
+    </reference>
+    <reference id="G.9960">
+      <name>G.9960</name>
+      <title>Unified high-speed wire-line based home networking transceivers - System architecture and physical layer specification</title>
+      <organization>ITU-T</organization>
+      <category>G.hn series</category>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.9960-201006-P</hyperlink>
+    </reference>
+    <reference id="G.9961">
+      <name>G.9961</name>
+      <title>Unified high-speed wire-line based home networking transceivers - Data link layer specification</title>
+      <organization>ITU-T</organization>
+      <category>G.hn series</category>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.9961-201006-P</hyperlink>
+    </reference>
+    <reference id="G.9962">
+      <name>G.9962</name>
+      <title>Unified high-speed wire-line based home networking transceivers - Management specification</title>
+      <organization>ITU-T</organization>
+      <category>G.hn series</category>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.9962-201308-P</hyperlink>
+    </reference>
+    <reference id="G.9964">
+      <name>G.9964</name>
+      <title>Unified high-speed wire-line based home networking transceivers - Power spectral density specification</title>
+      <organization>ITU-T</organization>
+      <category>G.hn series</category>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.9962-201308-P</hyperlink>
+    </reference>
+    <reference id="G.9973">
+      <name>G.9973</name>
+      <title>Protocol for identifying home network topology</title>
+      <organization>ITU-T</organization>
+      <date>2011</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.9973-201110-I/en</hyperlink>
+    </reference>
+    <reference id="G.993.1">
+      <name>G.993.1</name>
+      <title>Very high speed digital subscriber line transceivers</title>
+      <organization>ITU-T</organization>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.993.1</hyperlink>
+    </reference>
+    <reference id="G.993.2">
+      <name>G.993.2</name>
+      <title>Very high speed digital subscriber line transceivers 2 (VDSL2)</title>
+      <organization>ITU-T</organization>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.993.2</hyperlink>
+    </reference>
+    <reference id="G.997.1">
+      <name>G.997.1</name>
+      <title>Physical layer management for digital subscriber line (DSL) transceivers</title>
+      <organization>ITU-T</organization>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.997.1</hyperlink>
+    </reference>
+    <reference id="G.997.2">
+      <name>G.997.2</name>
+      <title>Physical layer management for FAST transceivers</title>
+      <organization>ITU-T</organization>
+      <date>2015</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.997.2-201505-I</hyperlink>
+    </reference>
+    <reference id="G.998.1">
+      <name>G.998.1</name>
+      <title>ATM-based Multi-Pair Bonding</title>
+      <organization>ITU-T</organization>
+      <date>2005</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.998.1</hyperlink>
+    </reference>
+    <reference id="G.998.2">
+      <name>G.998.2</name>
+      <title>Ethernet-based Multi-Pair Bonding</title>
+      <organization>ITU-T</organization>
+      <date>2005</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.998.2</hyperlink>
+    </reference>
+    <reference id="G.998.3">
+      <name>G.998.3</name>
+      <title>Multi-Pair Bonding Using Time-Division Inverse Multiplexing</title>
+      <organization>ITU-T</organization>
+      <date>2005</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-G.998.2</hyperlink>
+    </reference>
+    <reference id="HPAV1.1">
+      <name>HomePlug AV Specification</name>
+      <title>Version 1.1</title>
+      <organization>HomePlug</organization>
+      <date>2007</date>
+      <hyperlink>http://www.homeplug.org</hyperlink>
+    </reference>
+    <reference id="HTML4.01">
+      <name>HTML 4.01 Specification</name>
+      <organization>W3C</organization>
+      <hyperlink>http://www.w3.org/TR/html4</hyperlink>
+    </reference>
+    <reference id="IANA-protocolnumbers">
+      <name>IANA Protocol Numbers</name>
+      <title>Protocol Numbers</title>
+      <organization>IANA</organization>
+      <hyperlink>http://www.iana.org/assignments/protocol-numbers</hyperlink>
+    </reference>
+    <reference id="IANAifType">
+      <name>IANAifType</name>
+      <title>IANAifType-MIB DEFINITIONS</title>
+      <organization>IANA</organization>
+      <date>2009</date>
+      <hyperlink>http://www.iana.org/assignments/ianaiftype-mib/ianaiftype-mib</hyperlink>
+    </reference>
+    <reference id="ICSA-Baseline">
+      <name>ICSA Baseline Modular Firewall Certification Criteria</name>
+      <title>Baseline module - version 4.1</title>
+      <organization>ICSA Labs</organization>
+      <date>2008</date>
+      <hyperlink>http://www.icsalabs.com/sites/default/files/baseline.pdf</hyperlink>
+    </reference>
+    <reference id="ICSA-Residential">
+      <name>ICSA Residential Modular Firewall Certification Criteria</name>
+      <title>Required Services Security Policy - Residential Category module - version 4.1</title>
+      <organization>ICSA Labs</organization>
+      <date>2008</date>
+      <hyperlink>http://www.icsalabs.com/sites/default/files/residential.pdf</hyperlink>
+    </reference>
+    <reference id="IEEE1905.1a">
+      <name>IEEE 1905.1a</name>
+      <title>IEEE Std 1905.1a, Convergent Digital Home Network for Heterogeneous Technologies Amendment 1: Support of new MAC/PHYs and enhancements, IEEE, December 2014.</title>
+      <organization>IEEE</organization>
+      <date>December 2014</date>
+      <hyperlink>http://www.IEEE.org</hyperlink>
+    </reference>
+    <reference id="IKEv2-params">
+      <name>IKEv2 Parameters</name>
+      <title>Internet Key Exchange Version 2 (IKEv2) Parameters</title>
+      <organization>IETF</organization>
+      <hyperlink>http://www.iana.org/assignments/ikev2-parameters/ikev2-parameters.xml</hyperlink>
+    </reference>
+    <reference id="IPDR-FTP">
+      <name>IPDR File Transfer Protocol</name>
+      <title>IPDR/File Transfer Protocol</title>
+      <organization>TM Forum</organization>
+      <hyperlink>http://www.ipdr.org/public/</hyperlink>
+    </reference>
+    <reference id="IPDR-SP">
+      <name>IPDR Streaming Protocol</name>
+      <title>IPDR Streaming Protocol (IPDR/SP) Specification</title>
+      <organization>TM Forum</organization>
+      <hyperlink>http://www.ipdr.org/public/</hyperlink>
+    </reference>
+    <reference id="IPDR-XDR">
+      <name>IPDR XDR Encoding Format</name>
+      <title>IPDR/XDR Encoding Format</title>
+      <organization>TM Forum</organization>
+      <hyperlink>http://www.ipdr.org/public/</hyperlink>
+    </reference>
+    <reference id="IPDR-XML">
+      <name>IPDR XML File Encoding Format</name>
+      <title>IPDR/XML File Encoding Format</title>
+      <organization>TM Forum</organization>
+      <hyperlink>http://www.ipdr.org/public/</hyperlink>
+    </reference>
+    <reference id="ISO3166-1">
+      <name>ISO 3166-1</name>
+      <title>Codes for the representation of names of countries and their subdivisions - Part 1: Country codes</title>
+      <organization>ISO</organization>
+      <date>2006</date>
+      <hyperlink>http://www.iso.org/iso/country_codes.htm</hyperlink>
+    </reference>
+    <reference id="ISO639-1">
+      <name>ISO 639-1</name>
+      <title>Codes for the representation of names of Languages - Part 1: Alpha-2 code</title>
+      <organization>ISO</organization>
+      <date>2002</date>
+      <hyperlink>http://www.iso.org/iso/language_codes</hyperlink>
+    </reference>
+    <reference id="ISO646-1991">
+      <name>ISO/IEC 646-1991</name>
+      <title>Information Technology - ISO 7-bit coded character set for information interchange</title>
+      <organization>ISO</organization>
+      <date>1991</date>
+    </reference>
+    <reference id="ITU-E.118">
+      <name>ITU E.118</name>
+      <title>Overall Network Operation, Telephone Service, Service Operation and Human Factors</title>
+      <organization>International Telecommunication Union</organization>
+      <date>May 2006</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-E.118/en</hyperlink>
+    </reference>
+    <reference id="ITU-E.164">
+      <name>ITU E.164</name>
+      <title>The international public telecommunication numbering plan</title>
+      <organization>International Telecommunication Union</organization>
+      <date>October 2010</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-E.164-201011-I/en</hyperlink>
+    </reference>
+    <reference id="ITU-X.733">
+      <name>ITU X.733</name>
+      <title>Information technology - Open Systems Interconnection - Systems Management: Alarm reporting function</title>
+      <organization>International Telecommunication Union</organization>
+      <date>February 1992</date>
+      <hyperlink>http://www.itu.int/rec/T-REC-X.733/en</hyperlink>
+    </reference>
+    <reference id="JJ-300.00">
+      <name>JJ-300.00</name>
+      <title>Home-network Topology Identifying Protocol</title>
+      <organization>TTC</organization>
+      <date>2011</date>
+      <hyperlink>http://www.ttc.or.jp/jp/document_list/pdf/e/STD/JJ-300.00(E)v1.1.pdf</hyperlink>
+    </reference>
+    <reference id="JJ-300.01">
+      <name>JJ-300.01</name>
+      <title>The List of Device Categories</title>
+      <organization>TTC</organization>
+      <date>2011</date>
+      <hyperlink>http://www.ttc.or.jp/jp/document_list/pdf/e/STD/JJ-300.01(E)v1.1.pdf</hyperlink>
+    </reference>
+    <reference id="LMAPIFM">
+      <name>RFC 8193</name>
+      <title>Information Model for Large-Scale Measurement Platforms (LMAPs)</title>
+      <organization>IETF</organization>
+      <category>Informational RFC</category>
+      <date>August 2017</date>
+      <hyperlink>http://tools.ietf.org/html/rfc8193</hyperlink>
+    </reference>
+    <reference id="LMAPREG">
+      <name>draft-ietf-ippm-metric-registry-12</name>
+      <title>Registry for Performance Metrics</title>
+      <organization>IETF</organization>
+      <category>Internet Draft</category>
+      <date>June 30, 2017</date>
+      <hyperlink>https://datatracker.ietf.org/doc/draft-ietf-ippm-metric-registry/</hyperlink>
+    </reference>
+    <reference id="MOCA11-MIB">
+      <name>MOCA11-MIB</name>
+      <title>Remote Management of MoCA Interfaces using SNMP MIB</title>
+      <organization>MoCA Alliance</organization>
+      <date>2009</date>
+      <hyperlink>http://www.mocalliance.org</hyperlink>
+    </reference>
+    <reference id="MoCAv1.0">
+      <name>MoCA v1.0</name>
+      <title>MoCA MAC/PHY Specification v1.0</title>
+      <organization>MoCA Alliance</organization>
+      <date>2009</date>
+      <hyperlink>http://www.mocalliance.org</hyperlink>
+    </reference>
+    <reference id="MoCAv1.1">
+      <name>MoCA v1.1</name>
+      <title>MoCA MAC/PHY Specification v1.1 Extensions</title>
+      <organization>MoCA Alliance</organization>
+      <date>2009</date>
+      <hyperlink>http://www.mocalliance.org</hyperlink>
+    </reference>
+    <reference id="MQTT31">
+      <name>MQTT v3.1</name>
+      <title>MQ Telemetry Transport (MQTT) V3.1 Protocol Specification</title>
+      <date>2010</date>
+      <hyperlink>http://www.ibm.com/developerworks/webservices/library/ws-mqtt/index.html</hyperlink>
+    </reference>
+    <reference id="MQTT311">
+      <name>MQTT Version 3.1.1</name>
+      <title>MQTT v3.1.1</title>
+      <organization>OASIS Message Queuing Telemetry Transport (MQTT) TC</organization>
+      <date>October 2014</date>
+      <hyperlink>https://www.oasis-open.org/standards#mqttv3.1.1</hyperlink>
+    </reference>
+    <reference id="OUI">
+      <name>Organizationally Unique Identifiers (OUIs)</name>
+      <hyperlink>http://standards.ieee.org/faqs/OUI.html</hyperlink>
+    </reference>
+    <reference id="PCPProxy">
+      <name>PCP Proxy Function</name>
+      <title>Port Control Protocol (PCP) Proxy Function</title>
+      <organization>IETF</organization>
+      <date>January 2014</date>
+      <hyperlink>http://tools.ietf.org/html/draft-ietf-pcp-proxy</hyperlink>
+    </reference>
+    <reference id="RED">
+      <name>References on RED (Random Early Detection) Queue Management</name>
+      <hyperlink>http://www.icir.org/floyd/red.html</hyperlink>
+    </reference>
+    <reference id="RFC793">
+      <name>RFC 793</name>
+      <title>Transmission Control Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>September 1981</date>
+      <hyperlink>http://tools.ietf.org/html/rfc793</hyperlink>
+    </reference>
+    <reference id="RFC862">
+      <name>RFC 862</name>
+      <title>Echo Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1983</date>
+      <hyperlink>http://tools.ietf.org/html/rfc862</hyperlink>
+    </reference>
+    <reference id="RFC959">
+      <name>RFC 959</name>
+      <title>File Transfer Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1985</date>
+      <hyperlink>http://tools.ietf.org/html/rfc959</hyperlink>
+    </reference>
+    <reference id="RFC1035">
+      <name>RFC 1035</name>
+      <title>Domain Names - Implementation and Specification</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1987</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1035</hyperlink>
+    </reference>
+    <reference id="RFC1323">
+      <name>RFC 1323</name>
+      <title>TCP Extensions for High Performance</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>May 1992</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1323</hyperlink>
+    </reference>
+    <reference id="RFC1332">
+      <name>RFC 1332</name>
+      <title>The PPP Internet Protocol Control Protocol (IPCP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1992</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1332</hyperlink>
+    </reference>
+    <reference id="RFC1378">
+      <name>RFC 1378</name>
+      <title>The PPP AppleTalk Control Protocol (ATCP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1992</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1378</hyperlink>
+    </reference>
+    <reference id="RFC1552">
+      <name>RFC 1552</name>
+      <title>The PPP Internetwork Packet Exchange Control Protocol (IPXCP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1993</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1552</hyperlink>
+    </reference>
+    <reference id="RFC1661">
+      <name>RFC 1661</name>
+      <title>The Point-to-Point Protocol (PPP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1994</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1661</hyperlink>
+    </reference>
+    <reference id="RFC1877">
+      <name>RFC 1877</name>
+      <title>PPP Internet Protocol Control Protocol Extensions for Name Server Addresses</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1995</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1877</hyperlink>
+    </reference>
+    <reference id="RFC1974">
+      <name>RFC 1974</name>
+      <title>PPP Stac LZS Compression Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1996</date>
+      <hyperlink>http://tools.ietf.org/html/rfc1974</hyperlink>
+    </reference>
+    <reference id="RFC2080">
+      <name>RFC 2080</name>
+      <title>RIPng for IPv6</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1997</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2080</hyperlink>
+    </reference>
+    <reference id="RFC2097">
+      <name>RFC 2097</name>
+      <title>The PPP NetBIOS Frames Control Protocol (NBFCP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1997</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2097</hyperlink>
+    </reference>
+    <reference id="RFC2131">
+      <name>RFC 2131</name>
+      <title>Dynamic Host Configuration Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2131</hyperlink>
+    </reference>
+    <reference id="RFC2132">
+      <name>RFC 2132</name>
+      <title>DHCP Options and BOOTP Vendor Extensions</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2132</hyperlink>
+    </reference>
+    <reference id="RFC2225">
+      <name>RFC 2225</name>
+      <title>Classical IP and ARP over ATM</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2225</hyperlink>
+    </reference>
+    <reference id="RFC2364">
+      <name>RFC 2364</name>
+      <title>PPP Over AAL5</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1998</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2364</hyperlink>
+    </reference>
+    <reference id="RFC2474">
+      <name>RFC 2474</name>
+      <title>Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2474</hyperlink>
+    </reference>
+    <reference id="RFC2581">
+      <name>RFC 2581</name>
+      <title>TCP Congestion Control</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>April 1999</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2581</hyperlink>
+    </reference>
+    <reference id="RFC2582">
+      <name>RFC 2582</name>
+      <title>The NewReno Modification to TCP's Fast Recovery Algorithm</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>April 1999</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2582</hyperlink>
+    </reference>
+    <reference id="RFC2616">
+      <name>RFC 2616</name>
+      <title>Hypertext Transfer Protocol -- HTTP/1.1</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>1999</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2616</hyperlink>
+    </reference>
+    <reference id="RFC2684">
+      <name>RFC 2684</name>
+      <title>Multiprotocol Encapsulation over ATM Adaptation Layer 5</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2684</hyperlink>
+    </reference>
+    <reference id="RFC2697">
+      <name>RFC 2697</name>
+      <title>A Single Rate Three Color Marker</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2697</hyperlink>
+    </reference>
+    <reference id="RFC2698">
+      <name>RFC 2698</name>
+      <title>A Two Rate Three Color Marker</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2698</hyperlink>
+    </reference>
+    <reference id="RFC2782">
+      <name>RFC 2782</name>
+      <title>A DNS RR for specifying the location of services (DNS SRV)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2782</hyperlink>
+    </reference>
+    <reference id="RFC2784">
+      <name>RFC 2784</name>
+      <title>Generic Routing Encapsulation (GRE)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>November 2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2784</hyperlink>
+    </reference>
+    <reference id="RFC2818">
+      <name>RFC 2818</name>
+      <title>HTTP Over TLS</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>May 2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2818</hyperlink>
+    </reference>
+    <reference id="RFC2819">
+      <name>RFC 2819</name>
+      <title>Remote Network Monitoring Management Information Base</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2819</hyperlink>
+    </reference>
+    <reference id="RFC2863">
+      <name>RFC 2863</name>
+      <title>The Interfaces Group MIB</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2863</hyperlink>
+    </reference>
+    <reference id="RFC2865">
+      <name>RFC 2865</name>
+      <title>Remote Authentication Dial In User Service (RADIUS)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2865</hyperlink>
+    </reference>
+    <reference id="RFC2866">
+      <name>RFC 2866</name>
+      <title>RADIUS Accounting</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2866</hyperlink>
+    </reference>
+    <reference id="RFC2869">
+      <name>RFC 2869</name>
+      <title>RADIUS Extensions</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2869</hyperlink>
+    </reference>
+    <reference id="RFC2890">
+      <name>RFC 2890</name>
+      <title>Key and Sequence Number Extensions to GRE</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>November 2000</date>
+      <hyperlink>http://tools.ietf.org/html/rfc2890</hyperlink>
+    </reference>
+    <reference id="RFC2898">
+      <name>RFC 2898</name>
+      <title>PKCS #5: Password-Based Cryptography Specification Version 2.0</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc2898</hyperlink>
+    </reference>
+    <reference id="RFC3004">
+      <name>RFC 3004</name>
+      <title>The User Class Option for DHCP</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc3004</hyperlink>
+    </reference>
+    <reference id="RFC3066">
+      <name>RFC 3066</name>
+      <title>Tags for the Identification of Languages</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc3066</hyperlink>
+    </reference>
+    <reference id="RFC3174">
+      <name>RFC 3174</name>
+      <title>US Secure Hash Algorithm 1 (SHA1)</title>
+      <organization>IETF</organization>
+      <category>Draft Standard</category>
+      <date>September, 2001</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3174</hyperlink>
+    </reference>
+    <reference id="RFC3232">
+      <name>RFC 3232</name>
+      <title>"Assigned Numbers: RFC 1700 is Replaced by an On-line Database"</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2002</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3232</hyperlink>
+    </reference>
+    <reference id="RFC3315">
+      <name>RFC 3315</name>
+      <title>Dynamic Host Configuration Protocol for IPv6 (DHCPv6)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2003</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3315</hyperlink>
+    </reference>
+    <reference id="RFC3339">
+      <name>RFC 3339</name>
+      <title>Date and Time on the Internet: Timestamps</title>
+      <organization>IETF</organization>
+      <category>Draft Standard</category>
+      <date>July, 2002</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3339</hyperlink>
+    </reference>
+    <reference id="RFC3596">
+      <name>RFC 3596</name>
+      <title>DDNS Extensions to Support IP Version 6</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2003</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3596</hyperlink>
+    </reference>
+    <reference id="RFC3633">
+      <name>RFC 3633</name>
+      <title>IPv6 Prefix Options for Dynamic Host Configuration Protocol (DHCP) version 6</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2003</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3633</hyperlink>
+    </reference>
+    <reference id="RFC3646">
+      <name>RFC 3646</name>
+      <title>DNS Configuration options for Dynamic Host Configuration Protocol for IPv6 (DHCPv6)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2003</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3646</hyperlink>
+    </reference>
+    <reference id="RFC3775">
+      <name>RFC 3775</name>
+      <title>Mobility Support in IPv6</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2004</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3775</hyperlink>
+    </reference>
+    <reference id="RFC3925">
+      <name>RFC 3925</name>
+      <title>Vendor-Identifying Vendor Options for Dynamic Host Configuration Protocol version 4 (DHCPv4)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc3925</hyperlink>
+    </reference>
+    <reference id="RFC3927">
+      <name>RFC 3927</name>
+      <title>Dynamic Configuration of IPv4 Link-Local Addresses</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3927</hyperlink>
+    </reference>
+    <reference id="RFC3931">
+      <name>RFC 3931</name>
+      <title>Layer Two Tunneling Protocol - Version 3 (L2TPv3)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>March 2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3931</hyperlink>
+    </reference>
+    <reference id="RFC3948">
+      <name>RFC 3948</name>
+      <title>UDP Encapsulation of IPsec ESP Packets</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>January 2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc3948</hyperlink>
+    </reference>
+    <reference id="RFC3986">
+      <name>RFC 3986</name>
+      <title>Uniform Resource Identifier (URI): Generic Syntax</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <hyperlink>http://tools.ietf.org/html/rfc3986</hyperlink>
+    </reference>
+    <reference id="RFC4122">
+      <name>RFC 4122</name>
+      <title>A Universally Unique IDentifier (UUID) URN Namespace</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4122</hyperlink>
+    </reference>
+    <reference id="RFC4180">
+      <name>RFC4180</name>
+      <title>Common Format and MIME Type for Comma-Separated Values (CSV) Files</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>October 2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4180</hyperlink>
+    </reference>
+    <reference id="RFC4191">
+      <name>RFC 4191</name>
+      <title>Default Router Preferences and More-Specific Routes</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4191</hyperlink>
+    </reference>
+    <reference id="RFC4193">
+      <name>RFC 4193</name>
+      <title>Unique Local IPv6 Unicast Addresses</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4193</hyperlink>
+    </reference>
+    <reference id="RFC4242">
+      <name>RFC 4242</name>
+      <title>Information Refresh Time Option for Dynamic Host Configuration Protocol for IPv6 (DHCPv6)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4242</hyperlink>
+    </reference>
+    <reference id="RFC4291">
+      <name>RFC 4291</name>
+      <title>IP Version 6 Addressing Architecture</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4291</hyperlink>
+    </reference>
+    <reference id="RFC4292">
+      <name>RFC 4292</name>
+      <title>IP Forwarding Table MIB</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4292</hyperlink>
+    </reference>
+    <reference id="RFC4293">
+      <name>RFC 4293</name>
+      <title>Management Information Base for the Internet Protocol (IP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4293</hyperlink>
+    </reference>
+    <reference id="RFC4301">
+      <name>RFC 4301</name>
+      <title>Security Architecture for the Internet Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>December 2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4301</hyperlink>
+    </reference>
+    <reference id="RFC4302">
+      <name>RFC 4302</name>
+      <title>IP Authentication Header</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>December 2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4302</hyperlink>
+    </reference>
+    <reference id="RFC4303">
+      <name>RFC 4303</name>
+      <title>IP Encapsulating Security Payload (ESP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>December 2005</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4303</hyperlink>
+    </reference>
+    <reference id="RFC4389">
+      <name>RFC 4389</name>
+      <title>Neighbor Discovery Proxies (ND Proxy)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4389</hyperlink>
+    </reference>
+    <reference id="RFC4632">
+      <name>RFC 4632</name>
+      <title>Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4632</hyperlink>
+    </reference>
+    <reference id="RFC4719">
+      <name>RFC 4719</name>
+      <title>Transport of Ethernet Frames over Layer 2 Tunneling Protocol Version 3 (L2TPv3)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>November 2006</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4719</hyperlink>
+    </reference>
+    <reference id="RFC4835">
+      <name>RFC 4835</name>
+      <title>Cryptographic Algorithm Implementation Requirements for Encapsulating Security Payload (ESP) and Authentication Header (AH)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2007</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4835</hyperlink>
+    </reference>
+    <reference id="RFC4861">
+      <name>RFC 4861</name>
+      <title>Neighbor Discovery for IP version 6 (IPv6)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2007</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4861</hyperlink>
+    </reference>
+    <reference id="RFC4862">
+      <name>RFC 4862</name>
+      <title>IPv6 Stateless Address Autoconfiguration</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2007</date>
+      <hyperlink>http://tools.ietf.org/html/rfc4862</hyperlink>
+    </reference>
+    <reference id="RFC5072">
+      <name>RFC 5072</name>
+      <title>IP Version 6 over PPP</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2007</date>
+      <hyperlink>http://tools.ietf.org/html/rfc5072</hyperlink>
+    </reference>
+    <reference id="RFC5139">
+      <name>RFC 5139</name>
+      <title>Revised Civic Location Format For Presence Information Data Format Location Object (PIDF-LO)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>February 2008</date>
+      <hyperlink>http://tools.ietf.org/html/rfc5139</hyperlink>
+    </reference>
+    <reference id="RFC5280">
+      <name>RFC 5280</name>
+      <title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>May 2008</date>
+      <hyperlink>http://tools.ietf.org/html/rfc5280</hyperlink>
+    </reference>
+    <reference id="RFC5491">
+      <name>RFC 5491</name>
+      <title>GEOPRIV Presence Information Data Format Location Object (PIDF-LO) Usage Clarification, Considerations, and Recommendations</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>March 2009</date>
+      <hyperlink>http://tools.ietf.org/html/rfc5491</hyperlink>
+    </reference>
+    <reference id="RFC5625">
+      <name>RFC 5625</name>
+      <title>DNS Proxy Implementation Guidelines</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2009</date>
+      <hyperlink>http://tools.ietf.org/html/rfc5625</hyperlink>
+    </reference>
+    <reference id="RFC5969">
+      <name>RFC 5969</name>
+      <title>IPv6 Rapid Deployment on IPv4 Infrastructures (6rd) - Protocol Specification</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2010</date>
+      <hyperlink>http://tools.ietf.org/html/rfc5969</hyperlink>
+    </reference>
+    <reference id="RFC5996">
+      <name>RFC 5996</name>
+      <title>Internet Key Exchange Protocol Version 2 (IKEv2)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>September 2010</date>
+      <hyperlink>http://tools.ietf.org/html/rfc5996</hyperlink>
+    </reference>
+    <reference id="RFC6106">
+      <name>RFC 6106</name>
+      <title>IPv6 Router Advertisement Option for DNS Configuration</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2010</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6106</hyperlink>
+    </reference>
+    <reference id="RFC6120">
+      <name>RFC 6120</name>
+      <title>Extensible Messaging and Presence Protocol (XMPP) : Core</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2011</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6120</hyperlink>
+    </reference>
+    <reference id="RFC6234">
+      <name>RFC 6234</name>
+      <title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
+      <organization>IETF</organization>
+      <category>Draft Standard</category>
+      <date>May, 2011</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6234</hyperlink>
+    </reference>
+    <reference id="RFC6455">
+      <name>RFC 6455</name>
+      <title>The WebSocket Protocol</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>December 2011</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6455</hyperlink>
+    </reference>
+    <reference id="RFC6762">
+      <name>RFC 6762</name>
+      <title>Multicast DNS</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>February 2013</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6762</hyperlink>
+    </reference>
+    <reference id="RFC6838">
+      <name>RFC 6838</name>
+      <title>Media Type Specifications and Registration Procedures</title>
+      <organization>IETF</organization>
+      <category>Best Current Practice</category>
+      <date>January 2013</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6838</hyperlink>
+    </reference>
+    <reference id="RFC6887">
+      <name>RFC 6887</name>
+      <title>Port Control Protocol (PCP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2013</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6887</hyperlink>
+    </reference>
+    <reference id="RFC6970">
+      <name>RFC 6970</name>
+      <title>Universal Plug and Play (UPnP) Internet Gateway Device (IGD) - Port Control Protocol (PCP) Interworking Function</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2013</date>
+      <hyperlink>http://tools.ietf.org/html/rfc6970</hyperlink>
+    </reference>
+    <reference id="RFC7159">
+      <name>RFC7159</name>
+      <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>March 2014</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7159</hyperlink>
+    </reference>
+    <reference id="RFC7252">
+      <name>RFC 7252</name>
+      <title>The Constrained Application Protocol (CoAP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>June 2014</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7252</hyperlink>
+    </reference>
+    <reference id="RFC7291">
+      <name>RFC 7291</name>
+      <title>DHCP Options for the Port Control Protocol (PCP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>2014</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7291</hyperlink>
+    </reference>
+    <reference id="RFC7348">
+      <name>RFC 7348</name>
+      <title>Virtual eXtensible Local Area Network (VXLAN)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>August 2014</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7348</hyperlink>
+    </reference>
+    <reference id="RFC7395">
+      <name>RFC 7395</name>
+      <title>An Extensible Messaging and Presence Protocol (XMPP) Subprotocol for WebSocket</title>
+      <organization>IETF</organization>
+      <category>Standards Track</category>
+      <date>October 2014</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7395</hyperlink>
+    </reference>
+    <reference id="RFC7398">
+      <name>RFC 7398</name>
+      <title>A Reference Path and Measurement Points for Large-Scale Measurement of Broadband Performance</title>
+      <organization>IETF</organization>
+      <category>Informational RFC</category>
+      <date>February 2015</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7398</hyperlink>
+    </reference>
+    <reference id="RFC7594">
+      <name>RFC 7594</name>
+      <title>A Framework for Large-Scale Measurement of Broadband Performance (LMAP)</title>
+      <organization>IETF</organization>
+      <category>Informational RFC</category>
+      <date>September 2015</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7594</hyperlink>
+    </reference>
+    <reference id="RFC7597">
+      <name>RFC 7597</name>
+      <title>Mapping of Address and Port with Encapsulation (MAP)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>July 2015</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7597</hyperlink>
+    </reference>
+    <reference id="RFC7598">
+      <name>RFC 7598</name>
+      <title>DHCPv6 Options for configuration of Softwire Address and Port Mapped Clients</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>July 2015</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7598</hyperlink>
+    </reference>
+    <reference id="RFC7599">
+      <name>RFC 7599</name>
+      <title>Mapping of Address and Port using Translation (MAP-T)</title>
+      <organization>IETF</organization>
+      <category>RFC</category>
+      <date>July 2015</date>
+      <hyperlink>http://tools.ietf.org/html/rfc7599</hyperlink>
+    </reference>
+    <reference id="SOAP1.1">
+      <name>Simple Object Access Protocol (SOAP) 1.1</name>
+      <organization>W3C</organization>
+      <hyperlink>http://www.w3.org/TR/2000/NOTE-SOAP-20000508</hyperlink>
+    </reference>
+    <reference id="STOMP1.2">
+      <name>STOMP Protocol Specification</name>
+      <title>STOMP Protocol Specification, Version 1.2</title>
+      <hyperlink>https://stomp.github.io/stomp-specification-1.2.html</hyperlink>
+    </reference>
+    <reference id="TR-064">
+      <name>TR-064</name>
+      <title>LAN-Side DSL CPE Configuration Specification</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2004</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-064.pdf</hyperlink>
+    </reference>
+    <reference id="TR-069">
+      <name>TR-069</name>
+      <title>CPE WAN Management Protocol</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2004</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-069.pdf</hyperlink>
+    </reference>
+    <reference id="TR-069a2">
+      <name>TR-069 Amendment 2</name>
+      <title>CPE WAN Management Protocol</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2007</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-069_Amendment-2.pdf</hyperlink>
+    </reference>
+    <reference id="TR-069a3">
+      <name>TR-069 Amendment 3</name>
+      <title>CPE WAN Management Protocol</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2010</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-069_Amendment-3.pdf</hyperlink>
+    </reference>
+    <reference id="TR-069a4">
+      <name>TR-069 Amendment 4</name>
+      <title>CPE WAN Management Protocol</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2011</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-069_Amendment-4.pdf</hyperlink>
+    </reference>
+    <reference id="TR-069a5">
+      <name>TR-069 Amendment 5</name>
+      <title>CPE WAN Management Protocol</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>December 2013</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-069_Amendment-5.pdf</hyperlink>
+    </reference>
+    <reference id="TR-098">
+      <name>TR-098</name>
+      <title>Internet Gateway Device Data Model for TR-069</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2005</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-098.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106">
+      <name>TR-106</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2005</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106a2">
+      <name>TR-106 Amendment 2</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2008</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106_Amendment-2.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106a4">
+      <name>TR-106 Amendment 4</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2010</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106_Amendment-4.pdf</hyperlink>
+    </reference>
+    <reference id="TR-106a7">
+      <name>TR-106 Amendment 7</name>
+      <title>Data Model Template for TR-069-Enabled Devices</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2013</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-106_Amendment-7.pdf</hyperlink>
+    </reference>
+    <reference id="TR-143">
+      <name>TR-143</name>
+      <title>Enabling Network Throughput Performance Tests and Statistical Monitoring</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2008</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-143.pdf</hyperlink>
+    </reference>
+    <reference id="TR-143a1">
+      <name>TR-143 Amendment 1</name>
+      <title>Enabling Network Throughput Performance Tests and Statistical Monitoring</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>December 2014</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-143_Amendment-1.pdf</hyperlink>
+    </reference>
+    <reference id="TR-157">
+      <name>TR-157</name>
+      <title>Component Object for CWMP</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>March 2009</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-157.pdf</hyperlink>
+    </reference>
+    <reference id="TR-157a10">
+      <name>TR-157 Amendment 10</name>
+      <title>Component Objects for CWMP</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2015</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-157_Amendment-10.pdf</hyperlink>
+    </reference>
+    <reference id="TR-159">
+      <name>TR-159</name>
+      <title>Management Framework for xDSL Bonding</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2008</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-159.pdf</hyperlink>
+    </reference>
+    <reference id="TR-181i1">
+      <name>TR-181 Issue 1</name>
+      <title>Device Data Model for TR-069</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2010</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-181_Issue-1.pdf</hyperlink>
+    </reference>
+    <reference id="TR-181i2">
+      <name>TR-181 Issue 2</name>
+      <title>Device Data Model for TR-069</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2010</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-181_Issue-2.pdf</hyperlink>
+    </reference>
+    <reference id="TR-232">
+      <name>TR-232</name>
+      <title>Bulk Data Collection</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>May 2012</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-232.pdf</hyperlink>
+    </reference>
+    <reference id="TR-262">
+      <name>TR-262</name>
+      <title>Femto Component Objects</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2011</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-262.pdf</hyperlink>
+    </reference>
+    <reference id="TR-304">
+      <name>TR-304</name>
+      <title>Broadband Access Service Attributes and Performance Metrics</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>March 2015</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-304.pdf</hyperlink>
+    </reference>
+    <reference id="TR-369">
+      <name>WT-369</name>
+      <title>User Services Platform</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>December 2016</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-369.pdf</hyperlink>
+    </reference>
+    <reference id="TR-390">
+      <name>WT-390</name>
+      <title>Performance Measurement from Customer Equipment to IP Edge</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>November 2016</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-390.pdf</hyperlink>
+    </reference>
+    <reference id="TR-181i2a12">
+      <name>TR-181 Issue 2 Amendment 12</name>
+      <title>Device Data Model</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>April 2018</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-181_Issue-2_Amendment-12.pdf</hyperlink>
+    </reference>
+    <reference id="TR-181i2a2">
+      <name>TR-181 Issue 2 Amendment 2</name>
+      <title>Device Data Model for TR-069</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2011</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-181_Issue-2_Amendment-2.pdf</hyperlink>
+    </reference>
+    <reference id="TR-181i2a5">
+      <name>TR-181 Issue 2 Amendment 5</name>
+      <title>Device Data Model for TR-069</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>2012</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-181_Issue-2_Amendment-5.pdf</hyperlink>
+    </reference>
+    <reference id="TR-181i2a8">
+      <name>TR-181 Issue 2 Amendment 8</name>
+      <title>Device Data Model for TR-069</title>
+      <organization>Broadband Forum</organization>
+      <category>Technical Report</category>
+      <date>September 2014</date>
+      <hyperlink>http://www.broadband-forum.org/technical/download/TR-181_Issue-2_Amendment-8.pdf</hyperlink>
+    </reference>
+    <reference id="UPA-PLC">
+      <name>Universal Powerline Association</name>
+      <organization>UPA</organization>
+      <hyperlink>http://www.upaplc.org</hyperlink>
+    </reference>
+    <reference id="UPnP-DAv1">
+      <name>UPnP Device Architecture</name>
+      <title>UPnP Device Architecture 1.0</title>
+      <organization>UPnP Forum</organization>
+      <date>April 2008</date>
+      <hyperlink>http://www.upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.0-20080424.pdf</hyperlink>
+    </reference>
+    <reference id="UPnP-DAv11">
+      <name>UPnP Device Architecture 1.1</name>
+      <title>UPnP Device Architecture 1.1</title>
+      <organization>UPnP Forum</organization>
+      <date>October, 2008</date>
+      <hyperlink>http://www.upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf</hyperlink>
+    </reference>
+    <reference id="UPnP-IGD:1">
+      <name>UPnP InternetGatewayDevice:1</name>
+      <title>InternetGatewayDevice:1 Device Template Version 1.01</title>
+      <organization>UPnP</organization>
+      <category>SDCP</category>
+      <date>2001</date>
+      <hyperlink>http://upnp.org/specs/gw/UPnP-gw-InternetGatewayDevice-v1-Device.pdf</hyperlink>
+    </reference>
+    <reference id="UPnP-IGD:2">
+      <name>UPnP InternetGatewayDevice:2</name>
+      <title>InternetGatewayDevice:2 Device Template Version 1.01</title>
+      <organization>UPnP</organization>
+      <category>SDCP</category>
+      <date>2010</date>
+      <hyperlink>http://upnp.org/specs/gw/UPnP-gw-InternetGatewayDevice-v2-Device.pdf</hyperlink>
+    </reference>
+    <reference id="USB1.0">
+      <name>USB 1.0</name>
+      <title>USB 1.0 Specification</title>
+      <organization>USB-IF</organization>
+      <date>January 1996</date>
+      <hyperlink>http://www.usb.org/developers/docs/</hyperlink>
+    </reference>
+    <reference id="USB2.0">
+      <name>USB 2.0</name>
+      <title>USB 2.0 Specification</title>
+      <organization>USB-IF</organization>
+      <date>April 2000</date>
+      <hyperlink>http://www.usb.org/developers/docs/usb_20_122208.zip</hyperlink>
+    </reference>
+    <reference id="USB3.0">
+      <name>USB 3.0</name>
+      <title>USB 3.0 Specification</title>
+      <organization>USB-IF</organization>
+      <date>November 2008</date>
+      <hyperlink>http://www.usb.org/developers/docs/usb_30_spec.zip</hyperlink>
+    </reference>
+    <reference id="WPS 2.0">
+      <name>WSC 2.0</name>
+      <title>Wi-Fi Simple Configuration Technical Specification Version 2.0.x </title>
+      <organization>Wi-Fi Alliance</organization>
+      <hyperlink>http://www.wi-fi.org/discover-wi-fi/wi-fi-protected-setup</hyperlink>
+    </reference>
+    <reference id="WPSv1.0">
+      <name>Wi-Fi Protected Setup Specification Version 1.0h</name>
+      <title>Wi-Fi Alliance</title>
+      <date>2006</date>
+      <hyperlink>http://www.wi-fi.org</hyperlink>
+    </reference>
+    <reference id="ZigBee2007">
+      <name>ZigBee 2007 Specification</name>
+      <title>ZigBee 2007 Specification</title>
+      <organization>ZigBee Alliance</organization>
+      <date>October 2007</date>
+      <hyperlink>http://www.zigbee.org/Specifications/ZigBee/download.aspx</hyperlink>
+    </reference>
+  </bibliography>
+  <model name="Device:2.12">
+    <object name="Device." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The top-level object for a Device.
+      </description>
+      <parameter name="RootDataModelVersion" access="readOnly" forcedInform="true" dmr:version="2.4">
+        <description>
+          Root data model version, e.g. ''2.4''.  For a vendor-defined root data model, this is the standard Broadband Forum model on which the vendor-defined model is based.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+            <pattern value="2\.\d+"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceStackNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ProxiedDeviceNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <command name="Reboot()" dmr:version="2.12">
+        <description>
+          Reboot the entity associated with the containing {{object}}.
+        </description>
+      </command>
+      <event name="Boot!" dmr:version="2.12">
+        <description>
+          Boot event indicating that the {{object}} was rebooted.
+        </description>
+        <parameter name="CommandKey" dmr:version="2.12">
+          <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>
+        <parameter name="Cause" dmr:version="2.12">
+          <description>
+            The cause of the boot.
+          </description>
+          <syntax>
+            <string>
+              <enumeration value="LocalReboot"/>
+              <enumeration value="RemoteReboot"/>
+              <enumeration value="LocalFactoryReset"/>
+              <enumeration value="RemoteFactoryReset"/>
+            </string>
+          </syntax>
+        </parameter>
+        <parameter name="FirmwareUpdated" dmr:version="2.12">
+          <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" dmr:version="2.12">
+          <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()" dmr:version="2.12">
+        <description>
+          Factory reset the entity associated with the containing {{object}}.
+        </description>
+      </command>
+      <command name="SelfTestDiagnostics()" async="true" dmr:version="2.12">
+        <description>
+          This diagnostics test is vendor-specific and MAY include testing hardware, software, and/or firmware.
+        </description>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <parameter name="Results" dmr:version="2.0">
+            <description>
+              Results of self-test (vendor specific).
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="1024"/>
+              </string>
+            </syntax>
+          </parameter>
+        </output>
+      </command>
+    </object>
+    <object name="Device.Services." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains general services information.
+      </description>
+    </object>
+    <object name="Device.DeviceInfo." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains general device information.
+      </description>
+      <parameter name="DeviceCategory" access="readOnly" dmr:version="2.8">
+        <description>
+          Each list item is a device category (e.g. "AV_TV" and "AV_Recorder"), or the value is {{empty}} if no such element is provided by the device.
+          Note: It is assumed that this list might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. Standard HTIP device categories are defined in {{bibref|JJ-300.01}}. In this case, the maximum length of the list is 127 and of each item is 31, and any non-HTIP device categories SHOULD NOT conflict with standard HTIP device categories.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Manufacturer" access="readOnly" dmr:version="2.0">
+        <description>
+          The manufacturer of the CPE (human readable string).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerOUI" access="readOnly" dmr:version="2.0">
+        <description>
+          Organizationally unique identifier of the device manufacturer. Represented as a six hexadecimal-digit value using all upper-case letters and including any leading zeros. {{pattern}}
+          The value MUST be a valid OUI as defined in {{bibref|OUI}}.
+          This value MUST remain fixed over the lifetime of the device, 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="CID" access="readOnly" dmr:version="2.12">
+        <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" dmr:version="2.12">
+        <description>
+          Private Enterprise Number assigned and registered by IANA to the entity responsible for this Agent.  Represented as a decimal encoding of the IANA-assinged 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="FriendlyName" access="readWrite" dmr:version="2.12">
+        <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="ModelName" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Model name of the CPE (human readable string).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModelNumber" access="readOnly" dmr:version="2.8">
+        <description>
+          The model number of the device (human readable string), or {{empty}} if no model number is provided by the device.
+          Note: It is assumed that this string might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, the maximum length of the string is 31.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          A full description of the CPE device (human readable string).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProductClass" access="readOnly" dmr:version="2.0">
+        <description>
+          Identifier of the class of product for which the serial number applies.  That is, for a given manufacturer, this  parameter is used to identify the product or class of product over which the {{param|SerialNumber}} parameter is unique.
+          This value MUST remain fixed over the lifetime of the device, including across firmware updates. Any change would indicate that it's  a new device and would therefore require a BOOTSTRAP Inform.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="2.0">
+        <description>
+          Identifier of the particular device that is unique for the indicated class of product and manufacturer.
+          This value MUST remain fixed over the lifetime of the device, including across firmware updates. Any change would indicate that it's  a new device and would therefore require a BOOTSTRAP Inform.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="HardwareVersion" access="readOnly" forcedInform="true" dmr:version="2.0">
+        <description>
+          A string identifying the particular CPE model and version.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SoftwareVersion" access="readOnly" activeNotify="forceEnabled" forcedInform="true" dmr:version="2.0">
+        <description>
+          A string identifying the software version currently installed in the CPE (i.e. version of the overall CPE  firmware).
+          To allow version comparisons, this element SHOULD be in the form of dot-delimited integers, where each successive integer represents a more minor category of variation. For example, ''3.0.21'' where the components mean: ''Major.Minor.Build''.
+          For CPEs that support multiple firmware images, the value for this parameter MUST be the software version of the active firmware image.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ActiveFirmwareImage" access="readOnly" dmr:version="2.12">
+        <description>
+          {{noreference}}A full path reference to the row in the {{object|FirmwareImage}} table representing the currently running firmware image.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="FirmwareImage." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BootFirmwareImage" access="readWrite" dmr:version="2.12">
+        <description>
+          {{noreference}}A full path reference to the row in the {{object|FirmwareImage}} table of the firmware image that is to be loaded the next time the device boots.
+          This parameter value cannot be empty and must point to a valid and enabled {{object|FirmwareImage}} object where the ({{param|FirmwareImage.{i}.Available}} parameter is set to 'true'). Out of the factory, this parameter should be set to point to the firmware image the CPE will attempt to boot when first powered on.
+          The firmware image instance referenced by this parameter must also have an Available parameter value of 'true'. Attempting to set this parameter to point to a non-enabled firmware image MUST result in the CPE responding with a CWMP fault (9007).
+          In situations where the CPE cannot boot the firmware image specified by this parameter and manages to boot a different firmware image, the CPE MUST NOT modify this value to point to the alternate firmware image that is currently active.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="FirmwareImage." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalHardwareVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}}  Each entry is an additional version.  Represents any additional hardware version information the vendor might wish to supply.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="64"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalSoftwareVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}}  Each entry is an additional version.  Represents any additional software version information the vendor might wish to supply.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="64"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ProvisioningCode" access="readWrite" activeNotify="forceEnabled" forcedInform="true" dmr:version="2.0">
+        <description>
+          Identifier of the primary service provider and other provisioning information, which MAY be used by the ACS to  determine service provider-specific customization and provisioning parameters.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UpTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Time in {{units}} since the CPE was last restarted.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FirstUseDate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Date and time in UTC that the CPE first both successfully established an IP-layer network connection and acquired an absolute time reference using NTP or equivalent over that network connection.  The CPE MAY reset this date after a factory reset.
+          If NTP or equivalent is not available, this parameter, if present, SHOULD be set to the Unknown Time value.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareImageNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorConfigFileNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ProcessorNumberOfEntries" access="readOnly" dmr:version="2.1">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorLogFileNumberOfEntries" access="readOnly" dmr:version="2.1">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LocationNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceImageNumberOfEntries" access="readOnly" dmr:version="2.11">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.VendorConfigFile.{i}." access="readOnly" numEntriesParameter="VendorConfigFileNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Every instance of this object is a Vendor Configuration File, and contains parameters associated with the Vendor  Configuration File.
+        This table of Vendor Configuration Files is for information only and does not allow the ACS to operate on these files in any way.
+        Whenever the CPE successfully downloads a configuration file as a result of the Download RPC with the FileType argument of ''3 Vendor Configuration File'', the CPE MUST update this table.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          Name of the vendor configuration file.
+          If the CPE is able to obtain the name of the configuration file from the file itself, then the value of this parameter MUST be set to that name.
+          Otherwise, if the CPE can extract the file name from the URL used to download the configuration file, then the value of this  parameter MUST be set to that name.
+          Otherwise, the value of this parameter MUST be set to the value of the TargetFileName argument of the Download RPC used to download this configuration file.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.0">
+        <description>
+          A string identifying the configuration file version currently used in the CPE.
+          If the CPE is able to obtain the version of the configuration file from the file itself, then the value of this parameter MUST be set to the obtained value.
+          Otherwise, the value of this parameter MUST be {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="16"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Date" access="readOnly" dmr:version="2.0">
+        <description>
+          Date and time when the content of the current version of this vendor configuration file was first applied by the CPE.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readOnly" dmr:version="2.0">
+        <description>
+          A description of the vendor configuration file (human-readable string).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UseForBackupRestore" access="readOnly" dmr:version="2.7">
+        <description>
+          When {{true}}, this parameter indicates that this {{object}} instance is to be used for backup and restoration purposes.
+          Note: The backup and restore operations may require the use of multiple {{object}} instances. In this scenario the mechanism for detemining the order and combination of {{object}} instances used for backup and restoration purposes is implementation specific.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <command name="Backup()" async="true" dmr: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|Device.LocalAgent.TransferComplete!}} event.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="URL" mandatory="true" dmr:version="2.12">
+            <description>
+              URL, as defined in {{bibref|RFC3986}}, specifying the destination file location. HTTP and HTTPS transports MUST 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>
+              <string>
+                <size maxLength="256"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="Username" mandatory="true" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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" dmr: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|Device.LocalAgent.TransferComplete!}} event.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="URL" mandatory="true" dmr:version="2.12">
+            <description>
+              URL, as defined in {{bibref|RFC3986}}, specifying the source file location. HTTP and HTTPS transports MUST 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>
+              <string>
+                <size maxLength="256"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="Username" mandatory="true" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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>
+    <object name="Device.DeviceInfo.MemoryStatus." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Status of the device's volatile physical memory.
+      </description>
+      <parameter name="Total" access="readOnly" dmr:version="2.0">
+        <description>
+          The total physical RAM, in {{units}}, installed on the device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="kilobytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Free" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The free physical RAM, in {{units}}, currently available on the device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="kilobytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.ProcessStatus." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Status of the processes on the device.
+      </description>
+      <parameter name="CPUUsage" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total amount of the CPU, in {{units}}, rounded up to the nearest whole {{units}}.  In the case that multiple CPU are present, this value represents the average of all CPU.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="100"/>
+            <units value="percent"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ProcessNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+          Since a Process can come and go very quickly, the CPE SHOULD place a locally specified limit on the frequency at which it will notify the ACS of value changes, as described in {{bibref|TR-069a2|Section 3.2.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.ProcessStatus.Process.{i}." access="readOnly" numEntriesParameter="ProcessNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        List of all processes running on the device.
+      </description>
+      <uniqueKey>
+        <parameter ref="PID"/>
+      </uniqueKey>
+      <parameter name="PID" access="readOnly" dmr:version="2.0">
+        <description>
+          The Process Identifier.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Command" access="readOnly" dmr:version="2.0">
+        <description>
+          The name of the command that has caused the process to exist.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Size" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The size in {{units}} of the memory occupied by the process.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="kilobytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Priority" access="readOnly" dmr:version="2.0">
+        <description>
+          The priority of the process where 0 is highest.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="99"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CPUTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The amount of time in {{units}} that the process has spent taking up CPU time since the process was started.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="State" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current state that the process is in.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Running"/>
+            <enumeration value="Sleeping"/>
+            <enumeration value="Stopped"/>
+            <enumeration value="Idle" optional="true"/>
+            <enumeration value="Uninterruptible" optional="true"/>
+            <enumeration value="Zombie" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.TemperatureStatus." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Status of the temperature of the device.
+      </description>
+      <parameter name="TemperatureSensorNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.TemperatureStatus.TemperatureSensor.{i}." access="readOnly" numEntriesParameter="TemperatureSensorNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object represents information that the device has obtained via sampling an internal temperature sensor.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates whether or not the temperature sensor is enabled.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this temperature sensor.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled">
+              <description>
+                The sensor is not currently sampling the temperature.
+              </description>
+            </enumeration>
+            <enumeration value="Enabled">
+              <description>
+                The sensor is currently sampling the temperature.
+              </description>
+            </enumeration>
+            <enumeration value="Error">
+              <description>
+                The sensor error currently prevents sampling the temperature.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ResetTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The time at which this temperature sensor was reset.
+          Reset can be caused by:
+          * {{param|Status}} transition from {{enum|Disabled|Status}} to {{enum|Enabled|Status}}
+          * {{param|Reset}} set to {{true}}.
+          * An internal reset of the temperature sensor (including a reboot of the device).
+          The Unknown Time value, as defined in {{bibref|TR-106a2}}, indicates that this temperature sensor has never been reset, which can only happen if it has never been enabled.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          Name of this temperature sensor. This text MUST be sufficient to distinguish this temperature sensor from other temperature sensors.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          This temperature sensor's last good reading in {{units}}.
+          A value of -274 (which is below absolute zero) indicates a good reading has not been obtained since last reset.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-274"/>
+            <units value="degrees celsius"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The time at which this temperature sensor's last good reading was obtained.
+          The Unknown Time value, as defined in {{bibref|TR-106a2}}, indicates a good reading has not been obtained since last reset.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="MinValue" access="readOnly" dmr:version="2.0">
+        <description>
+          This temperature sensor's lowest value  reading in {{units}} since last reset.
+          A value of -274 (which is below absolute zero) indicates a good reading has not been obtained since last reset.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-274"/>
+            <units value="degrees celsius"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="MinTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The time at which this temperature sensor's lowest value was read.
+          The Unknown Time value, as defined in {{bibref|TR-106a2}}, indicates a good reading has not been obtained since last reset.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxValue" access="readOnly" dmr:version="2.0">
+        <description>
+          This temperature sensor's highest value  reading in {{units}} since last reset.
+          A value of -274 (which is below absolute zero) indicates a good reading has not been obtained since last reset.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-274"/>
+            <units value="degrees celsius"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="MaxTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The time at which this temperature sensor's highest value was read.
+          The Unknown Time value, as defined in {{bibref|TR-106a2}}, indicates a good reading has not been obtained since last reset.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LowAlarmValue" access="readWrite" dmr:version="2.0">
+        <description>
+          This temperature sensor's low alarm value in {{units}}.
+          A value of -274 (which is below absolute zero) indicates a non configured value.
+          A change to this value will cause {{param|LowAlarmTime}} to be reset.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-274"/>
+            <units value="degrees celsius"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="LowAlarmTime" access="readOnly" dmr:version="2.0">
+        <description>
+          Initial time at which this temperature sensor's {{param|LowAlarmValue}} was encountered.
+          This value is only set the first time the alarm is seen and not changed until the next reset.
+          The Unknown Time value, as defined in {{bibref|TR-106a2}}, indicates that an alarm has not been encountered since the last reset.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="HighAlarmValue" access="readWrite" dmr:version="2.0">
+        <description>
+          This temperature sensor's high alarm value in {{units}}.
+          A value of -274 (which is below absolute zero) indicates a non configured value.
+          A change to this value will cause {{param|HighAlarmTime}} to be reset.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-274"/>
+            <units value="degrees celsius"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="PollingInterval" access="readWrite" dmr:version="2.1">
+        <description>
+          The interval, measured in {{units}}, in which the device polls this {{object}}.
+          If the value is 0 then the device selects its own polling interval.
+          If the value is greater than 0 then the device MUST use this value as the polling interval.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="HighAlarmTime" access="readOnly" dmr:version="2.0">
+        <description>
+          Initial time at which this temperature sensor's {{param|HighAlarmValue}} was encountered.
+          This value is only set the first time the alarm is seen and not changed until the next reset.
+          The Unknown Time value, as defined in {{bibref|TR-106a2}}, indicates that an alarm has not been encountered since the last reset.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <command name="Reset()" dmr:version="2.12">
+        <description>
+          Resets the temperature sensor.
+        </description>
+      </command>
+    </object>
+    <object name="Device.DeviceInfo.NetworkProperties." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object defines the parameters that describe how the device handles network traffic.
+      </description>
+      <parameter name="MaxTCPWindowSize" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum number of {{units}} of outstanding data a sender can send on a particular connection prior to an acknowledgment {{bibref|RFC793}}.  Any scaling factor SHOULD be included in this parameter {{bibref|RFC1323}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TCPImplementation" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the TCP congestion control mechanism(s) implemented. {{enum}}
+          Tahoe, Reno, and New Reno are defined in {{bibref|RFC2582}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="Tahoe">
+              <description>
+                Represents the base TCP implementation in {{bibref|RFC793}} and elements of {{bibref|RFC2582}}
+              </description>
+            </enumeration>
+            <enumeration value="Reno">
+              <description>
+                Represents the base TCP implementation in {{bibref|RFC793}} with the additional algorithms defined in {{bibref|RFC2581}}
+              </description>
+            </enumeration>
+            <enumeration value="New Reno">
+              <description>
+                Described as a modification to the Reno algorithms in {{bibref|RFC2582}}
+              </description>
+            </enumeration>
+            <enumeration value="Vegas">
+              <description>
+                An emerging TCP congestion control mechanism
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.Processor.{i}." access="readOnly" numEntriesParameter="ProcessorNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.1" dmr:noUniqueKeys="true">
+      <description>
+        Each table entry represents a hardware or virtual processor that resides on this device.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Architecture" access="readOnly" dmr:version="2.1">
+        <description>
+          The architecture of the processor on the underlying hardware. {{enum}}
+          For processor architectures not included in this list, the vendor MAY include vendor-specific values, which MUST use the format defined in {{bibref|TR-106a4|Section 3.3}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="arm"/>
+            <enumeration value="i386"/>
+            <enumeration value="m68010"/>
+            <enumeration value="m68k"/>
+            <enumeration value="mipseb">
+              <description>
+                big-endian
+              </description>
+            </enumeration>
+            <enumeration value="mipsel">
+              <description>
+                little-endian
+              </description>
+            </enumeration>
+            <enumeration value="powerpc"/>
+            <enumeration value="sh3eb">
+              <description>
+                big-endian
+              </description>
+            </enumeration>
+            <enumeration value="sh3el">
+              <description>
+                little-endian
+              </description>
+            </enumeration>
+            <enumeration value="x86_64"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.VendorLogFile.{i}." access="readOnly" numEntriesParameter="VendorLogFileNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.1">
+      <description>
+        Each table entry represents a Vendor Log File.
+        This table of log files is informational only and does not allow the ACS to operate on these files in any way.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.1">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.1">
+        <description>
+          Name of the log file.
+          Typically this will be the full file system path, but provided that it is guaranteed to be unique across current and future log files, it MAY be a shorter name derived from the file system path, or be derived via another mechanism.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumSize" access="readOnly" dmr:version="2.1">
+        <description>
+          The maximum size of the log file in {{units}}.  If the device doesn't know the maximum file size then {{param}} will be 0.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Persistent" access="readOnly" dmr:version="2.1">
+        <description>
+          When {{true}}, the log file contents are preserved across a device reboot.
+          When {{false}}, the log file contents will be purged when the device is rebooted.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <command name="Upload()" async="true" dmr: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|Device.LocalAgent.TransferComplete!}} event.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="URL" mandatory="true" dmr:version="2.12">
+            <description>
+              URL, as defined in {{bibref|RFC3986}}, specifying the destination file location. HTTP and HTTPS transports MUST 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>
+              <string>
+                <size maxLength="256"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="Username" mandatory="true" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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 name="Device.DeviceInfo.Location.{i}." access="readWrite" numEntriesParameter="LocationNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        This object contains Location information.
+      </description>
+      <uniqueKey>
+        <parameter ref="Source"/>
+        <parameter ref="ExternalSource"/>
+      </uniqueKey>
+      <parameter name="Source" access="readOnly" dmr:version="2.4">
+        <description>
+          Identifies the source of the location data.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="GPS"/>
+            <enumeration value="AGPS"/>
+            <enumeration value="Manual"/>
+            <enumeration value="External"/>
+          </string>
+          <default type="object" value="External"/>
+        </syntax>
+      </parameter>
+      <parameter name="AcquiredTime" access="readOnly" dmr:version="2.4">
+        <description>
+          The time when the location was acquired.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ExternalSource" access="readOnly" dmr:version="2.4">
+        <description>
+          URL, MAC address, or other identifier that identifies an "External" source of this location.
+          Meaningful only if {{param|Source}} has a value of {{enum|External|Source}}, otherwise it MUST be {{empty}}.
+          If {{param|ExternalProtocol}} has a value of {{enum|CWMP|ExternalProtocol}},  this is the URL or IP address of the ACS.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ExternalProtocol" access="readOnly" dmr:version="2.4">
+        <description>
+          Protocol used to acquire a location from an "External" source. {{enum}}
+          Meaningful only if {{param|Source}} has a value of {{enum|External|Source}}, otherwise it MUST be {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="">
+              <description>
+                {{empty}}
+              </description>
+            </enumeration>
+            <enumeration value="CWMP"/>
+            <enumeration value="OMA-DM"/>
+            <enumeration value="SNMP"/>
+            <enumeration value="UPnP"/>
+            <enumeration value="HELD"/>
+            <enumeration value="DHCPv4"/>
+            <enumeration value="DHCPv6"/>
+            <enumeration value="LLDP-MED"/>
+            <enumeration value="MLP"/>
+            <enumeration value="Other"/>
+          </string>
+          <default type="object" value="CWMP"/>
+        </syntax>
+      </parameter>
+      <parameter name="DataObject" access="readWrite" dmr:version="2.4">
+        <description>
+          The currently valid location information.
+          Writable only when {{param|ExternalProtocol}} has a value of {{enum|CWMP|ExternalProtocol}}.
+          If obtained through the local GPS/AGPS then the location information is formatted according to {{bibref|RFC5491}}.
+          If manually configured then location information will be XML-formatted according to {{bibref|RFC5491}} (geographical information) and {{bibref|RFC5139}} (civic addresses).
+          If obtained by an external source this is the location information as received.
+          If it's an XML document (e.g. CWMP, OMA-DM, UPnP, HELD, MLP) the location information will be represented as-is, otherwise it will be converted to base64.
+          CWMP configured location information will be XML-formatted according to {{bibref|RFC5491}} (geographical information) and {{bibref|RFC5139}} (civic addresses).
+          Only zero or one Location object instance with value {{enum|CWMP|ExternalProtocol}} MUST exist at any given time.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1200"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.DeviceImageFile.{i}." access="readOnly" numEntriesParameter="DeviceImageNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.11">
+      <description>
+        This object describes an image of the device.
+      </description>
+      <uniqueKey>
+        <parameter ref="Location"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Location" access="readOnly" dmr:version="2.11">
+        <description>
+          The location of the device that represents the image as the user looks at the front of the device in its typical orientation (e.g., on-end, flat).
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Front"/>
+            <enumeration value="Back"/>
+            <enumeration value="Left"/>
+            <enumeration value="Right"/>
+            <enumeration value="Top"/>
+            <enumeration value="Bottom"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Image" access="readOnly" dmr:version="2.11">
+        <description>
+          The device image in PNG, JPEG or GIF format.
+        </description>
+        <syntax>
+          <base64/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DeviceInfo.FirmwareImage.{i}." access="readOnly" numEntriesParameter="FirmwareImageNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        Top-level object for mapping firmware images.
+        This is a static table – the number of object instances in this table is defined by the firmware that is currently running.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.12">
+        <description>
+          Firmware/software image name. Descriptive text of the image or filename.
+          The value of {{param}} is {{empty}} if {{param|Status}} is anything other than {{enum|Available|Status}}, {{enum|InstallationFailed|Status}}, or {{enum|ActivationFailed|Status}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.12">
+        <description>
+          A string identifying the version of the firmware image represented by this {{object}}. Whenever this firmware image is active (ie, the device has booted this firmware image), the value of the {{param|.DeviceInfo.SoftwareVersion}} parameter MUST be the same as the value contained in this parameter.
+          To allow version comparisons, this element SHOULD be in the form of dot-delimited integers, where each successive integer represents a more minor category of variation. For example, 3.0.21 where the components mean: ''Major.Minor.Build''.
+          The value of {{param}} is {{empty}} if {{param|Status}} is anything other than {{enum|Available|Status}}, {{enum|InstallationFailed|Status}}, or {{enum|ActivationFailed|Status}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Available" access="readWrite" dmr:version="2.12">
+        <description>
+          Specifies whether or not this particular firmware image can be used by the Agent. An Agent will only attempt to boot this particular firmware image if this parameter value is set to {{true}}.
+          This value MUST be set to {{true}} whenever a new firmware image is installed.
+          This value cannot be set to {{false}} if the firmware image is active or is referenced by the {{param|#.BootFirmwareImage}} parameter.
+          Firmware image instances cannot be deleted, so a Controller MAY use this parameter to subsequently mark a particular firmware as being invalid, which will prevent the Agent from attempting to boot it.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          Status of the firmware image, as determined by the Agent. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NoImage">
+              <description>
+                This Firmware Image instance is empty.
+                This value could happen on an Agent that supports multiple firmware images, but only has a single image installed.
+              </description>
+            </enumeration>
+            <enumeration value="Downloading">
+              <description>
+                This Firmware Image instance is being downloaded.
+              </description>
+            </enumeration>
+            <enumeration value="Validating">
+              <description>
+                This Firmware Image instance has been downloaded, and is in the process of being validated.
+              </description>
+            </enumeration>
+            <enumeration value="Available">
+              <description>
+                This Firmware Image instance has been downloaded, validated, and installed, and is ready to be activated.
+              </description>
+            </enumeration>
+            <enumeration value="DownloadFailed">
+              <description>
+                The Agent has attempted to download this Firmware Image instance, but ultimately failed while retrieving it from the source URL.
+              </description>
+            </enumeration>
+            <enumeration value="ValidationFailed">
+              <description>
+                The Agent has attempted to validate a Firmware Image downloaded to this instance, but ultimately failed while validating it.
+              </description>
+            </enumeration>
+            <enumeration value="InstallationFailed">
+              <description>
+                The Agent has attempted to install a Firmware Image downloaded and validated to this instance, but ultimately failed while installing it.
+              </description>
+            </enumeration>
+            <enumeration value="ActivationFailed">
+              <description>
+                The Agent has attempted to active this Firmware Image instance, but ultimately failed while being activated.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BootFailureLog" access="readOnly" dmr:version="2.12">
+        <description>
+          If the Agent is unable to boot into this firmware image, when specified, the Agent can use this parameter to record some information as to why the boot failed.
+          If the Agent successfully boots into this firmware, the value of this parameter SHOULD be {{empty}}. When a new firmware image is installed into this object instance, this parameter MUST be cleared.
+          The length of this string is defined as implementation-specific by the Agent.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <command name="Download()" async="true" dmr: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|Device.LocalAgent.TransferComplete!}} event.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="URL" mandatory="true" dmr:version="2.12">
+            <description>
+              URL, as defined in {{bibref|RFC3986}}, specifying the source file location. HTTP and HTTPS transports MUST 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>
+              <string>
+                <size maxLength="256"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="AutoActivate" mandatory="true" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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" dmr:version="2.12">
+        <description>
+          This command is issued to activate this {{object}} instance.
+          A {{object}} instance can also be activated by setting the {{param|Device.DeviceInfo.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|Device.DeviceInfo.ActiveFirmwareImage}} parameter.
+          A failed activation will result in this {{object}} instance's {{param|BootFailureLog}} being updated.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <object name="TimeWindow.{i}." minEntries="1" maxEntries="5" dmr:version="2.12">
+            <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" dmr:version="2.12">
+              <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" dmr:version="2.12">
+              <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" dmr:version="2.12">
+              <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" dmr:version="2.12">
+              <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" dmr:version="2.12">
+              <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 name="Device.Time." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains parameters relating an NTP or SNTP time client in the CPE.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the NTP or SNTP time client.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Status of Time support on the CPE.  {{enum}}
+          The {{enum|Unsynchronized}} value indicates that the CPE's absolute time has not yet been set.
+          The {{enum|Synchronized}} value indicates that the CPE has acquired accurate absolute time; its current time is accurate.
+          The {{enum|Error_FailedToSynchronize}} value indicates that the CPE failed to acquire accurate absolute time; its current time is not  accurate.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Unsynchronized"/>
+            <enumeration value="Synchronized"/>
+            <enumeration value="Error_FailedToSynchronize"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NTPServer1" access="readWrite" dmr:version="2.0">
+        <description>
+          First NTP timeserver.  Either a host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NTPServer2" access="readWrite" dmr:version="2.0">
+        <description>
+          Second NTP timeserver.  Either a host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NTPServer3" access="readWrite" dmr:version="2.0">
+        <description>
+          Third NTP timeserver.  Either a host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NTPServer4" access="readWrite" dmr:version="2.0">
+        <description>
+          Fourth NTP timeserver.  Either a host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NTPServer5" access="readWrite" dmr:version="2.0">
+        <description>
+          Fifth NTP timeserver.  Either a host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentLocalTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current date and time in the CPE's local time zone.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LocalTimeZone" access="readWrite" dmr:version="2.0">
+        <description>
+          The local time zone definition, encoded according to IEEE 1003.1 (POSIX).  The following is an example value:
+          : EST+5 EDT,M4.1.0/2,M10.5.0/2
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UserInterface." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains parameters relating to the user interface of the CPE.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.11">
+        <description>
+          Enables and disables the CPE's user interface.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="PasswordRequired" access="readWrite" dmr:version="2.0">
+        <description>
+          Present only if the CPE provides a password-protected LAN-side user interface.
+          Indicates whether or not the local user interface MUST require a password to be chosen by the user.  If {{false}}, the choice of  whether or not a password is used is left to the user.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PasswordUserSelectable" access="readWrite" dmr:version="2.0">
+        <description>
+          Present only if the CPE provides a password-protected LAN-side user interface and supports LAN-side  Auto-Configuration.
+          Indicates whether or not a password to protect the local user interface of the CPE MAY be selected by the user directly (i.e. {{param|.Users.User.{i}.Password}}), or MUST be equal to the password used by the LAN-side Auto-Configuration protocol (i.e. {{param|.LANConfigSecurity.ConfigPassword}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UpgradeAvailable" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates that a CPE upgrade is available, allowing the CPE to display this information to the  user.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="WarrantyDate" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates the date and time in UTC that the warranty associated with the CPE is to expire.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ISPName" access="readWrite" dmr:version="2.0">
+        <description>
+          The name of the customer's ISP.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ISPHelpDesk" access="readWrite" dmr:version="2.0">
+        <description>
+          The help desk phone number of the ISP.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ISPHomePage" access="readWrite" dmr:version="2.0">
+        <description>
+          The URL of the ISP's home page.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ISPHelpPage" access="readWrite" dmr:version="2.0">
+        <description>
+          The URL of the ISP's on-line support page.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ISPLogo" access="readWrite" dmr:version="2.0">
+        <description>
+          Base64 encoded GIF or JPEG image. The binary image is constrained to 4095 bytes or less.
+        </description>
+        <syntax>
+          <base64>
+            <size minLength="0" maxLength="4095"/>
+          </base64>
+        </syntax>
+      </parameter>
+      <parameter name="ISPLogoSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Un-encoded binary image size in bytes.
+          If ISPLogoSize input value is 0 then the ISPLogo is cleared.
+          ISPLogoSize can also be used as a check to verify correct transfer and conversion of Base64 string to image size.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="4095"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ISPMailServer" access="readWrite" dmr:version="2.0">
+        <description>
+          The URL of the ISP's mail server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ISPNewsServer" access="readWrite" dmr:version="2.0">
+        <description>
+          The URL of the ISP's news server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TextColor" access="readWrite" dmr:version="2.0">
+        <description>
+          The color of text on the GUI screens in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="BackgroundColor" access="readWrite" dmr:version="2.0">
+        <description>
+          The color of the GUI screen backgrounds in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="ButtonColor" access="readWrite" dmr:version="2.0">
+        <description>
+          The color of buttons on the GUI screens in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="ButtonTextColor" access="readWrite" dmr:version="2.0">
+        <description>
+          The color of text on buttons on the GUI screens in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="AutoUpdateServer" access="readWrite" dmr:version="2.0">
+        <description>
+          The server the CPE can check to see if an update is available for direct download to it.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UserUpdateServer" access="readWrite" dmr:version="2.0">
+        <description>
+          The server where a user can check via a web browser if an update is available for download to a PC.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AvailableLanguages" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items represent user-interface languages that are available, where each language is specified according to {{bibref|RFC3066}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentLanguage" access="readWrite" dmr:version="2.0">
+        <description>
+          Current user-interface language, specified according to {{bibref|RFC3066}}. The value MUST be a member of the list reported by the {{param|AvailableLanguages}} parameter.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="16"/>
+          </string>
+        </syntax>
+      </parameter>
+      <command name="PasswordReset()" dmr: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 name="Device.UserInterface.RemoteAccess." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains parameters relating to remotely accessing the CPE's user interface.
+        Remote access is defined as any entity not of a local subnet attempting to connect to the CPE.
+        Remote access requires user authentication.  To provide remote access authentication the CPE MUST support a "User" table with at least one instance that has "RemoteAccessCapable" set to {{true}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables remotely accessing the CPE's user interface.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.0">
+        <description>
+          Destination TCP port required for remote access connection.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedProtocols" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the protocols that are supported by the CPE for the purpose of remotely accessing the user interface.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="HTTP">
+              <description>
+                As defined in {{bibref|RFC2616}}
+              </description>
+            </enumeration>
+            <enumeration value="HTTPS">
+              <description>
+                As defined in {{bibref|RFC2818}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.0">
+        <description>
+          This is the protocol currently being used for remote access.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="SupportedProtocols"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UserInterface.LocalDisplay." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object describes how to remotely manage the initial positioning of a user interface on a device's local display.
+      </description>
+      <parameter name="Movable" access="readWrite" dmr:version="2.0">
+        <description>
+          Controls whether the user is allowed to change the GUI window position on the local CPE's display.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Resizable" access="readWrite" dmr:version="2.0">
+        <description>
+          Controls whether the user is allowed to resize the GUI window on the local CPE's display.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PosX" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The horizontal position of the User Interface's top left corner within the local CPE's display measured from the top left corner, expressed in {{units}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="pixels"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="PosY" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The vertical position of the User Interface's top left corner within the local CPE's display measured from the top left corner, expressed in {{units}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="pixels"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Width" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The width of the user interface within the local CPE's display, expressed in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="pixels"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Height" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The height of the user interface within the local CPE's display, expressed in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="pixels"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DisplayWidth" access="readOnly" dmr:version="2.0">
+        <description>
+          The width of the local CPE's display, expressed in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="pixels"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DisplayHeight" access="readOnly" dmr:version="2.0">
+        <description>
+          The height of the local CPE's display, expressed in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="pixels"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UserInterface.Messages." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        Definition of user information message displays.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.11">
+        <description>
+          Enables and displays the user information message.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="Title" access="readWrite" dmr:version="2.11">
+        <description>
+          Message title to be displayed.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SubTitle" access="readWrite" dmr:version="2.11">
+        <description>
+          Message sub title to be displayed.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Text" access="readWrite" dmr:version="2.11">
+        <description>
+          Message text.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="IconType" access="readWrite" dmr:version="2.11">
+        <description>
+          Icon to be displayed.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="Greeting"/>
+            <enumeration value="Information"/>
+            <enumeration value="Warning"/>
+            <enumeration value="Important"/>
+            <enumeration value="Urgent"/>
+            <enumeration value="Advertisement"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MessageColor" access="readWrite" dmr:version="2.11">
+        <description>
+          The color of message text in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="BackgroundColor" access="readWrite" dmr:version="2.11">
+        <description>
+          The color of the message screen background in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="TitleColor" access="readWrite" dmr:version="2.11">
+        <description>
+          The color of the message title in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="SubTitleColor" access="readWrite" dmr:version="2.11">
+        <description>
+          The color of the sub title in RGB hexadecimal notation (e.g., FF0088).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="RequestedNumberOfRepetitions" access="readWrite" dmr:version="2.11">
+        <description>
+          The number of times the device SHOULD repeat the message.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutedNumberOfRepetitions" access="readOnly" dmr:version="2.11">
+        <description>
+          The number of times the device repeated the message.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.InterfaceStack.{i}." access="readOnly" numEntriesParameter="InterfaceStackNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This table contains information about the relationships between the multiple layers of interface objects ({{bibref|TR-181i2|Section 4.3}}). In particular, it contains information on which interfaces run ''on top of'' which other interfaces.
+        This table is auto-generated by the CPE based on the ''LowerLayers'' parameters on individual interface objects.
+        Each table row represents a "link" between two interface objects, a higher-layer interface object (referenced by {{param|HigherLayer}}) and a lower-layer interface object (referenced by {{param|LowerLayer}}). Consequently, if a referenced interface object is deleted, the CPE MUST delete the corresponding {{object}} row(s) that had referenced it.
+      </description>
+      <uniqueKey>
+        <parameter ref="HigherLayer"/>
+        <parameter ref="LowerLayer"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="HigherLayer" access="readOnly" dmr:version="2.0">
+        <description>
+          {{noreference}}A reference to the interface object corresponding to the higher layer of the relationship, i.e. the interface which runs on ''top'' of the interface identified by the corresponding instance of {{param|LowerLayer}}.
+          When the referenced higher layer interface is deleted, the CPE MUST delete the table row.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayer" access="readOnly" dmr:version="2.0">
+        <description>
+          {{noreference}}A reference to the interface object corresponding to the lower layer of the relationship, i.e. the interface which runs ''below'' the interface identified by the corresponding instance of {{param|HigherLayer}}.
+          When the referenced lower layer interface is deleted, the CPE MUST delete the table row.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="HigherAlias" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the ''Alias'' parameter for the interface object referenced by {{param|HigherLayer}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LowerAlias" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the ''Alias'' parameter for the interface object referenced by {{param|LowerLayer}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object models DSL lines, DSL channels, DSL bonding, and DSL diagnostics. The specific interface objects defined here are {{object|Line}}, {{object|Channel}}, and {{object|BondingGroup}}. Each {{object|Line}} models a layer 1 DSL Line interface, and each {{object|Channel}} models a layer 1 DSL Channel interface where multiple channels can run over a DSL line. In the case where bonding is configured, it is expected that {{object|BondingGroup}} is stacked above the {{object|Channel}} instances within its group.
+      </description>
+      <parameter name="LineNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ChannelNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BondingGroupNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}." access="readOnly" numEntriesParameter="LineNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        DSL Line table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+        This table models physical DSL lines.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the DSL line.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EnableDataGathering" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables data gathering on the DSL line.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the DSL line (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the DSL line as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the DSL line entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          A string identifying the version of the modem firmware currently installed for this interface. This is applicable only when the modem firmware is separable from the overall CPE software.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LinkStatus" access="readOnly" dmr:version="2.0">
+        <description>
+          Status of the DSL physical link. {{enum}}
+          When {{param}} is {{enum|Up}}, {{param|Status}} is expected to be {{enum|Up|Status}}. When {{param}} is {{enum|Initializing}} or {{enum|EstablishingLink}} or {{enum|NoSignal}} or {{enum|Disabled}}, {{param|Status}} is expected to be {{enum|Down|Status}}.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Initializing"/>
+            <enumeration value="EstablishingLink"/>
+            <enumeration value="NoSignal"/>
+            <enumeration value="Disabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="StandardsSupported" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate which DSL standards and recommendations are supported by the {{object}} instance. {{enum}}
+          Note: In G.997.1, this parameter is called "xDSL Transmission system capabilities". See ITU-T Recommendation {{bibref|G.997.1}}.
+          This parameter is DEPRECATED because its entries are out-of-date; {{param|XTSE}} points to a current list.  Therefore its value MAY be {{empty}} if (and only if) {{param|XTSE}} is supported.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="G.992.1_Annex_A"/>
+            <enumeration value="G.992.1_Annex_B"/>
+            <enumeration value="G.992.1_Annex_C"/>
+            <enumeration value="T1.413"/>
+            <enumeration value="T1.413i2"/>
+            <enumeration value="ETSI_101_388"/>
+            <enumeration value="G.992.2"/>
+            <enumeration value="G.992.3_Annex_A"/>
+            <enumeration value="G.992.3_Annex_B"/>
+            <enumeration value="G.992.3_Annex_C"/>
+            <enumeration value="G.992.3_Annex_I"/>
+            <enumeration value="G.992.3_Annex_J"/>
+            <enumeration value="G.992.3_Annex_L"/>
+            <enumeration value="G.992.3_Annex_M"/>
+            <enumeration value="G.992.4"/>
+            <enumeration value="G.992.5_Annex_A"/>
+            <enumeration value="G.992.5_Annex_B"/>
+            <enumeration value="G.992.5_Annex_C"/>
+            <enumeration value="G.992.5_Annex_I"/>
+            <enumeration value="G.992.5_Annex_J"/>
+            <enumeration value="G.992.5_Annex_M"/>
+            <enumeration value="G.993.1"/>
+            <enumeration value="G.993.1_Annex_A"/>
+            <enumeration value="G.993.2_Annex_A"/>
+            <enumeration value="G.993.2_Annex_B"/>
+            <enumeration value="G.993.2_Annex_C"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="XTSE" access="readOnly" dmr:version="2.8">
+        <description>
+          This configuration parameter defines the transmission system types to be allowed by the xTU on this {{object}} instance. Each bit is 0 if not allowed or 1 if allowed, as defined for the xTU transmission system enabling (XTSE) in ITU-T G.997.1.
+          Note: This parameter is defined as xDSL Transmission system enabling (XTSE) in ITU-T G.997.1. For a full definition, see Clause 7.3.1.1.1 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="8" maxLength="8"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="StandardUsed" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          Indicates the standard that the {{object}} instance is using for the connection.
+          Note: In G.997.1, this parameter is called "xDSL Transmission system". See ITU-T Recommendation {{bibref|G.997.1}}.
+          This parameter is DEPRECATED because its entries are out-of-date; {{param|XTSE}} points to a current list.  Therefore its value MAY be {{empty}} if (and only if) {{param|XTSUsed}} is supported.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="StandardsSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="XTSUsed" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter indicates which DSL standard and recommendation are currently in use by the {{object}} instance. Only one bit is set, as defined for the xTU transmission system enabling (XTSE) in ITU-T G.997.1.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="8" maxLength="8"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="LineEncoding" access="readOnly" dmr:version="2.0">
+        <description>
+          The line encoding method used in establishing the Layer 1 DSL connection between the CPE and the DSLAM.  {{enum}}
+          Note: Generally speaking, this variable does not change after provisioning.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DMT"/>
+            <enumeration value="CAP"/>
+            <enumeration value="2B1Q"/>
+            <enumeration value="43BT"/>
+            <enumeration value="PAM"/>
+            <enumeration value="QAM"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AllowedProfiles" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate which VDSL2 profiles are allowed on the line.  {{enum}}
+          Note:  In G.997.1, this parameter is called PROFILES.  See ITU-T Recommendation {{bibref|G.997.1}}.
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be {{empty}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="8a"/>
+            <enumeration value="8b"/>
+            <enumeration value="8c"/>
+            <enumeration value="8d"/>
+            <enumeration value="12a"/>
+            <enumeration value="12b"/>
+            <enumeration value="17a"/>
+            <enumeration value="17b" status="deleted"/>
+            <enumeration value="30a"/>
+            <enumeration value="35b"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentProfile" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates which VDSL2 profile is currently in use on the line.
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="AllowedProfiles" nullValue=""/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PowerManagementState" access="readOnly" dmr:version="2.0">
+        <description>
+          The power management state of the line. {{enum}}
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="L0"/>
+            <enumeration value="L1"/>
+            <enumeration value="L2"/>
+            <enumeration value="L3"/>
+            <enumeration value="L4"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessFailureCause" access="readOnly" dmr:version="2.0">
+        <description>
+          The success failure cause of the initialization. An enumeration of the following integer values:
+          * 0: Successful
+          * 1: Configuration error.  This error occurs with inconsistencies in configuration parameters, e.g. when the line is initialized in  an xDSL Transmission system where an xTU does not support the configured Maximum Delay or the configured Minimum or Maximum Data Rate  for one or more bearer channels.
+          * 2: Configuration not feasible on the line.  This error occurs if the Minimum Data Rate cannot be reached on the line with the  Minimum Noise Margin, Maximum PSD level, Maximum Delay and Maximum Bit Error Ratio for one or more bearer channels.
+          * 3: Communication problem.  This error occurs, for example, due to corrupted messages or bad syntax messages or if no common mode  can be selected in the G.994.1 handshaking procedure or due to a timeout.
+          * 4: No peer xTU detected.  This error occurs if the peer xTU is not powered or not connected or if the line is too long to allow  detection of a peer xTU.
+          * 5: Any other or unknown Initialization Failure cause.
+          * 6: ITU T G.998.4 retransmission mode was not selected while RTX_MODE = FORCED or with RTX_MODE = RTX_TESTMODE.
+          Note: In G.997.1, this parameter is called "Initialization success/failure cause". See Clause 7.5.1.6 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="6"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UPBOKLER" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter contains the estimated electrical loop length estimated by the VTU-R expressed in {{units}} at 1MHz (see O-UPDATE in section 12.2.4.2.1.2/G.993.2). The value is coded as an unsignedInt in the range 0 (coded as 0) to 128 dB (coded as 1280) in steps of {{units}}.
+          Note: This parameter is defined as UPBOKLE-R in Clause 7.5.1.23.2 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1280"/>
+            <units value="0.1 dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UPBOKLEPb" access="readOnly" dmr:version="2.8">
+        <description>
+          VTU-O estimated upstream power back-off electrical length per band.
+          This parameter is a vector of UPBO electrical length per-band estimates for each supported downstream band, expressed in {{units}} at 1 MHz (kl0) calculated by the VTU-R, based on separate measurements in the supported upstream bands. The value of each list element ranges from 0 to 128 dB in steps of {{units}}, with special value 204.7 which indicates that the estimate is greater than 128 dB. This parameter is required for the alternative electrical length estimation method (ELE-M1).
+          Note: This parameter is defined as UPBOKLE-pb in Clause 7.5.1.23.3 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1280"/>
+            <range minInclusive="2047" maxInclusive="2047"/>
+            <units value="0.1 dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UPBOKLERPb" access="readOnly" dmr:version="2.8">
+        <description>
+          VTU-R estimated upstream power back-off electrical length per band.
+          This parameter is a vector of UPBO electrical length per-band estimates for each supported downstream band, expressed in {{units}} at 1 MHz (kl0) calculated by the VTU-R, based on separate measurements in the supported downstream bands. The value of each list element ranges from 0 to 128 dB in steps of {{units}}, with special value 204.7 which indicates that the estimate is greater than 128 dB. This parameter is required for the alternative electrical length estimation method (ELE-M1).
+          The value of each list element is coded as an unsigned 16 bit number in the range 0 (coded as 0) to 128 dB (coded as 1280) in steps of {{units}}.
+          Note: This parameter is defined as UPBOKLE-R-pb in Clause 7.5.1.23.4 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1280"/>
+            <range minInclusive="2047" maxInclusive="2047"/>
+            <units value="0.1 dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RXTHRSHds" access="readOnly" dmr:version="2.8">
+        <description>
+          UPBO downstream receiver signal level threshold.
+          This parameter reports the downstream received signal level threshold value used in the alternative electrical length estimation method (ELE-M1). This parameter represents an offset from -100 dBm/Hz, and ranges from -64 dB to 0 dB in steps of {{units}}.
+          The value is coded as a 16 bit number in the range -64 (coded as -640) to 0 dB (coded as 0) in steps of {{units}}.
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-640" maxInclusive="0"/>
+            <units value="0.1 dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ACTRAMODEds" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter indicates the actual active rate adaptation mode in the downstream direction.
+          * If {{param}} equals 1, the link is operating in RA-MODE 1 (MANUAL).
+          * If {{param}} equals 2, the link is operating in RA-MODE 2 (AT_INIT).
+          * If {{param}} equals 3, the link is operating in RA-MODE 3 (DYNAMIC).
+          * If {{param}} equals 4, the link is operating in RA-MODE 4 (DYNAMIC with SOS).
+          Note: This parameter is defined as ACT-RA-MODEds in Clause 7.5.1.33.1 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="4"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ACTRAMODEus" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter indicates the actual active rate adaptation mode in the upstream direction.
+          * If {{param}} equals 1, the link is operating in RA-MODE 1 (MANUAL).
+          * If {{param}} equals 2, the link is operating in RA-MODE 2 (AT_INIT).
+          * If {{param}} equals 3, the link is operating in RA-MODE 3 (DYNAMIC).
+          * If {{param}} equals 4, the link is operating in RA-MODE 4 (DYNAMIC with SOS).
+          Note: This parameter is defined as ACT-RA-MODEus in Clause 7.5.1.33.2 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="4"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ACTINPROCds" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter reports the actual impulse noise protection (INP) of the robust overhead channel (ROC) in the downstream direction. The format and usage is identical to the channel status parameter {{param|#.Channel.{i}.ACTINP}}.
+          Note: This parameter is defined as ACTINP-ROC-ds in Clause 7.5.1.34.1 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ACTINPROCus" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter reports the actual impulse noise protection (INP) of the robust overhead channel (ROC) in the upstream direction. The format and usage is identical to the channel status parameter {{param|#.Channel.{i}.ACTINP}}.
+          Note: This parameter is defined as ACTINP-ROC-us in Clause 7.5.1.34.2 ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMROCds" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter reports the actual signal-to-noise margin of the robust overhead channel (ROC) in the downstream direction (expressed in {{units}}). The format is identical to the format of the line status parameter SNRM margin {{param|DownstreamNoiseMargin}}.
+          Note: This parameter is defined as SNRM-ROC-ds in Clause 7.5.1.35.1 ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="0.1 dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMROCus" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter reports the actual signal-to-noise margin of the robust overhead channel (ROC) in the upstream direction (expressed in {{units}}). The format is identical to the format of the line status parameter SNRM margin ({{param|UpstreamNoiseMargin}}).
+          Note: This parameter is defined as SNRM-ROC-us in Clause 7.5.1.35.2 ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="0.1 dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastStateTransmittedDownstream" access="readOnly" dmr:version="2.0">
+        <description>
+          This parameter represents the last successful transmitted initialization state in the downstream direction in  the last full initialization performed on the line.  Initialization states are defined in the individual xDSL Recommendations and are  counted from 0 (if G.994.1 is used) or 1 (if G.994.1 is not used) up to Showtime.  This parameter needs to be interpreted along with  the xDSL Transmission System.
+          This parameter is available only when, after a failed full initialization, the line diagnostics procedures are activated on the  line.
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LastStateTransmittedUpstream" access="readOnly" dmr:version="2.0">
+        <description>
+          This parameter represents the last successful transmitted initialization state in the upstream direction in the  last full initialization performed on the line.  Initialization states are defined in the individual xDSL Recommendations and are  counted from 0 (if G.994.1 is used) or 1 (if G.994.1 is not used) up to Showtime.  This parameter needs to be interpreted along with  the xDSL Transmission System.
+          This parameter is available only when, after a failed full initialization, the line diagnostics procedures are activated on the  line.
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPBOKLE" access="readOnly" dmr:version="2.0">
+        <description>
+          This parameter contains the estimated electrical loop length expressed in {{units}} at 1MHz (see O-UPDATE  in section 12.2.4.2.1.2/G.993.2).  The value SHALL be coded as an unsigned 16 bit number in the range 0 (coded as 0) to 128 dB (coded  as 1280) in steps of 0.1 dB.
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1280"/>
+            <units value="0.1dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MREFPSDds" access="readOnly" dmr:version="2.0">
+        <description>
+          This parameter SHALL contain the set of breakpoints exchanged in the MREFPSDds fields of the O-PRM message of  G.993.2. Base64 encoded of the binary representation defined in Table 12-19/G.993.2 (maximum length is 145 octets, which requires 196  bytes for Base64 encoding).
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <base64>
+            <size minLength="0" maxLength="145"/>
+          </base64>
+        </syntax>
+      </parameter>
+      <parameter name="MREFPSDus" access="readOnly" dmr:version="2.0">
+        <description>
+          This parameter SHALL contain the set of breakpoints exchanged in the MREFPSDus fields of the R-PRM message of  G.993.2. Base64 encoded of the binary representation defined in Table 12-19/G.993.2 (maximum length is 145 octets, which requires 196  bytes for Base64 encoding).
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <base64>
+            <size minLength="0" maxLength="145"/>
+          </base64>
+        </syntax>
+      </parameter>
+      <parameter name="LIMITMASK" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the enabled VDSL2 Limit PSD mask of the selected PSD mask class.  Bit mask as specified in ITU-T  Recommendation G.997.1.
+          Note:  For a VDSL2-capable multimode device operating in a mode other than VDSL2, the value of this parameter SHOULD be set to  0.
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="US0MASK" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the allowed VDSL2 US0 PSD masks for Annex A operation.  Bit mask as specified in see ITU-T  Recommendation G.997.1.
+          Note:  For a VDSL2-capable multimode device operating in a mode other than VDSL2, the value of this parameter SHOULD be set to  0.
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TRELLISds" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports whether trellis coding is enabled in the downstream direction.  A value of 1 indicates that trellis  coding is in use, and a value of 0 indicates that the trellis is disabled.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to -1.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="TRELLISus" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports whether trellis coding is enabled in the upstream direction.  A value of 1 indicates that trellis coding  is in use, and a value of 0 indicates that the trellis is disabled.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to -1.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="ACTSNRMODEds" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports whether the OPTIONAL virtual noise mechanism is in use in the downstream direction.  A value of 1  indicates the virtual noise mechanism is not in use, and a value of 2 indicates the virtual noise mechanism is in use.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ACTSNRMODEus" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports whether the OPTIONAL virtual noise mechanism is in use in the upstream direction.  A value of 1  indicates the virtual noise mechanism is not in use, and a value of 2 indicates the virtual noise mechanism is in use.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="VirtualNoisePSDds" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the virtual noise PSD for the downstream direction. Base64 encoded of the binary representation defined  in G.997.1 by the parameter called TXREFVNds (maximum length is 97 octets, which requires 132 bytes for Base64 encoding).
+          See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value of  this parameter SHOULD be set to {{empty}}.
+        </description>
+        <syntax>
+          <base64>
+            <size minLength="0" maxLength="97"/>
+          </base64>
+        </syntax>
+      </parameter>
+      <parameter name="VirtualNoisePSDus" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the virtual noise PSD for the upstream direction. Base64 encoded of the binary representation defined in  G.997.1by the parameter called TXREFVNus (maximum length is 49 octets, which requires 68 bytes for Base64 encoding).
+          See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value of  this parameter SHOULD be set to {{empty}}.
+        </description>
+        <syntax>
+          <base64>
+            <size minLength="0" maxLength="49"/>
+          </base64>
+        </syntax>
+      </parameter>
+      <parameter name="ACTUALCE" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the actual cyclic extension, as the value of m, in use for the connection.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 99.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LineNumber" access="readOnly" dmr:version="2.0">
+        <description>
+          Signifies the line pair that the modem is using to connection.  {{param}} = 1 is the innermost  pair.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="1"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamMaxBitRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current maximum attainable data rate upstream (expressed in {{units}}).
+          Note:  This parameter is related to the G.997.1 parameter ATTNDRus, which is measured in bits/s.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamMaxBitRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current maximum attainable data rate downstream (expressed in {{units}}).
+          Note:  This parameter is related to the G.997.1 parameter ATTNDRds, which is measured in bits/s.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamNoiseMargin" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current signal-to-noise ratio margin (expressed in {{units}}) in the upstream direction.
+          Note:  In G.997.1, this parameter is called SNRMus.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamNoiseMargin" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current signal-to-noise ratio margin (expressed in {{units}}) in the downstream direction.
+          Note:  In G.997.1, this parameter is called SNRMds.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMpbus" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the current signal-to-noise ratio margin of each upstream band.  Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="24"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMpbds" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the current signal-to-noise ratio margin of each band.  Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="24"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="INMIATOds" access="readOnly" dmr:version="2.0">
+        <description>
+          The Impulse Noise Monitoring (INM) Inter Arrival Time (IAT) Offset, measured in DMT symbols, that the xTU  receiver uses to determine in which bin of the IAT histogram the IAT is reported.
+          Note:  In G.997.1, this parameter is called INMIATO.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="3" maxInclusive="511"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="INMIATSds" access="readOnly" dmr:version="2.0">
+        <description>
+          The Impulse Noise Monitoring (INM)  Inter Arrival Time (IAT) Step that the xTU receiver uses to determine in  which bin of the IAT histogram the IAT is reported.
+          Note:  In G.997.1, this parameter is called INMIATS.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="INMCCds" access="readOnly" dmr:version="2.0">
+        <description>
+          The Impulse Noise Monitoring (INM) Cluster Continuation value, measured in DMT symbols, that the xTU receiver  uses in the cluster indication process.
+          Note:  In G.997.1, this parameter is called INMCC.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="64"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="INMINPEQMODEds" access="readOnly" dmr:version="2.0">
+        <description>
+          The Impulse Noise Monitoring (INM) Equivalent Impulse Noise Protection (INP) Mode that the xTU receiver uses in  the computation of the Equivalent INP.
+          Note:  In G.997.1, this parameter is called INM_INPEQ_MODE.  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="3"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamAttenuation" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current upstream signal loss (expressed in {{units}}).
+          Doesn't apply to VDSL2 {{bibref|G.993.2}}. Otherwise has the same value as the single element of {{param|TestParams.SATNus}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamAttenuation" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current downstream signal loss (expressed in {{units}}).
+          Doesn't apply to VDSL2 {{bibref|G.993.2}}. Otherwise has the same value as the single element of {{param|TestParams.SATNds}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamPower" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current output power at the CPE's DSL line (expressed in {{units}}).
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dBmV"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamPower" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current received power at the CPE's DSL line (expressed in {{units}}).
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dBmV"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="XTURVendor" access="readOnly" dmr:version="2.0">
+        <description>
+          xTU-R vendor identifier as defined in G.994.1 and T1.413.  In the case of G.994.1 this corresponds to the four-octet provider code, which MUST be represented as eight hexadecimal digits.
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, it MUST have the value "00000000".
+          Note: In G.997.1, this parameter is called "xTU-R G.994.1 Vendor ID". See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="4" maxLength="4"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="XTURCountry" access="readOnly" dmr:version="2.0">
+        <description>
+          T.35 country code of the xTU-R vendor as defined in G.994.1, where the two-octet value defined in G.994.1 MUST be represented as four hexadecimal digits.
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, it MUST have the value "0000".
+          Note: In G.997.1, this parameter is called "xTU-R G.994.1 Vendor ID". See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="2" maxLength="2"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="XTURANSIStd" access="readOnly" dmr:version="2.0">
+        <description>
+          xTU-R T1.413 Revision Number as defined in T1.413 Issue 2.
+          When T1.413 modulation is not in use, the parameter value SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURANSIRev" access="readOnly" dmr:version="2.0">
+        <description>
+          xTU-R Vendor Revision Number as defined in T1.413 Issue 2.
+          When T1.413 modulation is not in use, the parameter value SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCVendor" access="readOnly" dmr:version="2.0">
+        <description>
+          xTU-C vendor identifier as defined in G.994.1 and T1.413.  In the case of G.994.1 this corresponds to the four-octet provider code, which MUST be represented as eight hexadecimal digits.
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, it MUST have the value "00000000".
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="4" maxLength="4"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCCountry" access="readOnly" dmr:version="2.0">
+        <description>
+          T.35 country code of the xTU-C vendor as defined in G.994.1, where the two-octet value defined in G.994.1 MUST be represented as four hexadecimal digits.
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, it MUST have the value "0000".
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="2" maxLength="2"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCANSIStd" access="readOnly" dmr:version="2.0">
+        <description>
+          xTU-C T1.413 Revision Number as defined in T1.413 Issue 2.
+          When T1.413 modulation is not in use, the parameter value SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCANSIRev" access="readOnly" dmr:version="2.0">
+        <description>
+          xTU-C Vendor Revision Number as defined in T1.413 Issue 2.
+          When T1.413 modulation is not in use, the parameter value SHOULD be 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|Total}} statistics.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ShowtimeStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the most recent DSL Showtime - the beginning of the period used for collection of {{object|Showtime}} statistics.
+          Showtime is defined as successful completion of the DSL link establishment process.  The ''Showtime'' statistics are those collected  since the most recent establishment of the DSL link.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastShowtimeStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the second most recent DSL Showtime-the beginning of the period used for collection of {{object|LastShowtime}} statistics.
+          If the CPE has not retained information about the second most recent Showtime (e.g., on reboot), the start of ''LastShowtime''  statistics MAY temporarily coincide with the start of ''Showtime'' statistics.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentDayStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|CurrentDay}} statistics.
+          The CPE MAY align the beginning of each ''CurrentDay'' interval with days in the UTC time zone, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QuarterHourStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|QuarterHour}} statistics.
+          The CPE MAY align the beginning of each ''QuarterHour'' interval with real-time quarter-hour intervals, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.Stats.Total." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL line total statistics. See {{bibref|G.997.1|Chapter 7.2.6}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of errored seconds (ES-L as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of severely errored seconds (SES-L as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.Stats.Showtime." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL line statistics accumulated since the most recent DSL Showtime. See {{bibref|G.997.1|Chapter 7.2.6}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of errored seconds since the most recent DSL Showtime (ES-L as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of severely errored seconds since the most recent DSL Showtime (SES-L as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.Stats.LastShowtime." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL line statistics accumulated since the second most recent DSL Showtime. See {{bibref|G.997.1|Chapter 7.2.6}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of errored seconds since the second most recent DSL Showtime (ES-L as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of severely errored seconds since the second most recent DSL Showtime (SES-L as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.Stats.CurrentDay." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL line statistics accumulated during the current day. See {{bibref|G.997.1|Chapter 7.2.6}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of errored seconds since the second most recent DSL Showtime (ES-L as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of severely errored seconds since the second most recent DSL Showtime (SES-L as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.Stats.QuarterHour." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL line statistics accumulated during the current quarter hour. See {{bibref|G.997.1|Chapter 7.2.6}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of errored seconds since the second most recent DSL Showtime (ES-L as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of severely errored seconds since the second most recent DSL Showtime (SES-L as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: This parameter is OPTIONAL at the G and S/T interfaces in G.997.1 Amendment 1.  If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.TestParams." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains the DSL line test parameters that are available during the L0 (i.e., Showtime)  state.
+      </description>
+      <parameter name="HLOGGds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the downstream direction for {{param|HLOGpsds}}. Valid values are 1, 2, 4, 8, and 16.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGGus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the upstream direction for {{param|HLOGpsus}}.  Valid values are  1, 2, 4, and 8.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGpsds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the downstream logarithmic line characteristics per sub-carrier group.  The maximum number of elements is 256 for G.992.3, and 512 for G.992.5.  For G.993.2, the number of elements will depend on the value of  {{param|HLOGGds}} but will not exceed 512. Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+          Note: {{param}} is measured during initialization and is not updated during Showtime.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2559"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGpsus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the upstream logarithmic line characteristics per sub-carrier group.  The maximum number of elements is 64 for G.992.3 and G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|HLOGGus}} but will not exceed 512. Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+          Note: {{param}} is measured during initialization and is not updated during Showtime.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2559"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGMTds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|HLOGpsds}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="HLOGMTus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|HLOGpsus}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNGds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the downstream direction for {{param|QLNpsds}}. Valid values are 1, 2, 4, 8, and 16.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNGus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the upstream direction for {{param|QLNpsus}}.  Valid values are  1, 2, 4, and 8.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNpsds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the downstream quiet line noise per subcarrier group.  The maximum number of elements is 256 for G.992.3 and G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|QLNGds}} but will not exceed 512.  Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+          Note: {{param}} is measured during initialization and is not updated during Showtime.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2047"/>
+          </list>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNpsus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the upstream quiet line noise per subcarrier group.  The maximum number of elements is 64 for  G.992.3 and G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|QLNGus}} but will not exceed 512.  Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+          Note: {{param}} is measured during initialization and is not updated during Showtime.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2047"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNMTds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|QLNpsds}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QLNMTus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|QLNpsus}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRGds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the downstream direction for {{param|SNRpsds}}. Valid values are 1, 2, 4, 8, and 16.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRGus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of sub-carriers per sub-carrier group in the upstream direction for {{param|SNRpsus}}.  Valid values are  1, 2, 4, and 8.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRpsds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the downstream SNR per subcarrier group.  The maximum number of elements is 256 for G.992.3, and 512 for G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|SNRGds}} but will not exceed 512.  Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+          Note: {{param}} is first measured during initialization and is updated during Showtime.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2047"/>
+          </list>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRpsus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the upstream SNR per subcarrier group.  The maximum number of elements is 64 for G.992.3 and  G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|SNRGus}} but will not exceed 512. Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+          Note: {{param}} is first measured during initialization and is updated during Showtime.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2047"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMTds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|SNRpsds}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMTus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Indicates the number of symbols over which {{param|SNRpsus}} was measured.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LATNds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the downstream line attenuation averaged across all sub-carriers in the frequency band, as computed during initialization.  Number  of elements is dependent on the number of downstream bands but will exceed one only for ITU-T G.993.2. Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="35"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="LATNus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the upstream line attenuation averaged across all sub-carriers in the frequency band, as computed during initialization.  Number of  elements is dependent on the number of upstream bands but will exceed one only for ITU-T G.993.2.  Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="35"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SATNds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the downstream signal attenuation averaged across all active sub-carriers in the frequency band, as computed during the L0 (i.e., Showtime)  state.  Number of elements is dependent on the number of downstream bands but will exceed one only for ITU-T G.993.2.  Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="35"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SATNus" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the upstream signal attenuation averaged across all active sub-carriers in the frequency band, as computed during the L0 (i.e., Showtime) state.  Number of elements is dependent on the number of downstream bands but will exceed one only for ITU-T G.993.2.  Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="35"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Line.{i}.DataGathering." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object models the DSL data gathering function at the VTU-R. This only applies to VDSL2.
+        Note: see ITU-T Recommendation {{bibref|G.993.2}}.
+      </description>
+      <parameter name="LoggingDepthR" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter is the maximum depth of the entire data gathering event buffer at the VTU-R, in number of {{units}}, where each of the {{units}} consists of 6 bytes indicating a data gathering event as defined in {{bibref|G.993.2}}.
+          Note: This parameter is defined as LOGGING_DEPTH_R in Clause 7.5.3.2 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="records"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ActLoggingDepthReportingR" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter is actual logging depth that is used for reporting the VTU-R event trace buffer over the eoc channel, in number of {{units}}, where each of the {{units}} consists of 6 bytes indicating a data gathering event as defined in {{bibref|G.993.2}}.
+          Note: This parameter is defined as ACT_LOGGING_DEPTH_REPORTING_R in Clause 7.5.3.4 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="records"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="EventTraceBufferR" access="readOnly" dmr:version="2.8">
+        <description>
+          This parameter identifies the log file of the the data gathering event trace buffer containing the event records that originated at the VTU-R.
+          This indicates the table entry that represents a Vendor Log File that contains the data gathering buffer at the VTU-R in the {{object|###.DeviceInfo.VendorLogFile}} table.
+          This data gathering buffer MAY be retrieved wia an upload RPC of the identified Vendor Log File.
+          Note: This parameter is defined as EVENT_TRACE_BUFFER_R in Clause 7.5.3.6 of ITU-T Recommendation {{bibref|G.997.1}} and Clause 11.5 of ITU-T Recommendation {{bibref|G.993.2}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".DeviceInfo.VendorLogFile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Channel.{i}." access="readOnly" numEntriesParameter="ChannelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        DSL Channel table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+        This table models DSL channel(s) on top of physical DSL lines.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the channel.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the channel (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the channel as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the channel entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LinkEncapsulationSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate which link encapsulation standards and recommendations are supported by the {{object}} instance.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="G.992.3_Annex_K_ATM"/>
+            <enumeration value="G.992.3_Annex_K_PTM"/>
+            <enumeration value="G.993.2_Annex_K_ATM"/>
+            <enumeration value="G.993.2_Annex_K_PTM"/>
+            <enumeration value="G.994.1">
+              <description>
+                Auto
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LinkEncapsulationUsed" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the link encapsulation standard that the {{object}} instance is using for the connection.  {{enum}}
+          When ATM encapsulation is identified then an upper-layer {{object|.ATM.Link}} interface MUST be used.
+          When PTM encapsulation is identified then an upper-layer {{object|.PTM.Link}} interface MUST be used.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="G.992.3_Annex_K_ATM"/>
+            <enumeration value="G.992.3_Annex_K_PTM"/>
+            <enumeration value="G.993.2_Annex_K_ATM"/>
+            <enumeration value="G.993.2_Annex_K_PTM"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LPATH" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the index of the latency path supporting the bearer channel.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1|Section 7.5.2.7}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="3"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="INTLVDEPTH" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the interleaver depth D for the latency path indicated in {{param|LPATH}}.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.  For a multimode device operating in a mode in which this parameter does not apply, the value of this parameter SHOULD be set to 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="INTLVBLOCK" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the interleaver block length in use on the latency path indicated in {{param|LPATH}}.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to -1.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="ActualInterleavingDelay" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the actual delay, in {{units}}, of the latency path due to interleaving.
+          Note:  In G.997.1, this parameter is called "Actual Interleaving Delay." See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ACTINP" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the actual impulse noise protection (INP) provided by the latency path indicated in {{param|LPATH}}.  The value is  the actual INP in the L0 (i.e., Showtime) state.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to -1.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="INPREPORT" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports whether the value reported in ACTINP was computed assuming the receiver does not use erasure decoding.   Valid values are 0 (computed per the formula assuming no erasure decoding) and 1 (computed by taking into account erasure decoding  capabilities of receiver).
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}.  For a multimode device operating in a mode in which this parameter does not apply, the  value of this parameter SHOULD be set to {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="NFEC" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the size, in {{units}}, of the Reed-Solomon codeword in use on the latency path indicated in {{param|LPATH}}.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to -1.
+        </description>
+        <syntax>
+          <int>
+            <units value="octets"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="RFEC" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the number of redundancy bytes per Reed-Solomon codeword on the latency path indicated in {{param|LPATH}}.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to -1.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="LSYMB" access="readOnly" dmr:version="2.0">
+        <description>
+          Reports the number of bits per symbol assigned to the latency path indicated in {{param|LPATH}}.  This value does not  include overhead due to trellis coding.
+          Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to -1.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamCurrRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current physical layer aggregate data rate (expressed in {{units}}) of the upstream DSL connection.
+          Note: If the parameter is implemented but no value is  available, it MUST have the value 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamCurrRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current physical layer aggregate data rate (expressed in {{units}}) of the downstream DSL connection.
+          Note: If the parameter is implemented but no value is  available, it MUST have the value 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ACTNDR" access="readOnly" dmr:version="2.8">
+        <description>
+          Actual net data rate expressed in {{units}}. Independent whether retransmission is used or not in a given transmit direction:
+          * In L0 state, this parameter reports the net data rate (as specified in [ITU T G.992.3], [ITU T G.992.5] or [ITU T G.993.2]) at which the bearer channel is operating.
+          * In L2 state, the parameter contains the net data rate (as specified in [ITU T G.992.3], [ITU T G.992.5] or [ITU T G.993.2]) in the previous L0 state.
+          Note: See ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ACTINPREIN" access="readOnly" dmr:version="2.8">
+        <description>
+          Actual impulse noise protection against REIN, expressed in {{units}}.
+          If retransmission is used in a given transmit direction, this parameter reports the actual impulse noise protection (INP) against REIN (under specific conditions detailed in [ITU T G.998.4]) on the bearer channel in the L0 state. In the L2 state, the parameter contains the INP in the previous L0 state.
+          The value is coded in fractions of DMT symbols with a granularity of 0.1 symbols.
+          The range is from 0 to 25.4. A special value of 25.5 indicates an ACTINP_REIN of 25.5 or higher.
+          Note: This parameter is defined as ACTINP_REIN in Clause 7.5.2.9 of ITU-T Recommendation {{bibref|G.997.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+            <units value="0.1 DMT symbols"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Channel.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|Total}} statistics.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ShowtimeStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the most recent DSL Showtime - the beginning of the period used for collection of {{object|Showtime}} statistics.
+          Showtime is defined as successful completion of the DSL link establishment process.  The ''Showtime'' statistics are those collected  since the most recent establishment of the DSL link.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastShowtimeStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the second most recent DSL Showtime-the beginning of the period used for collection of {{object|LastShowtime}} statistics.
+          If the CPE has not retained information about the second most recent Showtime (e.g., on reboot), the start of ''LastShowtime''  statistics MAY temporarily coincide with the start of ''Showtime'' statistics.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentDayStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|CurrentDay}} statistics.
+          The CPE MAY align the beginning of each ''CurrentDay'' interval with days in the UTC time zone, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QuarterHourStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|QuarterHour}} statistics.
+          The CPE MAY align the beginning of each ''QuarterHour'' interval with real-time quarter-hour intervals, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Channel.{i}.Stats.Total." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL channel total statistics {{bibref|G.997.1}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="XTURFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of FEC errors detected (FEC-C as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of FEC errors detected by the ATU-C (FEC-CFE as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of HEC errors detected (HEC-P as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of HEC errors detected by the ATU-C (HEC-PFE as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of CRC errors detected (CV-C as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of CRC errors detected by the ATU-C (CV-CFE as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Channel.{i}.Stats.Showtime." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL channel statistics accumulated since the most recent DSL Showtime {{bibref|G.997.1}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="XTURFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected since the most recent DSL Showtime (FEC-C as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected by the ATU-C since the most recent DSL Showtime (FEC-CFE as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected since the most recent DSL Showtime (HEC-P as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected by the ATU-C since the most recent DSL Showtime (HEC-PFE as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected since the most recent DSL Showtime (CV-C as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected by the ATU-C since the most recent DSL Showtime (CV-CFE as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Channel.{i}.Stats.LastShowtime." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL channel statistics accumulated since the second most recent DSL Showtime {{bibref|G.997.1}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="XTURFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected since the second most recent DSL Showtime (FEC-C as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected by the ATU-C since the second most recent DSL Showtime (FEC-CFE as defined in  ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected since the second most recent DSL Showtime (HEC-P as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected by the ATU-C since the second most recent DSL Showtime (HEC-PFE as defined in  ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected since the second most recent DSL Showtime (CV-C as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected by the ATU-C since the second most recent DSL Showtime (CV-CFE as defined in ITU-T  Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Channel.{i}.Stats.CurrentDay." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL channel statistics accumulated during the current day {{bibref|G.997.1}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="XTURFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected since the second most recent DSL Showtime (FEC-C as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected by the ATU-C since the second most recent DSL Showtime (FEC-CFE as defined in  ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected since the second most recent DSL Showtime (HEC-P as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected by the ATU-C since the second most recent DSL Showtime (HEC-PFE as defined in  ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected since the second most recent DSL Showtime (CV-C as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected by the ATU-C since the second most recent DSL Showtime (CV-CFE as defined in ITU-T  Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Channel.{i}.Stats.QuarterHour." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains DSL channel statistics accumulated during the current quarter hour {{bibref|G.997.1}}.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="XTURFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected since the second most recent DSL Showtime (FEC-C as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCFECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of FEC errors detected by the ATU-C since the second most recent DSL Showtime (FEC-CFE as defined in  ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected since the second most recent DSL Showtime (HEC-P as defined in ITU-T Rec.  {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCHECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of HEC errors detected by the ATU-C since the second most recent DSL Showtime (HEC-PFE as defined in  ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTURCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected since the second most recent DSL Showtime (CV-C as defined in ITU-T Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="XTUCCRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of CRC errors detected by the ATU-C since the second most recent DSL Showtime (CV-CFE as defined in ITU-T  Rec. {{bibref|G.997.1}}).
+          Note: If the parameter is implemented but no value is  available, its value MUST be 4294967295 (the maximum for its data type).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}." access="readOnly" numEntriesParameter="BondingGroupNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        DSL bonding group table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Each instance is a bonding group, and is expected to be stacked above a {{object|.DSL.Channel}} instance or a {{object|.FAST.Line}} instance for each bonded channel in the group.
+        Many of the parameters within this object, including {{param|LowerLayers}}, are read-only because bonding is not expected to be configured via {{bibref|TR-069}}.
+        The DSL bonding data model is closely aligned with {{bibref|TR-159}}. Corresponds to {{bibref|TR-159}} ''oBondingGroup''.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="GroupID"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the bonding group.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the bonding group (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the bonding group as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the bonding group entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          {{param}} is read-only for this object because bonding is expected to be configured by the CPE, not by the ACS.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GroupStatus" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}}  Indicates the current fault status of the DSL bonding group.  {{enum}}
+          Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupStatus''.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="NoPeer">
+              <description>
+                Peer physical layer is unreachable
+              </description>
+            </enumeration>
+            <enumeration value="PeerPowerLoss">
+              <description>
+                Local device received a "dying gasp" message (preceding a loss-of-power) from the peer  device
+              </description>
+            </enumeration>
+            <enumeration value="PeerBondSchemeMismatch">
+              <description>
+                Operating bonding scheme of the peer port is different from the local one
+              </description>
+            </enumeration>
+            <enumeration value="LowRate">
+              <description>
+                Upstream or downstream data rate is at or below threshold
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GroupID" access="readOnly" dmr:version="2.0">
+        <description>
+          DSL bonding group ID.  Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupID''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BondSchemesSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Supported DSL bonding schemes. {{enum}}
+          Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupBondSchemesSupported''.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="ATM">
+              <description>
+                {{bibref|G.998.1}} ATM-based bonding
+              </description>
+            </enumeration>
+            <enumeration value="Ethernet">
+              <description>
+                {{bibref|G.998.2}} Ethernet-based bonding
+              </description>
+            </enumeration>
+            <enumeration value="TDIM">
+              <description>
+                {{bibref|G.998.3}} TDIM-based bonding
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BondScheme" access="readOnly" dmr:version="2.0">
+        <description>
+          Currently operating bonding scheme.  Corresponds to {{bibref|TR-159}} ''aGroupOperBondScheme''.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="BondSchemesSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GroupCapacity" access="readOnly" dmr:version="2.0">
+        <description>
+          DSL bonding group capacity, i.e. the maximum number of channels that can be bonded in this group. Corresponds to  {{bibref|TR-159}} ''oBondingGroup.aGroupCapacity''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="32"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RunningTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} for which this bonding group has been operationally up.  Corresponds to  {{bibref|G.998.1|section 11.4.2}} ''Group Running Time''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TargetUpRate" access="readOnly" dmr:version="2.0">
+        <description>
+          Desired upstream data rate in {{units}} for this DSL bonding group (zero indicates best effort). Corresponds to  {{bibref|TR-159}} ''oBondingGroup.aGroupTargetUpRate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TargetDownRate" access="readOnly" dmr:version="2.0">
+        <description>
+          Desired downstream data rate in {{units}} for DSL bonding group (zero indicates best effort). Corresponds to  {{bibref|TR-159}} ''oBondingGroup.aGroupTargetDownRate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ThreshLowUpRate" access="readOnly" dmr:version="2.0">
+        <description>
+          Threshold upstream data rate in {{units}} for this DSL bonding group.  {{param|GroupStatus}} will include  {{enum|LowRate|GroupStatus}} whenever the upstream rate is less than this threshold.  Corresponds to {{bibref|TR-159}}  ''oBondingGroup.aGroupThreshLowUpRate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ThreshLowDownRate" access="readOnly" dmr:version="2.0">
+        <description>
+          Threshold downstream data rate in {{units}} for this DSL bonding group.  {{param|GroupStatus}} will include  {{enum|LowRate|GroupStatus}} whenever the downstream rate is less than this threshold.  Corresponds to {{bibref|TR-159}}  ''oBondingGroup.aGroupThreshLowDownRate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamDifferentialDelayTolerance" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum upstream differential delay in {{units}} among member links in a bonding group.  Corresponds to  {{bibref|G.998.1|section 11.4.1}} ''Differential Delay Tolerance''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamDifferentialDelayTolerance" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum downstream differential delay in {{units}} among member links in a bonding group.  Corresponds to  {{bibref|G.998.1|section 11.4.1}} ''Differential Delay Tolerance''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="BondedChannelNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}} Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupNumChannels''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="32"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.BondedChannel.{i}." access="readOnly" numEntriesParameter="BondedChannelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        DSL bonded channel table. Each table entry represents a bonded channel within the bonding group, and is associated with exactly one {{object|.DSL.Channel}} instance or one {{object|.FAST.Line}} instance. There MUST be an instance of {{object}} for each DSL channel or FAST line that is bonded.
+        When a {{object|.DSL.Channel}} or {{object|.FAST.Line}} is no longer bonded, then the CPE MUST delete the corresponding {{object}} instance. However, when a bonded {{object|.DSL.Channel}} or {{object|.FAST.Line}} becomes disabled, the channel remains bonded and so the corresponding {{object}} instance MUST NOT be deleted.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Channel"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Channel" access="readOnly" dmr:version="2.0">
+        <description>
+          {{reference}}This is the channel that is being bonded.
+          This is read-only because bonding is expected to be configured by the CPE, not by the ACS.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".DSL.Channel. .FAST.Line." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.BondedChannel.{i}.Ethernet." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Per-channel {{bibref|G.998.2}} Ethernet-based bonding parameters.
+        This object MUST be present if, and only if, {{param|##.BondScheme}} is  {{enum|Ethernet|##.BondScheme}}.
+      </description>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.BondedChannel.{i}.Ethernet.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Per-channel {{bibref|G.998.2}} Ethernet-based bonding statistics.
+        These relate to the {{bibref|G.998.2}} PME (Physical Medium Entity) Aggregation Function (PAF) lower layer (per-channel) interfaces.
+        The CPE MUST reset the Stats parameters either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|###.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|###.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="UnderflowErrorsSent" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of underflow errors sent, i.e. on the transmit side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CRCErrorsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of CRC errors received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AlignmentErrorsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of alignment errors received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ShortPacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of short packets received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LongPacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of long packets received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OverflowErrorsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of overflow errors received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PauseFramesReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of pause frames received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FramesDropped" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of frames dropped, e.g. because the receive queue is full.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|Total}} statistics.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentDayStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|CurrentDay}} statistics.
+          The CPE MAY align the beginning of each CurrentDay interval with days in the UTC time zone, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QuarterHourStart" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DSL-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|QuarterHour}} statistics.
+          The CPE MAY align the beginning of each QuarterHour interval with real-time quarter-hour intervals, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.Stats.Total." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Total statistics for this bonding group.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="FailureReasons" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}}  Indicates the failure conditions that have occurred during the accumulation period.  {{enum}}
+          Corresponds to {{bibref|G.998.1|section 11.4.3}} ''Current Group Failure Reason''.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="LowRate">
+              <description>
+                Minimum data rate not met
+              </description>
+            </enumeration>
+            <enumeration value="ExcessiveDelay">
+              <description>
+                Differential delay tolerance exceeded
+              </description>
+            </enumeration>
+            <enumeration value="InsufficientBuffers">
+              <description>
+                Insufficient buffers on receiver
+              </description>
+            </enumeration>
+            <enumeration value="Other">
+              <description>
+                Other failure occurred
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved upstream data rate in {{units}} (which might change subject to dynamic link usage conditions).  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Achieved Aggregate Data Rate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved downstream data rate in {{units}} (which might change subject to dynamic link usage conditions).   Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Achieved Aggregate Data Rate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamPacketLoss" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of upstream packets that were lost at aggregation output from a bonding group during the  accumulation period.  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Group Rx Cell Loss Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamPacketLoss" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of downstream packets that were lost at aggregation output from a bonding group during the  accumulation period.  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Group Rx Cell Loss Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamDifferentialDelay" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved upstream differential delay in {{units}} (which might change subject to dynamic link usage  conditions).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamDifferentialDelay" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved downstream differential delay in {{units}} (which might change subject to dynamic link usage  conditions).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FailureCount" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of times that the group was declared ''Unavailable'' during the accumulation period.  Corresponds to  {{bibref|G.998.1|Section 11.4.3}} ''Group Failure Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErroredSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''Errored'' during the accumulation period. Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**ES''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''SeverelyErrored'' during the accumulation period.  Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**SES''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UnavailableSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''Unavailable'' during the accumulation period.  Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**UAS''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.Stats.CurrentDay." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Current day statistics for this bonding group.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="FailureReasons" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}}  Indicates the failure conditions that have occurred during the accumulation period.  {{enum}}
+          Corresponds to {{bibref|G.998.1|section 11.4.3}} ''Current Group Failure Reason''.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="LowRate">
+              <description>
+                Minimum data rate not met
+              </description>
+            </enumeration>
+            <enumeration value="ExcessiveDelay">
+              <description>
+                Differential delay tolerance exceeded
+              </description>
+            </enumeration>
+            <enumeration value="InsufficientBuffers">
+              <description>
+                Insufficient buffers on receiver
+              </description>
+            </enumeration>
+            <enumeration value="Other">
+              <description>
+                Other failure occurred
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved upstream data rate in {{units}} (which might change subject to dynamic link usage conditions).  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Achieved Aggregate Data Rate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved downstream data rate in {{units}} (which might change subject to dynamic link usage conditions).   Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Achieved Aggregate Data Rate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamPacketLoss" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of upstream packets that were lost at aggregation output from a bonding group during the  accumulation period.  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Group Rx Cell Loss Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamPacketLoss" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of downstream packets that were lost at aggregation output from a bonding group during the  accumulation period.  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Group Rx Cell Loss Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamDifferentialDelay" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved upstream differential delay in {{units}} (which might change subject to dynamic link usage  conditions).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamDifferentialDelay" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved downstream differential delay in {{units}} (which might change subject to dynamic link usage  conditions).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FailureCount" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of times that the group was declared ''Unavailable'' during the accumulation period.  Corresponds to  {{bibref|G.998.1|Section 11.4.3}} ''Group Failure Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErroredSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''Errored'' during the accumulation period. Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**ES''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''SeverelyErrored'' during the accumulation period.  Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**SES''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UnavailableSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''Unavailable'' during the accumulation period.  Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**UAS''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.Stats.QuarterHour." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Current quarter hour statistics for this bonding group.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="FailureReasons" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}}  Indicates the failure conditions that have occurred during the accumulation period.  {{enum}}
+          Corresponds to {{bibref|G.998.1|section 11.4.3}} ''Current Group Failure Reason''.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="LowRate">
+              <description>
+                Minimum data rate not met
+              </description>
+            </enumeration>
+            <enumeration value="ExcessiveDelay">
+              <description>
+                Differential delay tolerance exceeded
+              </description>
+            </enumeration>
+            <enumeration value="InsufficientBuffers">
+              <description>
+                Insufficient buffers on receiver
+              </description>
+            </enumeration>
+            <enumeration value="Other">
+              <description>
+                Other failure occurred
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved upstream data rate in {{units}} (which might change subject to dynamic link usage conditions).  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Achieved Aggregate Data Rate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved downstream data rate in {{units}} (which might change subject to dynamic link usage conditions).   Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Achieved Aggregate Data Rate''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamPacketLoss" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of upstream packets that were lost at aggregation output from a bonding group during the  accumulation period.  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Group Rx Cell Loss Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamPacketLoss" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of downstream packets that were lost at aggregation output from a bonding group during the  accumulation period.  Corresponds to {{bibref|G.998.1|section 11.4.2}} ''Group Rx Cell Loss Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamDifferentialDelay" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved upstream differential delay in {{units}} (which might change subject to dynamic link usage  conditions).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamDifferentialDelay" access="readOnly" dmr:version="2.0">
+        <description>
+          The achieved downstream differential delay in {{units}} (which might change subject to dynamic link usage  conditions).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FailureCount" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of times that the group was declared ''Unavailable'' during the accumulation period.  Corresponds to  {{bibref|G.998.1|Section 11.4.3}} ''Group Failure Count''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErroredSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''Errored'' during the accumulation period. Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**ES''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''SeverelyErrored'' during the accumulation period.  Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**SES''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UnavailableSeconds" access="readOnly" dmr:version="2.0">
+        <description>
+          The time in {{units}} during which the group was declared ''Unavailable'' during the accumulation period.  Corresponds to {{bibref|TR-159}} ''oBondingGroup.aGroupPerf**UAS''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.Ethernet." access="readOnly" minEntries="0" maxEntries="1" dmr:version="2.0">
+      <description>
+        Ethernet-based bonding parameters {{bibref|G.998.2}}.
+        This object MUST be present if, and only if, {{param|#.BondScheme}} is {{enum|Ethernet|#.BondScheme}}.
+      </description>
+    </object>
+    <object name="Device.DSL.BondingGroup.{i}.Ethernet.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        {{bibref|G.998.2}} Ethernet-based bonding statistics.
+        These relate to the {{bibref|G.998.2}} PME (Physical Medium Entity) Aggregation Function (PAF) and to its upper layer interface.  PAF  lower layer interface statistics are in the {{object|##.BondedChannel.{i}.Ethernet.Stats}} objects.
+        The CPE MUST reset the Stats parameters either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|##.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|##.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="PAFErrors" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF errors.  Corresponds to {{bibref|TR-159}} ''oBondETH.aEthRxErrors''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFSmallFragments" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Small Fragment events.  Corresponds to {{bibref|TR-159}}  ''oBondETH.aEthRxSmallFragments''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFLargeFragments" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Large Fragment events. Corresponds to {{bibref|TR-159}}  ''oBondETH.aEthRxLargeFragments''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFBadFragments" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Bad Fragment events. Corresponds to {{bibref|TR-159}}  ''oBondETH.aEthRxBadFragments''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFLostFragments" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Lost Fragment events. Corresponds to {{bibref|TR-159}}  ''oBondETH.aEthRxLostFragments''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFLateFragments" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Late Fragment events.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFLostStarts" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Lost Start events. Corresponds to {{bibref|TR-159}} ''oBondETH.aEthRxLostStarts''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFLostEnds" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Lost End events. Corresponds to {{bibref|TR-159}} ''oBondETH.aEthRxLostEnds''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PAFOverflows" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PAF Overflow events. Corresponds to {{bibref|TR-159}} ''oBondETH.aEthRxOverflows''.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PauseFramesSent" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of pause frames sent, i.e. on the transmit side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CRCErrorsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of CRC errors received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AlignmentErrorsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of alignment errors received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ShortPacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of short packets received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LongPacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of long packets received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OverflowErrorsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of overflow errors received, i.e. on the receive side of the interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FramesDropped" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of frames dropped, e.g. because the receive queue is full.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSL.Diagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The DSL Diagnostics object.
+      </description>
+      <command name="ADSLLineTest()" async="true" dmr: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 dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Interface" mandatory="true" dmr:version="2.0">
+            <description>
+              {{reference}}  This is the interface over which the test is to be performed.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+                <pathRef refType="weak" targetParent=".DSL.Channel." targetType="row"/>
+              </string>
+            </syntax>
+          </parameter>
+        </input>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <parameter name="ACTPSDds" dmr:version="2.0">
+            <description>
+              Downstream actual power spectral density.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+            </description>
+            <syntax>
+              <int/>
+            </syntax>
+          </parameter>
+          <parameter name="ACTPSDus" dmr:version="2.0">
+            <description>
+              Upstream actual power spectral density.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+            </description>
+            <syntax>
+              <int/>
+            </syntax>
+          </parameter>
+          <parameter name="ACTATPds" dmr:version="2.0">
+            <description>
+              Downstream actual aggregate transmitter power.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+            </description>
+            <syntax>
+              <int/>
+            </syntax>
+          </parameter>
+          <parameter name="ACTATPus" dmr:version="2.0">
+            <description>
+              Upstream actual aggregate transmitter power.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+            </description>
+            <syntax>
+              <int/>
+            </syntax>
+          </parameter>
+          <parameter name="HLINSCds" dmr:version="2.0">
+            <description>
+              Downstream linear representation scale.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+            </description>
+            <syntax>
+              <int/>
+            </syntax>
+          </parameter>
+          <parameter name="HLINSCus" dmr:version="2.0">
+            <description>
+              Scaling used to represent the upstream linear channel characteristics.  Interpretation of the value is as  defined in ITU-T Rec. G.997.1.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+            </description>
+            <syntax>
+              <int/>
+            </syntax>
+          </parameter>
+          <parameter name="HLINGds" dmr:version="2.0">
+            <description>
+              Number of sub-carriers per sub-carrier group in the downstream direction for {{param|HLINpsds}}.  Valid values  are 1, 2, 4, and 8.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="HLINGus" dmr:version="2.0">
+            <description>
+              Number of sub-carriers per sub-carrier group in the downstream direction for {{param|HLINpsus}}.  Valid values  are 1, 2, 4, and 8.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="HLOGGds" dmr:version="2.0">
+            <description>
+              Number of sub-carriers per sub-carrier group in the downstream direction for {{param|HLOGpsds}}.  Valid values  are 1, 2, 4, and 8.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="HLOGGus" dmr:version="2.0">
+            <description>
+              Number of sub-carriers per sub-carrier group in the upstream direction for {{param|HLOGpsus}}.  Valid values are  1, 2, 4, and 8.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="HLOGpsds" dmr:version="2.0">
+            <description>
+              {{list}} List items represent downstream logarithmic channel characteristics per sub-carrier group.  The maximum  number of elements is 256 for G.992.3, and 512 for G.992.5.  For G.993.2, the number of elements will depend on the value of  {{param|HLOGGds}} but will not exceed 512. Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+              Note: {{param}} is measured during initialization and is not updated during Showtime.
+            </description>
+            <syntax>
+              <list>
+                <size maxLength="2559"/>
+              </list>
+              <string/>
+            </syntax>
+          </parameter>
+          <parameter name="HLOGpsus" dmr:version="2.0">
+            <description>
+              {{list}} List items represent upstream logarithmic channel characteristics per sub-carrier group.  The maximum number of elements is 64 for G.992.3 and G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|HLOGGus}} but will not exceed 512. Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+              Note: {{param}} is measured during initialization and is not updated during Showtime.
+            </description>
+            <syntax>
+              <list>
+                <size maxLength="2559"/>
+              </list>
+              <string/>
+            </syntax>
+          </parameter>
+          <parameter name="HLOGMTds" dmr:version="2.0">
+            <description>
+              Indicates the number of symbols over which {{param|HLOGpsds}} was measured.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="HLOGMTus" dmr:version="2.0">
+            <description>
+              Indicates the number of symbols over which {{param|HLOGpsus}} was measured.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="LATNpbds" dmr:version="2.0">
+            <description>
+              {{list}} List items represent downstream line attenuation per usable band, as computed during initialization.  Number of elements is dependent on the number of downstream bands but will exceed one only for G.993.2. Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+            </description>
+            <syntax>
+              <list>
+                <size maxLength="24"/>
+              </list>
+              <string/>
+            </syntax>
+          </parameter>
+          <parameter name="LATNpbus" dmr:version="2.0">
+            <description>
+              {{list}} List items represent upstream line attenuation per usable band, as computed during initialization.  Number of elements is dependent on the number of upstream bands but will exceed one only for G.993.2.  Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+            </description>
+            <syntax>
+              <list>
+                <size maxLength="24"/>
+              </list>
+              <string/>
+            </syntax>
+          </parameter>
+          <parameter name="SATNds" dmr:version="2.0">
+            <description>
+              {{list}} List items represent downstream signal attenuation per usable band, as computed during the L0 (i.e., Showtime) state.  Number of elements is dependent on the number of downstream bands but will exceed one only for G.993.2.  Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+            </description>
+            <syntax>
+              <list>
+                <size maxLength="24"/>
+              </list>
+              <string/>
+            </syntax>
+          </parameter>
+          <parameter name="SATNus" dmr:version="2.0">
+            <description>
+              {{list}} List items represent upstream signal attenuation per usable band, as computed during the L0 (i.e., Showtime) state.  Number of elements is dependent on the number of downstream bands but will exceed one only for G.993.2.  Interpretation of {{param}} is as defined in ITU-T Rec. G.997.1.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}.
+            </description>
+            <syntax>
+              <list>
+                <size maxLength="24"/>
+              </list>
+              <string/>
+            </syntax>
+          </parameter>
+          <parameter name="HLINpsds" dmr:version="2.0">
+            <description>
+              {{list}} List items represent downstream linear channel characteristics per subcarrier group.  Maximum number of  complex pairs is 256 for G.992.3, and 512 for G.992.5.  For G.993.2, the number of pairs will depend on the value of {{param|HLINGds}} but will not exceed 512.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+              Note: HLIN is not applicable in PLOAM for G.992.1 or G.992.2.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+            </description>
+            <syntax>
+              <list>
+                <size maxLength="61430"/>
+              </list>
+              <int/>
+            </syntax>
+          </parameter>
+          <parameter name="HLINpsus" dmr:version="2.0">
+            <description>
+              {{list}} List items represent upstream linear channel characteristics per sub-carrier group.  Maximum number of  complex pairs is 64 for G.992.3, and G.992.5.  For G.993.2, the number of pairs will depend on the value of {{param|HLINGus}} but  will not exceed 512.  Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+              Note:  HLIN is not applicable in PLOAM for G.992.1 or G.992.2.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+            </description>
+            <syntax>
+              <list>
+                <size maxLength="61430"/>
+              </list>
+              <string/>
+            </syntax>
+          </parameter>
+          <parameter name="QLNGds" dmr:version="2.0">
+            <description>
+              Number of sub-carriers per sub-carrier group in the downstream direction for {{param|QLNpsds}}.  Valid values  are 1, 2, 4, and 8.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="QLNGus" dmr:version="2.0">
+            <description>
+              Number of sub-carriers per sub-carrier group in the upstream direction for {{param|QLNpsus}}.  Valid values are  1, 2, 4, and 8.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="QLNpsds" dmr:version="2.0">
+            <description>
+              {{list}} List items represent downstream quiet line noise per subcarrier group.  Maximum number of elements is  256 for G.992.3, 512 for G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|QLNGds}} but will not  exceed 512.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+              Note:  QLN is not applicable in PLOAM for G.992.1 or G.992.2.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+            </description>
+            <syntax>
+              <list>
+                <size maxLength="61430"/>
+              </list>
+              <int/>
+            </syntax>
+          </parameter>
+          <parameter name="QLNpsus" dmr:version="2.0">
+            <description>
+              {{list}} List items represent upstream quiet line noise per subcarrier group.  The maximum number of elements is  64 for G.992.3, and G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|QLNGus}} but will not exceed  512. Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+              Note:  QLN is not applicable in PLOAM for G.992.1 or G.992.2.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+            </description>
+            <syntax>
+              <list>
+                <size maxLength="61430"/>
+              </list>
+              <string/>
+            </syntax>
+          </parameter>
+          <parameter name="QLNMTds" dmr:version="2.0">
+            <description>
+              Indicates the number of symbols over which {{param|QLNpsds}} was measured.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="QLNMTus" dmr:version="2.0">
+            <description>
+              Indicates the number of symbols over which {{param|QLNpsus}} was measured.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="SNRGds" dmr:version="2.0">
+            <description>
+              Number of sub-carriers per sub-carrier group in the downstream direction for {{param|SNRpsds}}.  Valid values  are 1, 2, 4, and 8.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="SNRGus" dmr:version="2.0">
+            <description>
+              Number of sub-carriers per sub-carrier group in the upstream direction for {{param|SNRpsus}}.  Valid values are  1, 2, 4, and 8.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 1.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="SNRpsds" dmr:version="2.0">
+            <description>
+              {{list}} List items represent downstream SNR per subcarrier group.  Maximum number of elements is 256 for  G.992.3, 512 for G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|SNRGds}} but will not exceed 512.    Interpretation of the value is as defined in ITU-T Rec. G.997.1.  Interpretation of the value is as defined in ITU-T Rec. G.997.1.
+              Note:  SNRps is not applicable in PLOAM for G.992.1 or G.992.2.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+            </description>
+            <syntax>
+              <list>
+                <size maxLength="61430"/>
+              </list>
+              <int/>
+            </syntax>
+          </parameter>
+          <parameter name="SNRpsus" dmr:version="2.0">
+            <description>
+              {{list}} List items represent upstream SNR per subcarrier group.  The maximum number of elements is 64 for  G.992.3, and G.992.5.  For G.993.2, the number of elements will depend on the value of {{param|SNRGus}} but will not exceed 512.  Interpretation of the values is as defined in ITU-T Rec. G.997.1.
+              Note:  SNRps is not applicable in PLOAM for G.992.1 or G.992.2.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to ''None''.
+            </description>
+            <syntax>
+              <list>
+                <size maxLength="61430"/>
+              </list>
+              <string/>
+            </syntax>
+          </parameter>
+          <parameter name="SNRMTds" dmr:version="2.0">
+            <description>
+              Indicates the number of symbols over which {{param|SNRpsds}} was measured.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="SNRMTus" dmr:version="2.0">
+            <description>
+              Indicates the number of symbols over which {{param|SNRpsus}} was measured.
+              Note:  See ITU-T Recommendation {{bibref|G.997.1}}. For a multimode device operating in a mode in which this parameter does not apply, the value  of this parameter SHOULD be set to 0.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="BITSpsds" dmr:version="2.0">
+            <description>
+              {{list}} List items represent downstream bit allocation per subcarrier group.  Maximum number of elements is 256 for G.992.3, 512 for G.992.5.  Interpretation of the value is as defined in ITU-T Rec. {{bibref|G.997.1}}.
+            </description>
+            <syntax>
+              <list>
+                <size maxLength="61430"/>
+              </list>
+              <int/>
+            </syntax>
+          </parameter>
+          <parameter name="BITSpsus" dmr:version="2.0">
+            <description>
+              {{list}} List items represent upstream bit allocation per subcarrier group.  Maximum number of elements is 256 for G.992.3, 512 for G.992.5.  Interpretation of the value is as defined in ITU-T Rec. {{bibref|G.997.1}}.
+            </description>
+            <syntax>
+              <list>
+                <size maxLength="61430"/>
+              </list>
+              <string/>
+            </syntax>
+          </parameter>
+        </output>
+      </command>
+    </object>
+    <object name="Device.FAST." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object models FAST (defined in ITU Recommendation {{bibref|G.9701}}) lines. Each {{object|Line}} models a layer 1 FAST Line interface.
+      </description>
+      <parameter name="LineNumberOfEntries" access="readOnly" dmr:version="2.11">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}." access="readOnly" numEntriesParameter="LineNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.11">
+      <description>
+        FAST Line table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+        This table models physical FAST lines.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.11">
+        <description>
+          Enables or disables the FAST line. This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.11">
+        <description>
+          The current operational state of the FAST line (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.11">
+        <description>
+          The textual name of the FAST line as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The accumulated time in {{units}} since the FAST line entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.11">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.11">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.11">
+        <description>
+          A string identifying the version of the modem firmware currently installed for this interface. This is applicable only when the modem firmware is separable from the overall CPE software.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LinkStatus" access="readOnly" dmr:version="2.11">
+        <description>
+          Status of the FAST physical link. {{enum}}
+          When {{param}} is {{enum|Up}}, {{param|Status}} is expected to be {{enum|Up|Status}}. When {{param}} is {{enum|Initializing}} or {{enum|EstablishingLink}} or {{enum|NoSignal}} or {{enum|Disabled}}, {{param|Status}} is expected to be {{enum|Down|Status}}.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Initializing"/>
+            <enumeration value="EstablishingLink"/>
+            <enumeration value="NoSignal"/>
+            <enumeration value="Disabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AllowedProfiles" access="readOnly" dmr:version="2.11">
+        <description>
+          {{list}} List items indicate which FAST profiles are allowed on the line. {{enum}}
+          Note:  In G.997.2, this parameter is called PROFILES. See ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="106a"/>
+            <enumeration value="212a"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentProfile" access="readOnly" dmr:version="2.11">
+        <description>
+          Indicates which FAST profile is currently in use on the line.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="AllowedProfiles" nullValue=""/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PowerManagementState" access="readOnly" dmr:version="2.11">
+        <description>
+          The power management state of the line. {{enum}}
+          Note: See ITU-T Recommendation {{bibref|G.9701}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="L0"/>
+            <enumeration value="L2.1"/>
+            <enumeration value="L2.2"/>
+            <enumeration value="L3"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessFailureCause" access="readOnly" dmr:version="2.11">
+        <description>
+          The success failure cause of the initialization. An enumeration of the following integer values:
+          * 0: Successful
+          * 1: Configuration error. Configuration error. This error occurs if the line cannot reach L0 state due to a mismatch of configuration and FTU capabilities.
+          * 2: Configuration not feasible on the line. This error occurs if the line cannot reach the L0 state due to a mismatch of configuration of line and noise characteristics.
+          * 3: Communication problem. This error occurs, for example, due to corrupted messages or bad syntax messages or if no common mode can be selected in the G.994.1 handshaking procedure or due to a timeout.
+          * 4: No far-end FTU detected. This error occurs if the far-end FTU is not powered or not connected or if the line is too long to allow detection of a far-end FTU.
+          * 5: Any other or unknown initialization failure cause.
+          Note: In G.997.2, this parameter is called "Initialization success/failure cause". See Clause 7.20.2.1 of ITU-T
+          Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="5"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UPBOKLER" access="readOnly" dmr:version="2.11">
+        <description>
+          This parameter reports the estimate of the electrical length expressed in {{units}}, as determined by the FTU-R (see clause 7.3.1.4.2.1/{{bibref|G.9701}}) and conveyed in the R-MSG1 initialization message (see clause 12.3.3.2.3/{{bibref|G.9701}}). The value is coded as an unsignedInt in the range 0 (coded as 0) to 128 dB (coded as 1280) in steps of {{units}}.
+          Note: This parameter is defined as UPBOKLE-R in Clause 7.10.4.2 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1280"/>
+            <units value="0.1 dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastTransmittedDownstreamSignal" access="readOnly" dmr:version="2.11">
+        <description>
+          This parameter reports the downstream signal count of the last transmitted initialization signal in the last full or short initialization performed on the line. The valid values are 0..21. The downstream signal count is defined in clause 12.3.1/{{bibref|G.9701}}.
+          Note: See clause 7.10.2.2 ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="21"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastTransmittedUpstreamSignal" access="readOnly" dmr:version="2.11">
+        <description>
+          This parameter reports the upstream signal count of the last transmitted initialization signal in the last full or short initialization performed on the line. The valid values are 0..21. The upstream signal count is defined in clause 12.3.1/{{bibref|G.9701}}.
+          Note: See clause 7.10.2.3 ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="21"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UPBOKLE" access="readOnly" dmr:version="2.11">
+        <description>
+          This parameter reports the electrical length that would have been sent from the FTU-O to the FTU-R if the electrical length was not forced by the DPU-MIB. If the electrical length is not forced by the DPU-MIB, then this object reports the final electrical length, as determined by the FTU-O (see clause 7.3.1.4.2.1/{{bibref|G.9701}}) and conveyed in the O-UPDATE initialization message (see clause 12.3.3.2.4/{{bibref|G.9701}}).
+          Note: See clause 7.10.4.1 in ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1280"/>
+            <units value="0.1dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LineNumber" access="readOnly" dmr:version="2.11">
+        <description>
+          Signifies the line pair that the modem is using to connection. {{param}} = 1 is the innermost  pair.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="1"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamMaxBitRate" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the attainable net data rate expressed in {{units}} as defined in clause 11.4.1.1.2/{{bibref|G.9701}}.
+          Note: This parameter is related to the G.997.2 parameter ATTNDRus. See clause 7.11.2.1 ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamMaxBitRate" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the attainable net data rate expressed in {{units}} as defined in clause 11.4.1.1.2/{{bibref|G.9701}}.
+          Note: This parameter is related to the G.997.2 parameter ATTNDRds. See clause 7.11.2.1 ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamNoiseMargin" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the signal-to-noise ratio margin (as defined in clause 9.8.3.2/{{bibref|G.9701}} and 11.4.1.3/{{bibref|G.9701}}) in the upstream direction. A special value indicates that the signal-to-noise ratio margin is out of the range to be represented. The parameter is expressed in {{units}}.
+          Note: In G.997.2, this parameter is called SNRMus. See ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamNoiseMargin" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the signal-to-noise ratio margin (as defined in clause 9.8.3.2/{{bibref|G.9701}} and 11.4.1.3/{{bibref|G.9701}}) in the upstream direction. A special value indicates that the signal-to-noise ratio margin is out of the range to be represented. The parameter is expressed in {{units}}.
+          Note: In G.997.2, this parameter is called SNRMds. See ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamAttenuation" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The current upstream signal loss (expressed in {{units}}).
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamAttenuation" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The current downstream signal loss (expressed in {{units}}).
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamPower" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The current output power at the CPE's FAST line (expressed in {{units}}).
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dBmV"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamPower" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The current received power at the CPE's FAST line (expressed in {{units}}).
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dBmV"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMRMCds" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the signal-to-noise margin for the robust management channel (RMC) in the downstream direction (express in {{units}}). A special value (-512)  indicates that the signal-to-noise ratio margin for the RMC is out of the range to be represented. This parameter is defined in clauses 7.10.12.1 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMRMCus" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the signal-to-noise margin for the robust management channel (RMC) in the upstream direction (express in {{units}}). A special value (-512)  indicates that the signal-to-noise ratio margin for the RMC is out of the range to be represented. This parameter is defined in clauses 7.10.12.2 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <int>
+            <units value="0.1dB"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="BITSRMCpsds" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{list}} List items report the bit allocation values on RMC sub-carriers in RMC symbols in the downstream direction. Each pair composes of a sub-carrier index from 0..4095 and an 8 bit allocation value. There are maximum 512 pairs. This parameter is defined in clause 7.10.12.3 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="4610"/>
+          </list>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="BITSRMCpsus" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{list}} List items report the bit allocation values on RMC sub-carriers in RMC symbols in the upstream direction. Each pair composes of a sub-carrier index from 0..4095 and an 8 bit allocation value. There are maximum 512 pairs. This parameter is defined in clause 7.10.12.4 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="4610"/>
+          </list>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="FEXTCANCELds" access="readOnly" dmr:version="2.11">
+        <description>
+          This indicates whether FEXT cancellation in the downstream direction from all the other vectored lines into the line in the vectored group is enabled (TRUE) or disabled (FALSE). This parameter is defined as FEXT_TO_CANCEL_ENABLEds in clause 7.1.7.1 of ITU Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FEXTCANCELus" access="readOnly" dmr:version="2.11">
+        <description>
+          This indicates whether FEXT cancellation in the upstream direction from all the other vectored lines into the line in the vectored group is enabled (TRUE) or disabled (FALSE). This parameter is defined as FEXT_TO_CANCEL_ENABLEds in clause 7.1.7.1 of ITU Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ETRds" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the expected throughput rate expressed in {{units}} as defined in clause 7.11.1.2 of ITU-T Recommendation {{bibref|G.997.2}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ETRus" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the expected throughput rate expressed in {{units}} as defined in clause 7.11.1.2 of ITU-T Recommendation {{bibref|G.997.2}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ATTETRds" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the attainable expected throughput expressed in {{units}} as defined in clause 7.11.2.2 of ITU-T Recommendation {{bibref|G.997.2}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ATTETRus" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the attainable expected throughput expressed in {{units}} as defined in clause 7.11.2.2 of ITU-T Recommendation {{bibref|G.997.2}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MINEFTR" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports the minimum error free throughput value expressed in {{units}} computed from power up as defined in clause 11.4.1.1.3 of ITU-T Recommendation {{bibref|G.9701}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalStart" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          FAST-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|Total}} statistics.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ShowtimeStart" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          FAST-specific statistic. The Number of {{units}} since the most recent DSL Showtime - the beginning of the period used for collection of {{object|Showtime}} statistics.
+          Showtime is defined as successful completion of the DSL link establishment process. The ''Showtime'' statistics are those collected  since the most recent establishment of the DSL link.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastShowtimeStart" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          FAST-specific statistic. The Number of {{units}} since the second most recent DSL Showtime-the beginning of the period used for collection of {{object|LastShowtime}} statistics.
+          If the CPE has not retained information about the second most recent Showtime (e.g., on reboot), the start of ''LastShowtime''  statistics MAY temporarily coincide with the start of ''Showtime'' statistics.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentDayStart" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          FAST-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|CurrentDay}} statistics.
+          The CPE MAY align the beginning of each ''CurrentDay'' interval with days in the UTC time zone, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QuarterHourStart" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          FAST-specific statistic. The Number of {{units}} since the beginning of the period used for collection of {{object|QuarterHour}} statistics.
+          The CPE MAY align the beginning of each ''QuarterHour'' interval with real-time quarter-hour intervals, but is not required to do so.
+          Statistics SHOULD continue to be accumulated across CPE reboots, though this might not always be possible.
+          Note: {{param}} SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}.Stats.Total." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object contains DSL line total statistics.
+        Note: The {{object}} parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}. An errored second (ES) is declared if, during a 1-second interval, there are one or more crc anomalies, or one or more los defects, or one or more lor defects, or one or more lpr primitives.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of severely errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LOSS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of signal seconds (LOSS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LOSS is declared if, during a 1-second interval, there are one or more los defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LORS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of RMC seconds (LORS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LORS is declared if, during a 1-second interval, there are one or more lor defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UAS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of unavailable seconds (UAS) as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXUC" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of uncorrected DTU anomalies (rtx_uc). This parameter is defined in clause 7.8.5 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXTX" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of retransmitted DTU anomalies (rtx_tx). This parameter is defined in clause 7.8.6 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessBSW" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful bit swap (BSW) primitives. This parameter is defined as success_BSW in clause 7.7.20 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessSRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful autonomous SRA (seamless rate adaptation) primitives. This parameter is defined as success_SRA in clause 7.7.21 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessFRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful FRA (fast rate adaptation)  primitives. This parameter is defined as success_FRA in clause 7.7.22 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessRPA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful RPA (RMC parameter adjustment)  primitives. This parameter is defined as success_RPA in clause 7.7.23 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessTIGA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful TIGA (transmitter initiated gain adjustment)  primitives. This parameter is defined as success_TIGA in clause 7.7.24 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}.Stats.Showtime." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object contains FAST line statistics since the most recent showtime.
+        Note: The Total parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}. An errored second (ES) is declared if, during a 1-second interval, there are one or more crc anomalies, or one or more los defects, or one or more lor defects, or one or more lpr primitives.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of severely errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LOSS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of signal seconds (LOSS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LOSS is declared if, during a 1-second interval, there are one or more los defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LORS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of RMC seconds (LORS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LORS is declared if, during a 1-second interval, there are one or more lor defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UAS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of unavailable seconds (UAS) as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXUC" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of uncorrected DTU anomalies (rtx_uc). This parameter is defined in clause 7.8.5 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXTX" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of retransmitted DTU anomalies (rtx_tx). This parameter is defined in clause 7.8.6 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessBSW" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful bit swap (BSW) primitives. This parameter is defined as success_BSW in clause 7.7.20 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessSRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful autonomous SRA (seamless rate adaptation) primitives. This parameter is defined as success_SRA in clause 7.7.21 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessFRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful FRA (fast rate adaptation)  primitives. This parameter is defined as success_FRA in clause 7.7.22 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessRPA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful RPA (RMC parameter adjustment)  primitives. This parameter is defined as success_RPA in clause 7.7.23 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessTIGA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful TIGA (transmitter initiated gain adjustment)  primitives. This parameter is defined as success_TIGA in clause 7.7.24 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}.Stats.LastShowtime." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object contains FAST line statistics since the second most recent showtime.
+        Note: The Total parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}. An errored second (ES) is declared if, during a 1-second interval, there are one or more crc anomalies, or one or more los defects, or one or more lor defects, or one or more lpr primitives.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of severely errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LOSS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of signal seconds (LOSS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LOSS is declared if, during a 1-second interval, there are one or more los defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LORS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of RMC seconds (LORS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LORS is declared if, during a 1-second interval, there are one or more lor defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UAS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of unavailable seconds (UAS) as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXUC" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of uncorrected DTU anomalies (rtx_uc). This parameter is defined in clause 7.8.5 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXTX" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of retransmitted DTU anomalies (rtx_tx). This parameter is defined in clause 7.8.6 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessBSW" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful bit swap (BSW) primitives. This parameter is defined as success_BSW in clause 7.7.20 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessSRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful autonomous SRA (seamless rate adaptation) primitives. This parameter is defined as success_SRA in clause 7.7.21 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessFRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful FRA (fast rate adaptation)  primitives. This parameter is defined as success_FRA in clause 7.7.22 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessRPA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful RPA (RMC parameter adjustment)  primitives. This parameter is defined as success_RPA in clause 7.7.23 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessTIGA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful TIGA (transmitter initiated gain adjustment)  primitives. This parameter is defined as success_TIGA in clause 7.7.24 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}.Stats.CurrentDay." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object contains FAST line statistics accumulated during the current day.
+        Note: The Total parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}. An errored second (ES) is declared if, during a 1-second interval, there are one or more crc anomalies, or one or more los defects, or one or more lor defects, or one or more lpr primitives.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of severely errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LOSS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of signal seconds (LOSS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LOSS is declared if, during a 1-second interval, there are one or more los defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LORS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of RMC seconds (LORS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LORS is declared if, during a 1-second interval, there are one or more lor defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UAS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of unavailable seconds (UAS) as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXUC" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of uncorrected DTU anomalies (rtx_uc). This parameter is defined in clause 7.8.5 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXTX" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of retransmitted DTU anomalies (rtx_tx). This parameter is defined in clause 7.8.6 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessBSW" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful bit swap (BSW) primitives. This parameter is defined as success_BSW in clause 7.7.20 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessSRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful autonomous SRA (seamless rate adaptation) primitives. This parameter is defined as success_SRA in clause 7.7.21 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessFRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful FRA (fast rate adaptation)  primitives. This parameter is defined as success_FRA in clause 7.7.22 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessRPA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful RPA (RMC parameter adjustment)  primitives. This parameter is defined as success_RPA in clause 7.7.23 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessTIGA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful TIGA (transmitter initiated gain adjustment)  primitives. This parameter is defined as success_TIGA in clause 7.7.24 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}.Stats.QuarterHour." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object contains FAST line statistics accumulated during the current quarter hour.
+        Note: The Total parameters SHOULD NOT be reset when the interface statistics are reset via an interface disable / enable cycle.
+      </description>
+      <parameter name="ErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}. An errored second (ES) is declared if, during a 1-second interval, there are one or more crc anomalies, or one or more los defects, or one or more lor defects, or one or more lpr primitives.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SeverelyErroredSecs" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of severely errored seconds as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LOSS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of signal seconds (LOSS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LOSS is declared if, during a 1-second interval, there are one or more los defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LORS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of loss of RMC seconds (LORS) as defined in ITU-T Rec. {{bibref|G.997.2}}. A LORS is declared if, during a 1-second interval, there are one or more lor defects.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UAS" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Total number of unavailable seconds (UAS) as defined in ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXUC" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of uncorrected DTU anomalies (rtx_uc). This parameter is defined in clause 7.8.5 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RTXTX" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of retransmitted DTU anomalies (rtx_tx). This parameter is defined in clause 7.8.6 of ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessBSW" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful bit swap (BSW) primitives. This parameter is defined as success_BSW in clause 7.7.20 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessSRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful autonomous SRA (seamless rate adaptation) primitives. This parameter is defined as success_SRA in clause 7.7.21 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessFRA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful FRA (fast rate adaptation)  primitives. This parameter is defined as success_FRA in clause 7.7.22 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessRPA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful RPA (RMC parameter adjustment)  primitives. This parameter is defined as success_RPA in clause 7.7.23 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SuccessTIGA" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This parameter reports a count of the successful TIGA (transmitter initiated gain adjustment)  primitives. This parameter is defined as success_TIGA in clause 7.7.24 of  ITU-T Rec. {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAST.Line.{i}.TestParams." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object contains the FAST line test parameters that are available during the L0 (i.e., Showtime)  state.
+      </description>
+      <parameter name="SNRGds" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the number of sub-carriers in any one sub-carrier group used to represent the downstream SNR(f) values. Valid values are 1, 2, 4, and 8.
+          Note: In ITU-T G.9701-2014, the only valid value is G = 1. See clause 7.10.8.2 ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRGus" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the number of sub-carriers in any one sub-carrier group used to represent the upstream SNR(f) values. Valid values are 1, 2, 4, and 8.
+          Note: In ITU-T G.9701-2014, the only valid value is G = 1. See clause 7.10.8.5 ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRpsds" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{list}} Reports the downstream SNR(f) values. A special value indicates that no measurement could be done for this sub-carrier group because it is out of the downstream MEDLEY set or its transmit power is zero. The number of elements will depend on the value of SNRGds. Interpretation of the values is as defined in clause 11.4.1.2.2.of ITU-T Rec. {{bibref|G.9701}}.
+          Note: See clause 7.10.8.3 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2047"/>
+          </list>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRpsus" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{list}} Reports the upstream SNR(f) values. A special value indicates that no measurement could be done for this sub-carrier group because it is out of the downstream MEDLEY set or its transmit power is zero. The number of elements will depend on the value of SNRGds. Interpretation of the values is as defined in clause 11.4.1.2.2.of ITU-T Rec. {{bibref|G.9701}}.
+          Note: See clause 7.10.8.6 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="2047"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMTds" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the number of symbols used to measure the downstream SNR(f) values. The valid values 0..65535.
+          Note: See clause 7.10.8.1 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SNRMTus" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the number of symbols used to measure the upstream SNR(f) values. The valid values 0..65535.
+          Note: See clause 7.10.8.4 of ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ACTINP" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the actual INP against SHINE as defined in clause 11.4.1.1.7/{{bibref|G.9701}}. A special value indicates an actual INP against SHINE of 2047 symbols or higher. The valid values are 0..2046 and 2047 is the special value.
+          Note: See ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="NFEC" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the DTU FEC codeword length (expressed in 1 byte unit) as defined in clause 9.3/{{bibref|G.9701}}. The valid range is 32..255.
+          Note: See clause 7.11.4.1 ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RFEC" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the DTU FEC codeword redundancy as defined in clause 9.3/{{bibref|G.9701}}.
+          Note: See ITU-T Recommendation {{bibref|G.997.2}}.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamCurrRate" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the current physical layer aggregate data rate (expressed in {{units}}) of the upstream FAST as defined in clause 11.4.1.1.1/{{bibref|G.9701}}.
+          The current physical layer aggregate data rate (expressed in Kbps) of the upstream FAST connection. The valid values are 0..4294967295(0 to 232-1 kbit/s).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamCurrRate" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the current physical layer aggregate data rate (expressed in {{units}}) of the upstream FAST as defined in clause 11.4.1.1.1/{{bibref|G.9701}}.
+          The current physical layer aggregate data rate (expressed in Kbps) of the downstream FAST connection. The valid values are 0..4294967295(0 to 232-1 kbit/s).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ACTINPREIN" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          Reports the actual INP against REIN as defined in clause 11.4.1.1.8/{{bibref|G.9701}}. A special value indicates an actual INP against REIN of 63 symbols or higher. The valid range is 0..62 symbols, and 63 is the special value.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Optical." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object models optical interface technologies.  It defines an {{object|Interface}} object that models a layer 1 optical interface that is capable of transporting Ethernet packets.  The data model definition is based on parts of {{bibref|G.988}}.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Optical.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4" dmr:fixedObject="true">
+      <description>
+        Optical interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).  This table models physical optical interfaces.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables the optical interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.4">
+        <description>
+          The current operational state of the optical interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.4">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.4">
+        <description>
+          The textual name of the optical interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The accumulated time in {{units}} since the optical interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.4">
+        <description>
+          {{list}}  {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="OpticalSignalLevel" access="readOnly" dmr:version="2.4">
+        <description>
+          Current measurement of total downstream optical signal level.
+          {{datatype|expand}}
+          Valid values are -65.536 dBm (coded as -65536), to 65.534 dBm (coded as 65534) in 0.002 dB increments.
+          This parameter is based on ''Optical signal level'' from {{bibref|G.988|Section 9.2.1}}.
+        </description>
+        <syntax>
+          <dataType ref="Dbm1000">
+            <range minInclusive="-65536" maxInclusive="65534" step="2"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="LowerOpticalThreshold" access="readOnly" dmr:version="2.4">
+        <description>
+          Optical level that is used to declare the downstream low received optical power alarm.
+          {{datatype|expand}}
+          Valid values are -127.5 dBm (coded as -127500) to 0 dBm (coded as 0) in 0.5 dB increments.  The value -127500 indicates the device's internal policy.
+          This parameter is based on ''Lower optical threshold'' from {{bibref|G.988|section 9.2.1}}.
+        </description>
+        <syntax>
+          <dataType ref="Dbm1000">
+            <range minInclusive="-127000" maxInclusive="0" step="500"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="UpperOpticalThreshold" access="readOnly" dmr:version="2.4">
+        <description>
+          Optical level that is used to declare the downstream high received optical power alarm.
+          {{datatype|expand}}
+          Valid values are -127.5 dBm (coded as -127500) to 0 dBm (coded as 0) in 0.5 dB increments.  The value -127500 indicates the device's internal policy.
+          This parameter is based on ''Upper optical threshold'' from {{bibref|G.988|section 9.2.1}}.
+        </description>
+        <syntax>
+          <dataType ref="Dbm1000">
+            <range minInclusive="-127000" maxInclusive="0" step="500"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="TransmitOpticalLevel" access="readOnly" dmr:version="2.4">
+        <description>
+          Current measurement of mean optical launch power.
+          {{datatype|expand}}
+          Valid values are -127.5 dBm (coded as -127500) to 0 dBm (coded as 0) in 0.5 dB increments.  The value -127500 indicates the device's internal policy.
+          This parameter is based on ''Transmit optical level'' from {{bibref|G.988|section 9.2.1}}.
+        </description>
+        <syntax>
+          <dataType ref="Dbm1000">
+            <range minInclusive="-127000" maxInclusive="0" step="500"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="LowerTransmitPowerThreshold" access="readOnly" dmr:version="2.4">
+        <description>
+          Minimum mean optical launch power that is used to declare the low transmit optical power alarm.
+          {{datatype|expand}}
+          Valid values are -63.5 dBm (coded as -63500) to +63.5 dBm (coded as 63500) in 0.5 dB increments.  The value -63500 indicates the device's internal policy.
+          This parameter is based on ''Lower transmit power threshold'' from {{bibref|G.988|section 9.2.1}}.
+        </description>
+        <syntax>
+          <dataType ref="Dbm1000">
+            <range minInclusive="-63500" maxInclusive="63500" step="500"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="UpperTransmitPowerThreshold" access="readOnly" dmr:version="2.4">
+        <description>
+          Maximum mean optical launch power that is used to declare the high transmit optical power alarm.
+          {{datatype|expand}}
+          Valid values are -63.5 dBm (coded as -63500) to +63.5 dBm (coded as 63500) in 0.5 dB increments.  The value -63500 indicates the device's internal policy.
+          This parameter is based on ''Upper transmit power threshold'' from {{bibref|G.988|section 9.2.1}}.
+        </description>
+        <syntax>
+          <dataType ref="Dbm1000">
+            <range minInclusive="-63500" maxInclusive="63500" step="500"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Optical.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Cellular." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object models cellular interfaces and access points.
+      </description>
+      <parameter name="RoamingEnabled" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables roaming.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RoamingStatus" access="readOnly" dmr:version="2.8">
+        <description>
+          Current roaming status.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Home"/>
+            <enumeration value="Roaming"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AccessPointNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Cellular.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8" dmr:fixedObject="true">
+      <description>
+        Cellular interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).  Each instance of this object models a cellular modem with a single radio and a single {{object|USIM}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}}
+          * SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic.
+          * SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed)
+          * SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface
+          * SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          Because the interface includes layer 1 the {{enum|LowerLayerDown}} value SHOULD never be used.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up">
+              <description>
+                Corresponds to {{enum|GPRS|CurrentAccessTechnology}}, {{enum|UMTS|CurrentAccessTechnology}}, {{enum|LTE|CurrentAccessTechnology}} etc ''ATTACHED'' status
+              </description>
+            </enumeration>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent">
+              <description>
+                Corresponds to {{enum|GPRS|CurrentAccessTechnology}}, {{enum|UMTS|CurrentAccessTechnology}}, {{enum|LTE|CurrentAccessTechnology}} etc ''DETACHED'' status
+              </description>
+            </enumeration>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.8">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.8">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IMEI" access="readOnly" dmr:version="2.8">
+        <description>
+          International Mobile Station Equipment Identity number, represented as a 15 digit string (digits 0-9).
+        </description>
+        <syntax>
+          <string>
+            <size minLength="15" maxLength="15"/>
+            <pattern value="[0-9]{15,15}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedAccessTechnologies" access="readOnly" dmr:version="2.8">
+        <description>
+          Access technologies supported by the interface.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="GPRS">
+              <description>
+                GSM with GPRS
+              </description>
+            </enumeration>
+            <enumeration value="EDGE">
+              <description>
+                GSM with EDGE
+              </description>
+            </enumeration>
+            <enumeration value="UMTS"/>
+            <enumeration value="UMTSHSPA">
+              <description>
+                UMTS with High Speed Packet Access (HSPA {{bibref|3GPP-HSPA}})
+              </description>
+            </enumeration>
+            <enumeration value="CDMA2000OneX"/>
+            <enumeration value="CDMA2000HRPD"/>
+            <enumeration value="LTE"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredAccessTechnology" access="readWrite" dmr:version="2.8">
+        <description>
+          Preferred access technology.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="SupportedAccessTechnologies" nullValue="Auto"/>
+          </string>
+          <default type="factory" value="Auto"/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentAccessTechnology" access="readOnly" dmr:version="2.8">
+        <description>
+          Access technology that is currently in use.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="SupportedAccessTechnologies"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AvailableNetworks" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          List of available networks.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkRequested" access="readWrite" dmr:version="2.8">
+        <description>
+          Name of the network which will be used, or {{empty}} if the network is selected automatically.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="factory" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkInUse" access="readOnly" dmr:version="2.8">
+        <description>
+          The value is {{empty}} if no network is found, or if the network specified in {{param|NetworkRequested}} is not found.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <enumerationRef targetParam="AvailableNetworks" nullValue=""/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RSSI" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The received signal strength in {{units}}. The allowed values depend on {{param|CurrentAccessTechnology}}:
+          * For {{enum|GPRS|SupportedAccessTechnologies}}, {{enum|EDGE|SupportedAccessTechnologies}} the range is -111 {{units}} to -49 {{units}}
+          * For {{enum|UMTS|SupportedAccessTechnologies}}, {{enum|UMTSHSPA|SupportedAccessTechnologies}} the range is -117 {{units}} to -54 {{units}}
+          * For {{enum|LTE|SupportedAccessTechnologies}} the range is -117 {{units}} to -25 {{units}}
+          Note: An undetectable signal is indicated by the appropriate lower limit, e.g. -117 {{units}} for LTE.
+        </description>
+        <syntax>
+          <int>
+            <units value="dBm"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="UpstreamMaxBitRate" access="readOnly" dmr:version="2.8">
+        <description>
+          The current maximum attainable data rate upstream (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownstreamMaxBitRate" access="readOnly" dmr:version="2.8">
+        <description>
+          The current maximum attainable data rate downstream (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Cellular.Interface.{i}.USIM." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        USIM (Universal Subscriber Identity Module or SIM card) parameters for the interface.
+      </description>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The current status of the USIM card.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None">
+              <description>
+                No card available
+              </description>
+            </enumeration>
+            <enumeration value="Available">
+              <description>
+                Card is available but not verified
+              </description>
+            </enumeration>
+            <enumeration value="Valid">
+              <description>
+                Card can be used; either valid PIN was entered, or PIN check is deactivated
+              </description>
+            </enumeration>
+            <enumeration value="Blocked">
+              <description>
+                USIM is blocked because the maximum number of invalid PIN entries was exceeded
+              </description>
+            </enumeration>
+            <enumeration value="Error" optional="true">
+              <description>
+                An error was detected with the card
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IMSI" access="readOnly" dmr:version="2.8">
+        <description>
+          International Mobile Subscriber Identity represented as a string with either 14 or 15 digits (digits 0-9). The first 3 digits are the mobile country code (MCC), which are followed by the mobile network code (MNC), either 2 digits (European standard) or 3 digits (North American standard), followed by the mobile subscription identification number (MSIN).
+        </description>
+        <syntax>
+          <string>
+            <size minLength="14" maxLength="15"/>
+            <pattern value="[0-9]{14,15}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ICCID" access="readOnly" dmr:version="2.8">
+        <description>
+          Integrated Circuit Card Identifier represented as a string of up to 20 digits (digits 0-9). The number is composed of the following parts:
+          * Major industry identifier (MII), 2 fixed digits, 89 for telecommunication purposes.
+          * Country code, 1–3 digits, as defined by ITU-T recommendation {{bibref|ITU-E.164}}.
+          * identifier, 1–4 digits.
+          * Individual account identification number. Its length is variable, but every number under one IIN will have the same length.
+          * Single check digit calculated from the other digits using the Luhn algorithm.
+          For cards using an ICCID according to {{bibref|ITU-E.118}} the maximum length is 19 Digits, for GSM cards 20 digits.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="20"/>
+            <pattern value="[0-9]{6,20}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MSISDN" access="readOnly" dmr:version="2.8">
+        <description>
+          Mobile Subscriber Integrated Service Digital Network Number, a number uniquely identifying a subscription in a GSM, UMTS, or LTE mobile network. {{bibref|ITU-E.164}}
+        </description>
+        <syntax>
+          <string>
+            <size minLength="14" maxLength="15"/>
+            <pattern value="[0-9]{14,15}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PINCheck" access="readWrite" dmr:version="2.8">
+        <description>
+          Controls the PIN verification of the USIM card.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="OnNetworkAccess">
+              <description>
+                Check the PIN with each access to a new network
+              </description>
+            </enumeration>
+            <enumeration value="Reboot">
+              <description>
+                Check the PIN with first access after (re)boot
+              </description>
+            </enumeration>
+            <enumeration value="Off">
+              <description>
+                Disable the PIN check
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PIN" access="readWrite" dmr:version="2.8">
+        <description>
+          Allows the ACS to change the USIM PIN used for SIM card activation.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="4"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Cellular.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Cellular.AccessPoint.{i}." access="readWrite" numEntriesParameter="AccessPointNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        Cellular Access Point table. Each entry is identified by an {{param|APN}} (Access Point Name) that identifies a gateway between the mobile network and another computer network.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="APN"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the Access Point.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="APN" access="readWrite" dmr:version="2.8">
+        <description>
+          Access Point Name.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.8">
+        <description>
+          Username used to authenticate the CPE when making a connection to the Access Point.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.8">
+        <description>
+          Password used to authenticate the CPE when making a connection to the Access Point.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Proxy" access="readWrite" dmr:version="2.8">
+        <description>
+          Proxy server IP address.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProxyPort" access="readWrite" dmr:version="2.8">
+        <description>
+          Proxy server port.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.8">
+        <description>
+          Reference to the interface with which the access point is associated.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".Cellular.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ATM." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Asynchronous Transfer Mode (ATM) object that contains the {{object|Link}} interface and {{object|Diagnostics.F5Loopback()}} diagnostics.
+      </description>
+      <parameter name="LinkNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ATM.Link.{i}." access="readWrite" numEntriesParameter="LinkNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        ATM link-layer table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Models an ATM PVC virtual circuit and the ATM Adaption Layer (AAL). An ATM Link entry is typically stacked on top of either a {{object|.DSL.Channel.}} or a {{object|.DSL.BondingGroup.}} object.
+        When an ''ATM Link'' interface is used, a lower-layer {{object|.DSL.Channel}} interface MUST be configured with ATM encapsulation (see {{param|.DSL.Channel.{i}.LinkEncapsulationUsed}}).
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the link.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the link (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the link as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the link entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="LinkType" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates the type of connection and refers to the complete stack of protocol used for this connection.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="EoA">
+              <description>
+                {{bibref|RFC2684}} bridged Ethernet over ATM
+              </description>
+            </enumeration>
+            <enumeration value="IPoA">
+              <description>
+                {{bibref|RFC2684}} routed IP over ATM
+              </description>
+            </enumeration>
+            <enumeration value="PPPoA">
+              <description>
+                {{bibref|RFC2364}} PPP over ATM
+              </description>
+            </enumeration>
+            <enumeration value="CIP">
+              <description>
+                {{bibref|RFC2225}} Classical IP over ATM
+              </description>
+            </enumeration>
+            <enumeration value="Unconfigured"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AutoConfig" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates if the CPE is currently using some auto configuration mechanisms for this connection.  If this  variable is {{true}}, all writable variables in this connection instance become read-only. Any attempt to change one of these variables SHOULD fail and an error SHOULD be returned.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="DestinationAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          Destination address of this link, in the form "VPI/VCI" (e.g. "8/23" or "0/35").
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pattern value="\d+/\d+"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Encapsulation" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifies the connection encapsulation that will be used.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="LLC"/>
+            <enumeration value="VCMUX"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FCSPreserved" access="readWrite" dmr:version="2.0">
+        <description>
+          This flag tells if a checksum SHOULD be added in the ATM payload. It does not refer to the checksum of one of  the ATM cells or AALX packets. In case of LLC or VCMUX encapsulation, this ATM checksum is the FCS field described in {{bibref|RFC2684}}. It is only applicable in the upstream direction.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="VCSearchList" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} Ordered list of VPI/VCI pairs to search if a link using the {{param|DestinationAddress}} cannot be  established.  In the form "VPI1/VCI1, VPI2/VCI2, ...".  {{pattern}}
+          Example:
+          : ''0/35, 8/35, 1/35''
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string>
+            <pattern value="\d+/\d+"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AAL" access="readOnly" dmr:version="2.0">
+        <description>
+          Describes the ATM Adaptation Layer (AAL) currently in use on the PVC.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AAL1"/>
+            <enumeration value="AAL2"/>
+            <enumeration value="AAL3"/>
+            <enumeration value="AAL4"/>
+            <enumeration value="AAL5"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ATM.Link.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedBlocks" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current count of successfully transmitted cells.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedBlocks" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current count of successfully received cells.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CRCErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Count of the ATM layer cyclic redundancy check (CRC) errors.
+          This refers to CRC errors at the ATM adaptation layer (AAL). The AAL in use is indicated by the {{param|#.AAL}} parameter. The value  of the {{param}} parameter MUST be 0 for AAL types that have no CRCs.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="HECErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Count of the number of Header Error Check related errors at the ATM layer.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ATM.Link.{i}.QoS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The ATM Link QoS object.
+      </description>
+      <parameter name="QoSClass" access="readWrite" dmr:version="2.0">
+        <description>
+          Describes the ATM Quality Of Service (QoS) being used on the VC.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="UBR"/>
+            <enumeration value="CBR"/>
+            <enumeration value="GFR"/>
+            <enumeration value="VBR-nrt"/>
+            <enumeration value="VBR-rt"/>
+            <enumeration value="UBR+"/>
+            <enumeration value="ABR"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PeakCellRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies the upstream peak cell rate in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="cells per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumBurstSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies the upstream maximum burst size in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="cells"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SustainableCellRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies the upstream sustainable cell rate, in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="cells per second"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ATM.Diagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The ATM Diagnostics object.
+      </description>
+      <command name="F5Loopback()" async="true" dmr:version="2.12">
+        <description>
+          This command provides access to an ATM-layer F5 OAM loopback test.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Interface" dmr:version="2.0">
+            <description>
+              {{reference}}  This is the interface over which the test is to be performed.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+                <pathRef refType="weak" targetParent=".ATM.Link." targetType="row"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="NumberOfRepetitions" dmr:version="2.0">
+            <description>
+              Number of repetitions of the ping test to perform before reporting the results.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="Timeout" dmr:version="2.0">
+            <description>
+              Timeout in {{units}} for the ping test.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1"/>
+                <units value="milliseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+        </input>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <parameter name="SuccessCount" dmr:version="2.0">
+            <description>
+              Result parameter indicating the number of successful pings (those in which a successful response was received  prior to the timeout) in the most recent ping test.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="FailureCount" dmr:version="2.0">
+            <description>
+              Result parameter indicating the number of failed pings in the most recent ping test.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="AverageResponseTime" dmr:version="2.0">
+            <description>
+              Result parameter indicating the average response time in {{units}} over all repetitions with successful  responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="milliseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="MinimumResponseTime" dmr:version="2.0">
+            <description>
+              Result parameter indicating the minimum response time in {{units}} over all repetitions with successful  responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="milliseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="MaximumResponseTime" dmr:version="2.0">
+            <description>
+              Result parameter indicating the maximum response time in {{units}} over all repetitions with successful  responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="milliseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+        </output>
+      </command>
+    </object>
+    <object name="Device.PTM." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Packet Transfer Mode ({{bibref|G.993.1|Annex H}}). This object contains the {{object|Link}} interface.
+      </description>
+      <parameter name="LinkNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PTM.Link.{i}." access="readWrite" numEntriesParameter="LinkNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        PTM link-layer table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Models a layer 2 variable-sized packet interface. A PTM Link entry is typically stacked on top of either a {{object|.FAST.Line.}}, {{object|.DSL.Channel.}}, or a {{object|.DSL.BondingGroup.}} object.
+        When a ''PTM Link'' interface is used, a lower-layer {{object|.DSL.Channel}} interface MUST be configured with PTM encapsulation (see {{param|.DSL.Channel.{i}.LinkEncapsulationUsed}}).
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the link.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the link (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the link as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the link entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC Address of the interface.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PTM.Link.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Ethernet object. This object models several Ethernet interface objects, each representing a different stack layer, including: {{object|Interface}}, {{object|Link}}, and {{object|VLANTermination}}. {{object|Interface}} is media-specific and models a port, the PHY layer, and the MAC layer. {{object|Link}} is media-independent and models the Logical Link Control (LLC) layer. An "outer" {{object|VLANTermination}}, when present, is expected to be stacked on top of {{object|Link}} objects to receive and send frames with a configured VLANID.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LinkNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANTerminationNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RMONStatsNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LAGNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        Ethernet interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). This table models physical Ethernet ports, but in terms of the interface stack it also models the PHY and MAC level Ethernet interface.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC Address of the interface.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readWrite" dmr:version="2.0">
+        <description>
+          The maximum upstream and downstream PHY bit rate supported by this interface (expressed in {{units}}).
+          A value of -1 indicates automatic selection of the maximum bit rate.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="Mbps"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentBitRate" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The current upstream and downstream PHY bit rate on this interface (expressed in {{units}}).
+          A value of 0 indicates that the current bit rate is unknown.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DuplexMode" access="readWrite" dmr:version="2.0">
+        <description>
+          The duplex mode available to this connection.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Half"/>
+            <enumeration value="Full"/>
+            <enumeration value="Auto"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EEECapability" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates whether this physical ethernet port supports Energy Efficient Ethernet as specified in {{bibref|802.3-2012_section6|Section 78}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EEEEnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Whether Energy Efficient Ethernet {{bibref|802.3-2012_section6|Section 78}} support is currently enabled. When enabled, this ethernet port will be capable of entering or exiting Low Power Idle (LPI) mode.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.Link.{i}." access="readWrite" numEntriesParameter="LinkNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Ethernet link layer table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Table entries model the Logical Link Control (LLC) layer. It is expected that an ''Ethernet Link'' interface can be stacked above any lower-layer interface object capable of carrying Ethernet frames.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the link.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the link (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the link as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the link entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC address used for packets sent via this interface. Provides the source MAC address for outgoing traffic and the destination MAC address for incoming traffic.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="PriorityTagging" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables priority tagging on this Ethernet Link.
+          When {{true}}, egress frames leaving this interface will be priority tagged with the frame's associated priority value, which will either be derived directly from the ingress frame or else set via {{param|.QoS.Classification.{i}.EthernetPriorityMark}} or {{param|.QoS.Classification.{i}.InnerEthernetPriorityMark}}.
+          When {{false}}, egress frames leaving this interface will be untagged.
+          The parameter does not affect reception of ingress frames.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.Link.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.VLANTermination.{i}." access="readWrite" numEntriesParameter="VLANTerminationNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        VLAN Termination table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). A VLAN Termination entry is typically stacked on top of a {{object|#.Link}} object to receive and send frames with the configured {{param|VLANID}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the VLANTermination entry.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the VLANTermination entry (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the VLANTermination entry as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the VLANTermination entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANID" access="readWrite" dmr:version="2.0">
+        <description>
+          The VLAN ID for this {{object}} entry (as defined in {{bibref|802.1Q-2011}}). Only ingress frames with this VLAN ID will be passed to higher protocol layers; frames sent from higher protocol layers will be tagged with this VLAN ID.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="4094"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TPID" access="readWrite" dmr:version="2.7">
+        <description>
+          The Tag Protocol Identifier (TPID) assigned to this {{object}}. The TPID is an EtherType value used to identify the frame as a tagged frame.
+          Standard {{bibref|802.1Q-2011|Table 9.1}} TPID values are:
+          *S-TAG 0x88A8 = 34984
+          *C-TAG 0x8100 = 33024
+          Non-Standard TPID values are:
+          *S-TAG 0x9100 = 37120
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="33024"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.VLANTermination.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.RMONStats.{i}." access="readWrite" numEntriesParameter="RMONStatsNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        Ethernet statistics based on the {{bibref|RFC2819}} ''RMON-MIB'' ''etherStatsTable'', with some extensions inspired by {{bibref|G.988|Section 9.3.32}}.
+        Each instance is associated with an interface capable of transporting Ethernet-encapsulated packets, and contains a set of unidirectional Ethernet statistics.
+        The statistics are sampled either on ingress or on egress.  This is determined as follows:
+        * If the instance is associated with an egress queue (or queues) via the {{param|Queue}} parameter or by setting {{param|AllQueues}} to {{true}} then data is sampled on egress.  In this case {{param|Bytes}} etc measure the data that has been sent on the interface, possibly filtered by {{param|Queue}} or {{param|VLANID}}.
+        * Otherwise data is sampled on ingress.  In this case {{param|Bytes}} etc measure the data that has been received on the interface, possibly filtered by {{param|VLANID}}.
+        When sampling on egress, the term ''received'' means ''received by the queuing sub-system''.
+        Multiple instances can be associated with a single interface: individual instances can be configured to collect data associated with the entire interface, or with a particular VLAN and/or queue.
+        The CPE MUST reset each instances's Stats parameters whenever the instance is disabled and re-enabled.  Whether this reset occurs when the instance becomes operationally disabled ({{param|Status}} = {{enum|Disabled|Status}}) or administratively enabled ({{param|Enable}} = {{true}}) is a local matter to the CPE.  This is similar to the behavior of interface statistics, e.g. as specified for {{object|Device.Ethernet.Interface.{i}.Stats}}.  Furthermore, this instance's Stats parameters MUST be reset whenever the referenced interface's Stats parameters are reset, or when the referenced queue or VLAN is disabled and re-enabled.
+        For enabled table entries, if {{param|Interface}} references an interface that is not capable of transporting Ethernet-encapsulated packets, or if {{param|Queue}} references a queue that is not instantiated on {{param|Interface}}, or if {{param|Queue}} is not a valid reference and {{param|AllQueues}} is {{false}}, the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes unique key parameters that are strong references. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+        <parameter ref="VLANID"/>
+        <parameter ref="Queue"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables this instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.4">
+        <description>
+          The status of this instance.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.4">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.4">
+        <description>
+          The textual name of the {{object}} entry as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.4">
+        <description>
+          The interface associated with this instance.  {{reference|an interface that is capable of transporting Ethernet-encapsulated packets}}
+          The term "capable of transporting Ethernet-encapsulated packets" means "has an Ethernet header" and therefore refers to any interface that is at or below an ''Ethernet''.{{object|#.Link}} instance in the interface stack.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANID" access="readWrite" dmr:version="2.4">
+        <description>
+          Filter criterion.
+          The VLAN ID for which statistics are to be collected.
+          A zero value indicates that all packets, whether or not they have a VLAN header, will be considered.
+          A non-zero value indicates that only packets that have the the specified VLAN ID will be considered.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="4094"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Queue" access="readWrite" dmr:version="2.4">
+        <description>
+          Filter criterion.
+          The egress queue with which this instance is associated.
+          Only packets that are sent to the referenced queue will be considered.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="Device.QoS.Queue." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllQueues" access="readWrite" dmr:version="2.4">
+        <description>
+          Indicates whether this instance applies to all queues.  If {{true}}, the value of {{param|Queue}} is ignored since all egress queues are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DropEvents" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of events in which packets were dropped due to lack of resources.  Note that this number is not necessarily the number of packets dropped; it is just the number of times this condition has been detected.
+          This parameter is based on ''etherStatsDropEvents'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Bytes" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including those in bad packets) received (excluding framing bits but including FCS bytes).
+          This parameter is based on ''etherStatsOctets'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="bytes"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Packets" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including bad packets, broadcast packets, and multicast packets) received.
+          This parameter is based on ''etherStatsPkts'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of good {{units}} received that were directed to the broadcast address.  Note that this does not include multicast packets.
+          This parameter is based on ''etherStatsBroadcastPkts'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of good {{units}} received that were directed to a multicast address.  Note that this number does not include packets directed to the broadcast address.
+          This parameter is based on ''etherStatsMulticastPkts'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="CRCErroredPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} received that had a length (excluding framing bits, but including FCS bytes) of between 64 and 1518 bytes, inclusive, but had either a bad Frame Check Sequence (FCS) with an integral number of bytes (FCS Error) or a bad FCS with a non-integral number of bytes (Alignment Error).
+          This parameter is based on ''etherStatsCRCAlignErrors'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="packets"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="UndersizePackets" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} received that were less than 64 bytes long (excluding framing bits, but including FCS bytes) and were otherwise well formed.
+          This parameter is based on ''etherStatsUndersizePkts'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="packets"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="OversizePackets" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} received that were longer than 1518 bytes (excluding framing bits, but including FCS bytes) and were otherwise well formed.
+          This parameter is based on ''etherStatsOversizePkts'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="packets"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Packets64Bytes" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including bad packets) received that were 64 bytes in length (excluding framing bits but including FCS bytes).
+          This parameter is based on ''etherStatsPkts64Octets'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Packets65to127Bytes" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including bad packets) received that were between 65 and 127 bytes in length inclusive (excluding framing bits but including FCS bytes).
+          This parameter is based on ''etherStatsPkts65to127Octets'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Packets128to255Bytes" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including bad packets) received that were between 128 and 255 bytes in length inclusive (excluding framing bits but including FCS bytes).
+          This parameter is based on ''etherStatsPkts6128to255Octets'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Packets256to511Bytes" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including bad packets) received that were between 256 and 511 bytes in length inclusive (excluding framing bits but including FCS bytes).
+          This parameter is based on ''etherStatsPkts256to511Octets'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Packets512to1023Bytes" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including bad packets) received that were between 512 and 1023 bytes in length inclusive (excluding framing bits but including FCS bytes).
+          This parameter is based on ''etherStatsPkts512to1023Octets'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Packets1024to1518Bytes" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of {{units}} (including bad packets) received that were between 1024 and 1518 bytes in length inclusive (excluding framing bits but including FCS bytes).
+          This parameter is based on ''etherStatsPkts1024to1518Octets'' from {{bibref|RFC2819}}.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="packets"/>
+          </unsignedLong>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.LAG.{i}." access="readWrite" numEntriesParameter="LAGNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        Ethernet Link Aggregation Group (LAG) table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Table entries model the Link Aggregation Sub-Layer as defined in {{bibref|802.3-2015}} and {{bibref|802.1AX-2014}}. It is expected that a {{object}} interface can only be stacked above {{object|.Ethernet.Interface}} interfaces. The CPE can reject creation of additional LAG instances if this would exceed its capabilities.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface). 
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.12">
+        <description>
+          The textual name of the LAG interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}.  See {{bibref|TR-181i2|Section 4.2.1}}.
+          {{param}} must reference to Device.Ethernet.Interface instances where  Link Aggregation Group is configured by the CPE.
+          For example, "Device.Ethernet.Interface.1, Device.Ethernet.Interface.2"
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readWrite" dmr:version="2.12">
+        <description>
+          MAC address of the Link Aggregation Interface.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ethernet.LAG.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Universal Serial Bus ({{bibref|USB1.0}}, {{bibref|USB2.0}}, {{bibref|USB3.0}}). This object contains the {{object|Interface}}, {{object|Port}}, and {{object|USBHosts}} objects.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PortNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        USB interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). This table models master and slave USB physical interfaces that support carrying Ethernet frames, e.g. via the USB Communication Device Class.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC Address of the interface.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum PHY bit rate supported by this interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readOnly" dmr:version="2.0">
+        <description>
+          {{reference}} This is the USB port associated with this interface object.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Port." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB.Port.{i}." access="readOnly" numEntriesParameter="PortNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        USB Port table. This table models master and slave USB physical ports on the device.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the port.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Standard" access="readOnly" dmr:version="2.0">
+        <description>
+          USB specification version supported by the Port. Example: "1.1"
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="4"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.0">
+        <description>
+          Type of the USB connection.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Host"/>
+            <enumeration value="Hub"/>
+            <enumeration value="Device"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Receptacle" access="readOnly" dmr:version="2.0">
+        <description>
+          Receptacle of the port.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Standard-A"/>
+            <enumeration value="Standard-B"/>
+            <enumeration value="Powered-B"/>
+            <enumeration value="Micro-AB"/>
+            <enumeration value="Micro-B"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Rate" access="readOnly" dmr:version="2.0">
+        <description>
+          Current speed of the USB connection. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Low">
+              <description>
+                1.5 Mbits/sec (187.5 KB/sec) defined in {{bibref|USB1.0}}
+              </description>
+            </enumeration>
+            <enumeration value="Full">
+              <description>
+                12 Mbits/sec (1.5 MB/sec) defined in {{bibref|USB1.0}}
+              </description>
+            </enumeration>
+            <enumeration value="High">
+              <description>
+                480 Mbits/sec (60 MB/sec) defined in {{bibref|USB2.0}}
+              </description>
+            </enumeration>
+            <enumeration value="Super">
+              <description>
+                5.0 Gbits/sec (625 MB/sec) defined in {{bibref|USB3.0}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Power" access="readOnly" dmr:version="2.0">
+        <description>
+          Power configuration of the USB connection. {{enum}}
+          Only applies when {{param|Type}} is {{enum|Device|Type}}. In other cases value is {{enum|Unknown}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Self"/>
+            <enumeration value="Bus"/>
+            <enumeration value="Unknown"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB.USBHosts." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object models the CPE's USB Host controllers.
+        See {{bibref|TR-157|Appendix I}} for Theory of Operation.
+      </description>
+      <parameter name="HostNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB.USBHosts.Host.{i}." access="readOnly" numEntriesParameter="HostNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Table of CPE USB Host controllers.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the USB Host controller.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          User-readable host controller name.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.0">
+        <description>
+          Type of USB Host
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="OHCI">
+              <description>
+                Open Host Controller Interface
+              </description>
+            </enumeration>
+            <enumeration value="EHCI">
+              <description>
+                Enhanced Host Controller Interface
+              </description>
+            </enumeration>
+            <enumeration value="UHCI">
+              <description>
+                Universal Host Controller Interface
+              </description>
+            </enumeration>
+            <enumeration value="xHCI">
+              <description>
+                Extensible Host Controller Interface
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PowerManagementEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, {{param}} enables the Host Controller to invoke Power Management policy, i.e. controlled Suspend (see {{bibref|USB2.0}}, Chapters 4.3.2, 7.1.7.6, and 11.9).
+          When set to {{false}} {{param}} immediately disables the Host controller Power Management policy.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="USBVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          USB specification version with which the controller complies.  Example: "1.1"
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="4"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <command name="Reset()" dmr:version="2.12">
+        <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 name="Device.USB.USBHosts.Host.{i}.Device.{i}." access="readOnly" numEntriesParameter="DeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Table of connected USB devices.
+      </description>
+      <uniqueKey>
+        <parameter ref="DeviceNumber"/>
+      </uniqueKey>
+      <parameter name="DeviceNumber" access="readOnly" dmr:version="2.0">
+        <description>
+          Device number on USB bus.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="USBVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          USB specification version with which the device complies.  Example: "1.1"
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="4"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceClass" access="readOnly" dmr:version="2.0">
+        <description>
+          Class Code as assigned by USB-IF.
+          When 0x00, each device specifies its own class code.  When 0xFF, the class code is vendor specified.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceSubClass" access="readOnly" dmr:version="2.0">
+        <description>
+          Subclass code (assigned by USB-IF).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          Device release number.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceProtocol" access="readOnly" dmr:version="2.0">
+        <description>
+          Protocol code (assigned by USB-IF).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="ProductID" access="readOnly" dmr:version="2.0">
+        <description>
+          Product ID (assigned by manufacturer).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="VendorID" access="readOnly" dmr:version="2.0">
+        <description>
+          Vendor ID (assigned by USB-IF).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Manufacturer" access="readOnly" dmr:version="2.0">
+        <description>
+          Device Manufacturer string descriptor.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProductClass" access="readOnly" dmr:version="2.0">
+        <description>
+          Device Product Class string descriptor.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="2.0">
+        <description>
+          Device SerialNumber string descriptor.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readOnly" dmr:version="2.0">
+        <description>
+          Hub port on parent device.
+          0 when no parent.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="USBPort" access="readOnly" dmr:version="2.0">
+        <description>
+          {{reference}} This is a reference to the USB host device to which this (external) USB device is connected.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".USB.Port." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Rate" access="readOnly" dmr:version="2.0">
+        <description>
+          Speed of the USB device. {{enum}}
+          Internal signaling between the connected USB device and the USB Host Controller provide the information needed to determine the negotiated rate.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Low">
+              <description>
+                1.5 Mbits/sec (187.5 KB/sec) defined in {{bibref|USB1.0}}
+              </description>
+            </enumeration>
+            <enumeration value="Full">
+              <description>
+                12 Mbits/sec (1.5 MB/sec) defined in {{bibref|USB1.0}}
+              </description>
+            </enumeration>
+            <enumeration value="High">
+              <description>
+                480 Mbits/sec (60 MB/sec) defined in {{bibref|USB2.0}}
+              </description>
+            </enumeration>
+            <enumeration value="Super">
+              <description>
+                5.0 Gbits/sec (625 MB/sec) defined in {{bibref|USB3.0}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Parent" access="readOnly" dmr:version="2.0">
+        <description>
+          {{reference}} This is a reference to the parent USB device (e.g. hub device).
+          This is {{empty}} for a device connected to the Host controller (root hub).
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.Device." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxChildren" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of ports.  Only applies for hub device, equal to 0 for other devices.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IsSuspended" access="readOnly" dmr:version="2.0">
+        <description>
+          When {{true}} the associated Device is in a suspended (i.e. low-power) state (see {{bibref|USB2.0|Chapter 11.9}}).
+          When {{false}} the associated Device is in any of the other states specified by the USB 2.0 Device State Machine (see {{bibref|USB2.0|Chapter 9.1.1}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IsSelfPowered" access="readOnly" dmr:version="2.0">
+        <description>
+          When {{true}} the associated device is at least partly powered by a local source (see {{bibref|USB2.0|Chapter 9.4.5}}).
+          When {{false}} the associated device draws all the current it needs from the USB bus.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ConfigurationNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}." access="readOnly" numEntriesParameter="ConfigurationNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Table of device configurations.
+      </description>
+      <uniqueKey>
+        <parameter ref="ConfigurationNumber"/>
+      </uniqueKey>
+      <parameter name="ConfigurationNumber" access="readOnly" dmr:version="2.0">
+        <description>
+          The identifier for each Device Configuration.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.USB.USBHosts.Host.{i}.Device.{i}.Configuration.{i}.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Table of device interface descriptors.
+      </description>
+      <uniqueKey>
+        <parameter ref="InterfaceNumber"/>
+      </uniqueKey>
+      <parameter name="InterfaceNumber" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of this interface (from USB interface descriptor).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceClass" access="readOnly" dmr:version="2.0">
+        <description>
+          Class Code as assigned by USB-IF.
+          When 0x00, each interface specifies its own class code.  When 0xFF, the class code is vendor specified.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceSubClass" access="readOnly" dmr:version="2.0">
+        <description>
+          Subclass code (assigned by USB-IF).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceProtocol" access="readOnly" dmr:version="2.0">
+        <description>
+          Protocol code (assigned by USB-IF).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        HPNA object that contains the {{object|Interface}} and {{object|Diagnostics}} objects. The HPNA (also known as HomePNA) industry standard {{bibref|G.9954}} defines peer to peer communication for home networking over existing coax cables and telephone wiring within the home.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        HPNA interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Each table entry models the PHY and MAC levels of an HPNA interface {{bibref|G.9954}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC Address of the interface.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          This interface's firmware version.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NodeID" access="readOnly" dmr:version="2.0">
+        <description>
+          The Node ID of this interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IsMaster" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether this interface is the HPNA network master.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Synced" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether this interface is synchronized with the HPNA network master. If this interface is the HPNA network master, {{param}} MUST be {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalSyncTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total time in {{units}} (since device reset) that this interface has been up and synchronized to the HPNA network master.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum HPNA PHY bit rate (expressed in {{units}}) of this interface.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkUtilization" access="readOnly" dmr:version="2.0">
+        <description>
+          Current HPNA network utilization (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="1000"/>
+            <units value="0.1%"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PossibleConnectionTypes" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate the types of connections possible for this interface. {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="Phone"/>
+            <enumeration value="Coax"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionType" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} Connection type(s) for which the HPNA protocol is active.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam="PossibleConnectionTypes"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PossibleSpectralModes" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate the spectral modes possible for this interface. {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="A">
+              <description>
+                4-20MHz - Phone / Coax
+              </description>
+            </enumeration>
+            <enumeration value="B">
+              <description>
+                12-28MHz - Phone / Coax
+              </description>
+            </enumeration>
+            <enumeration value="C">
+              <description>
+                36-52MHz - Coax only
+              </description>
+            </enumeration>
+            <enumeration value="D">
+              <description>
+                4-36MHz - Coax only
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SpectralMode" access="readWrite" dmr:version="2.0">
+        <description>
+          Spectral mode for which the HPNA protocol is active.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="PossibleSpectralModes"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MTU" access="readWrite" dmr:version="2.0">
+        <description>
+          Maximum Transmission Unit for this HPNA interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bytes"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NoiseMargin" access="readWrite" dmr:version="2.0">
+        <description>
+          The desired noise margin for which the local HPNA interface has been configured (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="0.1dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultNonLARQPER" access="readWrite" dmr:version="2.0">
+        <description>
+          The desired packet error rate for which the local HPNA interface has been configured (expressed in 1E-8, e.g. PER of 1.27E-6 will be presented as 127).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LARQEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enable or disable the Limited Automatic Repeat Request (LARQ) mechanism.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MinMulticastRate" access="readWrite" dmr:version="2.0">
+        <description>
+          The minimum multicast (and broadcast) rate that can be negotiated on the HPNA network directly accessible via this interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NegMulticastRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The negotiated multicast (and broadcast) rate on the HPNA network directly accessible via this interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MasterSelectionMode" access="readWrite" dmr:version="2.0">
+        <description>
+          Master selection mode. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Automatic">
+              <description>
+                Automatic master selection
+              </description>
+            </enumeration>
+            <enumeration value="ForceEndpoint">
+              <description>
+                Force local HPNA interface to be end point
+              </description>
+            </enumeration>
+            <enumeration value="ForceMaster">
+              <description>
+                Force local HPNA interface to be master
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}} This is the number of HPNA nodes that are directly accessible via this interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Interface.{i}.QoS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        QoS configuration object.
+      </description>
+      <parameter name="FlowSpecNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Interface.{i}.QoS.FlowSpec.{i}." access="readWrite" numEntriesParameter="FlowSpecNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Flow specification table.
+        The {{object|.QoS.Classification}} table is used to classify ingress traffic, where {{param|.QoS.Classification.{i}.TrafficClass}} is one of the classification result outputs. This ''TrafficClass'' value can be used to look up the appropriate {{object}} entry (i.e. the {{object}} entry whose {{param|TrafficClasses}} list contains a matching traffic class).
+        For enabled table entries, if {{param|TrafficClasses}} is {{empty}} then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="TrafficClasses" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} This list identifies the set of traffic classes associated with this flow spec.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <unsignedInt/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="FlowType" access="readWrite" dmr:version="2.0">
+        <description>
+          Flow type. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="CBR">
+              <description>
+                Constant Bit Rate
+              </description>
+            </enumeration>
+            <enumeration value="VBR">
+              <description>
+                Variable Bit Rate
+              </description>
+            </enumeration>
+            <enumeration value="VBR-NRT">
+              <description>
+                Variable Bit Rate - Non Real Time
+              </description>
+            </enumeration>
+            <enumeration value="BE">
+              <description>
+                Best Effort
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="BE"/>
+        </syntax>
+      </parameter>
+      <parameter name="Priority" access="readWrite" dmr:version="2.0">
+        <description>
+          Flow queue network priority.
+          Priority 0 is the lowest priority.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Latency" access="readWrite" dmr:version="2.0">
+        <description>
+          Maximum latency of the flow (expressed in {{units}}).
+          Value 0 means no latency requirements.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="999"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Jitter" access="readWrite" dmr:version="2.0">
+        <description>
+          Maximum jitter of the flow (expressed in {{units}}).
+          Value 0 means no jitter requirements.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="999"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Typical packet size.
+          Value 0 means undefined packet size.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="MinRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Minimum required rate in Kbps.
+          Value 0 means no MinRate requirements.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="AvgRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Average required rate in Kbps.
+          Value 0 means no AvgRate requirements.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Maximum required rate in Kbps.
+          Value 0 means no MaxRate requirements.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PER" access="readWrite" dmr:version="2.0">
+        <description>
+          The desired packet error rate (expressed in 1E-8, e.g. PER of 1.27E-6 will be presented as 127).
+          Value 0 means no PER requirements.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Timeout" access="readWrite" dmr:version="2.0">
+        <description>
+          Flow inactivity tear down timeout (expressed in {{units}}).
+          Value 0 means unlimited timeout.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Interface.{i}.AssociatedDevice.{i}." access="readOnly" numEntriesParameter="AssociatedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This table provides information about other HPNA devices that are directly accessible via this HPNA interface.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The physical address of this node.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeID" access="readOnly" dmr:version="2.0">
+        <description>
+          The Node ID of this node.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IsMaster" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether this node is the HPNA network master.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Synced" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether this node is synchronized with the HPNA network master. If this node is the HPNA network master, {{param}} MUST be {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalSyncTime" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total time in {{units}} (since device reset) that this node has been up and synchronized to the HPNA network master.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.0">
+        <description>
+          This node's maximum HPNA PHY bit rate (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PHYDiagnosticsEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enable / disable PHY throughput diagnostics mode on this node. All devices that are enabled will participate in the HPNA network PHY throughput diagnostics process.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether or not this node is currently present in the HPNA network.
+          The ability to list inactive nodes is OPTIONAL.  If the CPE includes inactive nodes in this table, {{param}} MUST be set to {{false}}  for each inactive node.  The length of time an inactive node remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HPNA.Diagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The HPNA Diagnostics object.
+      </description>
+      <command name="PHYThroughput()" async="true" dmr: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 dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Interface" dmr:version="2.0">
+            <description>
+              {{reference}}  This is the interface over which the test is to be performed.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+                <pathRef refType="weak" targetParent=".HPNA.Interface." targetType="row"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="NumPacketsInBurst" dmr:version="2.0">
+            <description>
+              Number of test packet in burst to be send during PHY diagnostics test from each HPNA device to other HPNA device  in the HPNA network.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="BurstInterval" dmr:version="2.0">
+            <description>
+              Test packet burst interval length (expressed in {{units}}).
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="milliseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TestPacketPayloadLength" dmr:version="2.0">
+            <description>
+              Payload length in the test packets.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="1480"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="PayloadEncoding" dmr:version="2.0">
+            <description>
+              HPNA payload encoding in PHY diagnostics. 0 is used for negotiated payload between devices according to line  conditions.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="PayloadDataGen" dmr:version="2.0">
+            <description>
+              Test packets payload data generator value.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="PayloadType" dmr:version="2.0">
+            <description>
+              Test packets payload type. {{enum}}
+              In Pattern mode the PayloadDataGen value is repeated pattern in the payload.
+              In IncrementByte mode LSByte in PayloadDataGen is used as first payload  and next bytes in payload are incremented.
+            </description>
+            <syntax>
+              <string>
+                <enumeration value="Pattern"/>
+                <enumeration value="IncrementByte"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="PriorityLevel" dmr:version="2.0">
+            <description>
+              Priority level of PHY diagnostics packets (0 lowest -7 highest).
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="7"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+        </input>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <object name="Result.{i}." minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+            <description>
+              PHY throughput diagnostics results.
+              Each result object corresponds to unidirectional traffic between two PHY diagnostics-enabled nodes (so there are two such objects for  each such pair).
+            </description>
+            <uniqueKey>
+              <parameter ref="SrcMACAddress"/>
+              <parameter ref="DestMACAddress"/>
+            </uniqueKey>
+            <parameter name="SrcMACAddress" dmr:version="2.0">
+              <description>
+                HPNA source MAC address.
+              </description>
+              <syntax>
+                <dataType ref="MACAddress"/>
+              </syntax>
+            </parameter>
+            <parameter name="DestMACAddress" dmr:version="2.0">
+              <description>
+                HPNA destination MAC address.
+              </description>
+              <syntax>
+                <dataType ref="MACAddress"/>
+              </syntax>
+            </parameter>
+            <parameter name="PHYRate" dmr:version="2.0">
+              <description>
+                PHY diagnostics HPNA PHY rate (expressed in {{units}}).
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="Mbps"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="BaudRate" dmr:version="2.0">
+              <description>
+                PHY Baud rate (expressed in {{units}}).
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="Kbaud"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="SNR" dmr:version="2.0">
+              <description>
+                PHY diagnostics SNR (expressed in {{units}}).
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="0.1dB"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="PacketsReceived" dmr:version="2.0">
+              <description>
+                Number of received packets in PHY diagnostics mode.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="Attenuation" dmr:version="2.0">
+              <description>
+                Measured attenuation (expressed in {{units}}).
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="0.1dB"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+          </object>
+        </output>
+      </command>
+      <command name="PerformanceMonitoring()" async="true" dmr: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 dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Interface" dmr:version="2.0">
+            <description>
+              {{reference}} This is the interface over which the test is to be performed.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+                <pathRef refType="weak" targetParent=".HPNA.Interface." targetType="row"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="SampleInterval" dmr:version="2.0">
+            <description>
+              Time in {{units}} between automatic collection of performance monitoring data.  A value of zero disables automatic collection of data.
+              The CPE MAY impose a minimum sample interval, in which case an attempt to set a (non-zero) interval that is less than this minimum MUST set the interval to the minimum and MUST NOT be regarded as an error.
+              If SampleInterval is a simple fraction of a day, e.g. 900 (a quarter of an hour) or 3600 (an hour), the CPE MAY choose to align sample intervals with time of day, but is not required to do so.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="seconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+        </input>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <object name="Nodes." minEntries="1" maxEntries="1" dmr:version="2.0">
+            <description>
+              Per-node HPNA performance monitoring results.
+              When automatic collection is enabled, i.e. {{param|#.SampleInterval}} is non-zero, the "current" interval is defined by the most recent automatic sample and the most recent subsequent manual sample, if any.
+              When automatic collection is disabled, i.e. SampleInterval is zero, the "current" interval is defined by the three most recent manual  samples.
+              Note: Packets in statistics counters are Ethernet packets.
+            </description>
+            <parameter name="CurrentStart" dmr:version="2.0">
+              <description>
+                Start time for the current interval.
+                When automatic collection is enabled, i.e. SampleInterval is non-zero, the current interval started at the most recent automatic  sample.
+                When automatic collection is disabled, i.e. SampleInterval is zero, the current interval started two manual samples  ago.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="CurrentEnd" dmr:version="2.0">
+              <description>
+                End time for the current interval.
+                When automatic collection is enabled, i.e. SampleInterval is non-zero, the current interval ended at the most recent manual sample  since the most recent automatic sample.  If there has been no such manual sample, the current interval is empty.
+                When automatic collection is disabled, i.e. SampleInterval is zero, the current interval ended at the most recent manual  sample.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="NodeNumberOfEntries" dmr:version="2.0">
+              <description>
+                {{numentries}} This is the number of HPNA nodes for which performance monitoring results were collected during the current sample interval.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+          </object>
+          <object name="Nodes.Node.{i}." minEntries="1" maxEntries="unbounded" dmr:version="2.0">
+            <description>
+              Per-node HPNA performance monitoring results during the current sample interval. Each table entry contains the results collected between an HPNA node (as indicated by {{param|MACAddress}}) and the local HPNA interface (as indicated by {{param|##.Interface}}).
+              Note: Packet counters indicate the number of packets received between {{param|#.CurrentStart}} and {{param|#.CurrentEnd}}.
+            </description>
+            <uniqueKey>
+              <parameter ref="MACAddress"/>
+            </uniqueKey>
+            <parameter name="MACAddress" dmr:version="2.0">
+              <description>
+                The MAC address of the HPNA node.
+              </description>
+              <syntax>
+                <dataType ref="MACAddress"/>
+              </syntax>
+            </parameter>
+            <parameter name="BytesSent" dmr:version="2.0">
+              <description>
+                The total number of bytes sent by host equipment for transmission on the HPNA interface.
+              </description>
+              <syntax>
+                <unsignedLong/>
+              </syntax>
+            </parameter>
+            <parameter name="BytesReceived" dmr:version="2.0">
+              <description>
+                The total number of received bytes on the HPNA interface destined for the host equipment.
+              </description>
+              <syntax>
+                <unsignedLong/>
+              </syntax>
+            </parameter>
+            <parameter name="PacketsSent" dmr:version="2.0">
+              <description>
+                The total number of packets sent by host equipment for transmission on the HPNA interface. Number includes also short error packets and control packets.
+              </description>
+              <syntax>
+                <unsignedLong/>
+              </syntax>
+            </parameter>
+            <parameter name="PacketsReceived" dmr:version="2.0">
+              <description>
+                The total number of good packets received on the HPNA interface destined for the host equipment.
+              </description>
+              <syntax>
+                <unsignedLong/>
+              </syntax>
+            </parameter>
+            <parameter name="BroadcastPacketsSent" dmr:version="2.0">
+              <description>
+                The number of broadcast packets transmitted on the HPNA interface.
+              </description>
+              <syntax>
+                <unsignedLong/>
+              </syntax>
+            </parameter>
+            <parameter name="BroadcastPacketsReceived" dmr:version="2.0">
+              <description>
+                The number of broadcast packets received on the HPNA interface.
+              </description>
+              <syntax>
+                <unsignedLong/>
+              </syntax>
+            </parameter>
+            <parameter name="MulticastPacketsSent" dmr:version="2.0">
+              <description>
+                The number of multicast packets transmitted on the HPNA interface.
+              </description>
+              <syntax>
+                <unsignedLong/>
+              </syntax>
+            </parameter>
+            <parameter name="MulticastPacketsReceived" dmr:version="2.0">
+              <description>
+                The number of multicast packets received on the HPNA interface.
+              </description>
+              <syntax>
+                <unsignedLong/>
+              </syntax>
+            </parameter>
+            <parameter name="PacketsCrcErrored" dmr:version="2.0">
+              <description>
+                The number of packets received on the HPNA interface with CRC errors.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="PacketsCrcErroredHost" dmr:version="2.0">
+              <description>
+                The number of CRC error packets received on the HPNA interface destined for the host equipment.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="PacketsShortErrored" dmr:version="2.0">
+              <description>
+                The number of packets received on the HPNA interface that are too short to be valid.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="PacketsShortErroredHost" dmr:version="2.0">
+              <description>
+                The number packets sent by the host equipment that are too short to be valid.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="RxPacketsDropped" dmr:version="2.0">
+              <description>
+                The number of received packets dropped due to lack of resources.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="TxPacketsDropped" dmr:version="2.0">
+              <description>
+                The number packets sent by the host equipment for transmission on the HPNA interface but dropped due to lack of resources.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="ControlRequestLocal" dmr:version="2.0">
+              <description>
+                The number of HPNA control request packets from local host.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="ControlReplyLocal" dmr:version="2.0">
+              <description>
+                The number of HPNA control reply packets to local host.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="ControlRequestRemote" dmr:version="2.0">
+              <description>
+                The number of HPNA control request packets from remote host.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="ControlReplyRemote" dmr:version="2.0">
+              <description>
+                The number of HPNA control reply packets to remote host.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="PacketsSentWire" dmr:version="2.0">
+              <description>
+                The total number of packets transmitted to wire.
+              </description>
+              <syntax>
+                <unsignedLong/>
+              </syntax>
+            </parameter>
+            <parameter name="BroadcastPacketsSentWire" dmr:version="2.0">
+              <description>
+                The total number of broadcast packets transmitted to wire.
+              </description>
+              <syntax>
+                <unsignedLong/>
+              </syntax>
+            </parameter>
+            <parameter name="MulticastPacketsSentWire" dmr:version="2.0">
+              <description>
+                The total number of multicast packets transmitted to wire.
+              </description>
+              <syntax>
+                <unsignedLong/>
+              </syntax>
+            </parameter>
+            <parameter name="PacketsInternalControl" dmr:version="2.0">
+              <description>
+                The number of HPNA control request packets from internal node.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="BroadcastPacketsInternalControl" dmr:version="2.0">
+              <description>
+                The number of HPNA broadcast control request packets from internal node.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="PacketsReceivedQueued" dmr:version="2.0">
+              <description>
+                The number of received packets queued on host output queues.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="PacketsReceivedForwardUnknown" dmr:version="2.0">
+              <description>
+                The number of packets received and forwarded to unknown hosts.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="NodeUtilization" dmr:version="2.0">
+              <description>
+                The node utilization (expressed in {{units}}).
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <range minInclusive="0" maxInclusive="1000"/>
+                  <units value="0.1%"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+          </object>
+          <object name="Channels." minEntries="1" maxEntries="1" dmr:version="2.0">
+            <description>
+              Per-channel HPNA performance monitoring results.
+              Note: channels are unidirectional.
+            </description>
+            <parameter name="TimeStamp" dmr:version="2.0">
+              <description>
+                Time at which channel data was last collected.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="ChannelNumberOfEntries" dmr:version="2.0">
+              <description>
+                {{numentries}} This is the number of HPNA channels for which performance monitoring results have been collected.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+          </object>
+          <object name="Channels.Channel.{i}." minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+            <description>
+              Per-channel HPNA performance monitoring results.
+            </description>
+            <uniqueKey>
+              <parameter ref="HostSrcMACAddress"/>
+              <parameter ref="HostDestMACAddress"/>
+            </uniqueKey>
+            <parameter name="HostSrcMACAddress" dmr:version="2.0">
+              <description>
+                The host source MAC address associated with the channel.
+              </description>
+              <syntax>
+                <dataType ref="MACAddress"/>
+              </syntax>
+            </parameter>
+            <parameter name="HostDestMACAddress" dmr:version="2.0">
+              <description>
+                The host destination MAC address associated with the channel.
+              </description>
+              <syntax>
+                <dataType ref="MACAddress"/>
+              </syntax>
+            </parameter>
+            <parameter name="HPNASrcMACAddress" dmr:version="2.0">
+              <description>
+                The HPNA source MAC address associated with the channel.
+              </description>
+              <syntax>
+                <dataType ref="MACAddress"/>
+              </syntax>
+            </parameter>
+            <parameter name="HPNADestMACAddress" dmr:version="2.0">
+              <description>
+                The HPNA destination MAC address associated with the channel.
+              </description>
+              <syntax>
+                <dataType ref="MACAddress"/>
+              </syntax>
+            </parameter>
+            <parameter name="PHYRate" dmr:version="2.0">
+              <description>
+                Channel PHY rate (expressed in {{units}}).
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="Mbps"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="BaudRate" dmr:version="2.0">
+              <description>
+                PHY Baud rate (expressed in {{units}}).
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="Kbaud"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="SNR" dmr:version="2.0">
+              <description>
+                Channel actual SNR measured in receiver side (expressed in {{units}}).
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="0.1dB"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="PacketsSent" dmr:version="2.0">
+              <description>
+                Number of packets sent in the channel.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="PacketsReceived" dmr:version="2.0">
+              <description>
+                Pre-LARQ number of packets received in the channel.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="LARQPacketsReceived" dmr:version="2.0">
+              <description>
+                Post-LARQ number of packets received in the channel. Valid only if LARQ is enabled.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="FlowSpec" dmr:version="2.0">
+              <description>
+                {{reference}} Identifies the ''FlowSpec'' associated with the channel. This parameter is only used for channels that correspond to egress traffic from the local HPNA interface.
+                {{null}} means that the channel is not associated with any specified flow specification in the QoS object.
+              </description>
+              <syntax>
+                <string>
+                  <size maxLength="256"/>
+                  <pathRef refType="strong" targetParent=".HPNA.Interface.{i}.QoS.FlowSpec." targetType="row"/>
+                </string>
+              </syntax>
+            </parameter>
+          </object>
+        </output>
+      </command>
+    </object>
+    <object name="Device.MoCA." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        MoCA object that contains the {{object|Interface}} table {{bibref|MoCAv1.0}} {{bibref|MoCAv1.1}}.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MoCA.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        MoCA interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Each table entry models the PHY and MAC levels of a MoCA interface {{bibref|MoCAv1.0}} {{bibref|MoCAv1.1}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC Address of the interface.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          This interface's firmware version.
+          This parameter is based on ''mocaIfSoftwareVersion'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum MoCA PHY bit rate (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxIngressBW" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum bandwidth of this interface for flows onto the MoCA network in {{units}}.
+          This parameter is based on ''mocaIfMaxIngressNodeBw'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxEgressBW" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum bandwidth of this interface for flows from the MoCA network in {{units}}.
+          This parameter is based on ''mocaIfMaxEgressNodeBw'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="HighestVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          Identifies the highest MoCA version that this interface supports.
+          This element MUST be in the form of dot-delimited integers, where each successive integer represents a more minor category of variation. For example, 1.0, where the components mean major.minor revision number. {{pattern}}
+          This parameter is based on ''mocaIfMocaVersion'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <pattern value="\d+(\.\d+)*"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          Identifies the MoCA version that the MoCA network is currently running.
+          This element MUST be in the form of dot-delimited integers, where each successive integer represents a more minor category of variation. For example, 1.0, where the components mean major.minor revision number. {{pattern}}
+          This parameter is based on ''mocaIfNetworkVersion'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <pattern value="\d+(\.\d+)*"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkCoordinator" access="readOnly" dmr:version="2.0">
+        <description>
+          The Node ID of the current Network Coordinator (NC) for the MoCA network.
+          This parameter is based on ''mocaIfNC'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeID" access="readOnly" dmr:version="2.0">
+        <description>
+          The Node ID of this interface.
+          This parameter is based on ''mocaIfNodeID'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxNodes" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum network node capability supported by the interface. If {{param}} is {{true}} then the interface supports 16 nodes (the maximum for a MoCA 1.1 network). If {{param}} is false then the interface supports 8 nodes (the maximum for a MoCA 1.0 network).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredNC" access="readWrite" dmr:version="2.0">
+        <description>
+          Whether this interface is a preferred Network Coordinator (NC).
+          This parameter is based on ''mocaIfPreferredNC'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="BackupNC" access="readOnly" dmr:version="2.0">
+        <description>
+          The Node ID of the backup Network Coordinator node.
+          This parameter is based on ''mocaIfBackupNC'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PrivacyEnabledSetting" access="readWrite" dmr:version="2.0">
+        <description>
+          The configured privacy mode. This indicates whether link-layer security is enabled ({{true}}) or disabled ({{false}}) for network admission.
+          The configured privacy setting MAY NOT match the current operational state ({{param|PrivacyEnabled}}), since this setting is only applied during network formation or admission.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PrivacyEnabled" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether link-layer security is enabled or disabled.
+          This parameter is based on ''mocaIfPrivacyEnable'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FreqCapabilityMask" access="readOnly" dmr:version="2.0">
+        <description>
+          Hexadecimal encoded 64-bit mask of supported frequencies. This is the bit map of the spectrum that the interface supports, and each bit represents 25 MHz of spectrum. The least significant bit of the rightmost character corresponds to 800MHz, which is the lowest frequency.
+          For example, an interface that supports 1150 MHz through 1500 MHz would have a value of 0x000000001FFFC000.
+          This parameter is based on ''mocaIfCapabilityMask'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="8" maxLength="8"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="FreqCurrentMaskSetting" access="readWrite" dmr:version="2.0">
+        <description>
+          The configured hexadecimal encoded 64-bit mask of enabled frequencies for network admission.
+          The configured frequencies MAY NOT match the current operational state ({{param|FreqCurrentMask}}), since this setting is only applied during network formation or admission.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="8" maxLength="8"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="FreqCurrentMask" access="readOnly" dmr:version="2.0">
+        <description>
+          Hexadecimal encoded 64-bit mask of used frequencies. This is the bit map of the spectrum that can be used and is a subset of the {{param|FreqCapabilityMask}}. Each bit represents 25 MHz of spectrum. The least significant bit of the rightmost character corresponds to 800MHz, which is the lowest frequency.
+          This parameter is based on ''mocaIfChannelMask'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="8" maxLength="8"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentOperFreq" access="readOnly" dmr:version="2.0">
+        <description>
+          Current Operational Frequency.  The RF frequency in Hz to which the MoCA interface is currently  tuned. This parameter is only valid when {{param|Status}} is {{enum|Up|Status}}.
+          This parameter is based on ''mocaIfRFChannel'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LastOperFreq" access="readOnly" dmr:version="2.0">
+        <description>
+          Last Operational Frequency.  The RF frequency in Hz to which the MoCA interface was tuned when last in the {{enum|Up|Status}} state.
+          This parameter is based on ''mocaIfLOF'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="KeyPassphrase" access="readWrite" dmr:version="2.0">
+        <description>
+          MoCA Password. The value consists of numeric characters (0-9). {{pattern}}
+          This parameter is based on ''mocaIfPassword'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size minLength="12" maxLength="17"/>
+            <pattern value="\d+"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TxPowerLimit" access="readWrite" dmr:version="2.0">
+        <description>
+          Transmit Power attenuation in dB relative to the maximum transmit power.
+          The MoCA interface SHOULD have {{param|Enable}} set to {{false}} for any change in this configuration. If the parameter is modified when {{param|Enable}} is {{true}} then this change might take several minutes to complete.
+          This parameter is based on ''mocaIfTxPowerLimit'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PowerCntlPhyTarget" access="readWrite" dmr:version="2.0">
+        <description>
+          Target PHY rate in Mbps for the power control algorithm.
+          The MoCA interface SHOULD have {{param|Enable}} set to {{false}} for any change in this configuration. If the parameter is modified when {{param|Enable}} is {{true}} then this change might take several minutes to complete.
+          This parameter is based on ''mocaIfPowerControlTargetRate'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BeaconPowerLimit" access="readWrite" dmr:version="2.0">
+        <description>
+          Beacon Transmit Power attenuation in {{units}} relative to the maximum transmit power.
+          The MoCA interface SHOULD have {{param|Enable}} set to {{false}} for any change in this configuration. If the parameter is modified when {{param|Enable}} is {{true}} then this change might take several minutes to complete.
+          This parameter is based on ''mocaIfBeaconPowerLimit'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkTabooMask" access="readOnly" dmr:version="2.0">
+        <description>
+          Hexadecimal encoded 64-bit mask of MoCA taboo channels identified for the home network. This is the bit map of the spectrum that the interface supports, and each bit represents 25 MHz of spectrum. The least significant bit of the rightmost character corresponds to 800MHz, which is the lowest frequency.
+          This parameter is based on ''mocaIfTabooChannelMask'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="8" maxLength="8"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="NodeTabooMask" access="readOnly" dmr:version="2.0">
+        <description>
+          Hexadecimal encoded 64-bit mask of supported frequencies. This is the bit map of the spectrum that the interface supports, and each bit represents 25 MHz of spectrum. The least significant bit of the rightmost character corresponds to 800MHz, which is the lowest frequency.
+          This parameter is based on ''mocaIfNodeTabooChannelMask'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="8" maxLength="8"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="TxBcastRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The broadcast PHY transmit rate in {{units}} for this interface.
+          This parameter is based on ''mocaIfTxGcdRate'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TxBcastPowerReduction" access="readOnly" dmr:version="2.0">
+        <description>
+          Transmit Power attenuation in {{units}} relative to the maximum transmit power for broadcast transmissions.
+          This parameter is based on ''mocaIfTxGcdPowerReduction'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QAM256Capable" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether this interface supports the 256 QAM feature.
+          This parameter is based on ''mocaIfQAM256Capable'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketAggregationCapability" access="readOnly" dmr:version="2.0">
+        <description>
+          The packet aggregation capability supported by the interface. Standard values are 0 (no support), 6 (6 {{units}}) or 10 (10 {{units}}).
+          This parameter is based on ''mocaIfPacketsAggrCapability'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="10"/>
+            <units value="packets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MoCA.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MoCA.Interface.{i}.QoS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The QoS object provides information on MoCA parameterized QoS for this interface {{bibref|MoCAv1.1}}.
+      </description>
+      <parameter name="EgressNumFlows" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of QoS flows that this interface has from the MoCA network.
+          This parameter is based on ''mocaIfEgressNodeNumFlows'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IngressNumFlows" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of QoS flows that this interface has onto the MoCA network.
+          This parameter is based on ''mocaIfIngressNodeNumFlows'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FlowStatsNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MoCA.Interface.{i}.QoS.FlowStats.{i}." access="readOnly" numEntriesParameter="FlowStatsNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        The flow statistics table provides information on the MoCA parameterized QoS flows this interface has allocated onto the MoCA network.
+      </description>
+      <uniqueKey>
+        <parameter ref="FlowID"/>
+      </uniqueKey>
+      <parameter name="FlowID" access="readOnly" dmr:version="2.0">
+        <description>
+          The flow ID used to identify a flow in the network.
+          This parameter is based on ''mocaIfFlowID'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketDA" access="readOnly" dmr:version="2.0">
+        <description>
+          The Destination Address (DA) for the packets in this flow.
+          This parameter is based on ''mocaIfPacketDA'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxRate" access="readOnly" dmr:version="2.0">
+        <description>
+          Maximum required rate in {{units}}.
+          This parameter is based on ''mocaIfPeakDataRate'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBurstSize" access="readOnly" dmr:version="2.0">
+        <description>
+          Maximum burst size.
+          This parameter is based on ''mocaIfBurstSize'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTime" access="readOnly" dmr:version="2.0">
+        <description>
+          Flow lease time (expressed in {{units}}).
+          A {{param}} of 0 means unlimited lease time.
+          This parameter is based on ''mocaIfLeaseTime'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTimeLeft" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Flow lease time remaining (expressed in {{units}}).
+          If {{param|LeaseTime}} is 0 then a {{param}} of 0 means unlimited lease time; otherwise, a {{param}} of 0 means expired.
+          This parameter is based on ''mocaIfLeaseTimeLeft'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FlowPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The number of packets transmitted for this flow.
+          This parameter is based on ''mocaIfTxPacketsFlow'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MoCA.Interface.{i}.AssociatedDevice.{i}." access="readOnly" numEntriesParameter="AssociatedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This table contains information about other MoCA devices currently associated with this MoCA interface.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC address of the associated device's MoCA interface.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeID" access="readOnly" dmr:version="2.0">
+        <description>
+          The Node ID of this remote device.
+          This parameter is based on ''mocaNodeIndex'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredNC" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether this remote device is a preferred Network Coordinator (NC).
+          This parameter is based on ''mocaNodePreferredNC'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="HighestVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          Identifies the highest MoCA version that this remote device supports.
+          This element MUST be in the form of dot-delimited integers, where each successive integer represents a more minor category of variation. For example, 1.0, where the components mean major.minor revision number. {{pattern}}
+          This parameter is based on ''mocaNodeMocaVersion'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+            <pattern value="\d+(\.\d+)*"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PHYTxRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The PHY transmit rate (in {{units}}) to this remote device.
+          This parameter is based on ''mocaMeshTxRate'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PHYRxRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The PHY receive rate (in {{units}}) from this remote device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TxPowerControlReduction" access="readOnly" dmr:version="2.0">
+        <description>
+          The reduction in transmitter level (in {{units}}) due to power control.
+          This parameter is based on ''mocaNodeTxPowerReduction'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RxPowerLevel" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The power level (in {{units}}) received at the MoCA interface from this remote device.
+          This parameter is based on ''mocaNodeRxPower'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dBm"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TxBcastRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The broadcast PHY transmit rate (in {{units}}) from this remote device.
+          This parameter is based on ''mocaNodeTxGcdRate'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RxBcastPowerLevel" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The power level (in {{units}}) received at the MoCA interface from this remote device.
+          This parameter is based on ''mocaNodeRxGcdPower'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dBm"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TxPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The number of packets transmitted to this remote device (Note: Includes Broadcast, Multicast and Unicast packets).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RxPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The number of packets received from this remote device (Note: Includes Broadcast, Multicast and Unicast packets).
+          This parameter is based on ''mocaNodeRxPackets'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RxErroredAndMissedPackets" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of errored and missed packets received from this remote device.
+          This parameter is based on ''mocaNodeRxDrops'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QAM256Capable" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether this remote device supports the 256 QAM feature.
+          This parameter is based on ''mocaNodeQAM256Capable'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketAggregationCapability" access="readOnly" dmr:version="2.0">
+        <description>
+          The packet aggregation capability supported by the remote device. Standard values are 0 (no support), 6 (6 {{units}}) or 10 (10 {{units}}).
+          This parameter is based on ''mocaNodePacketsAggrCapability'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="10"/>
+            <units value="packets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RxSNR" access="readOnly" dmr:version="2.0">
+        <description>
+          The signal to noise level (in {{units}}) received at this interface from this remote device.
+          This parameter is based on ''mocaNodeSNR'' from {{bibref|MOCA11-MIB}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dBm"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether or not this remote device is currently present in the MoCA network.
+          The ability to list inactive nodes is OPTIONAL.  If the CPE includes inactive nodes in this table, {{param}} MUST be set to {{false}}  for each inactive node.  The length of time an inactive node remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        G.hn object that contains an {{object|Interface}} table for G.hn supported CPE. The ITU-T G.hn specifications {{bibref|G.9960}} and {{bibref|G.9961}} define Physical and MAC Layers for communication between two or more G.hn nodes in the home network over multiple wired media such as power line, phone line and coaxial cable.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4" dmr:fixedObject="true">
+      <description>
+        G.hn interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Each table entry models the PHY {{bibref|G.9960}} and MAC {{bibref|G.9961}} layers of a G.hn interface.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.4">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.4">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.4">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.4">
+        <description>
+          {{list}}  {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.4">
+        <description>
+          The MAC Address of the interface, denoted as node MAC address or REGID in {{bibref|G.9961}}.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.4">
+        <description>
+          The firmware version of the interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionType" access="readOnly" status="deprecated" dmr:version="2.4">
+        <description>
+          This parameter is DEPRECATED because it has been replaced by {{param|MediumType}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Powerline"/>
+            <enumeration value="Phone"/>
+            <enumeration value="Coax"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxTransmitRate" access="readOnly" dmr:version="2.8">
+        <description>
+          The maximum PHY data rate that the interface is capable of transmitting (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TargetDomainNames" access="readWrite" dmr:version="2.4">
+        <description>
+          {{list}}  Identifies the target domains configured by the user, as described in {{bibref|G.9961|Section 8.6.1}}. When registering or re-registering, the G.hn interface SHOULD try to register to one of these domains in the given order.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DomainName" access="readOnly" dmr:version="2.4">
+        <description>
+          This is the domain name to which the interface is currently registered.
+          {{empty}} indicates that the interface is currently not registered.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DomainNameIdentifier" access="readOnly" dmr:version="2.4">
+        <description>
+          The Domain Name Identifier, a shortened version of {{param|DomainName}}, denoted as DNI in {{bibref|G.9961|Section 8.6.11.2.1}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DomainId" access="readOnly" dmr:version="2.4">
+        <description>
+          The Domain Identifier of the domain to which the interface is registered, denoted as DOD in {{bibref|G.9961}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceId" access="readOnly" dmr:version="2.4">
+        <description>
+          The Device Identifier assigned by the Domain Master, denoted as DEVICE_ID in {{bibref|G.9961}}.
+          The value 0 indicates that the device is not currently registered.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.4">
+        <description>
+          The maximum PHY bit rate supported by this interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NodeTypeDMCapable" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates whether this interface has the capability to act as Domain Master in the G.hn domain.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="DMRequested" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates a request to force the role of the G.hn interface to Domain Master (DM) for the G.hn domain it is connected to. The selection of the Domain Master follows the procedures described in {{bibref|G.9961|Clause 8.6.6}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IsDM" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates whether this G.hn interface is currently the Domain Master (DM) for the G.hn domain it is connected to, as described in {{bibref|G.9961|Clause 8.6}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeTypeSCCapable" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates whether this interface has the capability to act as Security Controller in the G.hn domain.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SCRequested" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates a request to force the role of the G.hn interface to Security Controller (SC) for the G.hn domain it is connected to. The selection of the Security Controller follows the procedures described in {{bibref|G.9961|Clause 9.2}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IsSC" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates whether this G.hn interface is currently the Security Controller (SC) for the G.hn domain it is connected to, as described in {{bibref|G.9961|Clause 9.2}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="StandardVersions" access="readOnly" dmr:version="2.8">
+        <description>
+          The standard versions that the interface supports. The list MUST have an even number of items.  The first item of each pair represents an ITU-T G.hn Recommendation while the second element of each pair represents the amendment version of the indicated Recommendation that this interface supports (the value 0 corresponds to the base Recommendation).
+          For example, to indicate support for the G.9960 base document and G.9961 amendment 1, the corresponding list would be "G9960,0,G9961,1".
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBandPlan" access="readOnly" dmr:version="2.8">
+        <description>
+          The largest bandplan that the interface can support, as defined in {{bibref|G.9961|Clause 8.8.5.5}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MediumType" access="readOnly" dmr:version="2.8">
+        <description>
+          The medium type that the interface currently operates on.  Refer to {{bibref|G.9962|Table 7-5}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="PowerLineBaseband"/>
+            <enumeration value="PhoneLineBaseband"/>
+            <enumeration value="CoaxBaseband"/>
+            <enumeration value="CoaxRF"/>
+            <enumeration value="PlasticOpticalFiber"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TAIFG" access="readOnly" dmr:version="2.8">
+        <description>
+          The Acknowledgement InterFrame Gap, or TAIFG, as defined in {{bibref|G.9961|Clause 8.4}}. It is represented as multiples of {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="1.28 microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NotchedAmateurRadioBands" access="readWrite" dmr:version="2.8">
+        <description>
+          A bit map representing usage of international amateur bands (0 = masked, 1 = unmasked). The LSB represents the lowest band (1.8-2.0 MHz), the second LSB represents the second lowest band (3.5-4.0 MHz), and so on. The maximum value for this parameter is 0x03FF, i.e. it is a 10-bit quantity represented in 16 bits and the top 6 bits are always zero.
+          International Radio amateur bands are described in {{bibref|G.9964|Table D-1}} and conveyed by the Domain Master in the Amateur radio band descriptor (see {{bibref|G.9961|Table 8-77}}).
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="2"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="PHYThroughputDiagnosticsEnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Comma-separated list of DeviceIDs of nodes that need to enable their PHY throughput diagnostics mode. All devices that are enabled will participate in the G.hn network PHY throughput diagnostics process.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="PerformanceMonitoringDiagnosticsEnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Comma-separated list of DeviceIDs of nodes that need to enable their Performance Monitoring diagnostics mode on this node. All devices that are enabled will participate in the G.hn network Performance Monitoring diagnostics process.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SMMaskedBandNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeTypeDMConfig" access="readWrite" dmr:version="2.4">
+        <description>
+          Requests the interface to become the Domain Master in the G.hn domain.
+          This parameter is valid only if {{param|NodeTypeDMCapable}} is {{true}}.
+          Note that, if more than one node is configured to act as Domain Master, G.hn specifies a protocol to ensure only one device actually becomes DM.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeTypeDMStatus" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates whether the interface is acting as Domain Master ({{true}}) or not ({{false}}).
+          See Note in {{param|NodeTypeDMConfig}} regarding the possibility of more than one node being configured with {{param|NodeTypeDMConfig}} = {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="NodeTypeSCStatus" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates whether the interface is acting as Security Controller ({{true}}) or not ({{false}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDeviceNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PSM" access="readWrite" dmr:version="2.12">
+        <description>
+          Specifies the list of PSD shaping mask (PSM) breakpoints to be applied to the G.hn interface.
+          {{list|with each list item consisting of:}}
+          {{datatype|expand}}
+          The PSM level is 0.1*(the value of the level of the PSM) - 140 dBm/Hz.
+          For example, a PSM defined by two breakpoints (subcarrier 450, PSM level -80 dBm/Hz) and (subcarrier 1050, PSM level -90 dBm/Hz) is represented by PSM [450,600],[1050,500] .
+        </description>
+        <syntax>
+          <list minItems="2" maxItems="32"/>
+          <dataType ref="PSMBreakPointIndexAndLevel"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        Throughput statistics for this interface at the different G.hn reference points described in {{bibref|G.9961|Clause 8.1}}.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+          More specifically, this is the total number of MPDU bytes transmitted or retransmitted by the node through a physical medium (i.e., PMI defined in {{bibref|G.9960|Clause 5.2.1}}), which correspond to data LPDUs (i.e., data packets) and framing overhead (e.g., LFH, LPH, LPCS defined in {{bibref|G.9961|Clause 8.1}}). It does not include transmitted bytes contributed by management LPDUs (i.e., management packets).
+          Note: LPDUs in mixed LLC frame blocks are considered data LPDUs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+          More specifically, this is the total number of MPDU bytes received by the node through a physical medium, which correspond to data LPDUs and framing overhead. It does not include received bytes contributed by management LPDUs. It can include blocks with errors.
+          Note: LPDUs in mixed LLC frame blocks are considered data LPDUs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets transmitted out of the interface.
+          More specifically, this is the total number of APDUs requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point defined in {{bibref|G.9960|Clause 5.2.1}}) that were transmitted by the node through the physical medium. It does not include transmitted LCDUs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets received on the interface.
+          More specifically, this is the total number of APDUs delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) that were received by the node through the physical medium. It does not include received LCDUs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+          More specifically, this is the total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point defined in {{bibref|G.9960|Clause 5.2.1}}) but could not be transmitted because of errors (e.g., APDUs containing CRC errors).
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+          More specifically, this is the total number of received APDUs that contained errors preventing them from being delivered to a higher layer (i.e., inbound APDUs at the x1 reference point defined in {{bibref|G.9960|Clause 5.2.1}}). The possible causes of error are: incorrect CRC, incorrect MIC, incorrect MIC size, and incorrect size of packet.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+          More specifically, this is the total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) and which were addressed to a unicast address at this layer. It includes APDUs that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+          More specifically, this is the total number of received APDUs that were delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) and which were addressed to a unicast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+          More specifically, this is the total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) but chosen to be discarded even though no errors had been detected to prevent their being transmitted (e.g., buffer overflow).
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+          More specifically, this is the total number of received APDUs that were chosen to be discarded even though no errors had been detected to prevent their being delivered.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+          More specifically, this is the total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) and which were addressed to a multicast address at this layer. It includes APDUs that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+          More specifically, this is the total number of received APDUs that were delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) and which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+          More specifically, this is the total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) and which were addressed to a broadcast address at this layer. It includes APDUs that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+          More specifically, this is the total number of received APDUs that were delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) and which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+          More specifically, this is the total number of APDUs received by the management that were discarded because of an unknown or unsupported protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="MgmtBytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of MPDU bytes transmitted by the node through a physical medium, which correspond to management LPDUs and framing overhead.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MgmtBytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of MPDU bytes received by the node through a physical medium, which correspond to management LPDUs and framing overhead.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MgmtPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of LCDUs requested for transmission by a management layer (i.e., outbound LCDUs generated in LLC defined in {{bibref|G.9961|Clause 8.1.3}}) that were transmitted by the node through a physical medium.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MgmtPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of LCDUs delivered to a management layer (i.e., inbound LCDUs) that were received by the node through a physical medium.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BlocksSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of LPDUs that were transmitted by the node through a physical medium, regardless of new or retransmitted LPDUs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BlocksReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of LPDUs that were received by the node through a physical medium, with or without errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BlocksResent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of LPDUs that were retransmitted.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="BlocksErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received LPDUs that contained errors.
+          Note the following relationships hold:
+          * PacketsSent + ErrorsSent + DiscardPacketsSent = UnicastPacketsSent + MulticastPacketsSent + BroadcastPacketsSent.
+          * PacketsReceived = UnicastPacketsReceived + MulticastPacketsReceived + BroadcastPacketsReceived.
+          * Retransmission rate = BlocksResent / BlocksSent.
+          * Block error rate = BlocksErrorReceived / BlocksReceived.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Interface.{i}.AssociatedDevice.{i}." access="readOnly" numEntriesParameter="AssociatedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        This table contains information about other G.hn devices connected to this G.hn interface.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.4">
+        <description>
+          MAC address of remote G.hn device.
+          This is denoted as REGID in {{bibref|G.9961}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceId" access="readOnly" dmr:version="2.4">
+        <description>
+          Device Id (as defined in G.hn) for the remote G.hn device, denoted as DEVICE_ID in {{bibref|G.9961}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TxPhyRate" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The PHY transmit Rate (expressed in {{units}}) to this remote device, denoted as PHY data rate in {{bibref|G.9961}}.
+          Refer to Note 1 of {{bibref|G.9961|Table 8-48}}.  To convert from the value in the table, divide by 32K (32768) and round down.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RxPhyRate" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The PHY receive Rate (expressed in {{units}}) from this remote device, denoted as PHY data rate in {{bibref|G.9961}}.
+          Refer to Note 1 of {{bibref|G.9961|Table 8-48}}.  To convert from the value in the table, divide by 32K (32768) and round down.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.4">
+        <description>
+          Whether or not this device is currently present in the G.hn domain.
+          The ability to list inactive nodes is OPTIONAL. If the CPE includes inactive nodes in this table, {{param}} MUST be set to {{false}} for each inactive node. The length of time an inactive node remains listed in this table is a local matter to the CPE.
+          If {{param}} is {{true}}, it indicates that the Status of the remote device is 0, 1, or 2 (see {{bibref|G.9961|Table 7-3}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Interface.{i}.DMInfo." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object specifies management parameters pertaining to the domain functionality (Domain Master function; see {{bibref|G.9961|Clause 8.6}}). The object exists only on G.hn interfaces that are currently the Domain Master, i.e. for which parameter {{param|#.IsDM}} is {{true}}.
+      </description>
+      <parameter name="DomainName" access="readWrite" dmr:version="2.8">
+        <description>
+          This is the domain name to which the interface is currently registered. {{empty}} indicates that the interface is currently not registered.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="32"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="DomainNameIdentifier" access="readOnly" dmr:version="2.8">
+        <description>
+          The Domain Name Identifier, a shortened version of {{param|DomainName}}, denoted as DNI in {{bibref|G.9961|Section 8.6.11.2.1}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="2"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="DomainId" access="readOnly" dmr:version="2.8">
+        <description>
+          The Domain Identifier of the domain to which the interface is registered, denoted as DOD in {{bibref|G.9961}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MACCycleDuration" access="readWrite" dmr:version="2.8">
+        <description>
+          The MAC cycle duration, as specified in {{bibref|G.9961|Clause 8.4}}. It is represented as multiples of {{units}}. In the case of power line, writing to this parameter has no effect and it reads back as 0, which is a special value indicating that the MAC cycle is synchronized with 2 AC cycles as defined in {{bibref|G.9961|Clause 8.6.3.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="0"/>
+            <range minInclusive="10" maxInclusive="200"/>
+            <units value="0.5 msec"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SCDeviceId" access="readWrite" dmr:version="2.8">
+        <description>
+          The DEVICE_ID of the Security Controller selected by the Domain Master.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SCMACAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          The REGID of the Security Controller selected by the Domain Master.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReregistrationTimePeriod" access="readWrite" dmr:version="2.8">
+        <description>
+          The time interval for periodic re-registration, as specified in {{bibref|G.9961|Clause 8.8.5.8}}. It is represented as multiples of {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="5" maxInclusive="63"/>
+            <units value="2 seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TopologyPeriodicInterval" access="readWrite" dmr:version="2.8">
+        <description>
+          The time interval that a node sends out the periodic topology update using TM_NodeTopologyChange.ind message, as specified in {{bibref|G.9961|Clause 8.8.5.8.1}}. It is represented as multiples of {{units}}. The special value 0 represents an infinite interval (i.e., no periodic topology update).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+            <units value="0.1 sec"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MinSupportedBandplan" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates the value of the minimal bandplan capability for a node that is allowed to register to the domain.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxSupportedBandplan" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates the value of the minimal bandplan capability for a node that is allowed to register to the domain.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Interface.{i}.SCInfo." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object specifies management parameters pertaining to the Security Controller functionality (Security Controller function; see {{bibref|G.9961|Clause 9.2}}). The object exists only on G.hn interfaces that are currently the Security Controller, i.e. for which parameter {{param|#.IsSC}} is {{true}}.
+      </description>
+      <parameter name="ModesSupported" access="readOnly" dmr:version="2.8">
+        <description>
+          The security modes that the Security Controller can support.  Refer to {{bibref|G.9961|Clause 9.2}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="NN">
+              <description>
+                Node-to-Node
+              </description>
+            </enumeration>
+            <enumeration value="NMK">
+              <description>
+                Network Membership Key
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModeEnabled" access="readWrite" dmr:version="2.8">
+        <description>
+          The security mode in which the Security Controller is operating.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="ModesSupported" nullValue="Disabled"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MICSize" access="readWrite" dmr:version="2.8">
+        <description>
+          The selected MIC size used in the domain.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="4-byte MIC"/>
+            <enumeration value="8-byte MIC"/>
+            <enumeration value="16-byte MIC"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Location" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates whether the Security Controller is above the L1 reference point. It is set to {{true}} if the Security Controller is above the L1 reference point, and set to {{false}} otherwise.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Interface.{i}.SMMaskedBand.{i}." access="readWrite" numEntriesParameter="SMMaskedBandNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="32" dmr:version="2.8">
+      <description>
+        Specifies the list of masked bands to be applied to the G.hn interface.  This information is conveyed by the Domain Master in the SM descriptor as specified in {{bibref|G.9961|Table 8-77}}.
+        Instances of this object are expected to exist only on G.hn interfaces that are currently the Domain Master, i.e. for which parameter {{param|#.IsDM}} is {{true}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="BandNumber"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the {{object}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="BandNumber" access="readWrite" dmr:version="2.8">
+        <description>
+          The masked band number.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="StartSubCarrier" access="readWrite" dmr:version="2.8">
+        <description>
+          Index of the lowest frequency sub-carrier in the band to be masked as specified in {{bibref|G.9961|Table 8-79}}. This parameter is writable only on the interface which acts as the Domain Master.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="StopSubCarrier" access="readWrite" dmr:version="2.8">
+        <description>
+          Index of the highest frequency sub-carrier in the band to be masked as specified in Table 8-79 in {{bibref|G.9961}}. This parameter is writable only on the interface which acts as the Domain Master.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Ghn.Diagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        The G.hn Diagnostics object.
+      </description>
+      <command name="PHYThroughput()" async="true" dmr: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 dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Interface" dmr:version="2.8">
+            <description>
+              The interface over which the test is to be performed.
+            </description>
+            <syntax>
+              <string>
+                <pathRef refType="strong" targetParent=".Ghn.Interface." targetType="row"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="DiagnoseMACAddress" dmr:version="2.8">
+            <description>
+              The MAC address of the originating G.hn interface of the link that is being diagnosed.
+              Note: This MAC address might belong to another node of the domain.
+            </description>
+            <syntax>
+              <dataType ref="MACAddress"/>
+            </syntax>
+          </parameter>
+        </input>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <object name="Result.{i}." minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+            <description>
+              PHY throughput diagnostics results.
+            </description>
+            <uniqueKey>
+              <parameter ref="DestinationMACAddress"/>
+            </uniqueKey>
+            <parameter name="DestinationMACAddress" dmr:version="2.8">
+              <description>
+                MAC address of the destination node of the link being measured.
+              </description>
+              <syntax>
+                <dataType ref="MACAddress"/>
+              </syntax>
+            </parameter>
+            <parameter name="LinkState" dmr:version="2.8">
+              <description>
+                Indicates the state of the link between the G.hn Interface with MAC address {{param|#.DiagnoseMACAddress}} and the G.hn Interface with MAC address {{param|DestinationMACAddress}}.
+              </description>
+              <syntax>
+                <string>
+                  <enumeration value="Direct">
+                    <description>
+                      There is a direct link between G.hn Interface with MAC address {{param|#.DiagnoseMACAddress}} and G.hn Interface with MAC address {{param|DestinationMACAddress}}
+                    </description>
+                  </enumeration>
+                  <enumeration value="NonDirect">
+                    <description>
+                      There is no direct link between G.hn Interface with MAC address {{param|#.DiagnoseMACAddress}} and G.hn Interface with MAC address {{param|DestinationMACAddress}}
+                    </description>
+                  </enumeration>
+                </string>
+              </syntax>
+            </parameter>
+            <parameter name="TxPhyRate" dmr:version="2.8">
+              <description>
+                PHY data rate in transmit direction in the link between the G.hn Interface with MAC address {{param|#.DiagnoseMACAddress}} and the G.hn Interface with MAC address {{param|DestinationMACAddress}}. It is represented in {{units}} as defined in Note 1 to {{bibref|G.9961|Table 8-48}}.  To convert from the value in the table, divide by 32K (32768) and round down.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="Mbps"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="RxPhyRate" dmr:version="2.8">
+              <description>
+                PHY data rate in receive direction in the link between the G.hn Interface with MAC address {{param|#.DiagnoseMACAddress}}  and the G.hn Interface with MAC address {{param|DestinationMACAddress}}. It is represented in {{units}} as defined in Note 1 to {{bibref|G.9961|Table 8-48}}.  To convert from the value in the table, divide by 32K (32768) and round down.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="Mbps"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+          </object>
+        </output>
+      </command>
+      <command name="PerformanceMonitoring()" async="true" dmr: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 dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Interface" dmr:version="2.8">
+            <description>
+              The interface over which the test is to be performed.
+            </description>
+            <syntax>
+              <string>
+                <pathRef refType="strong" targetParent=".Ghn.Interface." targetType="row"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="DiagnoseMACAddress" dmr:version="2.8">
+            <description>
+              The MAC address of the originating G.hn interface of the link that is being diagnosed.
+              Note: This MAC address might belong to another node of the domain.
+            </description>
+            <syntax>
+              <dataType ref="MACAddress"/>
+            </syntax>
+          </parameter>
+          <parameter name="SampleInterval" dmr:version="2.8">
+            <description>
+              Time in {{units}} between automatic collection of performance monitoring data. A value of zero disables automatic collection of data.
+              The node MAY impose a minimum sample interval, in which case an attempt to set a (non-zero) interval that is less than this minimum MUST set the interval to the minimum and MUST NOT be regarded as an error.
+              If SampleInterval is a simple fraction of a day, e.g. 900 (a quarter of an hour) or 3600 (an hour), the device MAY choose to align sample intervals with time of day, but is not required to do so.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="seconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="SNRGroupLength" dmr:version="2.8">
+            <description>
+              The number of sub-carriers in a group to be used for averaging SNR values when providing SNR information for a channel.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1" maxInclusive="1"/>
+                <range minInclusive="2" maxInclusive="2"/>
+                <range minInclusive="4" maxInclusive="4"/>
+                <range minInclusive="8" maxInclusive="8"/>
+                <range minInclusive="16" maxInclusive="16"/>
+                <range minInclusive="32" maxInclusive="32"/>
+                <range minInclusive="64" maxInclusive="64"/>
+                <range minInclusive="128" maxInclusive="128"/>
+                <range minInclusive="256" maxInclusive="256"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+        </input>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <object name="Nodes." minEntries="1" maxEntries="1" dmr:version="2.8">
+            <description>
+              Per-node G.hn performance monitoring results.
+              When automatic collection is enabled, i.e. {{param|#.SampleInterval}} is non-zero, the "current" interval is defined by the most recent automatic sample and the most recent subsequent manual sample, if any.
+              When automatic collection is disabled, i.e. SampleInterval is zero, the "current" interval is defined by the three most recent manual  samples.
+              Note: Packets in statistics counters are Ethernet packets.
+            </description>
+            <parameter name="CurrentStart" dmr:version="2.8">
+              <description>
+                Start time for the current interval.
+                When automatic collection is enabled, i.e. SampleInterval is non-zero, the current interval started at the most recent automatic sample.
+                When automatic collection is disabled, i.e. SampleInterval is zero, the current interval started two manual samples ago.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="CurrentEnd" dmr:version="2.8">
+              <description>
+                End time for the current interval.
+                When automatic collection is enabled, i.e. SampleInterval is non-zero, the current interval ended at the most recent manual sample since the most recent automatic sample.  If there has been no such manual sample, the current interval is empty.
+                When automatic collection is disabled, i.e. SampleInterval is zero, the current interval ended at the most recent manual sample.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="NodeNumberOfEntries" dmr:version="2.8">
+              <description>
+                {{numentries}} This is the number of G.hn nodes for which performance monitoring results were collected during the current sample interval.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+          </object>
+          <object name="Nodes.Node.{i}." minEntries="1" maxEntries="unbounded" dmr:version="2.8">
+            <description>
+              Per-node G.hn performance monitoring results during the current sample interval. Each table entry contains the results collected between the G.hn nodes with MAC addresses {{param|##.DiagnoseMACAddress}}) and {{param|DestinationMACAddress}}).
+              Note: Packet counters indicate the number of packets received between {{param|#.CurrentStart}} and {{param|#.CurrentEnd}}.
+            </description>
+            <uniqueKey>
+              <parameter ref="DestinationMACAddress"/>
+            </uniqueKey>
+            <parameter name="DestinationMACAddress" dmr:version="2.8">
+              <description>
+                MAC address of the destination node of the link being measured.
+              </description>
+              <syntax>
+                <dataType ref="MACAddress"/>
+              </syntax>
+            </parameter>
+            <parameter name="BytesSent" dmr:version="2.8">
+              <description>
+                The total number of MPDU bytes transmitted or retransmitted by the node through a physical medium (i.e., PMI defined in {{bibref|G.9960|Clause 5.2.1}}), which correspond to data LPDUs (i.e., data packets) and framing overhead (e.g., LFH, LPH, LPCS defined in {{bibref|G.9961|Clause 8.1}}). It does not include transmitted bytes contributed by management LPDUs (i.e., management packets).
+                Note: LPDUs in mixed LLC frame blocks are considered data LPDUs.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="BytesReceived" dmr:version="2.8">
+              <description>
+                The total number of MPDU bytes received by the node through a physical medium, which correspond to data LPDUs and framing overhead. It does not include received bytes contributed by management LPDUs. It might include blocks with errors.
+                Note: LPDUs in mixed LLC frame blocks are considered data LPDUs.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="PacketsSent" dmr:version="2.8">
+              <description>
+                The total number of APDUs requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point defined in {{bibref|G.9960|Clause 5.2.1}}) that were transmitted by the node through the physical medium. It does not include transmitted LCDUs.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="PacketsReceived" dmr:version="2.8">
+              <description>
+                The total number of APDUs delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) that were received by the node through the physical medium. It does not include received LCDUs.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="ErrorsSent" dmr:version="2.8">
+              <description>
+                The total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point defined in {{bibref|G.9960|Clause 5.2.1}}).  This parameter represents the total number of LCDUs requested for transmission by a management layer (i.e., outbound LCDUs generated in LLC defined in in {{bibref|G.9961|Clause 8.1.3}}) that were transmitted by the node through a physical medium) but could not be transmitted because of errors (e.g., APDUs containing CRC errors).
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter32"/>
+              </syntax>
+            </parameter>
+            <parameter name="ErrorsReceived" dmr:version="2.8">
+              <description>
+                The total number of received APDUs that contained errors preventing them from being delivered to a higher layer (i.e., inbound APDUs at the x1 reference point defined in {{bibref|G.9960|Clause 5.2.1}}). The possible causes of error are: incorrect CRC, incorrect MIC, incorrect MIC size, and incorrect size of packet.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter32"/>
+              </syntax>
+            </parameter>
+            <parameter name="UnicastPacketsSent" dmr:version="2.8">
+              <description>
+                The total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) and which were addressed to a unicast address at this layer. It includes APDUs that were discarded or not sent.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="UnicastPacketsReceived" dmr:version="2.8">
+              <description>
+                The total number of received APDUs that were delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) and which were addressed to a unicast address at this layer.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="DiscardPacketsSent" dmr:version="2.8">
+              <description>
+                The total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) but chosen to be discarded even though no errors had been detected to prevent their being transmitted (e.g., buffer overflow).
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter32"/>
+              </syntax>
+            </parameter>
+            <parameter name="DiscardPacketsReceived" dmr:version="2.8">
+              <description>
+                The total number of received APDUs that were chosen to be discarded even though no errors had been detected to prevent their being delivered.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter32"/>
+              </syntax>
+            </parameter>
+            <parameter name="MulticastPacketsSent" dmr:version="2.8">
+              <description>
+                The total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) and which were addressed to a multicast address at this layer. It includes APDUs that were discarded or not sent.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="MulticastPacketsReceived" dmr:version="2.8">
+              <description>
+                The total number of received APDUs that were delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) and which were addressed to a multicast address at this layer.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="BroadcastPacketsSent" dmr:version="2.8">
+              <description>
+                The total number of APDUs that were requested for transmission by a higher layer (i.e., outbound APDUs at the x1 reference point) and which were addressed to a broadcast address at this layer. It includes APDUs that were discarded or not sent.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="BroadcastPacketsReceived" dmr:version="2.8">
+              <description>
+                The total number of received APDUs that were delivered to a higher layer (i.e., inbound APDUs at the x1 reference point) and which were addressed to a broadcast address at this layer.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="UnknownProtoPacketsReceived" dmr:version="2.8">
+              <description>
+                The total number of APDUs received by the management that were discarded because of an unknown or unsupported protocol.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter32"/>
+              </syntax>
+            </parameter>
+            <parameter name="MgmtBytesSent" dmr:version="2.8">
+              <description>
+                The total number of MPDU bytes transmitted by the node through a physical medium, which correspond to management LPDUs and framing overhead.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="MgmtBytesReceived" dmr:version="2.8">
+              <description>
+                The total number of MPDU bytes received by the node through a physical medium, which correspond to management LPDUs and framing overhead.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="MgmtPacketsSent" dmr:version="2.8">
+              <description>
+                The total number of LCDUs requested for transmission by a management layer (i.e., outbound LCDUs generated in LLC defined in {{bibref|G.9961|Clause 8.1.3}}) that were transmitted by the node through a physical medium.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="MgmtPacketsReceived" dmr:version="2.8">
+              <description>
+                The total number of LCDUs delivered to a management layer (i.e., inbound LCDUs) that were received by the node through a physical medium.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="BlocksSent" dmr:version="2.8">
+              <description>
+                The total number of LPDUs that were transmitted by the node through a physical medium, regardless of new or retransmitted LPDUs.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="BlocksReceived" dmr:version="2.8">
+              <description>
+                The total number of LPDUs that were received by the node through a physical medium, with or without errors.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter64"/>
+              </syntax>
+            </parameter>
+            <parameter name="BlocksResent" dmr:version="2.8">
+              <description>
+                The total number of LPDUs that were retransmitted.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter32"/>
+              </syntax>
+            </parameter>
+            <parameter name="BlocksErrorsReceived" dmr:version="2.8">
+              <description>
+                The total number of received LPDUs that contained errors.
+                Note the following relationships hold:
+                * PacketsSent + ErrorsSent + DiscardPacketsSent = UnicastPacketsSent + MulticastPacketsSent + BroadcastPacketsSent.
+                * PacketsReceived = UnicastPacketsReceived + MulticastPacketsReceived + BroadcastPacketsReceived.
+                * Retransmission rate = BlocksResent / BlocksSent.
+                * Block error rate = BlocksErrorReceived / BlocksReceived.
+              </description>
+              <syntax>
+                <dataType ref="StatsCounter32"/>
+              </syntax>
+            </parameter>
+          </object>
+          <object name="Channels." minEntries="1" maxEntries="1" dmr:version="2.8">
+            <description>
+              Per-channel G.hn performance monitoring results.
+              Note: channels are unidirectional.
+            </description>
+            <parameter name="TimeStamp" dmr:version="2.8">
+              <description>
+                Time at which channel data was last collected.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="ChannelNumberOfEntries" dmr:version="2.8">
+              <description>
+                {{numentries}}
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+          </object>
+          <object name="Channels.Channel.{i}." minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+            <description>
+              Per-channel G.hn performance monitoring results during the current sample interval. Each table entry contains the results collected from the channel between a G.hn interface (as indicated by {{param|##.DiagnoseMACAddress}}) and a G.hn interface indicated by {{param|DestinationMACAddress}})
+            </description>
+            <uniqueKey>
+              <parameter ref="DestinationMACAddress"/>
+            </uniqueKey>
+            <parameter name="DestinationMACAddress" dmr:version="2.8">
+              <description>
+                MAC address of the destination node of the link being measured.
+              </description>
+              <syntax>
+                <dataType ref="MACAddress"/>
+              </syntax>
+            </parameter>
+            <parameter name="SNR" dmr:version="2.8">
+              <description>
+                The result of an SNR test performed over the channel. It is formatted as a comma-separated list of N/M unsigned integers that represents the result of Signal-to-Noise-Ratio measurement averaging in groups of M subcarriers. The number N depends on the bandplan used by the node and corresponds to the OFDM control parameter N of each medium as defined in {{bibref|G.9964}}. The number M corresponds to the parameter {{param|##.SNRGroupLength}}.
+              </description>
+              <syntax>
+                <list/>
+                <unsignedInt>
+                  <units value="0.1 dB"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+          </object>
+        </output>
+      </command>
+    </object>
+    <object name="Device.HomePlug." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        HomePlug object that contains the {{object|Interface}} table. The HomePlug industry standard {{bibref|HPAV1.1}} defines peer to peer communication over powerline medium.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HomePlug.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        HomePlug interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Each table entry models the PHY and MAC levels of a HomePlug interface {{bibref|HPAV1.1}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC Address of the interface.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="LogicalNetwork" access="readWrite" dmr:version="2.0">
+        <description>
+          The textual name of the HomePlug Logical Network.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the HomePlug version of the interface. This element SHOULD be in the form of dot-delimited integers, where each successive integer represents a more minor category of variation. For example:
+          : "1.0"
+          : "1.1"
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="16"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          The firmware version of the interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ForceCCo" access="readWrite" dmr:version="2.0">
+        <description>
+          Central Coordinator (CCo) selection mode.
+          If {{false}}, CCo selection is automatic. If {{true}}, the local HomePlug interface is forced to be CCo and all other devices in the Logical Network MUST be set to automatic CCo selection.
+          Typically {{param}} is set to automatic CCo selection ({{false}}).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkPassword" access="readWrite" dmr:version="2.0">
+        <description>
+          The network password of the device. This is a human readable ASCII string that is hashed per the HomePlug specification to generate the Network Membership Key (NMK). Note that care needs to be taken when setting this parameter as it might prohibit communication with other adapters or equipment connected via the powerline network.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="OtherNetworksPresent" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates whether any other HomePlug networks are currently visible via this interface. Examples of valid list items include, but are not limited to:
+          : "HomePlugAV"
+          : "HomePlug1.0"
+          : "Other"
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="64"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum PHY bit rate supported by this interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HomePlug.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MPDUTxAck" access="readOnly" dmr:version="2.0">
+        <description>
+          HomePlug-specific statistic. The Number of MAC Protocol Data Units (MPDUs) Transmitted and Acknowledged.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MPDUTxCol" access="readOnly" dmr:version="2.0">
+        <description>
+          HomePlug-specific statistic. The Number of MAC Protocol Data Units (MPDUs) Transmitted and Collided
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MPDUTxFailed" access="readOnly" dmr:version="2.0">
+        <description>
+          HomePlug-specific statistic. The Number of MAC Protocol Data Units (MPDUs) Transmitted and Failed
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MPDURxAck" access="readOnly" dmr:version="2.0">
+        <description>
+          HomePlug-specific statistic. The Number of MAC Protocol Data Units (MPDUs) Received and Acknowledged
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MPDURxFailed" access="readOnly" dmr:version="2.0">
+        <description>
+          HomePlug-specific statistic. The Number of MAC Protocol Data Units (MPDUs) Received and Failed
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.HomePlug.Interface.{i}.AssociatedDevice.{i}." access="readOnly" numEntriesParameter="AssociatedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This table contains information about other HomePlug devices connected to this HomePlug interface.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          MAC address of remote HomePlug device. It is used to uniquely identify and easily correlate with the connected remote HomePlug device.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="TxPhyRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The PHY transmit Rate (expressed in {{units}}) to this remote device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RxPhyRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The PHY receive Rate (expressed in {{units}}) from this remote device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SNRPerTone" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate Signal to Noise Ratio (SNR) per tone from this remote device (expressed in {{units}}).
+        </description>
+        <syntax>
+          <list maxItems="1155"/>
+          <unsignedInt>
+            <units value="0.1dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AvgAttenuation" access="readOnly" dmr:version="2.0">
+        <description>
+          Average attenuation from this remote device (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="0.1dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="EndStationMACs" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items represent MAC addresses of end stations bridged by the remote HomePlug device.
+          For example: "11:22:33:AA:BB:CC, 22:33:44:DD:EE:66"
+        </description>
+        <syntax>
+          <list maxItems="16"/>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether or not this device is currently present in the HomePlug network.
+          The ability to list inactive nodes is OPTIONAL. If the CPE includes inactive nodes in this table, {{param}} MUST be set to {{false}} for each inactive node. The length of time an inactive node remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPA." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Universal Powerline Association {{bibref|UPA-PLC}}. This object contains the {{object|Interface}} and {{object|Diagnostics}} objects.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPA.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        UPA interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). Each table entry models the PHY and MAC levels of a UPA interface {{bibref|UPA-PLC}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC Address of the interface.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          This interface's firmware version.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum PHY bit rate supported by this interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="NodeType" access="readWrite" dmr:version="2.0">
+        <description>
+          Type of UPA device role. It can be Fixed Access Point (master) or End Point (slave) of the PLC network.  {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AP"/>
+            <enumeration value="EP"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LogicalNetwork" access="readWrite" dmr:version="2.0">
+        <description>
+          The name (network ID) of the logical PLC network in which the local interface is a member (human readable string).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="20"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EncryptionMethod" access="readWrite" dmr:version="2.0">
+        <description>
+          Encryption Method used by UPA device. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="6"/>
+            <enumeration value="None"/>
+            <enumeration value="DES"/>
+            <enumeration value="3DES"/>
+            <enumeration value="AES128"/>
+            <enumeration value="AES256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EncryptionKey" access="readWrite" dmr:version="2.0">
+        <description>
+          Encryption key for secure PLC communications.
+          This a human readable string used by the system to generate the encryption key to encrypt communications in powerline. It takes non extended ASCII characters (i.e. printable 7-bit ASCII character codes 32-126, which includes SPACE but excludes TAB, LF and CR). For example: bvjPekZiYUf9kjNKJASkgJ09adfoP01Fjvgd
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="36"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PowerBackoffEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          Power back-off management feature status in the UPA device. Boolean can be {{true}} for "enabled" and {{false}}  for "disabled".
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PowerBackoffMechanismActive" access="readOnly" dmr:version="2.0">
+        <description>
+          Show if power back-off mechanism is active at that time in the UPA device. Boolean can be {{true}} for "active"  and {{false}} for "not active".
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EstApplicationThroughput" access="readOnly" dmr:version="2.0">
+        <description>
+          The estimated application throughput (expressed in {{units}}), received from the PLC link. This value can be  used to indicate link quality.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ActiveNotchEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the {{object|ActiveNotch}} table for this interface.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ActiveNotchNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BridgeForNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPA.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPA.Interface.{i}.AssociatedDevice.{i}." access="readOnly" numEntriesParameter="AssociatedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This table contains information about PLC connections running between this UPA interface and other UPA devices.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          Remote UPA device MAC address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readOnly" dmr:version="2.0">
+        <description>
+          The PLC port number.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LogicalNetwork" access="readOnly" dmr:version="2.0">
+        <description>
+          The name of the logical PLC network (human readable string).
+          In the case where the associated device belongs to a different powerline network than the UPA interface, the actual network identifier of the neighboring network is not shown in {{param}}. Rather, only a generic string, e.g. "Network 1", "Network 2", etc is stored here due to security/privacy implications.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="20"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PhyTxThroughput" access="readOnly" dmr:version="2.0">
+        <description>
+          Physical transmission throughput (in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PhyRxThroughput" access="readOnly" dmr:version="2.0">
+        <description>
+          Physical reception throughput (in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RealPhyRxThroughput" access="readOnly" dmr:version="2.0">
+        <description>
+          Real Physical reception throughput (in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="EstimatedPLR" access="readOnly" dmr:version="2.0">
+        <description>
+          Estimated PDU Loss Rate measurement between two devices (i.e. estimated {{units}} of MPDUs that have been  received with errors).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+            <units value="percent"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MeanEstimatedAtt" access="readOnly" dmr:version="2.0">
+        <description>
+          Mean estimated attenuation (i.e. channel loss between the local interface and the remote device). It is measured  in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SmartRouteIntermediatePLCMAC" access="readOnly" dmr:version="2.0">
+        <description>
+          Intermediate UPA adapter MAC address of the device that is acting as a relay to increase coverage in mesh scenarios. This is the MAC address of a third UPA device, with which the UPA interface is doing smart repeating in order to transmit data to the associated {{param|MACAddress}} UPA device. {{param}} will be empty when {{param|DirectRoute}} is {{true}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="DirectRoute" access="readOnly" dmr:version="2.0">
+        <description>
+          Route status, where {{true}} indicates ''direct'' and {{false}} indicates ''indirect''.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether or not this node is currently present in the UPA network.
+          The ability to list inactive nodes is OPTIONAL.  If the CPE includes inactive nodes in this table, {{param}} MUST be set to {{false}}  for each inactive node.  The length of time an inactive node remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPA.Interface.{i}.ActiveNotch.{i}." access="readWrite" numEntriesParameter="ActiveNotchNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object contains the list of active notches of the UPA interface.
+        A UPA device can have notches in its spectrum, where no power is transmitted in a given part of the spectrum. These notches are typically located in amateur radio bands, to avoid interference.
+        Note: All {{object}} entries can be enabled/disabled as a group using the {{param|#.ActiveNotchEnable}} parameter.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the active notch entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="StartFreq" access="readWrite" dmr:version="2.0">
+        <description>
+          The initial frequency (in {{units}}) of a notch enabled in the spectrum of the local interface.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="kHz"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="StopFreq" access="readWrite" dmr:version="2.0">
+        <description>
+          The final frequency (in {{units}}) of a notch enabled in the spectrum of the local interface.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="kHz"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Depth" access="readWrite" dmr:version="2.0">
+        <description>
+          The depth (in {{units}}) of a notch enabled in the spectrum of the local interface.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPA.Interface.{i}.BridgeFor.{i}." access="readOnly" numEntriesParameter="BridgeForNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object represents the bridge table of the UPA interface. Each instance is a bridge table entry.
+        It shows the MAC addresses of the remote UPA devices with their associated port number, and the MAC addresses of the end-devices (PCs, STBs, routers, etc) connected to Ethernet port of the powerline adapters with their associated logical port. In this way the system identifies to which UPA device an external device is connected to.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          MAC address of the device.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readOnly" dmr:version="2.0">
+        <description>
+          Internal bridge associated port.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPA.Diagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The UPA Diagnostics object.
+      </description>
+      <command name="InterfaceMeasurement()" async="true" dmr: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 dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Type" dmr:version="2.0">
+            <description>
+              Indicates the type of port measurement test to be carried out.  {{enum}}.
+            </description>
+            <syntax>
+              <string>
+                <enumeration value="SNR">
+                  <description>
+                    Signal-to-Noise-Ratio
+                  </description>
+                </enumeration>
+                <enumeration value="CFR">
+                  <description>
+                    Channel Frequency Response
+                  </description>
+                </enumeration>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="Interface" dmr:version="2.0">
+            <description>
+              {{reference}}  This is the local UPA interface from which the test is to be performed.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+                <pathRef refType="weak" targetParent=".UPA.Interface." targetType="row"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="Port" dmr:version="2.0">
+            <description>
+              PLC port being measured. This identifies which PLC connection to measure between the local interface (indicated by {{param|Interface}}) and the remote device (implied by {{param}}).
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="65535"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+        </input>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <parameter name="Measurements" dmr:version="2.0">
+            <description>
+              {{list}} Result of Signal-to-Noise-Ratio measurement (if {{param|Type}} is {{enum|SNR|Type}}) or Channel Frequency Response measurement (if {{param|Type}} is {{enum|CFR|Type}}).
+              List items indicate measurements per carrier for a PLC port (expressed in {{units}}).
+            </description>
+            <syntax>
+              <list maxItems="1536"/>
+              <unsignedInt>
+                <units value="0.1dB"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="RxGain" dmr:version="2.0">
+            <description>
+              Reception gain of the adapter (expresssed in {{units}}).
+            </description>
+            <syntax>
+              <int>
+                <units value="dB"/>
+              </int>
+            </syntax>
+          </parameter>
+        </output>
+      </command>
+    </object>
+    <object name="Device.WiFi." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The WiFi object is based on the WiFi Alliance 802.11 specifications ({{bibref|802.11-2007}}). It defines interface objects ({{object|Radio}} and {{object|SSID}}), and application objects ({{object|AccessPoint}} and {{object|EndPoint}}).
+      </description>
+      <parameter name="RadioNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SSIDNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AccessPointNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="EndPointNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ResetCounter" access="readOnly" dmr:version="2.12">
+        <description>
+          This parameter counts the number of WiFi host or driver resets since the last device reset. This parameter is reset to zero after the device resets, and increments with each successive WiFi host or driver reset.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <command name="NeighboringWiFiDiagnostic()" async="true" dmr:version="2.12">
+        <description>
+          This command defines access to other WiFi SSIDs that this device is able to receive.
+        </description>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <object name="Result.{i}." minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+            <description>
+              Neighboring SSID table. This table models the other WiFi SSIDs that this device is able to receive.
+            </description>
+            <uniqueKey>
+              <parameter ref="BSSID"/>
+            </uniqueKey>
+            <parameter name="Radio" dmr:version="2.7">
+              <description>
+                The Radio that detected the neighboring WiFi SSID.
+              </description>
+              <syntax>
+                <string>
+                  <pathRef refType="strong" targetParent="Device.WiFi.Radio." targetType="row"/>
+                </string>
+              </syntax>
+            </parameter>
+            <parameter name="SSID" dmr:version="2.7">
+              <description>
+                The current service set identifier in use by the neighboring WiFi SSID. The value MAY be empty for hidden SSIDs.
+              </description>
+              <syntax>
+                <string>
+                  <size maxLength="32"/>
+                </string>
+              </syntax>
+            </parameter>
+            <parameter name="BSSID" dmr:version="2.7">
+              <description>
+                The BSSID used for the neighboring WiFi SSID.
+              </description>
+              <syntax>
+                <dataType ref="MACAddress"/>
+              </syntax>
+            </parameter>
+            <parameter name="Mode" dmr:version="2.7">
+              <description>
+                The mode the neighboring WiFi radio is operating in.
+              </description>
+              <syntax>
+                <string>
+                  <enumeration value="AdHoc"/>
+                  <enumeration value="Infrastructure"/>
+                </string>
+              </syntax>
+            </parameter>
+            <parameter name="Channel" dmr:version="2.7">
+              <description>
+                The current radio channel used by the neighboring WiFi radio.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <range minInclusive="1" maxInclusive="255"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="SignalStrength" dmr:version="2.7">
+              <description>
+                An indicator of radio signal strength (RSSI) of the neighboring WiFi radio measured in {{units}}, as an average of the last 100 packets received.
+              </description>
+              <syntax>
+                <int>
+                  <range minInclusive="-200" maxInclusive="0"/>
+                  <units value="dBm"/>
+                </int>
+              </syntax>
+            </parameter>
+            <parameter name="SecurityModeEnabled" dmr:version="2.7">
+              <description>
+                The type of encryption the neighboring WiFi SSID advertises.
+              </description>
+              <syntax>
+                <string>
+                  <enumeration value="None"/>
+                  <enumeration value="WEP"/>
+                  <enumeration value="WPA"/>
+                  <enumeration value="WPA2"/>
+                  <enumeration value="WPA-WPA2"/>
+                  <enumeration value="WPA-Enterprise"/>
+                  <enumeration value="WPA2-Enterprise"/>
+                  <enumeration value="WPA-WPA2-Enterprise"/>
+                </string>
+              </syntax>
+            </parameter>
+            <parameter name="EncryptionMode" dmr:version="2.7">
+              <description>
+                The type of encryption the neighboring WiFi SSID advertises.
+              </description>
+              <syntax>
+                <list/>
+                <string>
+                  <enumeration value="TKIP"/>
+                  <enumeration value="AES"/>
+                </string>
+              </syntax>
+            </parameter>
+            <parameter name="OperatingFrequencyBand" dmr:version="2.7">
+              <description>
+                Indicates the frequency band at which the radio this SSID instance is operating.
+              </description>
+              <syntax>
+                <string>
+                  <enumeration value="2.4GHz"/>
+                  <enumeration value="5GHz"/>
+                </string>
+              </syntax>
+            </parameter>
+            <parameter name="SupportedStandards" dmr:version="2.7">
+              <description>
+                {{list}} List items indicate which IEEE 802.11 standards this {{object}} instance can support simultaneously, in the frequency band specified by {{param|OperatingFrequencyBand}}. {{enum}}
+                Each value indicates support for the indicated standard.
+                If {{param|OperatingFrequencyBand}} is set to {{enum|2.4GHz|OperatingFrequencyBand}}, only values {{enum|b}}, {{enum|g}}, {{enum|n}} are allowed.
+                If {{param|OperatingFrequencyBand}} is set to {{enum|5GHz|OperatingFrequencyBand}}, only values {{enum|a}}, {{enum|n}}, {{enum|ac}} are allowed.
+              </description>
+              <syntax>
+                <list/>
+                <string>
+                  <enumeration value="a">
+                    <description>
+                      {{bibref|802.11a-1999}}
+                    </description>
+                  </enumeration>
+                  <enumeration value="b">
+                    <description>
+                      {{bibref|802.11b-1999}}
+                    </description>
+                  </enumeration>
+                  <enumeration value="g">
+                    <description>
+                      {{bibref|802.11g-2003}}
+                    </description>
+                  </enumeration>
+                  <enumeration value="n">
+                    <description>
+                      {{bibref|802.11n-2009}}
+                    </description>
+                  </enumeration>
+                  <enumeration value="ac">
+                    <description>
+                      {{bibref|802.11ac-2013}}
+                    </description>
+                  </enumeration>
+                </string>
+              </syntax>
+            </parameter>
+            <parameter name="OperatingStandards" dmr:version="2.7">
+              <description>
+                {{list}} List items indicate which IEEE 802.11 standard that is detected for this {{object}}.
+                Each value indicates support for the indicated standard.
+                If {{param|OperatingFrequencyBand}} is set to {{enum|2.4GHz|##.Radio.{i}.SupportedFrequencyBands}}, only values {{enum|b}}, {{enum|g}}, {{enum|n}} are allowed.
+                If {{param|OperatingFrequencyBand}} is set to {{enum|5GHz|##.Radio.{i}.SupportedFrequencyBands}}, only values {{enum|a}}, {{enum|n}}, {{enum|ac}} are allowed.
+                For example, a value of "g,b" (or "b,g" - order is not important) means that the 802.11g standard {{bibref|802.11g-2003}} is used with a backwards-compatible mode for 802.11b {{bibref|802.11b-1999}}. A value of "g" means that only the 802.11g standard can be used.
+              </description>
+              <syntax>
+                <list/>
+                <string>
+                  <enumerationRef targetParam="SupportedStandards"/>
+                </string>
+              </syntax>
+            </parameter>
+            <parameter name="OperatingChannelBandwidth" dmr:version="2.7">
+              <description>
+                Indicates the bandwidth at which the channel is operating.
+              </description>
+              <syntax>
+                <string>
+                  <enumeration value="20MHz"/>
+                  <enumeration value="40MHz"/>
+                  <enumeration value="80MHz"/>
+                  <enumeration value="160MHz"/>
+                  <enumeration value="Auto"/>
+                </string>
+              </syntax>
+            </parameter>
+            <parameter name="BeaconPeriod" dmr:version="2.7">
+              <description>
+                Time interval (in {{units}}) between transmitting beacons.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="ms"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="Noise" dmr:version="2.7">
+              <description>
+                Indicator of average noise strength (in {{units}}) received from the neighboring WiFi radio.
+              </description>
+              <syntax>
+                <int>
+                  <range minInclusive="-200" maxInclusive="0"/>
+                  <units value="dBm"/>
+                </int>
+              </syntax>
+            </parameter>
+            <parameter name="BasicDataTransferRates" dmr:version="2.7">
+              <description>
+                {{list}} Basic data transmit rates (in Mbps) for the SSID.  For example, if {{param}} is "1,2", this indicates that the SSID is operating with basic rates of 1 Mbps and 2 Mbps.
+              </description>
+              <syntax>
+                <list>
+                  <size maxLength="256"/>
+                </list>
+                <string/>
+              </syntax>
+            </parameter>
+            <parameter name="SupportedDataTransferRates" dmr:version="2.7">
+              <description>
+                {{list}} Data transmit rates (in Mbps) for unicast frames at which the SSID will permit a station to connect. For example, if {{param}} is "1,2,5.5", this indicates that the SSID will only permit connections at 1 Mbps, 2 Mbps and 5.5 Mbps.
+              </description>
+              <syntax>
+                <list>
+                  <size maxLength="256"/>
+                </list>
+                <string/>
+              </syntax>
+            </parameter>
+            <parameter name="DTIMPeriod" dmr:version="2.7">
+              <description>
+                The number of beacon intervals that elapse between transmission of Beacon frames containing a TIM element whose DTIM count field is 0. This value is transmitted in the DTIM Period field of beacon frames. {{bibref|802.11-2012}}
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="ms"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+          </object>
+        </output>
+      </command>
+      <command name="Reset()" dmr:version="2.12">
+        <description>
+          This parameter represents a request to reset or reboot the WiFi sub-system without resetting or rebooting the device.
+        </description>
+      </command>
+    </object>
+    <object name="Device.WiFi.Radio.{i}." access="readOnly" numEntriesParameter="RadioNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:fixedObject="true">
+      <description>
+        This object models an 802.11 wireless radio on a device (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+        If the device can establish more than one connection simultaneously (e.g. a dual radio device), a separate {{object}} instance MUST be used for each physical radio of the device. See {{bibref|TR-181i2|Appendix III.1}} for additional information.
+        Note: A dual-band single-radio device (e.g. an 802.11a/b/g radio) can be configured to operate at 2.4 or 5 GHz frequency bands, but only a single frequency band is used to transmit/receive at a given time. Therefore, a single {{object}} instance is used even for a dual-band radio.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the radio.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the radio (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the radio as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the radio entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since {{object}} is a layer 1 interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+          This parameter is DEPRECATED because it gives a wrong indication for multiple SSIDs. Use the {{param|#.SSID.{i}.Upstream}} parameter instead.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxBitRate" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum PHY bit rate supported by this interface (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedFrequencyBands" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate the frequency bands at which the radio can operate.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="2.4GHz"/>
+            <enumeration value="5GHz"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="OperatingFrequencyBand" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates the frequency band at which the radio is operating.
+          If the radio supports multiple bands, and {{param}} is changed, then all parameters whose value is not valid for the new frequency band (e.g. {{param|Channel}}) MUST be set to a valid value (according to some CPE vendor-specific behavior).
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="SupportedFrequencyBands"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedStandards" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate which IEEE 802.11 standards this {{object}} instance can support simultaneously, in the frequency band specified by {{param|OperatingFrequencyBand}}.  {{enum}}
+          Each value indicates support for the indicated standard.
+          If {{param|OperatingFrequencyBand}} is set to {{enum|2.4GHz|OperatingFrequencyBand}}, only values {{enum|b}}, {{enum|g}}, {{enum|n}} are allowed.
+          If {{param|OperatingFrequencyBand}} is set to {{enum|5GHz|OperatingFrequencyBand}}, only values {{enum|a}}, {{enum|n}}, {{enum|ac}} are allowed.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="a">
+              <description>
+                {{bibref|802.11a-1999}}
+              </description>
+            </enumeration>
+            <enumeration value="b">
+              <description>
+                {{bibref|802.11b-1999}}
+              </description>
+            </enumeration>
+            <enumeration value="g">
+              <description>
+                {{bibref|802.11g-2003}}
+              </description>
+            </enumeration>
+            <enumeration value="n">
+              <description>
+                {{bibref|802.11n-2009}}
+              </description>
+            </enumeration>
+            <enumeration value="ac">
+              <description>
+                {{bibref|802.11ac-2013}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="OperatingStandards" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} List items indicate which IEEE 802.11 standard this {{object}} instance is configured for.
+          Each value indicates support for the indicated standard.
+          If {{param|OperatingFrequencyBand}} is set to {{enum|2.4GHz|OperatingFrequencyBand}}, only values {{enum|b}}, {{enum|g}}, {{enum|n}} are allowed.
+          If {{param|OperatingFrequencyBand}} is set to {{enum|5GHz|OperatingFrequencyBand}}, only values {{enum|a}}, {{enum|n}}, {{enum|ac}} are allowed.
+          For example, a value of "g,b" (or "b,g" - order is not important) means that the 802.11g standard {{bibref|802.11g-2003}} is used with a backwards-compatible mode for 802.11b {{bibref|802.11b-1999}}. A value of "g" means that only the 802.11g standard can be used.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam="SupportedStandards"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PossibleChannels" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items represent possible radio channels for the wireless standard (a, b, g, n) and the regulatory domain.
+          Ranges in the form "n-m" are permitted.
+          For example, for 802.11b and North America, would be "1-11".
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ChannelsInUse" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} List items represent channels that the radio determines to be currently in use (including any that it is using itself).
+          Ranges in the form "n-m" are permitted.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Channel" access="readWrite" dmr:version="2.0">
+        <description>
+          The current radio channel used by the connection. To request automatic channel selection, set {{param|AutoChannelEnable}} to {{true}}.
+          Whenever {{param|AutoChannelEnable}} is {{true}}, the value of the {{param}} parameter MUST be the channel selected by the automatic channel selection procedure.
+          Note: Valid {{param}} values depend on the {{param|OperatingFrequencyBand}} and {{param|RegulatoryDomain}} values specified.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AutoChannelSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether automatic channel selection is supported by this radio. If {{false}}, then {{param|AutoChannelEnable}} MUST be {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoChannelEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enable or disable automatic channel selection.
+          Set to {{false}} to disable the automatic channel selection procedure, in which case the currently selected channel remains selected.
+          Set to {{true}} to enable the automatic channel selection procedure. This procedure MUST automatically select the channel, and MAY also change it subsequently.
+          {{param}} MUST automatically change to {{false}} whenever the channel is manually selected, i.e. whenever the {{param|Channel}} parameter is written.
+          Whenever {{param}} is {{true}}, the value of the {{param|Channel}} parameter MUST be the channel selected by the automatic channel selection procedure.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoChannelRefreshPeriod" access="readWrite" dmr:version="2.0">
+        <description>
+          The time period in {{units}} between two consecutive automatic channel selections. A value of 0 means that the automatic channel selection is done only at boot time.
+          This parameter is significant only if {{param|AutoChannelEnable}} is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ChannelLastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The accumulated time in {{units}} since the current {{param|Channel}} came into use.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ChannelLastSelectionReason" access="readOnly" dmr:version="2.12">
+        <description>
+          The cause of the last channel selection.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Manual">
+              <description>
+                Manual selection of the {{param|Channel}}.
+              </description>
+            </enumeration>
+            <enumeration value="Auto_Startup">
+              <description>
+                Automatic channel selection procedure launched at radio startup.
+              </description>
+            </enumeration>
+            <enumeration value="Auto_User">
+              <description>
+                Automatic channel selection procedure triggered by the user (e.g. via a GUI).
+              </description>
+            </enumeration>
+            <enumeration value="Auto_Refresh">
+              <description>
+                Automatic channel selection procedure triggered by the {{param|AutoChannelRefreshPeriod}} timer.
+              </description>
+            </enumeration>
+            <enumeration value="Auto_Dynamic">
+              <description>
+                Automatic channel selection procedure dynamically triggered to adjust to environmental interference.
+              </description>
+            </enumeration>
+            <enumeration value="Auto_DFS">
+              <description>
+                Automatic channel selection procedure triggered by Dynamic Frequency Selection (DFS) {{bibref|ETSIBRAN}}.
+              </description>
+            </enumeration>
+            <enumeration value="Unknown"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxSupportedSSIDs" access="readOnly" dmr:version="2.12">
+        <description>
+          Maximum number of SSIDs supported on this radio.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxSupportedAssociations" access="readOnly" dmr:version="2.12">
+        <description>
+          Maximum number of associated devices supported.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FirmwareVersion" access="readOnly" dmr:version="2.12">
+        <description>
+          This radio's WiFi firmware version.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedOperatingChannelBandwidths" access="readOnly" dmr:version="2.12">
+        <description>
+          {{list}}  These are the valid writable values for {{param|OperatingChannelBandwidth}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="20MHz"/>
+            <enumeration value="40MHz">
+              <description>
+                wide mode
+              </description>
+            </enumeration>
+            <enumeration value="80MHz">
+              <description>
+                802.11ac only
+              </description>
+            </enumeration>
+            <enumeration value="160MHz">
+              <description>
+                802.11ac only
+              </description>
+            </enumeration>
+            <enumeration value="Auto"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="OperatingChannelBandwidth" access="readWrite" dmr:version="2.0">
+        <description>
+          The preferred channel bandwidth to be used (applicable to 802.11n and 802.11ac specifications only).
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="SupportedOperatingChannelBandwidths"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentOperatingChannelBandwidth" access="readOnly" dmr:version="2.11">
+        <description>
+          The channel bandwidth currently in use.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="20MHz"/>
+            <enumeration value="40MHz"/>
+            <enumeration value="80MHz"/>
+            <enumeration value="160MHz"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ExtensionChannel" access="readWrite" dmr:version="2.0">
+        <description>
+          The secondary extension channel position, applicable when operating in wide channel mode (i.e. when {{param|OperatingChannelBandwidth}} is set to {{enum|40MHz|OperatingChannelBandwidth}} or {{enum|Auto|OperatingChannelBandwidth}}).
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AboveControlChannel"/>
+            <enumeration value="BelowControlChannel"/>
+            <enumeration value="Auto"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GuardInterval" access="readWrite" dmr:version="2.0">
+        <description>
+          The guard interval value between OFDM symbols (applicable to 802.11n and 802.11ac specifications only).
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="400nsec"/>
+            <enumeration value="800nsec"/>
+            <enumeration value="Auto"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MCS" access="readWrite" dmr:version="2.0">
+        <description>
+          The Modulation Coding Scheme index (applicable to 802.11n and 802.11ac specifications only). Values from 0 to 15 MUST be supported ({{bibref|802.11n-2009}}). Values from 0 to 9 MUST be supported for {{bibref|802.11ac-2013}}.  A value of -1 indicates automatic selection of the MCS index.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="15"/>
+            <range minInclusive="16" maxInclusive="31"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="TransmitPowerSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items represent supported transmit power levels as {{units}} of full power. For example, "0,25,50,75,100".
+          A -1 item indicates auto mode (automatic decision by CPE). Auto mode allows the ''Radio'' to adjust transmit power accordingly. For example, this can be useful for power-save modes such as EU-CoC, where the ''Radio'' can adjust power according to activity in the CPE.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="64"/>
+          </list>
+          <int>
+            <range minInclusive="-1" maxInclusive="100"/>
+            <units value="percentage"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="TransmitPower" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates the current transmit power level as a {{units}} of full power. The value MUST be one of the values reported by the {{param|TransmitPowerSupported}} parameter. A value of -1 indicates auto mode (automatic decision by CPE).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="100"/>
+            <units value="percentage"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="IEEE80211hSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether IEEE 802.11h {{bibref|802.11h-2003}} functionality is supported by this radio. The value can be {{true}} only if the 802.11a or the 802.11n@5GHz standard is supported (i.e. {{param|SupportedFrequencyBands}} includes {{enum|5GHz|SupportedFrequencyBands}} and {{param|SupportedStandards}} includes {{enum|a|SupportedStandards}} and/or {{enum|n|SupportedStandards}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IEEE80211hEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates whether IEEE 802.11h functionality is enabled on this radio. The value can be {{true}} only if the 802.11a or the 802.11n@5GHz standard is supported and enabled (i.e. {{param|OperatingFrequencyBand}} is {{enum|5GHz|OperatingFrequencyBand}} and {{param|OperatingStandards}} includes {{enum|a|OperatingStandards}} and/or {{enum|n|OperatingStandards}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RegulatoryDomain" access="readWrite" dmr:version="2.0">
+        <description>
+          The 802.11d Regulatory Domain. First two octets are {{bibref|ISO3166-1}} two-character country code. The third octet is either " " (all environments), "O" (outside) or "I" (inside).
+        </description>
+        <syntax>
+          <string>
+            <size minLength="3" maxLength="3"/>
+            <pattern value="[A-Z][A-Z][ OI]"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RetryLimit" access="readWrite" dmr:version="2.8">
+        <description>
+          The maximum number of retransmissions of a short packet i.e. a packet that is no longer than the {{param|RTSThreshold}}. This corresponds to IEEE 802.11 parameter ''dot11ShortRetryLimit''  {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CCARequest" access="readWrite" dmr:version="2.8">
+        <description>
+          A request for the clear channel assessment (CCA) report in the format specified in {{bibref|802.11-2012|Clause 8.4.2.23.3}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="11" maxLength="11"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="CCAReport" access="readOnly" dmr:version="2.8">
+        <description>
+          The clear channel assessment (CCA) report in the format specified in {{bibref|802.11-2012|Clause 8.4.2.24.3}}.
+          When read, the value of this parameter MUST correspond to {{param|CCARequest}}.  How this is achieved is a local matter to the CPE.
+          If this parameter is read before a CCARequest has been issued, then its value is {{empty}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="12" maxLength="12"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="RPIHistogramRequest" access="readWrite" dmr:version="2.8">
+        <description>
+          A request for a received power indicator (RPI) histogram in the format specified in {{bibref|802.11-2012|Clause 8.4.2.23.4}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="11" maxLength="11"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="RPIHistogramReport" access="readOnly" dmr:version="2.8">
+        <description>
+          Received power indicator (RPI) histogram report in the format specified in {{bibref|802.11-2012|Clause 8.4.2.24.4}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="19" maxLength="19"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="FragmentationThreshold" access="readWrite" dmr:version="2.8">
+        <description>
+          This specifies the current maximum size, in {{units}}, of the MPDU that can be delivered to the PHY. This parameter is based on ''dot11FragmentationThreshold'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="octets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RTSThreshold" access="readWrite" dmr:version="2.8">
+        <description>
+          This indicates the number of {{units}} in an MPDU, below which an RTS/CTS handshake is not performed. This parameter is based on ''dot11RTSThreshold'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="octets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LongRetryLimit" access="readWrite" dmr:version="2.8">
+        <description>
+          This indicates the maximum number of transmission attempts of a frame, the length of which is greater than {{param|RTSThreshold}}, that will be made before a failure condition is indicated. This parameter is based on ''dot11LongRetryLimit'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BeaconPeriod" access="readWrite" dmr:version="2.8">
+        <description>
+          Time interval between transmitting beacons (expressed in {{units}}). This parameter is based on ''dot11BeaconPeriod'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DTIMPeriod" access="readWrite" dmr:version="2.8">
+        <description>
+          This specifies the number of beacon intervals that elapse between transmission of Beacon frames containing a TIM element whose DTIM Count field is 0. This parameter is based on ''dot11DTIMPeriod'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketAggregationEnable" access="readWrite" dmr:version="2.8">
+        <description>
+          This determines whether or not packet aggregation (commonly called "frame aggregation") is enabled. This applies only to 802.11n.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PreambleType" access="readWrite" dmr:version="2.8">
+        <description>
+          The type of preamble. Longer preambles (more overhead) are needed by 802.11g to coexist with legacy systems 802.11 and 802.11b.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="short"/>
+            <enumeration value="long"/>
+            <enumeration value="auto"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BasicDataTransmitRates" access="readWrite" dmr:version="2.8">
+        <description>
+          {{list}} The set of data rates, in ''Mbps'', that have to be supported by all stations that desire to join this BSS. The stations have to be able to receive and transmit at each of the data rates listed in {{param}}. For example, a value of "1,2", indicates that stations support 1 Mbps and 2 Mbps. Most control packets use a data rate in {{param}}.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="OperationalDataTransmitRates" access="readWrite" dmr:version="2.8">
+        <description>
+          {{list}} Maximum access point data transmit rates in ''Mbps'' for unicast frames (a superset of {{param|BasicDataTransmitRates}}). Given the value of {{param|BasicDataTransmitRates}} from the example above, {{param}} might be "1,2,5.5,11", indicating that unicast frames can additionally be transmitted at 5.5 Mbps and 11 Mbps.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedDataTransmitRates" access="readOnly" dmr:version="2.8">
+        <description>
+          {{list}} Data transmit rates in ''Mbps'' for unicast frames at which the access point will permit a station to connect (a subset of {{param|OperationalDataTransmitRates}}). Given the values of {{param|BasicDataTransmitRates}} and {{param|OperationalDataTransmitRates}} from the examples above, {{param}} might be "1,2,5.5", indicating that the AP will only permit connections at 1 Mbps, 2 Mbps and 5.5 Mbps, even though it could theoretically accept connections at 11 Mbps.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.Radio.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface. Packet counters here count 802.11 WiFi frames. See {{bibref|TR-181i2a5|Appendix III}} for further details. The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2a5|Section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PLCPErrorCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of packets that were received with a detected Physical Layer Convergence Protocol (PLCP) header error.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FCSErrorCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of packets that were received with a detected FCS error. This parameter is based on dot11FCSErrorCount from {{bibref|802.11-2012|Annex C}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="InvalidMACCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of packets that were received with a detected invalid MAC header error.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsOtherReceived" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of packets that were received, but which were destined for a MAC address that is not associated with this interface.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Noise" access="readOnly" dmr:version="2.8">
+        <description>
+          An indicator of average noise strength received at this radio, measured in {{units}}. This measurement of non-IEEE 802.11 noise power is made by sampling the channel when virtual carrier sense indicates idle and this radio is neither transmitting nor receiving a frame.
+        </description>
+        <syntax>
+          <int>
+            <units value="dBm"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="TotalChannelChangeCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of times that the {{param|#.Channel}} has changed since the {{object|.WiFi.Radio}} entered its current operating state.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ManualChannelChangeCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The number of times that the {{param|#.Channel}} has changed due to manual channel selection since the {{object|.WiFi.Radio}} entered its current operating state.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoStartupChannelChangeCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The number of times that the {{param|#.Channel}} has changed due to automatic channel selection procedure launched at radio startup since the {{object|.WiFi.Radio}} entered its current operating state.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoUserChannelChangeCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The number of times that the {{param|#.Channel}} has changed due to automatic channel selection procedure triggered by the user (e.g. via a GUI) since the {{object|.WiFi.Radio}} entered its current operating state.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoRefreshChannelChangeCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The number of times that the {{param|#.Channel}} has changed due to automatic channel selection procedure triggered by the {{param|#.AutoChannelRefreshPeriod}} timer since the {{object|.WiFi.Radio}} entered its current operating state.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoDynamicChannelChangeCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The number of times that the {{param|#.Channel}} has changed due to automatic channel selection procedure dynamically triggered to adjust to environmental interference since the {{object|.WiFi.Radio}} entered its current operating state.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoDFSChannelChangeCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The number of times that the {{param|#.Channel}} has changed due to automatic channel selection procedure triggered by DFS {{bibref|ETSIBRAN}} since the {{object|.WiFi.Radio}} entered its current operating state.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.SSID.{i}." access="readWrite" numEntriesParameter="SSIDNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        WiFi SSID table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}), where table entries model the MAC layer. A WiFi SSID entry is typically stacked on top of a {{object|#.Radio}} object.
+        WiFi SSID is also a multiplexing layer, i.e. more than one {{object}} can be stacked above a single {{object|#.Radio}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="BSSID"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the SSID entry.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the SSID entry (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the SSID entry as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the SSID entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="BSSID" access="readOnly" dmr:version="2.0">
+        <description>
+          The Basic Service Set ID.
+          This is the MAC address of the access point, which can either be local (when this instance models an access point SSID) or remote (when this instance models an end point SSID).
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The MAC address of this interface.
+          If this instance models an access point SSID, {{param}} is the same as {{param||BSSID}}.
+          Note: This is not necessarily the same as the Ethernet header source or destination MAC address, which is associated with the IP interface and is modeled via the {{param|.Ethernet.Link.{i}.MACAddress}} parameter.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="SSID" access="readWrite" dmr:version="2.0">
+        <description>
+          The current service set identifier in use by the connection. The SSID is an identifier that is attached to packets sent over the wireless LAN that functions as an ID for joining a particular radio network (BSS).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Upstream" access="readOnly" dmr:version="2.12">
+        <description>
+          Indicates whether the interface points towards the Internet ({{true}}) or towards End Devices ({{false}}).
+          For example:
+          * For an Internet Gateway Device, {{param}} will be {{true}} for all WAN interfaces and {{false}} for all LAN interfaces.
+          * For a standalone WiFi Access Point that is connected via Ethernet to an Internet Gateway Device, {{param}} will be {{true}} for the Ethernet interface and {{false}} for the WiFi Radio interface.
+          * For an End Device, {{param}} will be {{true}} for all interfaces.
+          This parameter supersedes the deprecated {{param|#.Radio.{i}.Upstream}} parameter. If both exist, the parameter {{param|#.Radio.{i}.Upstream}} is ignored.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.SSID.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface. Packet counters here count 802.11 WiFi frames. See {{bibref|TR-181i2a5|Appendix III}} for further details. The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2a5|Section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors. These can be due to the number of retransmissions exceeding the retry limit, or from other causes.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RetransCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The total number of transmitted packets which were retransmissions. Two retransmissions of the same packet results in this counter incrementing by two.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FailedRetransCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of packets that were not transmitted successfully due to the number of retransmission attempts exceeding an 802.11 retry limit. This parameter is based on dot11FailedCount from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RetryCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of packets that were successfully transmitted after one or more retransmissions. This parameter is based on dot11RetryCount from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MultipleRetryCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of packets that were successfully transmitted after more than one retransmission. This parameter is based on dot11MultipleRetryCount from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ACKFailureCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of expected ACKs that were never received. This parameter is based on dot11ACKFailureCount from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AggregatedPacketCount" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of aggregated packets that were transmitted. This applies only to 802.11n and 802.11ac.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}." access="readWrite" numEntriesParameter="AccessPointNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object models an 802.11 connection from the perspective of a wireless access point. Each {{object}} entry is associated with a particular {{object|#.SSID}} interface instance via the {{param|SSIDReference}} parameter.
+        For enabled table entries, if {{param|SSIDReference}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="SSIDReference"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this access point.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the status of this access point.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="SSIDReference" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.SSID." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SSIDAdvertisementEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates whether or not beacons include the SSID name.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RetryLimit" access="readWrite" status="deprecated" dmr:version="2.0">
+        <description>
+          The maximum number of retransmission for a packet. This corresponds to IEEE 802.11 parameter ''dot11ShortRetryLimit''.
+          This parameter is DEPRECATED because it is really a {{object|#.Radio}} attribute.  Use {{param|#.Radio.{i}.RetryLimit}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="WMMCapability" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether this access point supports WiFi Multimedia (WMM) Access Categories (AC).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UAPSDCapability" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether this access point supports WMM Unscheduled Automatic Power Save Delivery (U-APSD).
+          Note: U-APSD support implies WMM support.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="WMMEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          Whether WMM support is currently enabled. When enabled, this is indicated in beacon frames.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UAPSDEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          Whether U-APSD support is currently enabled. When enabled, this is indicated in beacon frames.
+          Note: U-APSD can only be enabled if WMM is also enabled.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAssociatedDevices" access="readWrite" dmr:version="2.4">
+        <description>
+          The maximum number of devices that can simultaneously be connected to the access point.
+          A value of 0 means that there is no specific limit.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="IsolationEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables device isolation.
+          A value of {{true}} means that the devices connected to the Access Point are isolated from all other devices within the home network (as is typically the case for a Wireless Hotspot).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddressControlEnabled" access="readWrite" dmr:version="2.9">
+        <description>
+          Indicates whether or not MAC Address Control is enabled on this {{object|#}}.  MAC Address Control limits client devices to those whose hardware addresses match the {{param|AllowedMACAddress}} list.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="AllowedMACAddress" access="readWrite" dmr:version="2.9">
+        <description>
+          Hardware addresses of client devices that are allowed to associate with this {{object|#}} if {{param|MACAddressControlEnabled}} is {{true}}.
+        </description>
+        <syntax>
+          <list/>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAllowedAssociations" access="readWrite" dmr:version="2.12">
+        <description>
+          Maximum number of associated devices allowed for this SSID. If the number is reached new device connections to this access point will be rejected.
+          If the number is changed to a value less than the actual number of associated devices, new device connections will be rejected until the number of devices is below this number. It is not expected that any connections are dropped.
+          If the parameter {{param|#.Radio.{i}.MaxSupportedAssociations}} exists, the value MUST be less than or equal to the maximum number specified in {{param|#.Radio.{i}.MaxSupportedAssociations}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}.Security." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains security related parameters that apply to a CPE acting as an Access Point {{bibref|802.11-2007}}.
+      </description>
+      <parameter name="ModesSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates which security modes this {{object|#}} instance is capable of supporting.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="WEP-64"/>
+            <enumeration value="WEP-128"/>
+            <enumeration value="WPA-Personal"/>
+            <enumeration value="WPA2-Personal"/>
+            <enumeration value="WPA-WPA2-Personal"/>
+            <enumeration value="WPA-Enterprise"/>
+            <enumeration value="WPA2-Enterprise"/>
+            <enumeration value="WPA-WPA2-Enterprise"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModeEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates which security mode is enabled.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="ModesSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="WEPKey" access="readWrite" dmr:version="2.0">
+        <description>
+          A WEP key expressed as a hexadecimal string.
+          {{param}} is used only if {{param|ModeEnabled}} is set to {{enum|WEP-64|ModeEnabled}} or {{enum|WEP-128|ModeEnabled}}.
+          A 5 byte {{param}} corresponds to security mode {{enum|WEP-64|ModeEnabled}} and a 13 byte {{param}} corresponds to security mode {{enum|WEP-128|ModeEnabled}}.
+        </description>
+        <syntax hidden="true">
+          <hexBinary>
+            <size minLength="5" maxLength="5"/>
+            <size minLength="13" maxLength="13"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="PreSharedKey" access="readWrite" dmr:version="2.0">
+        <description>
+          A literal PreSharedKey (PSK) expressed as a hexadecimal string.
+          {{param}} is only used if {{param|ModeEnabled}} is set to {{enum|WPA-Personal|ModeEnabled}} or {{enum|WPA2-Personal|ModeEnabled}} or {{enum|WPA-WPA2-Personal|ModeEnabled}}.
+          If {{param|KeyPassphrase}} is written, then {{param}} is immediately generated. The ACS SHOULD NOT set both the {{param|KeyPassphrase}} and the {{param}} directly (the result of doing this is undefined).
+        </description>
+        <syntax hidden="true">
+          <hexBinary>
+            <size maxLength="32"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="KeyPassphrase" access="readWrite" dmr:version="2.0">
+        <description>
+          A passphrase from which the {{param|PreSharedKey}} is to be generated, for {{enum|WPA-Personal|ModeEnabled}} or {{enum|WPA2-Personal|ModeEnabled}} or {{enum|WPA-WPA2-Personal|ModeEnabled}} security modes.
+          If {{param}} is written, then {{param|PreSharedKey}} is immediately generated. The ACS SHOULD NOT set both the {{param}} and the {{param|PreSharedKey}} directly (the result of doing this is undefined). The key is generated as specified by WPA, which uses PBKDF2 from PKCS #5: Password-based Cryptography Specification Version 2.0 ({{bibref|RFC2898}}).
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size minLength="8" maxLength="63"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RekeyingInterval" access="readWrite" dmr:version="2.0">
+        <description>
+          The interval (expressed in {{units}}) in which the keys are re-generated.
+          This is applicable to WPA, WPA2 and Mixed (WPA-WPA2) modes in Personal or Enterprise mode (i.e. when {{param|ModeEnabled}} is set to a value other than {{enum|None|ModeEnabled}} or {{enum|WEP-64|ModeEnabled}} or {{enum|WEP-128|ModeEnabled}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="3600"/>
+        </syntax>
+      </parameter>
+      <parameter name="RadiusServerIPAddr" access="readWrite" dmr:version="2.0">
+        <description>
+          The IP Address of the RADIUS server used for WLAN security. {{param}} is only applicable when {{param|ModeEnabled}} is an Enterprise type (i.e. {{enum|WPA-Enterprise|ModeEnabled}}, {{enum|WPA2-Enterprise|ModeEnabled}} or {{enum|WPA-WPA2-Enterprise|ModeEnabled}}).
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="SecondaryRadiusServerIPAddr " access="readWrite" dmr:version="2.5">
+        <description>
+          The IP Address of a secondary RADIUS server used for WLAN security. {{param}} is only applicable when {{param|ModeEnabled}} is an Enterprise type (i.e. {{enum|WPA-Enterprise|ModeEnabled}}, {{enum|WPA2-Enterprise|ModeEnabled}} or {{enum|WPA-WPA2-Enterprise|ModeEnabled}}).
+          The client can forward requests to the secondary server in the event that the primary server is down or unreachable, or after a number of tries to the primary server fail, or in a round-robin fashion {{bibref|RFC2865}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="RadiusServerPort" access="readWrite" dmr:version="2.0">
+        <description>
+          The port number of the RADIUS server used for WLAN security. {{param}} is only applicable when {{param|ModeEnabled}} is an Enterprise type (i.e. {{enum|WPA-Enterprise|ModeEnabled}}, {{enum|WPA2-Enterprise|ModeEnabled}} or {{enum|WPA-WPA2-Enterprise|ModeEnabled}}).
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="1812"/>
+        </syntax>
+      </parameter>
+      <parameter name="SecondaryRadiusServerPort" access="readWrite" dmr:version="2.5">
+        <description>
+          The port number of the secondary RADIUS server used for WLAN security. {{param}} is only applicable when {{param|ModeEnabled}} is an Enterprise type (i.e. {{enum|WPA-Enterprise|ModeEnabled}}, {{enum|WPA2-Enterprise|ModeEnabled}} or {{enum|WPA-WPA2-Enterprise|ModeEnabled}}).
+          If this parameter is not implemented, the secondary RADIUS server will use the same port number as the primary RADIUS server.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="1812"/>
+        </syntax>
+      </parameter>
+      <parameter name="RadiusSecret" access="readWrite" dmr:version="2.0">
+        <description>
+          The secret used for handshaking with the RADIUS server {{bibref|RFC2865}}.
+        </description>
+        <syntax hidden="true">
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SecondaryRadiusSecret" access="readWrite" dmr:version="2.5">
+        <description>
+          The secret used for handshaking with the secondary RADIUS server {{bibref|RFC2865}}.
+          If this parameter is not implemented, the secondary RADIUS server will use the same secret as the primary RADIUS server.
+        </description>
+        <syntax hidden="true">
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="MFPConfig" access="readWrite" dmr:version="2.11">
+        <description>
+          Management Frame Protection configuration applicable when {{param|ModeEnabled}} is set to {{enum|WPA2-Personal|ModeEnabled}} or {{enum|WPA2-Enterprise|ModeEnabled}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Optional"/>
+            <enumeration value="Required"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <command name="Reset()" dmr:version="2.12">
+        <description>
+          Reset this {{object|#}} instance's WiFi security settings to their factory default values. The affected settings include {{param|ModeEnabled}}, {{param|WEPKey}}, {{param|PreSharedKey}} , {{param|KeyPassphrase}} and {{param|#.WPS.PIN}} (if applicable).
+          If the command cannot be executed, the agent MUST reject the command. Possible failure reasons include a lack of default values or if {{param|ModeEnabled}} is an Enterprise type, i.e. {{enum|WPA-Enterprise|ModesSupported}}, {{enum|WPA2-Enterprise|ModesSupported}} or {{enum|WPA-WPA2-Enterprise|ModesSupported}}.
+        </description>
+      </command>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}.WPS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains parameters related to Wi-Fi Protected Setup for this access point (as specified in {{bibref|WPSv1.0}} or {bibref|WPSv2.0}}).
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables WPS functionality for this access point.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConfigMethodsSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          WPS configuration methods supported by the device. {{enum}}
+          This parameter corresponds directly to the "Config Methods" attribute of {{bibref|WPS 2.0}}.
+          The {{enum|USBFlashDrive}} and {{enum|Ethernet}} are only applicable in WPS 1.0 and are deprecated in WPS 2.x. The {{enum|PhysicalPushButton}}, {{enum|VirtualPushButton}}, {{enum|PhysicalDisplay}} and {{enum|VirtualDisplay}} are applicable to WPS 2.x only.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="USBFlashDrive"/>
+            <enumeration value="Ethernet"/>
+            <enumeration value="Label"/>
+            <enumeration value="Display"/>
+            <enumeration value="ExternalNFCToken"/>
+            <enumeration value="IntegratedNFCToken"/>
+            <enumeration value="NFCInterface"/>
+            <enumeration value="PushButton"/>
+            <enumeration value="PIN"/>
+            <enumeration value="PhysicalPushButton"/>
+            <enumeration value="PhysicalDisplay"/>
+            <enumeration value="VirtualPushButton"/>
+            <enumeration value="VirtualDisplay"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConfigMethodsEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} Indicates WPS configuration methods enabled on the device.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam="ConfigMethodsSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.11">
+        <description>
+          {{list}} Indicates the current status of WPS. If the device goes to {{enum|SetupLocked}} the WPS needs to be disabled and re-enabled to come out of state.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Error"/>
+            <enumeration value="Unconfigured"/>
+            <enumeration value="Configured"/>
+            <enumeration value="SetupLocked"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.11">
+        <description>
+          The Wi-Fi Simple Configuration version supported by the device, a string of the form ''m.n'' where ''m'' is the major version and ''n'' is the minor version.
+          For example, a value of ''1.0'' denotes WSC 1.0 and a value of ''2.0'' denotes WSC 2.0.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="PIN" access="readWrite" dmr:version="2.11">
+        <description>
+          Represents the Device PIN used for PIN based pairing between WPS peers. This PIN is either a four digit number or an eight digit number.
+          {{hidden}}
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="8"/>
+            <pattern value="\d{4}|\d{8}"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}.AssociatedDevice.{i}." access="readOnly" numEntriesParameter="AssociatedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        A table of the devices currently associated with the access point.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The MAC address of an associated device.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="OperatingStandard" access="readOnly" dmr:version="2.10">
+        <description>
+          The operating standard that this associated device is connected with.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="a">
+              <description>
+                {{bibref|802.11a-1999}}
+              </description>
+            </enumeration>
+            <enumeration value="b">
+              <description>
+                {{bibref|802.11b-1999}}
+              </description>
+            </enumeration>
+            <enumeration value="g">
+              <description>
+                {{bibref|802.11g-2003}}
+              </description>
+            </enumeration>
+            <enumeration value="n">
+              <description>
+                {{bibref|802.11n-2009}}
+              </description>
+            </enumeration>
+            <enumeration value="ac">
+              <description>
+                {{bibref|802.11ac-2013}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AuthenticationState" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Whether an associated device has authenticated ({{true}}) or not ({{false}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="LastDataDownlinkRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The data transmit rate in {{units}} that was most recently used for transmission from the access point to the associated device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1000"/>
+            <units value="kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastDataUplinkRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The data transmit rate in {{units}} that was most recently used for transmission from the associated device to the access point.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1000"/>
+            <units value="kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AssociationTime" access="readOnly" dmr:version="2.12">
+        <description>
+          Date and time in UTC when the device was associated
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="SignalStrength" access="readOnly" dmr:version="2.0">
+        <description>
+          An indicator of radio signal strength of the uplink from the associated device to the access point, measured in {{units}}, as an average of the last 100 packets received from the device.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-200" maxInclusive="0"/>
+            <units value="dBm"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Noise" access="readOnly" dmr:version="2.12">
+        <description>
+          An indicator of radio noise on the uplink from the associated device to the access point, measured in {{units}}, as an average of the last 100 packets received from the device (see ANPI definition in {{bibref|802.11-2012|Clause 10.11.9.4}})
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-200" maxInclusive="0"/>
+            <units value="dBm"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Retransmissions" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of {{units}} that had to be re-transmitted, from the last 100 packets sent to the associated device. Multiple re-transmissions of the same packet count as one.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+            <units value="packets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether or not this node is currently present in the WiFi AccessPoint network.
+          The ability to list inactive nodes is OPTIONAL. If the CPE includes inactive nodes in this table, {{param}} MUST be set to {{false}} for each inactive node. The length of time an inactive node remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}.AssociatedDevice.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        These count bytes or packets sent to, or received from, this Associated Device, which is a WiFi station associated to this access point. Packet counters here count 802.11 WiFi frames.
+        The CPE MUST reset these {{object}} parameters (unless otherwise stated in individual object or parameter descriptions) either when the {{param|##.Status}} of the parent {{object|##}} object transitions from {{enum|Disabled|##.Status}} to {{enum|Enabled|##.Status}}, or when it transitions from {{enum|Enabled|##.Status}} to {{enum|Disabled|##.Status}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of bytes transmitted to the Associated Device, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of bytes received from the Associated Device, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of packets transmitted to the Associated Device.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of packets received from the Associated Device.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors. These might be due to the number of retransmissions exceeding the retry limit, or from other causes.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="RetransCount" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of transmitted packets which were retransmissions. Two retransmissions of the same packet results in this counter incrementing by two.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="FailedRetransCount" access="readOnly" dmr:version="2.8">
+        <description>
+          The number of packets that were not transmitted successfully due to the number of retransmission attempts exceeding an 802.11 retry limit. This parameter is based on ''dot11FailedCount'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="RetryCount" access="readOnly" dmr:version="2.8">
+        <description>
+          The number of packets that were successfully transmitted after one or more retransmissions. This parameter is based on ''dot11RetryCount'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="MultipleRetryCount" access="readOnly" dmr:version="2.8">
+        <description>
+          The number of packets that were successfully transmitted after more than one retransmission. This parameter is based on ''dot11MultipleRetryCount'' from {{bibref|802.11-2012}}.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}.AC.{i}." access="readOnly" minEntries="4" maxEntries="4" dmr:version="2.8">
+      <description>
+        This object contains parameters related to WiFi QoS for different 802.11e access categories (priorities). Access categories are: BE, BK, VI, and VO. These parameters can help control and monitor 802.11e Enhanced distributed channel access (EDCA). The size of this table is fixed, with four entries which are identified by the {{param|AccessCategory}} parameter as follows:
+        * BE (Best Effort)
+        * BK (Background)
+        * VI (Video)
+        * VO (Voice)
+      </description>
+      <uniqueKey>
+        <parameter ref="AccessCategory"/>
+      </uniqueKey>
+      <parameter name="AccessCategory" access="readOnly" dmr:version="2.8">
+        <description>
+          This identifies the access category.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="BE"/>
+            <enumeration value="BK"/>
+            <enumeration value="VI"/>
+            <enumeration value="VO"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="AIFSN" access="readWrite" dmr:version="2.8">
+        <description>
+          Arbitration Inter Frame Spacing (Number). This is the number of time slots in the arbitration interframe space.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="2" maxInclusive="15"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ECWMin" access="readWrite" dmr:version="2.8">
+        <description>
+          Exponent of Contention Window (Minimum). This encodes the values of CWMin as an exponent: CWMin = 2^ECWMin - 1. For example, if ECWMin is 8, then CWMin is 2^8 - 1, or 255, (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="15"/>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ECWMax" access="readWrite" dmr:version="2.8">
+        <description>
+          Exponent of Contention Window (Maximum). This encodes the values of CWMax as an exponent: CWMax = 2^ECWMax - 1. For example, if ECWMax is 8, then CWMax is 2^8 - 1, or 255, (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="15"/>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TxOpMax" access="readWrite" dmr:version="2.8">
+        <description>
+          Maximum transmit opportunity, in multiples of {{units}}. A TXOP time interval of 0 means it is limited to a single MAC protocol data unit (MPDU).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+            <units value="32 microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AckPolicy" access="readWrite" dmr:version="2.8">
+        <description>
+          Ack Policy, where False="Do Not Acknowledge" and True="Acknowledge"
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="OutQLenHistogramIntervals" access="readWrite" dmr:version="2.8">
+        <description>
+          {{list}} Definition of the histogram intervals for counting the transmit queue length in packets. Each value indicates the maximum value of the interval. For example, "0,1,4,8," defines the five intervals: 0 packets in queue, 1 packet in queue, 2 to 4 packets in queue, 5 to 8 packets in queue, and 9 or more packets in queue. (No value after the last comma means no upper bound.) If this parameter is set to {{empty}}, no {{param|Stats.OutQLenHistogram}} stats will be collected.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="OutQLenHistogramSampleInterval" access="readWrite" dmr:version="2.8">
+        <description>
+          The time between recording samples of the current transmit queue in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}.AC.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object contains statistics for different 802.11e access categories (priorities).
+        Packet counters here count 802.11 WiFi frames.
+        If there are not separate stats for each access category, (e.g., 802.11e is not used and there is only one queue), then only access category 0 = BE applies (e.g., the statistics for the single queue are in access category 0 = BE).
+        The CPE MUST reset the Access Point's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the Access Point becomes operationally down due to a previous administrative down (i.e. the Access Point's Status parameter transitions to a Diasbled state) or when the Access Point becomes administratively up (i.e. the Access Point's Enable parameter transitions from false to true). Administrative and operational status is discussed in [Section 4.2.2/TR-181i2].
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} transmitted in this access category, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received in this access category, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} transmitted in this access category.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received in this access category.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of outbound {{units}} in this access category that could not be transmitted because of errors. These might be due to the number of retransmissions exceeding the retry limit, or from other causes.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of inbound {{units}} in this access category that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of outbound {{units}} in this access category which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of inbound {{units}} in this access category which were chosen to be discarded even though no errors had been detected to prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="RetransCount" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of transmitted {{units}} in this access category which were retransmissions. Two retransmissions of the same packet results in this counter incrementing by two.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="OutQLenHistogram" access="readOnly" dmr:version="2.8">
+        <description>
+          {{list}} Histogram of the total length of the transmit queue of this access category in packets (1 packet, 2 packets, etc.) according to the intervals defined by {{param|#.OutQLenHistogramIntervals}}, with samples taken each {{param|#.OutQLenHistogramSampleInterval}}. Example: "12,5,1,0,2,0,0,1".
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.AccessPoint.{i}.Accounting." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.5">
+      <description>
+        This object contains the parameters related to RADIUS accounting functionality for the access point.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.5">
+        <description>
+          Enables or disables accounting functionality for the access point.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerIPAddr" access="readWrite" dmr:version="2.5">
+        <description>
+          The IP Address of the RADIUS accounting server.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="SecondaryServerIPAddr" access="readWrite" dmr:version="2.5">
+        <description>
+          The IP Address of a secondary RADIUS accounting server.
+          The client can forward requests to the secondary server in the event that the primary server is down or unreachable, or after a number of tries to the primary server fail, or in a round-robin fashion. {{bibref|RFC2866}}
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerPort" access="readWrite" dmr:version="2.5">
+        <description>
+          The port number of the RADIUS server used for accounting. The default port is 1813 as defined in {{bibref|RFC2866}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="1813"/>
+        </syntax>
+      </parameter>
+      <parameter name="SecondaryServerPort" access="readWrite" dmr:version="2.5">
+        <description>
+          The port number of the secondary RADIUS server used for accounting. The default port is 1813 as defined in {{bibref|RFC2866}}.
+          If this parameter is not implemented, the secondary RADIUS server will use the same port number as the primary RADIUS server.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="1813"/>
+        </syntax>
+      </parameter>
+      <parameter name="Secret" access="readWrite" dmr:version="2.5">
+        <description>
+          The secret used for handshaking with the RADIUS accounting server {{bibref|RFC2865}}.
+        </description>
+        <syntax hidden="true">
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SecondarySecret" access="readWrite" dmr:version="2.5">
+        <description>
+          The secret used for handshaking with the secondary RADIUS accounting server {{bibref|RFC2865}}.
+          If this parameter is not implemented, the secondary RADIUS server will use the same secret as the primary RADIUS server.
+        </description>
+        <syntax hidden="true">
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="InterimInterval" access="readWrite" dmr:version="2.5">
+        <description>
+          Specifies the default interim accounting interval in {{units}}, which is used for service accounting when the ''Acct-Interim-Interval'' attribute is not configured. {{bibref|RFC2869|Section 2.1}}
+          The value MUST NOT be smaller than 60.  The value SHOULD NOT be smaller than  600, and careful consideration should be given to its impact on network traffic {{bibref|RFC2869|Section 5.16}}.
+          A value of 0 means no interim accounting messages are sent.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="0"/>
+            <range minInclusive="60"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}." access="readWrite" numEntriesParameter="EndPointNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object models an 802.11 connection from the perspective of a wireless end point. Each {{object}} entry is associated with a particular {{object|#.SSID}} interface instance via the {{param|SSIDReference}} parameter, and an associated active {{object|Profile}} instance via the {{param|ProfileReference}} parameter. The active profile is responsible for specifying the actual SSID and security settings used by the end point.
+        For enabled table entries, if {{param|SSIDReference}} or {{param|ProfileReference}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="SSIDReference"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this end point.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the status of this end point.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProfileReference" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} This is the currently active profile, which specifies the SSID and security settings to be used by the end point.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="Profile." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SSIDReference" access="readOnly" dmr:version="2.0">
+        <description>
+          {{reference}} {{param}} is determined based on the {{param|Profile.{i}.SSID}} within the associated {{param|ProfileReference}}) endpoint profile. {{param}} MUST be {{empty}} if {{param|ProfileReference}} is {{empty}} (i.e. only when an active profile is assigned can the associated SSID interface be determined).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.SSID." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ProfileNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this end point.
+      </description>
+      <parameter name="LastDataDownlinkRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The data transmit rate in {{units}} that was most recently used for transmission from the access point to the end point device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1000" maxInclusive="600000"/>
+            <units value="kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastDataUplinkRate" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The data transmit rate in {{units}} that was most recently used for transmission from the end point to the access point device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1000" maxInclusive="600000"/>
+            <units value="kbps"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SignalStrength" access="readOnly" dmr:version="2.0">
+        <description>
+          An indicator of radio signal strength of the downlink from the access point to the end point, measured in {{units}}, as an average of the last 100 packets received from the device.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-200" maxInclusive="0"/>
+            <units value="dBm"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Retransmissions" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of {{units}} that had to be re-transmitted, from the last 100 packets sent to the access point. Multiple re-transmissions of the same packet count as one.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+            <units value="packets"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}.Security." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains security related parameters that apply to a WiFi end point {{bibref|802.11-2007}}.
+      </description>
+      <parameter name="ModesSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates which security modes this {{object|#}} instance is capable of supporting.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="WEP-64"/>
+            <enumeration value="WEP-128"/>
+            <enumeration value="WPA-Personal"/>
+            <enumeration value="WPA2-Personal"/>
+            <enumeration value="WPA-WPA2-Personal"/>
+            <enumeration value="WPA-Enterprise"/>
+            <enumeration value="WPA2-Enterprise"/>
+            <enumeration value="WPA-WPA2-Enterprise"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}.Profile.{i}." access="readWrite" numEntriesParameter="ProfileNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        EndPoint Profile table.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="SSID"/>
+        <parameter ref="Location"/>
+        <parameter ref="Priority"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this Profile.
+          When there are multiple WiFi EndPoint Profiles, e.g. each instance supports a different SSID and/or different security configuration, this parameter can be used to control which of the instances are currently enabled.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the status of this Profile.  {{enum}}
+          The {{enum|Active}} value is reserved for the instance that is actively connected. The {{enum|Available}} value represents an instance that is not currently active, but is also not disabled or in error. The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Active"/>
+            <enumeration value="Available"/>
+            <enumeration value="Error" optional="true"/>
+            <enumeration value="Disabled"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="SSID" access="readWrite" dmr:version="2.0">
+        <description>
+          The profile identifier in use by the connection. The SSID is an identifier that is attached to packets sent over the wireless LAN that functions as an ID for joining a particular radio network (BSS).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Location" access="readWrite" dmr:version="2.0">
+        <description>
+          Location of the profile. This value serves as a reminder from the user, describing the location of the profile. For example: "Home", "Office", "Neighbor House", "Airport", etc. An empty string is also valid.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Priority" access="readWrite" dmr:version="2.0">
+        <description>
+          The profile Priority defines one of the criteria used by the End Point to automatically select the "best" AP when several APs with known profiles are simultaneously available for association.
+          In this situation, the End Point has to select the AP with the higher priority in its profile. If there are several APs with the same priority, providing different SSID or the same SSID, then the wireless end point has to select the APs according to other criteria like signal quality, SNR, etc.
+          0 is the highest priority.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}.Profile.{i}.Security." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains security related parameters that apply to a WiFi End Point profile {{bibref|802.11-2007}}.
+      </description>
+      <parameter name="ModeEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates which security mode is enabled.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="##.Security.ModesSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="WEPKey" access="readWrite" dmr:version="2.0">
+        <description>
+          A WEP key expressed as a hexadecimal string.
+          {{param}} is used only if {{param|ModeEnabled}} is set to {{enum|WEP-64|ModeEnabled}} or {{enum|WEP-128|ModeEnabled}}.
+          A 5 byte {{param}} corresponds to security mode {{enum|WEP-64|ModeEnabled}} and a 13 byte {{param}} corresponds to security mode {{enum|WEP-128|ModeEnabled}}.
+        </description>
+        <syntax hidden="true">
+          <hexBinary>
+            <size minLength="5" maxLength="5"/>
+            <size minLength="13" maxLength="13"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="PreSharedKey" access="readWrite" dmr:version="2.0">
+        <description>
+          A literal PreSharedKey (PSK) expressed as a hexadecimal string.
+          {{param}} is only used if {{param|ModeEnabled}} is set to {{enum|WPA-Personal|ModeEnabled}} or {{enum|WPA2-Personal|ModeEnabled}} or {{enum|WPA-WPA2-Personal|ModeEnabled}}.
+          If {{param|KeyPassphrase}} is written, then {{param}} is immediately generated. The ACS SHOULD NOT set both the {{param|KeyPassphrase}} and the {{param}} directly (the result of doing this is undefined).
+        </description>
+        <syntax hidden="true">
+          <hexBinary>
+            <size maxLength="32"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="KeyPassphrase" access="readWrite" dmr:version="2.0">
+        <description>
+          A passphrase from which the {{param|PreSharedKey}} is to be generated, for {{enum|WPA-Personal|ModeEnabled}} or {{enum|WPA2-Personal|ModeEnabled}} or {{enum|WPA-WPA2-Personal|ModeEnabled}} security modes.
+          If {{param}} is written, then {{param|PreSharedKey}} is immediately generated. The ACS SHOULD NOT set both the {{param}} and the {{param|PreSharedKey}} directly (the result of doing this is undefined). The key is generated as specified by WPA, which uses PBKDF2 from PKCS #5: Password-based Cryptography Specification Version 2.0 {{bibref|RFC2898}}.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size minLength="8" maxLength="63"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MFPConfig" access="readWrite" dmr:version="2.11">
+        <description>
+          Management Frame Protection configuration applicable when {{param|ModeEnabled}} is set to {{enum|WPA2-Personal|ModeEnabled}} or {{enum|WPA2-Enterprise|ModeEnabled}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Optional"/>
+            <enumeration value="Required"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}.WPS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains parameters related to Wi-Fi Protected Setup {{bibref|WPSv1.0}} for this end point.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables WPS functionality for this end point.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConfigMethodsSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          WPS configuration methods supported by the device. {{enum}}
+          This parameter corresponds directly to the "Config Methods" attribute of {{bibref|WPS 2.0}}.
+          The {{enum|USBFlashDrive}} and {{enum|Ethernet}} are only applicable in WPS 1.0 and are deprecated in WPS 2.x. The {{enum|PhysicalPushButton}}, {{enum|VirtualPushButton}}, {{enum|PhysicalDisplay}} and {{enum|VirtualDisplay}} are applicable to WPS 2.x only.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="USBFlashDrive"/>
+            <enumeration value="Ethernet"/>
+            <enumeration value="Label"/>
+            <enumeration value="Display"/>
+            <enumeration value="ExternalNFCToken"/>
+            <enumeration value="IntegratedNFCToken"/>
+            <enumeration value="NFCInterface"/>
+            <enumeration value="PushButton"/>
+            <enumeration value="PIN"/>
+            <enumeration value="PhysicalPushButton"/>
+            <enumeration value="PhysicalDisplay"/>
+            <enumeration value="VirtualPushButton"/>
+            <enumeration value="VirtualDisplay"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConfigMethodsEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the WPS configuration methods enabled on the device.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam="ConfigMethodsSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.11">
+        <description>
+          {{list}} Indicates the current status of WPS in EndPoint.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Error"/>
+            <enumeration value="Unconfigured"/>
+            <enumeration value="Configured"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.11">
+        <description>
+          The Wi-Fi Simple Configuration version supported by the device, a string of the form ''m.n'' where ''m'' is the major version and ''n'' is the minor version.
+          For example, a value of ''1.0'' denotes WSC 1.0 and a value of ''2.0'' denotes WSC 2.0.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="PIN" access="readWrite" dmr:version="2.11">
+        <description>
+          Represents the Device PIN used for PIN based pairing between WPS peers. This PIN is either a four digit number or an eight digit number.
+          {{hidden}}
+        </description>
+        <syntax hidden="true">
+          <unsignedInt>
+            <range minInclusive="4" maxInclusive="4"/>
+            <range minInclusive="8" maxInclusive="8"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}.AC.{i}." access="readOnly" minEntries="4" maxEntries="4" dmr:version="2.8">
+      <description>
+        This object contains parameters related to WiFi QoS for different 802.11e access categories (priorities). Access categories are: BE, BK, VI, and VO. These parameters can help control and monitor 802.11e Enhanced distributed channel access (EDCA). The size of this table is fixed, with four entries which are identified by the {{param|AccessCategory}} parameter as follows:
+        * BE (Best Effort)
+        * BK (Background)
+        * VI (Video)
+        * VO (Voice)
+      </description>
+      <uniqueKey>
+        <parameter ref="AccessCategory"/>
+      </uniqueKey>
+      <parameter name="AccessCategory" access="readOnly" dmr:version="2.8">
+        <description>
+          This identifies the access category.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="BE"/>
+            <enumeration value="BK"/>
+            <enumeration value="VI"/>
+            <enumeration value="VO"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="AIFSN" access="readWrite" dmr:version="2.8">
+        <description>
+          Arbitration Inter Frame Spacing (Number). This is the number of time slots in the arbitration interframe space.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="2" maxInclusive="15"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ECWMin" access="readWrite" dmr:version="2.8">
+        <description>
+          Exponent of Contention Window (Minimum). This encodes the values of CWMin as an exponent: CWMin = 2^ECWMin - 1. For example, if ECWMin is 8, then CWMin is 2^8 - 1, or 255, (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="15"/>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ECWMax" access="readWrite" dmr:version="2.8">
+        <description>
+          Exponent of Contention Window (Maximum). This encodes the values of CWMax as an exponent: CWMax = 2^ECWMax - 1. For example, if ECWMax is 8, then CWMax is 2^8 - 1, or 255, (expressed in {{units}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="15"/>
+            <units value="microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TxOpMax" access="readWrite" dmr:version="2.8">
+        <description>
+          Maximum transmit opportunity, in multiples of {{units}}. A TXOP time interval of 0 means it is limited to a single MAC protocol data unit (MPDU).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+            <units value="32 microseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AckPolicy" access="readWrite" dmr:version="2.8">
+        <description>
+          Ack Policy, where False="Do Not Acknowledge" and True="Acknowledge"
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="OutQLenHistogramIntervals" access="readWrite" dmr:version="2.8">
+        <description>
+          {{list}} Definition of the histogram intervals for counting the transmit queue length in packets. Each value indicates the maximum value of the interval. For example, "0,1,4,8," defines the five intervals: 0 packets in queue, 1 packet in queue, 2 to 4 packets in queue, 5 to 8 packets in queue, and 9 or more packets in queue. (No value after the last comma means no upper bound.) If this parameter is set to an empty string, no {{param|Stats.OutQLenHistogram}} stats will be collected.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="OutQLenHistogramSampleInterval" access="readWrite" dmr:version="2.8">
+        <description>
+          The time between recording samples of the current transmit queue {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.WiFi.EndPoint.{i}.AC.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object contains statistics for different 802.11e access categories (priorities).
+        Packet counters here count 802.11 WiFi frames.
+        If there are not separate stats for each access category, (e.g., 802.11e is not used and there is only one queue), then only access category 0 = BE applies (e.g., the statistics for the single queue are in access category 0 = BE).
+        The CPE MUST reset the EndPoint's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the EndPoint becomes operationally down due to a previous administrative down (i.e. the EndPoint's Status parameter transitions to a Diasbled state) or when the EndPoint becomes administratively up (i.e. the EndPoint's Enable parameter transitions from false to true). Administrative and operational status is discussed in [Section 4.2.2/TR-181i2].
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} transmitted in this access category, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received in this access category, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} transmitted in this access category.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received in this access category.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of outbound {{units}} in this access category that could not be transmitted because of errors. These might be due to the number of retransmissions exceeding the retry limit, or from other causes.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of inbound {{units}} in this access category that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of outbound {{units}} in this access category which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of inbound {{units}} in this access category which were chosen to be discarded even though no errors had been detected to prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="RetransCount" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of transmitted {{units}} in this access category which were retransmissions. Two retransmissions of the same packet results in this counter incrementing by two.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="OutQLenHistogram" access="readOnly" dmr:version="2.8">
+        <description>
+          {{list}} Histogram of the total length of the transmit queue of this access category in packets (1 packet, 2 packets, etc.) according to the intervals defined by {{param|#.OutQLenHistogramIntervals}}, with samples taken each {{param|#.OutQLenHistogramSampleInterval}}. Example: "12,5,1,0,2,0,0,1"
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        Top level object for ZigBee capabilities based on the {{bibref|ZigBee2007}} specification.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ZDONumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        ZigBee interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). This table models the ZigBee interface of a ZigBee end device, ZigBee router or ZigBee coordinator.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="ZDOReference"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables the interface. This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.7">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.7">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.7">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IEEEAddress" access="readOnly" activeNotify="forceDefaultEnabled" dmr:version="2.7">
+        <description>
+          The IEEE address assigned to this interface.  A value of "FF:FF:FF:FF:FF:FF:FF:FF"  indicates that this address is unknown.  This parameter has the same value as the {{param|.ZigBee.ZDO.{i}.IEEEAddress}} parameter of the ZDO instance {{param|ZDOReference}} is pointing to.
+        </description>
+        <syntax>
+          <dataType ref="IEEE_EUI64"/>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkAddress" access="readOnly" dmr:version="2.7">
+        <description>
+          The ZigBee network address assigned to this interface.  This parameter has the same value as the {{param|.ZigBee.ZDO.{i}.NetworkAddress}} parameter of the ZDO instance {{param|ZDOReference}} is pointing to.
+        </description>
+        <syntax>
+          <dataType ref="ZigBeeNetworkAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ZDOReference" access="readOnly" dmr:version="2.7">
+        <description>
+          The ZigBee Device Object assigned to this interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".ZigBee.ZDO." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDeviceNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}}  received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} sent transmitted out of the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} received by the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} discarded by interface due to any error.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} received that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} received which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} requested for transmission which were chosen to be discarded even though no errors had been detected to prevent the {{units}} being transmitted.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} received which were chosen to be discarded even though no errors had been detected to prevent their being delivered.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} requested for transmission which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} received which were addressed to a multicast address at this layer and delivered by this layer to a higher layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} requested for transmission which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} received which were addressed to a broadcast address at this layer and delivered by this layer to a higher layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The total number of {{units}} received which were discarded because of an unknown or unsupported protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="ZigBee packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.Interface.{i}.AssociatedDevice.{i}." access="readOnly" numEntriesParameter="AssociatedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        This table provides information about other ZigBee devices that are directly accessible via this interface.
+        {{keys}}
+        It is possible that instances of this object have the same key value when the value of {{param|IEEEAddress}} parameter is "FF:FF:FF:FF:FF:FF:FF:FF" and the ZigBee Coordinators on two or more separate area networks assign the same value for the {{param|NetworkAddress}}. This is because the ZigBee specification describes only intra-area network topologies {{bibref|ZigBee2007|Section 1.1.4 Network Topology}}. As such if two or more {{object}} instances have the same key value the implemenation is undefined.
+      </description>
+      <uniqueKey>
+        <parameter ref="IEEEAddress"/>
+        <parameter ref="NetworkAddress"/>
+      </uniqueKey>
+      <parameter name="IEEEAddress" access="readOnly" dmr:version="2.7">
+        <description>
+          The IEEE address assigned to this device. A value of "FF:FF:FF:FF:FF:FF:FF:FF"  indicates that this address is unknown.
+        </description>
+        <syntax>
+          <dataType ref="IEEE_EUI64"/>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkAddress" access="readOnly" dmr:version="2.7">
+        <description>
+          The ZigBee network address assigned to this device.
+        </description>
+        <syntax>
+          <dataType ref="ZigBeeNetworkAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.7">
+        <description>
+          Whether or not this device is currently present in the ZigBee network as defined in {{bibref|ZigBee2007|section 2.4.4.1}}.
+          The ability to list inactive devices is OPTIONAL. If the CPE includes inactive devices in this table, {{param}} MUST be set to {{false}}  for each inactive device. The length of time an inactive device remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ZDOReference" access="readOnly" dmr:version="2.7">
+        <description>
+          The ZigBee Device Object assigned to this interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".ZigBee.ZDO." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}." access="readOnly" numEntriesParameter="ZDONumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        ZigBee Device Object (ZDO) provides management capabilities of the ZigBee Application Support  (APS) and Network (NWK) layers of a ZigBee Device as defined in {{bibref|ZigBee2007|section 2.5}}.
+        {{keys}}
+        It is possible that instances of this object have the same key value when the value of {{param|IEEEAddress}} parameter is "FF:FF:FF:FF:FF:FF:FF:FF" and the ZigBee Coordinators on two or more separate area networks assign the same value for the {{param|NetworkAddress}}. This is because the ZigBee specification describes only intra-area network topologies {{bibref|ZigBee2007|Section 1.1.4 Network Topology}}. As such if two or more {{object}} instances have the same key value the implemenation is undefined
+      </description>
+      <uniqueKey>
+        <parameter ref="IEEEAddress"/>
+        <parameter ref="NetworkAddress"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="IEEEAddress" access="readOnly" dmr:version="2.7">
+        <description>
+          The IEEE address assigned to this device. A value of "FF:FF:FF:FF:FF:FF:FF:FF"  indicates that this address is unknown.
+        </description>
+        <syntax>
+          <dataType ref="IEEE_EUI64"/>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkAddress" access="readOnly" dmr:version="2.7">
+        <description>
+          The ZigBee network address assigned to this device.
+        </description>
+        <syntax>
+          <dataType ref="ZigBeeNetworkAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="BindingTableNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="GroupNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ApplicationEndpointNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.NodeDescriptor." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        The {{object}} object describes the node capabilities of the ZigBee device as defined in {{bibref|ZigBee2007|section 2.3.2.3 Node Descriptor}}.
+      </description>
+      <parameter name="LogicalType" access="readOnly" dmr:version="2.7">
+        <description>
+          The type of ZigBee device that is extracted from the Logical Type Field as defined in {{bibref|ZigBee2007|Table 2.29}}.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ZC">
+              <description>
+                ZigBee Coordinator
+              </description>
+            </enumeration>
+            <enumeration value="ZR">
+              <description>
+                ZigBee Router
+              </description>
+            </enumeration>
+            <enumeration value="ZED">
+              <description>
+                ZigBee End Device
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ComplexDescriptorSupported" access="readOnly" dmr:version="2.7">
+        <description>
+          When {{true}}, specifies that the {{object|#.ComplexDescriptor}} object is supported for this ZigBee device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UserDescriptorSupported" access="readOnly" dmr:version="2.7">
+        <description>
+          When {{true}}, specifies that the {{object|#.UserDescriptor}} object is supported for this ZigBee device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FrequencyBand" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the frequency bands that are supported by the underlying IEEE 802.15.4 radio utilized by the ZigBee device.
+          {{list}} {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="868-868.6">
+              <description>
+                The 868-868.6 MHz Band
+              </description>
+            </enumeration>
+            <enumeration value="902-928">
+              <description>
+                The 902-928 MHz Band
+              </description>
+            </enumeration>
+            <enumeration value="2400-2483.5">
+              <description>
+                The 2400-2483.5 MHz Band
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MACCapability" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies  the IEEE 802.15.4-2003 MAC sub-layer capabilities for this ZigBee device.
+          {{list}} {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="AlternatePANCoordinator">
+              <description>
+                Alternate PAN Coordinator
+              </description>
+            </enumeration>
+            <enumeration value="FFD">
+              <description>
+                Full Function Device
+              </description>
+            </enumeration>
+            <enumeration value="MainsPowerSource">
+              <description>
+                The current power source is mains power
+              </description>
+            </enumeration>
+            <enumeration value="OnWhenIdle">
+              <description>
+                The receiver is on when idle
+              </description>
+            </enumeration>
+            <enumeration value="SecureCommunication">
+              <description>
+                Secure communication is enabled
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManufactureCode" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies a manufacturer code that is allocated by the ZigBee Alliance, relating the manufacturer to the device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumBufferSize" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the maximum buffer size, in {{units}}, of the network sub-layer data unit (NSDU) for this ZigBee device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="128"/>
+            <units value="octets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumIncomingTransferSize" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the maximum size, in {{units}}, of the application sub-layer data unit (ASDU) that can be transferred to this ZigBee device in one single message transfer.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="32768"/>
+            <units value="octets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumOutgoingTransferSize" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the maximum size, in {{units}}, of the application sub-layer data unit (ASDU) that can be transferred from this ZigBee device in one single message transfer.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="32768"/>
+            <units value="octets"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ServerMask" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the system server capabilities of this ZigBee device.
+          {{list}} {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="PrimaryTrustCenter"/>
+            <enumeration value="PrimaryBindingTableCache"/>
+            <enumeration value="BackupBindingTableCache"/>
+            <enumeration value="PrimaryDiscoveryCache"/>
+            <enumeration value="BackupDiscoveryCache"/>
+            <enumeration value="NetworkManager"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DescriptorCapability" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the descriptor capabilities of this ZigBee device.
+          {{list}} {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="ExtendedActiveEndpointListAvailable"/>
+            <enumeration value="ExtendedSimpleDescriptorListAvailable"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.PowerDescriptor." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        The {{object}} object describes the power capabilities of the ZigBee device as defined in {{bibref|ZigBee2007|section 2.3.2.4 Node Power Descriptor}}.
+      </description>
+      <parameter name="CurrentPowerMode" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the current sleep/power-saving mode of the ZigBee device.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Synchronized"/>
+            <enumeration value="Periodic"/>
+            <enumeration value="Manual"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AvailablePowerSource" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the power sources available on this ZigBee device.
+          {{list}} {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="Constant">
+              <description>
+                Constant (mains) power
+              </description>
+            </enumeration>
+            <enumeration value="Rechargeable">
+              <description>
+                Rechargable battery
+              </description>
+            </enumeration>
+            <enumeration value="Disposable">
+              <description>
+                Disposable battery
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentPowerSource" access="readOnly" dmr:version="2.7">
+        <description>
+          The current power source field specifies the current power source being utilized by the node.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Constant">
+              <description>
+                Constant (mains) power
+              </description>
+            </enumeration>
+            <enumeration value="Rechargeable">
+              <description>
+                Rechargable battery
+              </description>
+            </enumeration>
+            <enumeration value="Disposable">
+              <description>
+                Disposable battery
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentPowerSourceLevel" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the level of charge of the current power source.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Critical">
+              <description>
+                Critical battery state
+              </description>
+            </enumeration>
+            <enumeration value="33">
+              <description>
+                Battery state is 33 percent
+              </description>
+            </enumeration>
+            <enumeration value="66">
+              <description>
+                Battery state is 66 percent
+              </description>
+            </enumeration>
+            <enumeration value="100">
+              <description>
+                Battery state is 100 percent
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.UserDescriptor." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7" dmr:noUniqueKeys="true">
+      <description>
+        The {{object}} object is an optional descriptor that describes user defined capabilities of the ZigBee device as defined in {{bibref|ZigBee2007|section 2.3.2.7 User Descriptor}}. The {{object}} object contains information that allows the user to identify the device using a user-friendly character string, such as "Bedroom TV" or "Stairs Light".
+      </description>
+      <parameter name="DescriptorAvailable" access="readOnly" dmr:version="2.7">
+        <description>
+          When {{true}}, the User Descriptor recorded has been received from the target device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the information that allows the user to identify the ZigBee device using a user-friendly character string, such as "Bedroom TV" or "Stairs light".
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="16"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.ComplexDescriptor." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7" dmr:noUniqueKeys="true">
+      <description>
+        The {{object}} object is an optional descriptor that describes extended capabilities of the ZigBee device as defined in {{bibref|ZigBee2007|section 2.3.2.6 Complex Descriptor}}.
+      </description>
+      <parameter name="DescriptorAvailable" access="readOnly" dmr:version="2.7">
+        <description>
+          When {{true}}, the Complex Descriptor recorded has been received from the target device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Language" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the ISO 639-1 language code as defined in {{bibref|ISO639-1}}.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="CharacterSet" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the ISO 646 character set as defined in {{bibref|ISO646-1991}}.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerName" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the name of the manufacturer of the ZigBee device.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ModelName" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the name of the manufacturer's model of the ZigBee device.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the manufacturer's serial number of the ZigBee device.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceURL" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the URL through which more information relating to the ZigBee device can be obtained.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Icon" access="readOnly" dmr:version="2.7">
+        <description>
+          The icon field contains an octet string which carries the data for an icon that can represent the ZigBee device.  The format of the icon MUST be a 32-by-32-pixel PNG image.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="IconURL" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the URL through which the icon for the ZigBee device can be obtained.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.Security." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        The {{object}} object provides the configuration capabilities needed to perform the Security Management functionality defined in {{bibref|ZigBee2007|section 4 Security Management}}.
+      </description>
+      <parameter name="TrustCenterAddress" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies the IEEE address of a special device trusted by devices within a ZigBee network to distribute keys for the purpose of network and end-to-end application configuration management.
+        </description>
+        <syntax>
+          <dataType ref="IEEE_EUI64"/>
+        </syntax>
+      </parameter>
+      <parameter name="SecurityLevel" access="readOnly" dmr:version="2.7">
+        <description>
+          Specifies how an outgoing frame is to be secured, how an incoming frame purportedly has been secured; it also indicates whether or not the payload is encrypted and to what extent data authenticity over the frame is provided, as reflected by the length of the message integrity code (MIC).
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="MIC-32"/>
+            <enumeration value="MIC-64"/>
+            <enumeration value="MIC-128"/>
+            <enumeration value="ENC"/>
+            <enumeration value="ENC-MIC-32"/>
+            <enumeration value="ENC-MIC-64"/>
+            <enumeration value="ENC-MIC-128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TimeOutPeriod" access="readOnly" dmr:version="2.7">
+        <description>
+          The period of time, in {{units}}, that this ZigBee device will wait for an expected security protocol frame.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.Network." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        The {{object}} object provides the configuration capabilities needed to by a ZigBee Device to operate within a ZigBee Area Network as defined in {{bibref|ZigBee2007|section 2.5.2.4 Network Manager}}.
+      </description>
+      <parameter name="NeighborNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.Network.Neighbor.{i}." access="readOnly" numEntriesParameter="NeighborNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        The {{object}} object provides the configuration capabilities needed to by a ZigBee Device to operate within a ZigBee Area Network as defined in {{bibref|ZigBee2007|section 2.5.2.4 Network Manager}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="Neighbor"/>
+      </uniqueKey>
+      <parameter name="Neighbor" access="readOnly" dmr:version="2.7">
+        <description>
+          Neighbor of this ZigBee device. The value MUST be the path name of a row in the ZigBee.ZDO table. If the referenced row is deleted then this entry MUST be deleted.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".ZigBee.ZDO." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LQI" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The LQI field specified link quality identification (LQI) for neighbor ZigBee device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Relationship" access="readOnly" dmr:version="2.7">
+        <description>
+          The relationship between the neighbor and this device.{{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Parent"/>
+            <enumeration value="Child"/>
+            <enumeration value="PrevChild"/>
+            <enumeration value="Sibling"/>
+            <enumeration value="None"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PermitJoin" access="readOnly" dmr:version="2.7">
+        <description>
+          An indication of whether the neighbor device is accepting join requests.{{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Accepting"/>
+            <enumeration value="NotAccepting"/>
+            <enumeration value="Unknown"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Depth" access="readOnly" dmr:version="2.7">
+        <description>
+          The tree depth of the neighbor device. A value of 0x00 indicates that the device is the ZigBee coordinator for the network.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.NodeManager." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        The {{object}} object describes the configuration capabilities related for remote management of the ZigBee Area Network as defined in {{bibref|ZigBee2007|section 2.5.2.6 Node Manager}}.
+      </description>
+      <parameter name="RoutingTableNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.NodeManager.RoutingTable.{i}." access="readOnly" numEntriesParameter="RoutingTableNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.7" dmr:noUniqueKeys="true">
+      <description>
+        The {{object}} object describes the route table as defined in {{bibref|ZigBee2007|table 3.51 Routing Table Entry}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="DestinationAddress"/>
+      </uniqueKey>
+      <parameter name="DestinationAddress" access="readOnly" dmr:version="2.7">
+        <description>
+          The ZigBee network address of this route.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="4"/>
+            <pattern value="([0-9A-Fa-f]){4}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NextHopAddress" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          Specifies the network address of the next hop ZigBee device on the way to the destination ZigBee device.
+        </description>
+        <syntax>
+          <dataType ref="ZigBeeNetworkAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          The status of the route entry. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Active"/>
+            <enumeration value="DiscoveryUnderway"/>
+            <enumeration value="DiscoveryFailed"/>
+            <enumeration value="Inactive"/>
+            <enumeration value="ValidationUnderway"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MemoryConstrained" access="readOnly" dmr:version="2.7">
+        <description>
+          A flag indicating whether the device is a memory constrained concentrator.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ManyToOne" access="readOnly" dmr:version="2.7">
+        <description>
+          A flag indicating that the destination is a concentrator that issued a many to-one request.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RouteRecordRequired" access="readOnly" dmr:version="2.7">
+        <description>
+          A flag indicating that a route record command frame should be sent to the destination prior to the next data packet.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.Binding.{i}." access="readWrite" numEntriesParameter="BindingTableNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        The {{object}} object describes the configuration capabilities related to maintaining a ZigBee Device's Binding Table as defined in {{bibref|ZigBee2007|section 2.2.8.2 Binding}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables the use of this binding on the device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceEndpoint" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the source endpoint used in this binding entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="240"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SourceAddress" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the source address used in this binding entry.
+        </description>
+        <syntax>
+          <dataType ref="IEEE_EUI64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ClusterId" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the cluster identifier used in this binding entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DestinationAddressMode" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the type of destination address used for this binding entry. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Group"/>
+            <enumeration value="Endpoint"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DestinationEndpoint" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the destination endpoint for the binding entry. The value of this field is valid when the value of the {{param|DestinationAddressMode}} is {{enum|Endpoint|DestinationAddressMode}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="240"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="IEEEDestinationAddress" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the IEEE destination address for this binding entry. The value of this field is valid when the value of the {{param|DestinationAddressMode}} is {{enum|Endpoint|DestinationAddressMode}}.
+        </description>
+        <syntax>
+          <dataType ref="IEEE_EUI64"/>
+        </syntax>
+      </parameter>
+      <parameter name="GroupDestinationAddress" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the group destination address for this binding entry. The value of this field is valid when the value of the {{param|DestinationAddressMode}} is {{enum|Group|DestinationAddressMode}}.
+        </description>
+        <syntax>
+          <dataType ref="ZigBeeNetworkAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.Group.{i}." access="readWrite" numEntriesParameter="GroupNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        The {{object}} object describes the configuration capabilities related to maintaining a ZigBee Device's Group Table as defined in {{bibref|ZigBee2007|section 2.5.2.7 Group Manager}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="GroupId"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables the use of this group on the device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="GroupId" access="readWrite" dmr:version="2.7">
+        <description>
+          The Group Identifier for this object as defined in {{bibref|ZigBee2007|table 2.25 Group Table Entry Format}}.
+        </description>
+        <syntax>
+          <dataType ref="ZigBeeNetworkAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="EndpointList" access="readWrite" dmr:version="2.7">
+        <description>
+          The list of application endpoints assigned as a member of this {{object}} object.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".ZigBee.ZDO.{i}.ApplicationEndpoint." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.ApplicationEndpoint.{i}." access="readWrite" numEntriesParameter="ApplicationEndpointNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        The {{object}} object describes the application endpoint as defined in {{bibref|ZigBee2007|section 2.1.2 Application Framework}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="EndpointId"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables the use of this application endpoint on the device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="EndpointId" access="readWrite" dmr:version="2.7">
+        <description>
+          The Endpoint Identifier for this object as defined in {{bibref|ZigBee2007|section 2.1.2 Application Framework}}.
+          An {{object}} with an {{param}} value of 0 is designated as the device application: This is a special application that is responsible for device operation and contains logic to manage the device's networking and general maintenance features.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="240"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.ZDO.{i}.ApplicationEndpoint.{i}.SimpleDescriptor." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        The {{object}} object contains the attributes of the Simple Descriptor of an application endpoint, as defined in {{bibref|ZigBee2007|section 2.3.2.5 Simple Descriptor}}.
+      </description>
+      <parameter name="ProfileId" access="readWrite" dmr:version="2.7">
+        <description>
+          Specifies the application profile that is supported on this endpoint. Application profiles are agreements for messages, message formats, andprocessing actions that enable developers to create an interoperable, distributed application employing application entities that reside on separate ZigBee devices. These application profiles enable applications to send commands, request data, and process commands and requests as defined in {{bibref|ZigBee2007|section 2.1.2.1 Application Profiles}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceId" access="readOnly" dmr:version="2.7">
+        <description>
+          Application device identifier, as defined in {{bibref|ZigBee2007|section 2.3.2.5.3 Application Device Identifier Field}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceVersion" access="readOnly" dmr:version="2.7">
+        <description>
+          Application device version, as defined in {{bibref|ZigBee2007|section 2.3.2.5.4 Application Device Version Field}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="15"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="InputClusterList" access="readWrite" dmr:version="2.7">
+        <description>
+          {{list}} Specifies the input cluster identifiers to be matched by the ZigBee coordinator by remote Zigbee device's output cluster list for this {{object}} object.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="OutputClusterList" access="readWrite" dmr:version="2.7">
+        <description>
+          {{list}} Specifies the output cluster identifiers to be matched by the ZigBee coordinator by remote Zigbee device's input cluster list for this {{object}} object.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.Discovery." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        This object is used for managing the discovery of ZigBee devices within a ZigBee Area Network. ZigBee Devices are discovered via the {{object|#.ZDO}} instance associated with the ZigBee Coordinator of an Area Network.
+      </description>
+      <parameter name="AreaNetworkNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.ZigBee.Discovery.AreaNetwork.{i}." access="readWrite" numEntriesParameter="AreaNetworkNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        This object specifies the ZigBee devices that are discovered by the {{param|Coordinator}}.
+        As the ZigBee specification does not provide a discovery protocol between the CWMP proxy and the ZigBee coordinator, the {{object}} object is provisioned and not discovered.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Coordinator"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables discovery of the ZigBee devices in this {{object}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" dmr:version="2.7">
+        <description>
+          The date and time when this {{object}} or its member devices (i.e., the devices with ZDOs listed in {{param|ZDOList}}) were updated due to a discovery operation.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.7">
+        <description>
+          The status of the current discovery operation.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Indeterminate">
+              <description>
+                The discovery operation has not been executed and there are no valid discovery results available)
+              </description>
+            </enumeration>
+            <enumeration value="InProgress"/>
+            <enumeration value="Success"/>
+            <enumeration value="Error"/>
+            <enumeration value="Error_Timeout" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Coordinator" access="readWrite" dmr:version="2.7">
+        <description>
+          The Fully Qualified Domain Name (FQDN) or IP address of the ZigBee Coordinator.  The coordinator MAY be located within the CPE. In this scenario the ACS or CPE MAY use the value of "localhost".
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ZDOReference" access="readOnly" dmr:version="2.7">
+        <description>
+          The ZDO object for this device that is used to discover the ZigBee capabilities of attached devices.
+          {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".ZigBee.ZDO." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ZDOList" access="readOnly" dmr:version="2.7">
+        <description>
+          The list of ZDO objects discovered in this Area Network by the ZigBee Coordinator.
+          {{reference}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".ZigBee.ZDO." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Layer 2 bridging configuration. Specifies bridges between different layer 2 interfaces. Bridges can be defined to include layer 2 filter criteria to selectively bridge traffic between interfaces.
+        This object can be used to configure both 802.1D {{bibref|802.1D-2004}} and 802.1Q {{bibref|802.1Q-2011}} bridges.
+        Not all 802.1D and 802.1Q features are modeled, and some additional features not present in either 802.1D or 802.1Q are modeled.
+        802.1Q {{bibref|802.1Q-2011}} bridges incorporate 802.1Q {{bibref|802.1Q-2005}} customer and 802.1ad {{bibref|802.1ad-2005}} provider bridges.
+      </description>
+      <parameter name="MaxBridgeEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the {{object|.Bridging.Bridge}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxDBridgeEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum number of 802.1D {{bibref|802.1D-2004}} entries available in the {{object|.Bridging.Bridge}} table.  A positive value for this parameter implies support for 802.1D.
+          There is no guarantee that this many 802.1D Bridges can be configured. For example, the CPE might not be able simultaneously to  support both 802.1D and 802.1Q Bridges.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxQBridgeEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum number of 802.1Q {{bibref|802.1Q-2011}} entries available in the {{object|.Bridging.Bridge}} table. A non-zero value for this parameter implies support for 802.1Q.
+          There is no guarantee that this many 802.1Q Bridges can be configured. For example, the CPE might not be able simultaneously to support both 802.1D and 802.1Q Bridges.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxVLANEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          The maximum number of 802.1Q {{bibref|802.1Q-2011}} VLANs supported per {{object|.Bridging.Bridge}} table entry.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxProviderBridgeEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          The maximum number of entries available in the {{object|.Bridging.ProviderBridge}} table. A non-zero value for this parameter implies support for 802.1Q Provider Bridges.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ProviderBridgeNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxFilterEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the {{object|Filter}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BridgeNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FilterNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.Bridge.{i}." access="readWrite" numEntriesParameter="BridgeNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Bridge table.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this {{object}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this {{object}}.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Standard" access="readWrite" dmr:version="2.0">
+        <description>
+          Selects the standard supported by this Bridge table entry.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="802.1D-2004">
+              <description>
+                {{bibref|802.1D-2004}}
+              </description>
+            </enumeration>
+            <enumeration value="802.1Q-2005">
+              <description>
+                {{bibref|802.1Q-2005}}
+              </description>
+            </enumeration>
+            <enumeration value="802.1Q-2011">
+              <description>
+                The {{object}} provides support for at least one feature defined in {{bibref|802.1Q-2011}} that was not defined in {{bibref|802.1Q-2005}}.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PortNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANPortNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.Bridge.{i}.Port.{i}." access="readWrite" numEntriesParameter="PortNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Bridge Port table, which MUST contain an entry for each bridge port (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+        There are two types of bridge ports: management (upward facing) and non-management (downward facing). This is determined by configuring the Boolean {{param|ManagementPort}} parameter. The CPE will automatically configure each management bridge port to appear in the interface stack above all non-management bridge ports that share the same {{object|##.Bridge}} instance.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the bridge port.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the bridge port (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then this parameter SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then this parameter SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the bridge port as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the bridge port entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          When {{param|ManagementPort}} is set to {{true}} the CPE MUST set {{param}} to reference all non-management bridge ports that are within the same {{object|##.Bridge}} instance (and update {{param}} when subsequent non-management bridge ports are added or deleted on that ''Bridge''). The ACS SHOULD NOT set {{param}} in this case.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ManagementPort" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{true}} then the entry is a management (upward facing) bridge port rather than a non-management (downward facing) bridge port. For a given {{object|##.Bridge}} instance, each management bridge port appears in the interface stack above all non-management bridge ports. The concept of Management Port is discussed in {{bibref|802.1Q-2005|chapter 8}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readWrite" dmr:version="2.7">
+        <description>
+          The type of bridge port as defined in 802.1Q {{bibref|802.1Q-2011|Section 17 IEEE8021BridgePortType}}.
+          Enumeration of:
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ProviderNetworkPort">
+              <description>
+                Indicates this {{object}} is an S-TAG aware port of a {{object|##.ProviderBridge}}.
+              </description>
+            </enumeration>
+            <enumeration value="CustomerNetworkPort">
+              <description>
+                Indicates this {{object}} is an S-TAG aware port of a {{object|##.ProviderBridge}}.
+              </description>
+            </enumeration>
+            <enumeration value="CustomerEdgePort">
+              <description>
+                Indicates this {{object}} is an C-TAG aware port of a {{object|##.ProviderBridge}}.
+              </description>
+            </enumeration>
+            <enumeration value="CustomerVLANPort">
+              <description>
+                Indicates this {{object}} is an C-TAG aware port of a Customer Bridge.
+              </description>
+            </enumeration>
+            <enumeration value="VLANUnawarePort">
+              <description>
+                Indicates this {{object}} is a VLAN unaware member of an {{enum|802.1D-2004|#.Standard}} bridge.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultUserPriority" access="readWrite" dmr:version="2.0">
+        <description>
+          Bridge Port Default User Priority.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PriorityRegeneration" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} List items represent user priority regeneration values for each ingress user priority on this Bridge  Port.
+        </description>
+        <syntax>
+          <list minItems="8" maxItems="8"/>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+          <default type="object" value="0,1,2,3,4,5,6,7"/>
+        </syntax>
+      </parameter>
+      <parameter name="PortState" access="readOnly" dmr:version="2.0">
+        <description>
+          Bridge Port state as defined in 802.1D {{bibref|802.1D-2004}} and 802.1Q {{bibref|802.1Q-2011}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Blocking"/>
+            <enumeration value="Listening"/>
+            <enumeration value="Learning"/>
+            <enumeration value="Forwarding"/>
+            <enumeration value="Broken"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="PVID" access="readWrite" dmr:version="2.0">
+        <description>
+          PVID (or Port VID) is the VLAN ID with which an untagged or priority tagged frame that arrives on this port will be associated (i.e. default Port VLAN ID as defined in 802.1Q {{bibref|802.1Q-2011}}).
+          For an 802.1D Bridge {{bibref|802.1D-2004}}, this parameter MUST be ignored.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="1" maxInclusive="4094"/>
+          </int>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+      <parameter name="TPID" access="readWrite" dmr:version="2.7">
+        <description>
+          The Tag Protocol Identifier (TPID) assigned to this {{object}}. The TPID is an EtherType value used to identify the frame as a tagged frame.
+          Standard {{bibref|802.1Q-2011|Table 9.1}} TPID values are:
+          *S-TAG 0x88A8 = 34984
+          *C-TAG 0x8100 = 33024
+          Non-Standard TPID values are:
+          *S-TAG 0x9100 = 37120
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="33024"/>
+        </syntax>
+      </parameter>
+      <parameter name="AcceptableFrameTypes" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates which types of frame arriving on this port will be admitted to the bridge (i.e. Bridge Port acceptable frame types as defined in 802.1Q {{bibref|802.1Q-2011}}).  {{enum}}
+          For an 802.1D {{bibref|802.1D-2004}} Bridge, the value of this parameter MUST be {{enum|AdmitAll}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AdmitAll"/>
+            <enumeration value="AdmitOnlyVLANTagged" optional="true"/>
+            <enumeration value="AdmitOnlyPrioUntagged" optional="true"/>
+          </string>
+          <default type="object" value="AdmitAll"/>
+        </syntax>
+      </parameter>
+      <parameter name="IngressFiltering" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables Ingress Filtering as defined in 802.1Q {{bibref|802.1Q-2011}}. If enabled ({{true}}), causes frames arriving on this port to be discarded if the port is not in the VLAN ID's member set (which is configured via the {{object|#.VLANPort}} table).
+          For an 802.1D {{bibref|802.1D-2004}} Bridge, the value of this parameter MUST be {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceAccessPrioritySelection" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter controls the Service Access Priority selection function as described in {{bibref|802.1Q-2011|section 6.13}}.
+          The parameter is applicable to deployments of {{object|##.Bridge}} instances that are referenced by {{param|###.Bridging.ProviderBridge.{i}.SVLANcomponent}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceAccessPriorityTranslation" access="readWrite" dmr:version="2.7">
+        <description>
+          {{list}} List items represent service access priority translation values for each ingress priority on this {{object}} as described in {{bibref|802.1Q-2011|section 6.13}}.
+          The parameter is applicable to deployments of {{object|##.Bridge}} instances that are referenced by {{param|###.Bridging.ProviderBridge.{i}.SVLANcomponent}}.
+        </description>
+        <syntax>
+          <list minItems="8" maxItems="8"/>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+          <default type="object" value="0,1,2,3,4,5,6,7"/>
+        </syntax>
+      </parameter>
+      <parameter name="PriorityTagging" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables priority tagging on this Bridge Port.
+          When {{true}}, egress frames leaving this interface will be priority tagged with the frame's associated priority value, which will either be derived directly from the ingress frame or else set via {{param|.QoS.Classification.{i}.EthernetPriorityMark}}.
+          When {{false}}, egress frames leaving this interface will be untagged.
+          The parameter does not affect reception of ingress frames.
+          Only applies on bridge ports that are untagged member of one or more VLAN's.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.Bridge.{i}.Port.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.Bridge.{i}.Port.{i}.PriorityCodePoint." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        {{object}} provides the management control for the processing of the Priority Code Point (PCP) field for the 802.1Q header as defined in {{bibref|802.1Q-2011|section 6.9.3 Priority Code Point Encoding}}.
+        The object is applicable to deployments of  {{object|####.Bridging.ProviderBridge}} where the {{object|###.Bridge}} instance is referenced by {{param|####.Bridging.ProviderBridge.{i}.SVLANcomponent}} or {{param|####.Bridging.ProviderBridge.{i}.CVLANcomponents}} parameters.
+      </description>
+      <parameter name="PCPSelection" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter identifies the row in the {{param|PCPEncoding}} and {{param|PCPDecoding}} parameter lists. The value of 1 points to the 8P0D row in the corresponding parameter lists.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="4"/>
+          </unsignedInt>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+      <parameter name="UseDEI" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter controls the processing of the drop_eligible field and is described in {{bibref|802.1Q-2011|section 6.9.3}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="RequireDropEncoding" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter controls the processing of the encoding or decoding of the drop_eligible component in the PCP field and is described in {{bibref|802.1Q-2011|section 8.6.7}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PCPEncoding" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter provides the management control for the processing of the encoding of the Priority Code Point (PCP) field for the 802.1Q header as defined in {{bibref|802.1Q-2011|section 6.9.3 Priority Code Point Encoding}} and {{bibref|802.1Q-2011|Table 6-3}}.
+          The list is an ordered list that contains entries for the following 4 PCP Values: "8P0D","7P1D", "6P2D" "5P3D".  Each list entry matches the following pattern:
+          {{pattern}}
+          The value of this parameter MUST use square brackets to protect comma separators within nested lists.  For example, this corresponds to Table 6-3 (mentioned above):
+          : [7,7,6,6,5,5,4,4,3,3,2,2,1,1,0,0],[7,7,6,6,5,4,5,4,3,3,2,2,1,1,0,0],[7,7,6,6,5,4,5,4,3,2,3,2,1,1,0,0],[7,7,6,6,5,4,5,4,3,2,3,2,1,0,1,0]
+        </description>
+        <syntax>
+          <list minItems="4" maxItems="4"/>
+          <string>
+            <size minLength="31" maxLength="31"/>
+            <pattern value="([0-7],){15}[0-7]">
+              <description>
+                PCP for each priority and drop_eligible field (7, 7DE, 6, 6DE, ..., 1, 1DE, 0, 0DE)
+              </description>
+            </pattern>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PCPDecoding" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter provides the management control for the processing of the decoding of the Priority Code Point (PCP) field for the 802.1Q header as defined in {{bibref|802.1Q-2011|section 6.9.3 Priority Code Point Encoding}} and {{bibref|802.1Q-2011|Table 6-4}}.
+          The list is an ordered list that contains entries for the following 4 PCP Values: "8P0D","7P1D", "6P2D" "5P3D".  Each list entry matches the following pattern:
+          {{pattern}}
+          The value of this parameter MUST use square brackets to protect comma separators within nested lists.  For example, this corresponds to Table 6-4 (mentioned above):
+          : [7,0,6,0,5,0,4,0,3,0,2,0,1,0,0,0],[7,0,6,0,4,0,4,1,3,0,2,0,1,0,0,0],[7,0,6,0,4,0,4,1,2,0,2,1,1,0,0,0],[7,0,6,0,4,0,4,1,2,0,2,1,0,0,0,1]
+        </description>
+        <syntax>
+          <list minItems="4" maxItems="4"/>
+          <string>
+            <size minLength="15" maxLength="15"/>
+            <pattern value="([0-7],[0-1],){7}[0-7],[0-1]">
+              <description>
+                Priority (0-7) and drop_eligible field (0-1) for each PCP value (7, 6, ..., 1, 0).
+              </description>
+            </pattern>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.Bridge.{i}.VLAN.{i}." access="readWrite" numEntriesParameter="VLANNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Bridge VLAN table.  If this table is supported, if MUST contain an entry for each VLAN known to the Bridge.
+        This table only applies to an 802.1Q {{bibref|802.1Q-2011}} Bridge.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="VLANID"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this VLAN table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.0">
+        <description>
+          Human-readable name for this VLAN table entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANID" access="readWrite" dmr:version="2.0">
+        <description>
+          VLAN ID of the entry.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="1" maxInclusive="4094"/>
+          </int>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.Bridge.{i}.VLANPort.{i}." access="readWrite" numEntriesParameter="VLANPortNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Bridge VLAN egress port and untagged port membership table.
+        This table only applies to an 802.1Q {{bibref|802.1Q-2011}} Bridge.
+        Note: The {{object}} table includes unique key parameters that are strong references. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="VLAN"/>
+        <parameter ref="Port"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLAN" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}  Specifies the VLAN for which port membership is expressed.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.VLAN." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}  Specifies the bridge port that is member of the VLAN.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Port." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Untagged" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables untagged port membership to the VLAN and determines whether egress frames for this VLAN are sent untagged or tagged.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.Filter.{i}." access="readWrite" numEntriesParameter="FilterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Filter table containing classification filter entries, each of which expresses a set of classification criterion to classify ingress frames as member of a {{object|#.Bridge}} instance or a {{object|#.Bridge.{i}.VLAN}} instance.
+        Bridge VLAN classification only applies for 802.1Q {{bibref|802.1Q-2011}} Bridges.
+        For enabled table entries, if {{param|Bridge}} or {{param|Interface}} is {{empty}} then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Several of this object's parameters specify DHCP option values. Some cases are version neutral (the parameter can apply to both DHCPv4 and DHCPv6), but in other cases the representation of the option is different for DHCPv4 and DHCPv6, so it is necessary to define separate DHCPv4-specific and DHCPv6-specific parameters. Therefore, an instance of this object that uses DHCP option values as filter criteria will be associated with either DHCPv4 or DHCPv6, as indicated by the {{param|DHCPType}} parameter.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this Filter table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this Filter table entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+          If the Bridge Port table is supported, but none of its entries correspond to {{param|Interface}}, or if such an entry exists  but is disabled, {{param}} MUST NOT indicate {{enum|Enabled}}.
+          If the Bridge VLAN table is supported, but none of its entries correspond to {{param|VLANIDFilter}}, or if such an entry exists but is disabled, {{param}} MUST NOT indicate {{enum|Enabled}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Bridge" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference|a {{object|.Bridging.Bridge}} object in case of a 802.1D bridge or a {{object|.Bridging.Bridge.{i}.VLAN}} object in case of a 802.1Q bridge}}  Note: either way, this identifies the bridge (because each bridge has a VLAN table).
+          Defines the Bridge or Bridge VLAN to which ingress frames will be classified based upon matches of the classification criteria.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Bridge. #.Bridge.{i}.VLAN." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.0">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each ingress frame on the {{param|Interface}}, the highest ordered entry that matches the filter criteria is applied. All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value.  A deletion causes {{param}} values to be compacted.  When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}  This MUST relate to the same bridge as does {{param|Bridge}}.
+          Defines the Bridge Port on which ingress frame classification will occur.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Bridge.{i}.Port." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DHCPType" access="readWrite" dmr:version="2.2">
+        <description>
+          The DHCP protocol associated with the {{object}} instance. Affects only parameters that specify DHCP option values as filter criteria (all such parameter descriptions note this fact).  {{enum}}
+          If {{param}} is {{enum|DHCPv4}}, then {{object}} parameters that are DHCPv6-specific are ignored. If {{param}} is {{enum|DHCPv6}}, then {{object}} parameters that are DHCPv4-specific are ignored.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv4"/>
+            <enumeration value="DHCPv6"/>
+          </string>
+          <default type="object" value="DHCPv4"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          The 802.1Q {{bibref|802.1Q-2011}} VLAN ID.
+          For an 802.1D {{bibref|802.1D-2004}} Bridge, which has no concept of VLANs, the VLAN ID MUST be ''0''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="4094"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthertypeFilterList" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          {{list}} Each list item represents an Ethertype value.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on  Ethertype.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <unsignedInt/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="EthertypeFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge is defined to admit only those packets that match one of the {{param|EthertypeFilterList}} entries (in either the Ethernet or SNAP Type header).  If the {{param|EthertypeFilterList}} is empty, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge is defined to admit all packets except those  packets that match one of the {{param|EthertypeFilterList}} entries (in either the Ethernet or SNAP Type header).  If the  {{param|EthertypeFilterList}} is empty, packets are admitted regardless of Ethertype.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on  Ethertype.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACAddressFilterList" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          {{list|each representing a MAC Address}}
+          Each list entry MAY optionally specify a bit-mask, where matching of a packet's MAC address is only to be done for bit positions set  to one in the mask.  If no mask is specified, all bits of the MAC Address are to be used for matching.
+          For example, the list might be: ''01:02:03:04:05:06, 1:22:33:00:00:00/FF:FF:FF:00:00:00, 88:77:66:55:44:33''
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC  address.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="512"/>
+          </list>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACAddressFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets  whose source MAC Address matches one of the {{param|SourceMACAddressFilterList}} entries.  If the  {{param|SourceMACAddressFilterList}} is empty, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose  source MAC Address matches one of the {{param|SourceMACAddressFilterList}} entries.  If the {{param|SourceMACAddressFilterList}} is empty, packets are admitted regardless of MAC address.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC  address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACAddressFilterList" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          {{list}} Each list item specifies a MAC Address. List items MAY optionally specify a bit-mask after the MAC Address, where matching  of a packet's MAC address is only to be done for bit positions set to one in the mask.  If no mask is specified, all bits of the MAC  Address are to be used for matching.
+          For example, the list might be: ''01:02:03:04:05:06, 1:22:33:00:00:00/FF:FF:FF:00:00:00, 88:77:66:55:44:33''
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="512"/>
+          </list>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACAddressFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets  whose destination MAC Address matches one of the {{param|DestMACAddressFilterList}} entries.  If the  {{param|DestMACAddressFilterList}} is empty, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose  destination MAC Address matches one of the {{param|DestMACAddressFilterList}} entries.  If the {{param|DestMACAddressFilterList}} is  empty, packets are admitted regardless of MAC address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromVendorClassIDFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply. A device is considered matching if its DHCPv4 Vendor Class Identifier (Option 60 as defined in {{bibref|RFC2132}}) in the most recent DHCP lease acquisition or renewal matches the specified value according to the match criterion in {{param|SourceMACFromVendorClassIDMode}}. Case sensitive.
+          This is a normal string, e.g. "abc" is represented as "abc" and not "616263" hex. However, if the value includes non-printing characters then such characters have to be represented using XML escapes, e.g. #x0a for line-feed.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC address.
+          Note: This parameter is DHCPv4-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv4|DHCPType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromVendorClassIDFilterv6" access="readWrite" dmr:version="2.2">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply. A device is considered matching if the most recent DHCPv6 Vendor Class Identifier (Option 16 as defined in {{bibref|RFC3315}}) was equal to the specified value. The option value is binary, so an exact match is REQUIRED.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC address.
+          Note: This parameter is DHCPv6-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv6|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromVendorClassIDFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets whose source MAC Address matches that of a LAN device previously identified as described in {{param|SourceMACFromVendorClassIDFilter}} (for {{enum|DHCPv4|DHCPType}}) or {{param|SourceMACFromVendorClassIDFilterv6}} (for {{enum|DHCPv6|DHCPType}}). If this corresponding filter parameter is {{empty}}, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose source MAC Address matches that of a LAN device previously identified as described in {{param|SourceMACFromVendorClassIDFilter}} (for {{enum|DHCPv4|DHCPType}}) or {{param|SourceMACFromVendorClassIDFilterv6}} (for {{enum|DHCPv6|DHCPType}}). If this corresponding filter parameter is {{empty}}, packets are admitted regardless of MAC address.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC address
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromVendorClassIDMode" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|SourceMACFromVendorClassIDFilter}} pattern match criterion.  {{enum}}
+          For example, if {{param|SourceMACFromVendorClassIDFilter}} is "Example" then an Option 60 value of "Example device" will match with this parameter values of {{enum|Prefix}} or {{enum|Substring}}, but not with {{enum|Exact}} or {{enum|Suffix}}.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC  address.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Exact"/>
+            <enumeration value="Prefix"/>
+            <enumeration value="Suffix"/>
+            <enumeration value="Substring"/>
+          </string>
+          <default type="object" value="Exact"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromVendorClassIDFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply.  A device is considered matching if its DHCPv4 Vendor Class Identifier (Option 60 as defined in {{bibref|RFC2132}}) in the most recent DHCP lease acquisition or renewal matches the specified value according to the match criterion in {{param|DestMACFromVendorClassIDMode}}. Case sensitive.
+          This is a normal string, e.g. "abc" is represented as "abc" and not say "616263" hex. However, if the value includes non-printing characters then such characters have to be represented using XML escapes, e.g. #x0a for line-feed.
+          Note: This parameter is DHCPv4-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv4|DHCPType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromVendorClassIDFilterv6" access="readWrite" dmr:version="2.2">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply. A device is considered matching if the most recent DHCPv6 Vendor Class Identifier (Option 16 as defined in {{bibref|RFC3315}}) was equal to the specified value. The option value is binary, so an exact match is REQUIRED.
+          Note: This parameter is DHCPv6-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv6|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromVendorClassIDFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets whose destination MAC Address matches that of a LAN device previously identified as described in {{param|DestMACFromVendorClassIDFilter}} (for {{enum|DHCPv4|DHCPType}}) or {{param|DestMACFromVendorClassIDFilterv6}} (for {{enum|DHCPv6|DHCPType}}). If this corresponding filter parameter is {{empty}}, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose destination MAC Address matches that of a LAN device previously identified as described in {{param|DestMACFromVendorClassIDFilter}} (for {{enum|DHCPv4|DHCPType}}) or {{param|DestMACFromVendorClassIDFilterv6}} (for {{enum|DHCPv6|DHCPType}}). If this corresponding filter parameter is {{empty}}, packets are admitted regardless of MAC address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromVendorClassIDMode" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|DestMACFromVendorClassIDFilter}} pattern match criterion.  {{enum}}
+          For example, if {{param|DestMACFromVendorClassIDFilter}} is ''Example'' then an Option 60 value of "Example device" will match with  {{param}} values of {{enum|Prefix}} or {{enum|Substring}}, but not with {{enum|Exact}} or {{enum|Suffix}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Exact"/>
+            <enumeration value="Prefix"/>
+            <enumeration value="Suffix"/>
+            <enumeration value="Substring"/>
+          </string>
+          <default type="object" value="Exact"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromClientIDFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply. A device is considered matching if the most recent DHCP Client Identifier (via DHCP lease acquisition or renewal for DHCPv4) was equal to the specified value. The DHCP Client Identifier is Option 61 (as defined in {{bibref|RFC2132}}) for {{enum|DHCPv4|DHCPType}}, or is Option 1 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC address.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+          Note: DHCPv6 Option 1 (Client Identifier) is sometimes referred to as ''DUID''.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromClientIDFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets  whose source MAC Address matches that of a LAN device previously identified as described in {{param|SourceMACFromClientIDFilter}}.   If {{param|SourceMACFromClientIDFilter}} is {{empty}}, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose  source MAC Address matches that of a LAN device previously identified as described in {{param|SourceMACFromClientIDFilter}}.  If the  {{param|SourceMACFromClientIDFilter}} is {{empty}}, packets are admitted regardless of MAC address.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC  address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromClientIDFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply. A device is considered matching if the most recent DHCP Client Identifier (via DHCP lease acquisition or renewal for DHCPv4) was equal to the specified value. The DHCP Client Identifier is Option 61 (as defined in {{bibref|RFC2132}}) for {{enum|DHCPv4|DHCPType}}, or is Option 1 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+          Note: DHCPv6 Option 1 (Client Identifier) is sometimes referred to as ''DUID''.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromClientIDFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets whose destination MAC Address matches that of a LAN device previously identified as described in {{param|DestMACFromClientIDFilter}}.   If {{param|DestMACFromClientIDFilter}} is {{empty}}, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose destination MAC Address matches that of a LAN device previously identified as described in {{param|DestMACFromClientIDFilter}}.  If  the {{param|DestMACFromClientIDFilter}} is {{empty}}, packets are admitted regardless of MAC address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromUserClassIDFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply. A device is considered matching if the most recent DHCP User Class Identifier (via DHCP lease acquisition or renewal for DHCPv4) was equal to the specified value. The DHCP User Class Identifier is Option 77 (as defined in {{bibref|RFC3004}}) for {{enum|DHCPv4|DHCPType}}, or is Option 15 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC address.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACFromUserClassIDFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets whose source MAC Address matches that of a LAN device previously identified as described in {{param|SourceMACFromUserClassIDFilter}}.  If {{param|SourceMACFromUserClassIDFilter}} is {{empty}}, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose source MAC Address matches that of a LAN device previously identified as described in {{param|SourceMACFromUserClassIDFilter}}.  If the {{param|SourceMACFromUserClassIDFilter}} is {{empty}}, packets are admitted regardless of MAC address.
+          Note that neither 802.1D {{bibref|802.1D-2004}} nor 802.1Q {{bibref|802.1Q-2011}} support classification based on source MAC address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromUserClassIDFilter" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more devices via DHCP for which MAC address filtering would subsequently apply. A device is considered matching if the most recent DHCP User Class Identifier (via DHCP lease acquisition or renewal for DHCPv4) was equal to the specified value. The DHCP User Class Identifier is Option 77 (as defined in {{bibref|RFC3004}}) for {{enum|DHCPv4|DHCPType}}, or is Option 15 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACFromUserClassIDFilterExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, on ingress to the interfaces associated with this Filter, the Bridge admits only those packets whose destination MAC Address matches that of a LAN device previously identified as described in {{param|DestMACFromUserClassIDFilter}}.  If {{param|DestMACFromUserClassIDFilter}} is {{empty}}, no packets are admitted.
+          If {{true}}, on ingress to the interfaces associated with this Filter, the Bridge admits all packets except those packets whose destination MAC Address matches that of a LAN device previously identified as described in {{param|DestMACFromUserClassIDFilter}}.  If the {{param|DestMACFromUserClassIDFilter}} is {{empty}}, packets are admitted regardless of MAC address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIP" access="readWrite" dmr:version="2.6">
+        <description>
+          Classification criterion.
+          Destination IP address.  {{empty}} indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMask" access="readWrite" dmr:version="2.6">
+        <description>
+          Destination IP address mask, represented as an IP routing prefix using CIDR notation [RFC4632]. The IP address part MUST be {{empty}} (and, if specified, MUST be ignored).
+        </description>
+        <syntax>
+          <dataType ref="IPPrefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIPExclude" access="readWrite" dmr:version="2.6">
+        <description>
+          If {{false}}, the class includes only those packets that match the (masked) DestIP entry, if specified.
+          If {{true}}, the class includes all packets except those that match the (masked) DestIP entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIP" access="readWrite" dmr:version="2.6">
+        <description>
+          Classification criterion.
+          Source IP address. {{empty}} indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMask" access="readWrite" dmr:version="2.6">
+        <description>
+          Source IP address mask, represented as an IP routing prefix using CIDR notation [RFC4632]. The IP address part MUST be an empty string (and, if specified, MUST be ignored).
+        </description>
+        <syntax>
+          <dataType ref="IPPrefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIPExclude" access="readWrite" dmr:version="2.6">
+        <description>
+          If {{false}}, the class includes only those packets that match the (masked) {{param|SourceIP}} entry, if  specified.
+          If {{true}}, the class includes all packets except those that match the (masked) {{param|SourceIP}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.6">
+        <description>
+          Classification criterion.
+          Protocol number.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="255"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolExclude" access="readWrite" dmr:version="2.6">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|Protocol}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|Protocol}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPort" access="readWrite" dmr:version="2.6">
+        <description>
+          Classification criterion.
+          Destination port number.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortRangeMax" access="readWrite" dmr:version="2.6">
+        <description>
+          Classification criterion.
+          If specified, indicates the classification criterion is to include the port range from {{param|DestPort}} through {{param}} (inclusive).  If specified, {{param}} MUST be greater than or equal to {{param|DestPort}}.
+          A value of -1 indicates that no port range is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortExclude" access="readWrite" dmr:version="2.6">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|DestPort}} entry (or port range), if  specified.
+          If {{true}}, the class includes all packets except those that match the {{param|DestPort}} entry (or port range), if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePort" access="readWrite" dmr:version="2.6">
+        <description>
+          Classification criterion.
+          Source port number.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortRangeMax" access="readWrite" dmr:version="2.6">
+        <description>
+          Classification criterion.
+          If specified, indicates the classification criterion is to include the port range from {{param|SourcePort}} through {{param}} (inclusive).  If specified, {{param}} MUST be greater than or equal to SourcePort.
+          A value of -1 indicates that no port range is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortExclude" access="readWrite" dmr:version="2.6">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|SourcePort}} entry (or port range), if  specified.
+          If {{true}}, the class includes all packets except those that match the {{param|SourcePort}} entry (or port range), if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Bridging.ProviderBridge.{i}." access="readWrite" numEntriesParameter="ProviderBridgeNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        Provider Bridge table.
+        A Provider Bridge is described in {{bibref|802.1Q-2011|section 5.10 Provider Bridge conformance}} as an entity that is comprised of one S-VLAN component and zero or more C-VLAN components. S-VLAN and C-VLAN components are modelled as instances of {{object|#.Bridge}} objects.
+        When {{param|Type}} is configured with value of {{enum|PE|Type}} VLAN tags from the S-VLAN component (outer of 2 VLAN tags) are stacked on top of the VLAN tag from the C-VLAN component (inner of 2 VLAN tags).
+        When {{param|Type}} is configured with value of {{enum|S-VLAN|Type}} only VLAN tags from the S-VLAN component are utilized.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables this {{object}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.7">
+        <description>
+          The status of this {{object}}. {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid. For example when the {{param|Type}} is configured with value of {{enum|PE|Type}} but {{param|CVLANcomponents}} is {{empty}}.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.7">
+        <description>
+          A non-volatile handle used to reference this instance. This parameter provides a mechanism for an ACS to label this instance for future reference. An initial unique value MUST be assigned when the CPE creates an instance of this object.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readWrite" dmr:version="2.7">
+        <description>
+          Selects the standard supported by this {{object}} table entry.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="S-VLAN">
+              <description>
+                Provider Bridge conforming to {{bibref|802.1Q-2011|5.10.1 S-VLAN Bridge conformance}}
+              </description>
+            </enumeration>
+            <enumeration value="PE">
+              <description>
+                Provider Bridge conforming to {{bibref|802.1Q-2011|5.10.2 Provider Edge Bridge conformance}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SVLANcomponent" access="readWrite" dmr:version="2.7">
+        <description>
+          {{reference|a {{object|#.Bridge}} instance that specifies the S-VLAN component for the {{object}}}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Bridge." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="CVLANcomponents" access="readWrite" dmr:version="2.7">
+        <description>
+          {{list}} {{reference|a {{object|#.Bridge}} instance that specifies a C-VLAN component for the {{object}}}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Bridge." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PPP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Point-to-Point Protocol {{bibref|RFC1661}}. This object contains the {{object|Interface}} table.
+      </description>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedNCPs" access="readOnly" dmr:version="2.2">
+        <description>
+          The Network Control Protocols (NCPs) that are supported by the device. {{enum}}
+          Note that {{enum|IPv6CP}} is an IPv6 capability.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="ATCP">
+              <description>
+                AppleTalk Control Protocol {{bibref|RFC1378}}
+              </description>
+            </enumeration>
+            <enumeration value="IPCP">
+              <description>
+                {{bibref|RFC1332}}
+              </description>
+            </enumeration>
+            <enumeration value="IPXCP">
+              <description>
+                {{bibref|RFC1552}}
+              </description>
+            </enumeration>
+            <enumeration value="NBFCP">
+              <description>
+                {{bibref|RFC2097}}
+              </description>
+            </enumeration>
+            <enumeration value="IPv6CP">
+              <description>
+                {{bibref|RFC5072}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PPP.Interface.{i}." access="readWrite" numEntriesParameter="InterfaceNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        PPP interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionStatus" access="readOnly" dmr:version="2.0">
+        <description>
+          Current status of the connection.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Unconfigured"/>
+            <enumeration value="Connecting"/>
+            <enumeration value="Authenticating"/>
+            <enumeration value="Connected"/>
+            <enumeration value="PendingDisconnect"/>
+            <enumeration value="Disconnecting"/>
+            <enumeration value="Disconnected"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastConnectionError" access="readOnly" dmr:version="2.0">
+        <description>
+          The cause of failure for the last connection setup attempt.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ERROR_NONE"/>
+            <enumeration value="ERROR_ISP_TIME_OUT"/>
+            <enumeration value="ERROR_COMMAND_ABORTED"/>
+            <enumeration value="ERROR_NOT_ENABLED_FOR_INTERNET"/>
+            <enumeration value="ERROR_BAD_PHONE_NUMBER"/>
+            <enumeration value="ERROR_USER_DISCONNECT"/>
+            <enumeration value="ERROR_ISP_DISCONNECT"/>
+            <enumeration value="ERROR_IDLE_DISCONNECT"/>
+            <enumeration value="ERROR_FORCED_DISCONNECT"/>
+            <enumeration value="ERROR_SERVER_OUT_OF_RESOURCES"/>
+            <enumeration value="ERROR_RESTRICTED_LOGON_HOURS"/>
+            <enumeration value="ERROR_ACCOUNT_DISABLED"/>
+            <enumeration value="ERROR_ACCOUNT_EXPIRED"/>
+            <enumeration value="ERROR_PASSWORD_EXPIRED"/>
+            <enumeration value="ERROR_AUTHENTICATION_FAILURE"/>
+            <enumeration value="ERROR_NO_DIALTONE"/>
+            <enumeration value="ERROR_NO_CARRIER"/>
+            <enumeration value="ERROR_NO_ANSWER"/>
+            <enumeration value="ERROR_LINE_BUSY"/>
+            <enumeration value="ERROR_UNSUPPORTED_BITSPERSECOND"/>
+            <enumeration value="ERROR_TOO_MANY_LINE_ERRORS"/>
+            <enumeration value="ERROR_IP_CONFIGURATION"/>
+            <enumeration value="ERROR_UNKNOWN"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AutoDisconnectTime" access="readWrite" dmr:version="2.0">
+        <description>
+          The time in {{units}} since the establishment of the connection after which connection termination is automatically initiated by the CPE.  This occurs irrespective of whether the connection is being used or not.  A value of 0 (zero) indicates that the connection is not to be shut down automatically.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="IdleDisconnectTime" access="readWrite" dmr:version="2.0">
+        <description>
+          The time in {{units}} that if the connection remains idle, the CPE automatically terminates the connection.  A  value of 0 (zero) indicates that the connection is not to be shut down automatically.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="WarnDisconnectDelay" access="readWrite" dmr:version="2.0">
+        <description>
+          Time in {{units}} the {{param|ConnectionStatus}} remains in the {{enum|PendingDisconnect|ConnectionStatus}} state  before transitioning to disconnecting state to drop the connection.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.0">
+        <description>
+          Username to be used for authentication.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.0">
+        <description>
+          Password to be used for authentication.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EncryptionProtocol" access="readOnly" dmr:version="2.0">
+        <description>
+          Describes the PPP encryption protocol.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="MPPE"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CompressionProtocol" access="readOnly" dmr:version="2.0">
+        <description>
+          Describes the PPP compression protocol.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="Van Jacobson">
+              <description>
+                {{bibref|RFC1332}}
+              </description>
+            </enumeration>
+            <enumeration value="STAC LZS">
+              <description>
+                {{bibref|RFC1974}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AuthenticationProtocol" access="readOnly" dmr:version="2.0">
+        <description>
+          Describes the PPP authentication protocol.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="PAP"/>
+            <enumeration value="CHAP"/>
+            <enumeration value="MS-CHAP"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxMRUSize" access="readWrite" dmr:version="2.0">
+        <description>
+          The maximum allowed size of frames sent from the remote peer.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="64" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="1500"/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentMRUSize" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The current MRU in use over this connection.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="64" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionTrigger" access="readWrite" dmr:version="2.0">
+        <description>
+          Trigger used to establish the PPP connection.  {{enum}}
+          Note that the reason for a PPP connection becoming disconnected to begin with might be either external to the CPE, such as  termination by the BRAS or momentary disconnection of the physical interface, or internal to the CPE, such as use of the  {{param|IdleDisconnectTime}} and/or {{param|AutoDisconnectTime}} parameters in this object.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="OnDemand">
+              <description>
+                If this PPP connection is disconnected for any reason, it is to remain disconnected until the CPE has one  or more packets to communicate over this connection, at which time the CPE automatically attempts to reestablish the  connection.
+              </description>
+            </enumeration>
+            <enumeration value="AlwaysOn">
+              <description>
+                If this PPP connection is disconnected for any reason, the CPE automatically attempts to reestablish the  connection (and continues to attempt to reestablish the connection as long it remains disconnected).
+              </description>
+            </enumeration>
+            <enumeration value="Manual">
+              <description>
+                If this PPP connection is disconnected for any reason, it is to remain disconnected until the user of the  CPE explicitly instructs the CPE to reestablish the connection.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LCPEcho" access="readOnly" dmr:version="2.0">
+        <description>
+          PPP LCP Echo period in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LCPEchoRetry" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of PPP LCP Echo retries within an echo period.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPCPEnable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables IPCP ({{bibref|RFC1332}}) on this interface.  If this parameter is present, {{enum|IPCP|#.SupportedNCPs}} MUST be included in {{param|#.SupportedNCPs}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6CPEnable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables IPv6CP ({{bibref|RFC5072}}) on this interface.  If this parameter is present, {{enum|IPv6CP|#.SupportedNCPs}} MUST be included in {{param|#.SupportedNCPs}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <command name="Reset()" dmr:version="2.12">
+        <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 name="Device.PPP.Interface.{i}.PPPoE." access="readOnly" minEntries="0" maxEntries="1" dmr:version="2.0">
+      <description>
+        PPPoE object that functionally groups PPPoE related parameters.
+        PPPoE is only applicable when the lower layer provides Ethernet frames, e.g. ATM with EoA, PTM, or anything else that supports an Ethernet MAC.
+      </description>
+      <parameter name="SessionID" access="readOnly" dmr:version="2.0">
+        <description>
+          Represents the PPPoE Session ID.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ACName" access="readWrite" dmr:version="2.0">
+        <description>
+          PPPoE Access Concentrator.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceName" access="readWrite" dmr:version="2.0">
+        <description>
+          PPPoE Service Name.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PPP.Interface.{i}.IPCP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        IP Control Protocol (IPCP) client object for this PPP interface {{bibref|RFC1332}}. {{object}} only applies to IPv4.
+      </description>
+      <parameter name="LocalIPAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The local IPv4 address for this connection received via IPCP.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteIPAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The remote IPv4 address for this connection received via IPCP.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DNSServers" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Items represent DNS Server IPv4 address(es) received via IPCP {{bibref|RFC1877}}.
+        </description>
+        <syntax>
+          <list maxItems="2"/>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="PassthroughEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the PPP Interface retrieved information is configured on the IP Interface stacked on top of this PPP Interface.
+          If {{true}}, the PPP Interface retrieved information is propagated to the parameters in the referenced {{param|PassthroughDHCPPool}} object, replacing any existing configuration (including ''MinAddress'', ''MaxAddress'', ''SubnetMask'', ''IPRouters'', and ''DNSServers'').
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PassthroughDHCPPool" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}When {{param}} is set to {{empty}}, {{param|PassthroughEnable}} MUST be set to {{false}} (i.e. passthrough can not be enabled without a pool reference specified).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".DHCPv4.Server.Pool." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PPP.Interface.{i}.IPv6CP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        IPv6 Control Protocol (IPv6CP) client object for this PPP interface {{bibref|RFC5072}}. {{object}} only applies to IPv6.
+      </description>
+      <parameter name="LocalInterfaceIdentifier" access="readOnly" dmr:version="2.2">
+        <description>
+          The interface identifier for the local end of the PPP link, negotiated using the IPv6CP ''Interface-Identifier'' option {{bibref|RFC5072|Section 4.1}}.
+          The identifier is represented as the rightmost 64 bits of an IPv6 address (the leftmost 64 bits MUST be zero and MUST be ignored by the recipient).
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteInterfaceIdentifier" access="readOnly" dmr:version="2.2">
+        <description>
+          The interface identifier for the remote end of the PPP link, negotiated using the IPv6CP ''Interface-Identifier'' option {{bibref|RFC5072|Section 4.1}}.
+          The identifier is represented as the rightmost 64 bits of an IPv6 address (the leftmost 64 bits MUST be zero and MUST be ignored by the recipient).
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PPP.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PPP.Interface.{i}.PPPoA." access="readOnly" minEntries="0" maxEntries="1" dmr:version="2.2">
+      <description>
+        PPPoA object that functionally groups PPPoA related parameters.
+        This object is OBSOLETED because it contains no standard parameters and its existence causes confusion.
+      </description>
+    </object>
+    <object name="Device.IP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        IP object that contains the {{object|Interface}}, {{object|ActivePort}}, and {{object|Diagnostics}} objects.
+      </description>
+      <parameter name="IPv4Capable" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether the device is IPv4 capable.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables the IPv4 stack, and so the use of IPv4 on the device. This affects only layer 3 and above.
+          When {{false}}, IP interfaces that had been operationally up and passing IPv4 packets will now no longer be able to do so, and will be operationally down (unless also attached to an enabled IPv6 stack).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4Status" access="readOnly" dmr:version="2.2">
+        <description>
+          Indicates the status of the IPv4 stack.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6Capable" access="readOnly" dmr:version="2.2">
+        <description>
+          Indicates whether the device is IPv6 capable.
+          Note: If {{false}}, it is expected that IPv6-related parameters, enumeration values, etc will not be implemented by the device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables the IPv6 stack, and so the use of IPv6 on the device. This affects only layer 3 and above.
+          When {{false}}, IP interfaces that had been operationally up and passing IPv6 packets will now no longer be able to do so, and will be operationally down (unless also attached to an enabled IPv4 stack).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6Status" access="readOnly" dmr:version="2.2">
+        <description>
+          Indicates the status of the IPv6 stack.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ULAPrefix" access="readWrite" dmr:version="2.2">
+        <description>
+          The ULA /48 prefix {{bibref|RFC4193|Section 3}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ActivePortNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Interface.{i}." access="readWrite" numEntriesParameter="InterfaceNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        IP interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). This table models the layer 3 IP interface.
+        Each IP interface can be attached to the IPv4 and/or IPv6 stack.  The interface's IP addresses and prefixes are listed in the {{object|IPv4Address}}, {{object|IPv6Address}} and {{object|IPv6Prefix}} tables.
+        Note that support for manipulating {{param|Loopback}} interfaces is OPTIONAL, so the implementation MAY choose not to create (or allow the ACS to create) {{object}} instances of type {{enum|Loopback|Type}}.
+        When the ACS administratively disables the interface, i.e. sets {{param|Enable}} to {{false}}, the interface's automatically-assigned IP addresses and prefixes MAY be retained.  When the ACS administratively enables the interface, i.e. sets {{param|Enable}} to {{true}}, these IP addresses and prefixes MUST be refreshed.  It's up to the implementation to decide exactly what this means: it SHOULD take all reasonable steps to refresh everything but if it is unable, for example, to refresh a prefix that still has a significant lifetime, it might well choose to retain rather than discard it.
+        Any {{enum|Tunneled|Type}} IP interface instances instantiated by the CPE MUST NOT have any statistics, writable parameters, IP addresses or IPv6 prefixes.  Any read-only parameters, e.g. {{param|Status}}, MUST return the same information as for the corresponding {{enum|Tunnel|Type}} interface.  The reason for these rules is that {{enum|Tunneled|Type}} IP interfaces exist only in order to be the targets of references (within the data model) and do not model any concepts over and above those already modeled by the {{enum|Tunnel|Type}} IP interfaces.
+        Note that {{enum|Tunnel|Type}} and {{enum|Tunneled|Type}} IP interfaces are part of a legacy mechanism that is only used for {{object|##.IPv6rd}}, {{object|##.DSLite}} and {{object|##.IPsec}} tunnels and MUST NOT be used in any other context.  For all other tunneling mechanisms {{enum|Normal|Type}} IP interfaces are stacked above technology-specific Tunnel Interfaces, e.g. above {{object|##.GRE.Tunnel.{i}.Interface}} or {{object|##.MAP.Domain.{i}.Interface}} objects.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the interface (regardless of {{param|IPv4Enable}} and {{param|IPv6Enable}}).
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          If set to {{true}}, attaches this interface to the IPv4 stack.  If set to {{false}}, detaches this interface from the IPv4 stack.
+          Once detached from the IPv4 stack, the interface will now no longer be able to pass IPv4 packets, and will be operationally down (unless also attached to an enabled IPv6 stack).
+          For an IPv4 capable device, if {{param}} is not present this interface SHOULD be permanently attached to the IPv4 stack.
+          Note that {{param}} is independent of {{param|Enable}}, and that to administratively enable an interface for IPv4 it is necessary for both {{param|Enable}} and {{param}} to be {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          If set to {{true}}, attaches this interface to the IPv6 stack.  If set to {{false}}, detaches this interface from the IPv6 stack.
+          Once detached from the IPv6 stack, the interface will now no longer be able to pass IPv6 packets, and will be operationally down (unless also attached to an enabled IPv4 stack).
+          For an IPv6 capable device, if {{param}} is not present this interface SHOULD be permanently attached to the IPv6 stack.
+          Note that {{param}} is independent of {{param|Enable}}, and that to administratively enable an interface for IPv6 it is necessary for both {{param|Enable}} and {{param}} to be {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ULAEnable" access="readWrite" dmr:version="2.2">
+        <description>
+          Controls whether or not ULAs {{bibref|RFC4193}} are generated and used on this interface.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Down"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          {{param}} MUST be {{empty}} and read-only when {{param|Type}} is {{enum|Loopback|Type}}, {{enum|Tunnel|Type}}, or {{enum|Tunneled|Type}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Router" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The ''Router'' instance that is associated with this IP Interface entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".Routing.Router." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxMTUSize" access="readWrite" dmr:version="2.0">
+        <description>
+          The maximum transmission unit (MTU); the largest allowed size of an IP packet (including IP headers, but excluding lower layer headers such as Ethernet, PPP, or PPPoE headers) that is allowed to be transmitted by or through this device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="64" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.0">
+        <description>
+          IP interface type. {{enum}}
+          For {{enum|Loopback}}, {{enum|Tunnel}}, and {{enum|Tunneled}} IP interface objects, the {{param|LowerLayers}} parameter MUST be {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Normal"/>
+            <enumeration value="Loopback"/>
+            <enumeration value="Tunnel">
+              <description>
+                Only used with legacy ({{enum|Tunnel}},{{enum|Tunneled}}) IP interface pairs
+              </description>
+            </enumeration>
+            <enumeration value="Tunneled">
+              <description>
+                Only used with legacy ({{enum|Tunnel}},{{enum|Tunneled}}) IP interface pairs
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Normal"/>
+        </syntax>
+      </parameter>
+      <parameter name="Loopback" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, the IP interface becomes a loopback interface and the CPE MUST set {{param|Type}} to {{enum|Loopback|Type}}. In this case, the CPE MUST also set {{param|LowerLayers}} to {{empty}} and fail subsequent attempts at setting {{param|LowerLayers}} until the interface is no longer a loopback.
+          Support for manipulating loopback interfaces is OPTIONAL.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4AddressNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6AddressNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6PrefixNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AutoIPEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{true}}, enables auto-IP on the interface {{bibref|RFC3927}}. This mechanism is only used with IPv4.
+          When auto-IP is enabled on an interface, an {{object|IPv4Address}} object will dynamically be created and configured with auto-IP  parameter values. The exact conditions under which an auto-IP address is created (e.g. always when enabled or only in absence of  dynamic IP addressing) is implementation specific.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="TWAMPReflectorNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <command name="Reset()" dmr:version="2.12">
+        <description>
+          On a reset device MUST tear down the existing IP 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 name="Device.IP.Interface.{i}.IPv4Address.{i}." access="readWrite" numEntriesParameter="IPv4AddressNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        IPv4 address table. Entries are auto-created and auto-deleted as IP addresses are added and deleted via DHCP, auto-IP, or IPCP. Static entries are created and configured by the ACS.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="IPAddress"/>
+        <parameter ref="SubnetMask"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this IPv4 address.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this {{object}} table entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+          This parameter can only be modified if {{param|AddressingType}} is {{enum|Static|AddressingType}}.
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          IPv4 address.
+          This parameter can only be modified if the {{param|AddressingType}} is {{enum|Static|AddressingType}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="SubnetMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Subnet mask.
+          This parameter can only be modified if the {{param|AddressingType}} is {{enum|Static|AddressingType}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AddressingType" access="readOnly" dmr:version="2.0">
+        <description>
+          Addressing method used to assign the IP address. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCP"/>
+            <enumeration value="IKEv2">
+              <description>
+                Assigned by IKEv2 {{bibref|RFC5996}}.
+              </description>
+            </enumeration>
+            <enumeration value="AutoIP"/>
+            <enumeration value="IPCP"/>
+            <enumeration value="Static"/>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Throughput statistics for this interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+          Note that IPv6 does not define broadcast addresses, so IPv6 packets will never cause this counter to increment.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" dmr:version="2.0">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+          Note that IPv6 does not define broadcast addresses, so IPv6 packets will never cause this counter to increment.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Interface.{i}.TWAMPReflector.{i}." access="readWrite" numEntriesParameter="TWAMPReflectorNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object contains parameters associated with the configuration that permits this interface to be used as Two-Way Active Measurement Protocol (TWAMP) reflector as defined in {{bibref|TR-390}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Port"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables the TWAMP reflector.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the TWAMP reflector.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Active"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.12">
+        <description>
+          The port used to listen for the TWAMP test packets.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="862"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumTTL" access="readWrite" dmr:version="2.12">
+        <description>
+          The maximum TTL of a received packet that this TWAMP reflector will reflect to the TWAMP controller.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="255"/>
+          </unsignedInt>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPAllowedList" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} List items represent source IP addresses and subnets from which test packets MUST always be received. {{empty}} list will allow test packets to be received from any source IP address.
+          Each entry in the list MUST be either an IP address, or an IP prefix specified using Classless Inter-Domain Routing (CIDR) notation {{bibref|RFC4632}}.
+          An IP prefix is specified as an IP address followed (with no intervening white space) by "/n", where ''n'' (the prefix size) is an integer in the range 0-32 (for IPv4) or 0-128 (for IPv6) that indicates the number of (leftmost) '1' bits of the prefix.
+          IPv4 example:
+          * 1.2.3.4 specifies a single IPv4 address, and 1.2.3.4/24 specifies a class C subnet with subnet mask 255.255.255.0.
+          * 1.2.0.0/22 represents the 1024 IPv4 addresses from 1.2.0.0 to 1.2.3.255.
+          IPv6 example:
+          * fec0::220:edff:fe6a:f76 specifies a single IPv6 address.
+          * 2001:edff:fe6a:f76::/64 represents the IPv6 addresses from 2001:edff:fe6a:f76:0:0:0:0 to 2001:edff:fe6a:f76:ffff:ffff:ffff:ffff.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="255"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="PortAllowedList" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} List items represent source port ranges from which test packets MUST always be received. {{empty}} list will allow test packets to be received from any source port.
+          Each entry in the list MUST be either a port number or a range of port numbers separated by a hypen (-).
+          For example, an entry with the value: '2-40' accepts test packets from any allowed source IP addresses with a source port between 2 and 40 inclusive. An entry of '3' accepts test packets from allow source IP addresses with a port of 3.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="255"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Interface.{i}.IPv6Address.{i}." access="readWrite" numEntriesParameter="IPv6AddressNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        This table contains the IP interface's IPv6 unicast addresses.  There MUST be an entry for each such address, including anycast addresses.
+        There are several ways in which entries can be added to and deleted from this table, including:
+        * Automatically via SLAAC {{bibref|RFC4862}}, which covers generation of link-local addresses (for all types of device) and global addresses (for non-router devices).
+        * Automatically via DHCPv6 {{bibref|RFC3315}}, which covers generation of any type of address (subject to the configured DHCP server policy).
+        * Manually via a GUI or some other local management interface.
+        * Manually via factory default configuration.
+        * By the ACS.
+        This table MUST NOT include entries for the Subnet-Router anycast address {{bibref|RFC4291|Section 2.6.1}}.  Such entries would be identical to others but with a zero interface identifier, and would add no value.
+        A loopback interface will always have address ''::1'' {{bibref|RFC4291|Section 2.5.3}} and MAY also have link-local address ''fe80::1''.
+        This object is based on ''ipAddressTable'' from {{bibref|RFC4293}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="IPAddress"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this {{object}} table entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddressStatus" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of {{param|IPAddress}}, indicating whether it can be used for communication.  See also {{param|PreferredLifetime}} and {{param|ValidLifetime}}.  {{enum}}
+          This parameter is based on ''ipAddressStatus'' and ''ipAddressStatusTC'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Preferred">
+              <description>
+                Valid address that can appear as the destination or source address of a packet.
+              </description>
+            </enumeration>
+            <enumeration value="Deprecated">
+              <description>
+                Valid but deprecated address that is not intended to be used as a source address.
+              </description>
+            </enumeration>
+            <enumeration value="Invalid">
+              <description>
+                Invalid address that is not intended to appear as the destination or source address of a packet.
+              </description>
+            </enumeration>
+            <enumeration value="Inaccessible">
+              <description>
+                Valid address that is not accessible because the interface to which it is assigned is not operational.
+              </description>
+            </enumeration>
+            <enumeration value="Unknown">
+              <description>
+                Address status cannot be determined for some reason.
+              </description>
+            </enumeration>
+            <enumeration value="Tentative">
+              <description>
+                The uniqueness of the address on the link is being verified.
+              </description>
+            </enumeration>
+            <enumeration value="Duplicate">
+              <description>
+                Invalid address that has been determined to be non-unique on the link.
+              </description>
+            </enumeration>
+            <enumeration value="Optimistic">
+              <description>
+                Valid address that is available for use, subject to restrictions, while its uniqueness on a link is being verified.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Invalid"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddress" access="readWrite" dmr:version="2.2">
+        <description>
+          IPv6 address.
+          This parameter can only be modified if the {{param|Origin}} is {{enum|Static|Origin}}.
+          This parameter is based on ''ipAddressAddr'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.2">
+        <description>
+          Mechanism via which the IP address was assigned.  {{enum}}
+          This parameter is based on ''ipOrigin'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AutoConfigured">
+              <description>
+                Automatically generated. For example, a link-local address as specified by SLAAC {{bibref|RFC4862|Section 5.3}}, a global address as specified by SLAAC {{bibref|RFC4862|Section 5.5}}, or generated via CPE logic (e.g. from delegated prefix as specified by {{bibref|RFC3633}}), or from ULA /48 prefix as specified by {{bibref|RFC4193}}.
+              </description>
+            </enumeration>
+            <enumeration value="DHCPv6">
+              <description>
+                Assigned by DHCPv6 {{bibref|RFC3315}}.
+              </description>
+            </enumeration>
+            <enumeration value="IKEv2">
+              <description>
+                Assigned by IKEv2 {{bibref|RFC5996}}.
+              </description>
+            </enumeration>
+            <enumeration value="MAP">
+              <description>
+                Assigned by MAP {{bibref|RFC7597}}, i.e. is this interface's ''MAP IPv6 address''
+              </description>
+            </enumeration>
+            <enumeration value="WellKnown">
+              <description>
+                Specified by a standards organization, e.g. the ''::1'' loopback address, which is defined in {{bibref|RFC4291}}.
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                For example, present in the factory default configuration (but not {{enum|WellKnown}}), created by the ACS, or created by some other management entity (e.g. via a GUI).
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+      <parameter name="Prefix" access="readWrite" dmr:version="2.2">
+        <description>
+          IPv6 address prefix.
+          Some addresses, e.g. addresses assigned via the DHCPv6 IA_NA option, are not associated with a prefix, and some {{enum|WellKnown|#.IPv6Prefix.{i}.Origin}} prefixes might not be modeled.  In both of these cases {{param}} will be {{null}}.
+          This parameter can only be modified if the {{param|Origin}} is {{enum|Static|Origin}}.
+          This parameter is based on ''ipAddressPrefix'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.IPv6Prefix." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredLifetime" access="readWrite" dmr:version="2.2">
+        <description>
+          The time at which this address will cease to be preferred (i.e. will become deprecated), or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+          This parameter can only be modified if the {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="9999-12-31T23:59:59Z"/>
+        </syntax>
+      </parameter>
+      <parameter name="ValidLifetime" access="readWrite" dmr:version="2.2">
+        <description>
+          The time at which this address will cease to be valid (i.e. will become invalid), or {{null}} if unknown. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+          This parameter can only be modified if the {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="9999-12-31T23:59:59Z"/>
+        </syntax>
+      </parameter>
+      <parameter name="Anycast" access="readWrite" dmr:version="2.2">
+        <description>
+          Indicates whether this is an anycast address {{bibref|RFC4291|Section 2.6}}.  Anycast addresses are syntactically identical to unicast addresses and so need to be configured explicitly.
+          This parameter can only be modified if the {{param|Origin}} is {{enum|Static|Origin}}.
+          This parameter is based on ''ipAddressType'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Interface.{i}.IPv6Prefix.{i}." access="readWrite" numEntriesParameter="IPv6PrefixNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        This table contains the interface's IPv6 prefixes.  There MUST be an entry for each such prefix, not only for prefixes learned from router advertisements.
+        There are several ways in which entries can be added to and deleted from this table, including:
+        * Automatically via {{bibref|RFC4861}} Router Advertisements.  See also {{object|.RouterAdvertisement}}.
+        * Automatically via DHCPv6 {{bibref|RFC3315}} prefix delegation {{bibref|RFC3633}}.  See also {{object|.DHCPv6.Client}}.
+        * Automatically via internal CPE logic, e.g. creation of child prefixes derived from a parent prefix.
+        * Manually via a GUI or some other local management interface.
+        * Manually via factory default configuration.
+        * By the ACS.
+        The CPE MAY choose not to create {{object}} entries for {{enum|WellKnown|Origin}} prefixes or for the ULA /48 prefix {{bibref|RFC4193}}. If an {{object}} entry exists for the ULA /48 prefix, it MUST be on a downstream interface (i.e. an interface for which the physical layer interface object has ''Upstream'' = {{false}}).
+        This object is based on ''ipAddressPrefixTable'' from {{bibref|RFC4293}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Prefix"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this {{object}} table entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="PrefixStatus" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of {{param|Prefix}}, indicating whether it can be used for communication.  See also {{param|PreferredLifetime}} and {{param|ValidLifetime}}.  {{enum}}
+          This parameter is based on ''ipAddressStatus'' and ''ipAddressStatusTC'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Preferred">
+              <description>
+                Valid prefix.
+              </description>
+            </enumeration>
+            <enumeration value="Deprecated">
+              <description>
+                Valid but deprecated prefix.
+              </description>
+            </enumeration>
+            <enumeration value="Invalid">
+              <description>
+                Invalid prefix.
+              </description>
+            </enumeration>
+            <enumeration value="Inaccessible">
+              <description>
+                Valid prefix that is not accessible because the interface to which it is assigned is not operational.
+              </description>
+            </enumeration>
+            <enumeration value="Unknown">
+              <description>
+                Prefix status cannot be determined for some reason.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Invalid"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Prefix" access="readWrite" dmr:version="2.2">
+        <description>
+          IPv6 address prefix.
+          This parameter can only be modified if the {{param|Origin}} is {{enum|Static|Origin}}.
+          This parameter is based on ''ipAddressPrefixPrefix'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.2">
+        <description>
+          Mechanism via which the prefix was assigned or most recently updated. {{enum}}
+          Note that:
+          * {{enum|PrefixDelegation}} and {{enum|RouterAdvertisement}} prefixes can exist only on upstream interfaces (i.e. interfaces for which the physical layer interface object has ''Upstream'' = {{true}}),
+          * {{enum|AutoConfigured}} and {{enum|WellKnown}} prefixes can exist on any interface, and
+          * {{enum|Static}} and {{enum|Child}} prefixes can exist only on downstream interfaces (i.e. interfaces for which the physical layer interface object has ''Upstream'' = {{false}}).
+          Also note that a {{enum|Child}} prefix's {{param|ParentPrefix}} will always be an {{enum|AutoConfigured}}, {{enum|PrefixDelegation}}, or {{enum|RouterAdvertisement}} prefix.
+          This parameter is based on ''ipAddressOrigin'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AutoConfigured">
+              <description>
+                Generated via internal CPE logic (e.g. the ULA /48 prefix) or derived from an internal prefix that is not modeled in any {{object}} table.
+              </description>
+            </enumeration>
+            <enumeration value="PrefixDelegation">
+              <description>
+                Delegated via DHCPv6 {{bibref|RFC3633}} or some other protocol, e.g. IPv6rd {{bibref|RFC5969}}.  Also see {{param|StaticType}}.
+              </description>
+            </enumeration>
+            <enumeration value="RouterAdvertisement">
+              <description>
+                Discovered via router advertisement {{bibref|RFC4861}} Prefix Information Option.
+              </description>
+            </enumeration>
+            <enumeration value="WellKnown">
+              <description>
+                Specified by a standards organization, e.g. ''fe80::/10'' for link-local addresses, or ''::1/128'' for the loopback address, both of which are defined in {{bibref|RFC4291}}.
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                Created by the ACS, by some other management entity (e.g. via a GUI), or present in the factory default configuration (but not {{enum|WellKnown}}).  Unrelated to any shorter length prefix that might exist on the CPE.  Also see {{param|StaticType}}.  Can be used for RA (Prefix Information), DHCPv6 address assignment (IA_NA) or DHCPv6 prefix delegation (IA_PD).
+              </description>
+            </enumeration>
+            <enumeration value="Child">
+              <description>
+                Derived from an associated {{enum|AutoConfigured}} or {{enum|PrefixDelegation}} parent prefix.  Also see {{param|StaticType}}, {{param|ParentPrefix}} and {{param|ChildPrefixBits}}.  Can be used for RA (Prefix Information), DHCPv6 address assignment (IA_NA) or DHCPv6 prefix delegation (IA_PD).
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+      <parameter name="StaticType" access="readWrite" dmr:version="2.2">
+        <description>
+          Static prefix sub-type.  For a {{enum|Static|Origin}} prefix, this can be set to {{enum|PrefixDelegation}} or {{enum|Child}}, thereby creating an unconfigured prefix of the specified type that will be populated in preference to creating a new instance.  This allows the ACS to pre-create "prefix slots" with known path names that can be referenced from elsewhere in the data model before they have been populated.  {{enum}}
+          This mechanism works as follows:
+          * When this parameter is set to {{enum|PrefixDelegation}} or {{enum|Child}}, the instance becomes a "prefix slot" of the specified type.
+          * Such an instance can be administratively enabled ({{param|Enable}} = {{true}}) but will remain operationally disabled ({{param|Status}} = {{enum|Disabled|Status}}) until it has been populated.
+          * When a new prefix of of type T is needed, the CPE will look for a matching unpopulated instance, i.e. an instance with ({{param|Origin}},{{param}},{{param|Prefix}}) = ({{enum|Static|Origin}},T,"").  If the CPE finds at least one such instance it will choose one and populate it.  If already administratively enabled it will immediately become operationally enabled.  If the CPE finds no such instances, it will create and populate a new instance with ({{param|Origin}},{{param}}) = (T,T).  If the CPE finds more than one such instance, the algorithm via which it chooses which instance to populate is implementation-specific.
+          * When a prefix that was populated via this mechanism becomes invalid, the CPE will reset {{param|Prefix}} to {{empty}}.  This does not affect the value of the {{param|Enable}} parameter.
+          The prefix {{param}} can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Static">
+              <description>
+                Prefix is a "normal" {{enum|Static|Origin}} prefix.
+              </description>
+            </enumeration>
+            <enumeration value="Inapplicable" access="readOnly">
+              <description>
+                Prefix is not {{enum|Static|Origin}}, so this parameter does not apply.
+              </description>
+            </enumeration>
+            <enumeration value="PrefixDelegation">
+              <description>
+                Prefix will be populated when a {{enum|PrefixDelegation|Origin}} prefix needs to be created.
+              </description>
+            </enumeration>
+            <enumeration value="Child">
+              <description>
+                Prefix will be populated when a {{enum|Child|Origin}} prefix needs to be created. In this case, the ACS needs also to set {{param|ParentPrefix}} and might want to set {{param|ChildPrefixBits}} (if parent prefix is not set, or goes away, then the child prefix will become operationally disabled).
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+      <parameter name="ParentPrefix" access="readWrite" dmr:version="2.2">
+        <description>
+          Indicates the parent prefix from which this prefix was derived. The parent prefix is relevant only for {{enum|Child|Origin}} prefixes and for {{enum|Static|Origin}} {{enum|Child|StaticType}} prefixes (both of which will always be on downstream interfaces), i.e. for {{param|Origin}}={{enum|Child|Origin}} and for ({{param|Origin}},{{param|StaticType}}) = ({{enum|Static|Origin}},{{enum|Child|StaticType}}) prefixes.
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}} (which makes sense only for a prefix whose {{param|StaticType}} is already or will be changed to {{enum|Child|StaticType}}).
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ChildPrefixBits" access="readWrite" dmr:version="2.2">
+        <description>
+          A prefix that specifies the length of {{enum|Static|Origin}} {{enum|Child|StaticType}} prefixes and how they are derived from their {{param|ParentPrefix}}. It will be used if and only if it is not {{empty}} and is longer than the parent prefix (if it is not used, derivation of such prefixes is implementation-specific).  Any bits to the right of the parent prefix are set to the bits in this prefix.
+          For example, for a parent prefix of fedc::/56, if this parameter had the value 123:4567:89ab:cdef::/64, the child /64 would be fedc:0:0:ef::/64.  For a parent prefix of fedc::/60, the child /64 would be fedc:0:0:f::/64.
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="OnLink" access="readWrite" dmr:version="2.2">
+        <description>
+          On-link flag {{bibref|RFC4861|Section 4.6.2}} as received (in the RA) for RouterAdvertisement.  Indicates whether this prefix can be used for on-link determination.
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+          This parameter is based on ''ipAddressPrefixOnLinkFlag'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Autonomous" access="readWrite" dmr:version="2.2">
+        <description>
+          Autonomous address configuration flag {{bibref|RFC4861|Section 4.6.2}} as received (in the RA) for RouterAdvertisement.  Indicates whether this prefix can be used for generating global addresses as specified by SLAAC {{bibref|RFC4862}}.
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+          This parameter is based on ''ipAddressPrefixAutonomousFlag'' from {{bibref|RFC4293}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredLifetime" access="readWrite" dmr:version="2.2">
+        <description>
+          This parameter is based on ''ipAddressPrefixAdvPreferredLifetime'' from {{bibref|RFC4293}}. The time at which this prefix will cease to be preferred (i.e. will become deprecated), or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="9999-12-31T23:59:59Z"/>
+        </syntax>
+      </parameter>
+      <parameter name="ValidLifetime" access="readWrite" dmr:version="2.2">
+        <description>
+          This parameter is based on ''ipAddressPrefixAdvValidLifetime'' from {{bibref|RFC4293}}.  The time at which this prefix will cease to be valid (i.e. will become invalid), or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+          This parameter can only be modified if {{param|Origin}} is {{enum|Static|Origin}}.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="9999-12-31T23:59:59Z"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.ActivePort.{i}." access="readOnly" numEntriesParameter="ActivePortNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This table lists the ports on which TCP connections are listening or established.
+      </description>
+      <uniqueKey>
+        <parameter ref="LocalIPAddress"/>
+        <parameter ref="LocalPort"/>
+        <parameter ref="RemoteIPAddress"/>
+        <parameter ref="RemotePort"/>
+      </uniqueKey>
+      <parameter name="LocalIPAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          Connection local IP address.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="LocalPort" access="readOnly" dmr:version="2.0">
+        <description>
+          Connection local port.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteIPAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The remote IP address of the source of inbound packets.
+          This will be {{null}} for listening connections (only connections in {{enum|ESTABLISHED|Status}} state have remote addresses).
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemotePort" access="readOnly" dmr:version="2.0">
+        <description>
+          The remote port of the source of inbound packets.
+          This will be {{null}} for listening connections (only connections in {{enum|ESTABLISHED|Status}} state have remote addresses).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Current operational status of the connection. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="LISTEN"/>
+            <enumeration value="ESTABLISHED"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IP.Diagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The IP Diagnostics object.
+      </description>
+      <parameter name="IPv4PingSupported" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates that Ping over IPv4 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6PingSupported" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates that Ping over IPv6 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4TraceRouteSupported" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates that TraceRoute over IPv4 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6TraceRouteSupported" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates that TraceRoute over IPv6 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4DownloadDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that Download Diagnostics over IPv4 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6DownloadDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that Download Diagnostics over IPv6 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4UploadDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that Upload Diagnostics over IPv4 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6UploadDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that Upload Diagnostics over IPv6 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4UDPEchoDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that UDPEcho Diagnostics over IPv4 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6UDPEchoDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that UDPEcho Diagnostics over IPv6 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4ServerSelectionDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that ServerSelection Diagnostics over IPv4 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6ServerSelectionDiagnosticsSupported" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates that ServerSelection Diagnostics over IPv6 is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <command name="IPPing()" async="true" dmr:version="2.12">
+        <description>
+          This command provides access to an IP-layer ping test.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Interface" dmr:version="2.0">
+            <description>
+              {{reference}} The layer 2 or layer 3 interface over which the test is to be performed. Example: ''Device.IP.Interface.1'', ''Device.Bridge.1.Port.2''
+              If {{empty}} is specified, the CPE MUST use the interface as directed by its bridging or routing policy (''Forwarding'' table entries) to determine the appropriate interface.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+                <pathRef refType="weak" targetParent=".IP.Interface. .Bridging.Bridge.{i}.Port." targetType="row"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="ProtocolVersion" dmr:version="2.8">
+            <description>
+              Indicates the IP protocol to be used.
+            </description>
+            <syntax>
+              <string>
+                <enumeration value="Any">
+                  <description>
+                    Use either IPv4 or IPv6 depending on the system preference
+                  </description>
+                </enumeration>
+                <enumeration value="IPv4">
+                  <description>
+                    Use IPv4 for the Ping requests
+                  </description>
+                </enumeration>
+                <enumeration value="IPv6">
+                  <description>
+                    Use IPv6 for the Ping requests
+                  </description>
+                </enumeration>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="Host" dmr:version="2.0">
+            <description>
+              Host name or address of the host to ping.
+              In the case where {{param}} is specified by name, and the name resolves to more than one address, it is up to the device implementation to choose which address to use.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="NumberOfRepetitions" dmr:version="2.0">
+            <description>
+              Number of repetitions of the ping test to perform before reporting the results.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="Timeout" dmr:version="2.0">
+            <description>
+              Timeout in {{units}} for the ping test.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1"/>
+                <units value="milliseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="DataBlockSize" dmr:version="2.0">
+            <description>
+              Size of the data block in bytes to be sent for each ping.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1" maxInclusive="65535"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="DSCP" dmr:version="2.0">
+            <description>
+              DiffServ codepoint to be used for the test packets.  By default the CPE SHOULD set this value to  zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="63"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+        </input>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <parameter name="IPAddressUsed" dmr:version="2.8">
+            <description>
+              Indicates which IP address was used to send the Ping request.
+            </description>
+            <syntax>
+              <dataType ref="IPAddress"/>
+            </syntax>
+          </parameter>
+          <parameter name="SuccessCount" dmr:version="2.0">
+            <description>
+              Result parameter indicating the number of successful pings (those in which a successful response was received  prior to the timeout) in the most recent ping test.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="FailureCount" dmr:version="2.0">
+            <description>
+              Result parameter indicating the number of failed pings in the most recent ping test.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="AverageResponseTime" dmr:version="2.0">
+            <description>
+              Result parameter indicating the average response time in {{units}} over all repetitions with successful  responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="milliseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="MinimumResponseTime" dmr:version="2.0">
+            <description>
+              Result parameter indicating the minimum response time in {{units}} over all repetitions with successful  responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="milliseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="MaximumResponseTime" dmr:version="2.0">
+            <description>
+              Result parameter indicating the maximum response time in {{units}} over all repetitions with successful  responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="milliseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="AverageResponseTimeDetailed" dmr:version="2.7">
+            <description>
+              Result parameter indicating the average response time in {{units}} over all repetitions with successful responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="microseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="MinimumResponseTimeDetailed" dmr:version="2.7">
+            <description>
+              Result parameter indicating the minimum response time in {{units}} over all repetitions with successful responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="microseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="MaximumResponseTimeDetailed" dmr:version="2.7">
+            <description>
+              Result parameter indicating the maximum response time in {{units}} over all repetitions with successful responses of the most recent ping test.  If there were no successful responses, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="microseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+        </output>
+      </command>
+      <command name="TraceRoute()" async="true" dmr:version="2.12">
+        <description>
+          This command defines access to an IP-layer trace-route test for the specified IP interface.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Interface" dmr:version="2.0">
+            <description>
+              {{reference}} The layer 2 or layer 3 interface over which the test is to be performed. Example: ''Device.IP.Interface.1'', ''Device.Bridge.1.Port.2''
+              If {{empty}} is specified, the CPE MUST use the interface as directed by its bridging or routing policy (''Forwarding'' table entries) to determine the appropriate interface.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+                <pathRef refType="weak" targetParent=".IP.Interface. .Bridging.Bridge.{i}.Port." targetType="row"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="ProtocolVersion" dmr:version="2.8">
+            <description>
+              Indicates the IP protocol to be used.
+            </description>
+            <syntax>
+              <string>
+                <enumeration value="Any">
+                  <description>
+                    Use either IPv4 or IPv6 depending on the system preference
+                  </description>
+                </enumeration>
+                <enumeration value="IPv4">
+                  <description>
+                    Use IPv4 for the TraceRoute
+                  </description>
+                </enumeration>
+                <enumeration value="IPv6">
+                  <description>
+                    Use IPv6 for the TraceRoute
+                  </description>
+                </enumeration>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="Host" dmr:version="2.0">
+            <description>
+              Host name or address of the host to find a route to.
+              In the case where {{param}} is specified by name, and the name resolves to more than one address, it is up to the device implementation to choose which address to use.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="NumberOfTries" dmr:version="2.0">
+            <description>
+              Number of tries per hop. Set prior to running Diagnostic.  By default, the CPE SHOULD set this value to  3.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1" maxInclusive="3"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="Timeout" dmr:version="2.0">
+            <description>
+              Timeout in {{units}} for each hop of the trace route test.  By default the CPE SHOULD set this value to 5000.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1"/>
+                <units value="milliseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="DataBlockSize" dmr:version="2.0">
+            <description>
+              Size of the data block in bytes to be sent for each trace route.  By default, the CPE SHOULD set this value to  38.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1" maxInclusive="65535"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="DSCP" dmr:version="2.0">
+            <description>
+              DiffServ codepoint to be used for the test packets.  By default the CPE SHOULD set this value to  0.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="63"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="MaxHopCount" dmr:version="2.0">
+            <description>
+              The maximum number of hop used in outgoing probe packets (max TTL).  By default the CPE SHOULD set this value to  30.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1" maxInclusive="64"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+        </input>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <parameter name="IPAddressUsed" dmr:version="2.8">
+            <description>
+              Indicates which IP address was used for TraceRoute.
+            </description>
+            <syntax>
+              <dataType ref="IPAddress"/>
+            </syntax>
+          </parameter>
+          <parameter name="ResponseTime" dmr:version="2.0">
+            <description>
+              Result parameter indicating the response time in {{units}} the most recent trace route test.  If a route  could not be determined, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="milliseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <object name="RouteHops.{i}." minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:noUniqueKeys="true">
+            <description>
+              Contains the array of hop results returned. If a route could not be determined, this array will be empty
+            </description>
+            <parameter name="Host" dmr:version="2.0">
+              <description>
+                Result parameter indicating the Host Name if DNS is able to resolve or IP Address of a hop along the discovered  route.
+              </description>
+              <syntax>
+                <string>
+                  <size maxLength="256"/>
+                </string>
+              </syntax>
+            </parameter>
+            <parameter name="HostAddress" dmr:version="2.0">
+              <description>
+                If this parameter is not {{empty}} it will contain the last IP address of the host returned for this hop and the  {{param|Host}} will contain the Host Name returned from the reverse DNS query.
+              </description>
+              <syntax>
+                <string/>
+              </syntax>
+            </parameter>
+            <parameter name="ErrorCode" dmr:version="2.0">
+              <description>
+                Contains the error code returned for this hop. This code is directly from the ICMP CODE field.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="RTTimes" dmr:version="2.0">
+              <description>
+                {{list}} Each list item contains one or more round trip times in {{units}} (one for each repetition) for this hop.
+                A list item of 0 indicates that the corresponding response was not received. Round trip times of less than 1 {{units}} MUST be rounded up to 1.
+                The number of list entries is determined by the value of {{param|#.NumberOfTries}}.
+              </description>
+              <syntax>
+                <list minItems="1" maxItems="3">
+                  <size maxLength="16"/>
+                </list>
+                <unsignedInt>
+                  <units value="milliseconds"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+          </object>
+        </output>
+      </command>
+      <parameter name="DownloadTransports" access="readOnly" dmr:version="2.0">
+        <description>
+          Supported ''DownloadDiagnostics'' transport protocols for a CPE device.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="HTTP"/>
+            <enumeration value="FTP" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DownloadDiagnosticMaxConnections" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates the maximum number of connections that are supported by Download Diagnostics.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="DownloadDiagnosticsMaxIncrementalResult" access="readOnly" dmr:version="2.9">
+        <description>
+          The maximum number of rows in {{object|DownloadDiagnostics().IncrementalResult}} that the CPE will store.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <command name="DownloadDiagnostics()" async="true" dmr: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 dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Interface" dmr:version="2.0">
+            <description>
+              {{reference}} The IP-layer interface over which the test is to be performed. Example: Device.IP.Interface.1
+              If {{empty}} is specified, the CPE MUST use the interface as directed by its routing policy (''Forwarding'' table entries) to determine the appropriate interface.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+                <pathRef refType="weak" targetType="row"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="DownloadURL" dmr:version="2.0">
+            <description>
+              The URL, as defined in {{bibref|RFC3986}}, for the CPE to perform the download on. This parameter MUST be in the form of a valid HTTP {{bibref|RFC2616}} or FTP {{bibref|RFC959}} URL.
+              * When using FTP transport, FTP binary transfer MUST be used.
+              * When using HTTP transport, persistent connections MUST be used and pipelining MUST NOT be used.
+              * When using HTTP transport the HTTP Authentication MUST NOT be used.
+              Note: For time based tests ({{param|TimeBasedTestDuration}} &gt; 0) the ACS MAY add a hint to duration of the test to the URL.  See {{bibref|TR-143a1|Section 4.3}} for more details.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="DSCP" dmr:version="2.0">
+            <description>
+              The DiffServ code point for marking packets transmitted in the test.
+              The default value SHOULD be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="63"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="EthernetPriority" dmr:version="2.0">
+            <description>
+              Ethernet priority code for marking packets transmitted in the test (if applicable).
+              The default value SHOULD be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="7"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TimeBasedTestDuration" dmr:version="2.9">
+            <description>
+              Controls time based testing {{bibref|TR-143a1|Section 4.3}}. When {{param}} &gt; 0, {{param}} is the duration in {{units}} of a time based test. If {{param}} is 0, the test is not based on time, but on the size of the file to be downloaded.  The default value SHOULD be 0.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="999"/>
+                <units value="seconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TimeBasedTestMeasurementInterval" dmr:version="2.9">
+            <description>
+              The measurement interval duration in {{units}} for objects in {{object|IncrementalResult}} for a time based FTP/HTTP download test (when {{param|TimeBasedTestDuration}} &gt; 0).  The default value SHOULD be 0, which implies {{object|IncrementalResult}} collection is disabled.
+              For example if {{param|TimeBasedTestDuration}} is 90 seconds and {{param}} is 10 {{units}}, there will be 9 results in {{object|IncrementalResult}}, each with a 10 {{units}} duration.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="999"/>
+                <units value="seconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TimeBasedTestMeasurementOffset" dmr:version="2.9">
+            <description>
+              This {{param}} works in conjunction with {{param|TimeBasedTestMeasurementInterval}} to allow the interval measurement to start a number of {{units}} after {{param|BOMTime}}. The test measurement interval in {{object|IncrementalResult}} starts at time {{param|BOMTime}} + {{param}} to allow for slow start window removal of file transfers.
+              This {{param}} is in {{units}}.  The default value SHOULD be 0.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="255"/>
+                <units value="seconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="ProtocolVersion" dmr:version="2.9">
+            <description>
+              Indicates the IP protocol version to be used.  The default value SHOULD be {{enum|Any}}.
+            </description>
+            <syntax>
+              <string>
+                <enumeration value="Any">
+                  <description>
+                    Use either IPv4 or IPv6 depending on the system preference.
+                  </description>
+                </enumeration>
+                <enumeration value="IPv4">
+                  <description>
+                    Use IPv4 for the requests
+                  </description>
+                </enumeration>
+                <enumeration value="IPv6">
+                  <description>
+                    Use IPv6 for the requests.
+                  </description>
+                </enumeration>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="NumberOfConnections" dmr:version="2.9">
+            <description>
+              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>
+          <parameter name="EnablePerConnectionResults" dmr:version="2.9">
+            <description>
+              The results must be returned in the {{object|PerConnectionResult}} table for every connection when set to {{true}}. The default value SHOULD be {{false}}.
+            </description>
+            <syntax>
+              <boolean/>
+            </syntax>
+          </parameter>
+        </input>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <parameter name="IPAddressUsed" dmr:version="2.9">
+            <description>
+              Indicates which IP address was used to send the request.
+            </description>
+            <syntax>
+              <dataType ref="IPAddress"/>
+            </syntax>
+          </parameter>
+          <parameter name="ROMTime" dmr:version="2.0">
+            <description>
+              Request time in UTC, which MUST be specified to microsecond precision.
+              For example: 2008-04-09T15:01:05.123456Z
+              * For HTTP this is the time at which the client sends the GET command.
+              * For FTP this is the time at which the client sends the RTRV command.
+              If multiple connections are used, then {{param}} is set to the earliest {{param}} across all connections.
+            </description>
+            <syntax>
+              <dateTime/>
+            </syntax>
+          </parameter>
+          <parameter name="BOMTime" dmr:version="2.0">
+            <description>
+              Begin of transmission time in UTC, which MUST be specified to microsecond precision
+              For example: 2008-04-09T15:01:05.123456Z
+              * For HTTP this is the time at which the first data packet is received.
+              * For FTP this is the time at which the client receives the first data packet on the data connection.
+              If multiple connections are used, then {{param}} is set to the earliest {{param}} across all connections.
+            </description>
+            <syntax>
+              <dateTime/>
+            </syntax>
+          </parameter>
+          <parameter name="EOMTime" dmr:version="2.0">
+            <description>
+              End of transmission in UTC, which MUST be specified to microsecond precision.
+              For example: 2008-04-09T15:01:05.123456Z
+              * For HTTP this is the time at which the last data packet is received.
+              * For FTP this is the time at which the client receives the last packet on the data connection.
+              If multiple connections are used, then {{param}} is set to the latest {{param}} across all connections.
+            </description>
+            <syntax>
+              <dateTime/>
+            </syntax>
+          </parameter>
+          <parameter name="TestBytesReceived" dmr:version="2.0">
+            <description>
+              The number of {{units}} received during the FTP/HTTP transaction including FTP/HTTP headers, between {{param|BOMTime}} and {{param|EOMTime}} across all connections.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="bytes"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TotalBytesReceived" dmr:version="2.0">
+            <description>
+              The total number of {{units}} (at the IP layer) received on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="bytes"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TotalBytesSent" dmr:version="2.9">
+            <description>
+              The total number of {{units}} (at the IP layer) sent on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesSent on the {{param|Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="bytes"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TestBytesReceivedUnderFullLoading" dmr:version="2.9">
+            <description>
+              The number of {{units}} of the test file received between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}} across all connections.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="bytes"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TotalBytesReceivedUnderFullLoading" dmr:version="2.9">
+            <description>
+              The total number of {{units}} (at the IP layer) received in between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}}.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|Interface}} object at the latest {{param|PerConnectionResult.{i}.BOMTime}} and at the earliest {{param|PerConnectionResult.{i}.EOMTime}} and subtracting.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="bytes"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TotalBytesSentUnderFullLoading" dmr:version="2.9">
+            <description>
+              The total number of {{units}} (at the IP layer) sent between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}}.  This MAY be calculated by sampling Stats.bytesSent on the {{param|Interface}} object at the latest {{param|PerConnectionResult.{i}.BOMTime}} and at the earliest {{param|PerConnectionResult.{i}.EOMTime}} and subtracting.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="bytes"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="PeriodOfFullLoading" dmr:version="2.9">
+            <description>
+              The period of time in {{units}} between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}} of the test.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="microseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TCPOpenRequestTime" dmr:version="2.0">
+            <description>
+              Request time in UTC, which MUST be specified to microsecond precision.
+              For example: 2008-04-09T15:01:05.123456Z
+              * For HTTP this is the time at which the TCP socket open (SYN) was sent for the HTTP connection.
+              * For FTP this is the time at which the TCP socket open (SYN) was sent for the data connection.
+              Note: Interval of 1 microsecond SHOULD be supported.
+              If multiple connections are used, then {{param}} is set to the latest {{param}} across all connections.
+            </description>
+            <syntax>
+              <dateTime/>
+            </syntax>
+          </parameter>
+          <parameter name="TCPOpenResponseTime" dmr:version="2.0">
+            <description>
+              Response time in UTC, which MUST be specified to microsecond precision.
+              For example: 2008-04-09T15:01:05.123456Z
+              * For HTTP this is the time at which the TCP ACK to the socket opening the HTTP connection was received.
+              * For FTP this is the time at which the TCP ACK to the socket opening the data connection was received.
+              Note: Interval of 1 microsecond SHOULD be supported.
+              If multiple connections are used, then {{param}} is set to the latest {{param}} across all connections.
+            </description>
+            <syntax>
+              <dateTime/>
+            </syntax>
+          </parameter>
+          <object name="PerConnectionResult.{i}." minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+            <description>
+              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>
+            <parameter name="ROMTime" dmr:version="2.9">
+              <description>
+                Request time in UTC, which MUST be specified to microsecond precision.
+                For example: 2008-04-09T15:01:05.123456Z
+                * For HTTP this is the time at which the client sends the GET command.
+                * For FTP this is the time at which the client sends the RTRV command.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="BOMTime" dmr:version="2.9">
+              <description>
+                Begin of transmission time in UTC, which MUST be specified to microsecond precision
+                For example: 2008-04-09T15:01:05.123456Z
+                * For HTTP this is the time at which the first data packet is received.
+                * For FTP this is the time at which the client receives the first data packet on the data connection.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="EOMTime" dmr:version="2.9">
+              <description>
+                End of transmission in UTC, which MUST be specified to microsecond precision.
+                For example: 2008-04-09T15:01:05.123456Z
+                * For HTTP this is the time at which the last data packet is received.
+                * For FTP this is the time at which the client receives the last packet on the data connection.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="TestBytesReceived" dmr:version="2.9">
+              <description>
+                The number of {{units}} of the test file received during the FTP/HTTP transaction including FTP/HTTP headers, between {{param|BOMTime}} and {{param|EOMTime}}.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="bytes"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="TotalBytesReceived" dmr:version="2.9">
+              <description>
+                The total number of {{units}} (at the IP layer) received on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|#.Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="bytes"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="TotalBytesSent" dmr:version="2.9">
+              <description>
+                The total number of {{units}} (at the IP layer) sent on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesSent on the {{param|#.Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="bytes"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="TCPOpenRequestTime" dmr:version="2.9">
+              <description>
+                Request time in UTC, which MUST be specified to microsecond precision.
+                For example: 2008-04-09T15:01:05.123456Z
+                * For HTTP this is the time at which the TCP socket open (SYN) was sent for the HTTP connection.
+                * For FTP this is the time at which the TCP socket open (SYN) was sent for the data connection.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="TCPOpenResponseTime" dmr:version="2.9">
+              <description>
+                Response time in UTC, which MUST be specified to microsecond precision.
+                For example: 2008-04-09T15:01:05.123456Z
+                * For HTTP this is the time at which the TCP ACK to the socket opening the HTTP connection was received.
+                * For FTP this is the time at which the TCP ACK to the socket opening the data connection was received.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+          </object>
+          <object name="IncrementalResult.{i}." minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+            <description>
+              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>
+            <parameter name="TestBytesReceived" dmr:version="2.9">
+              <description>
+                Change in the value of {{param|#.TestBytesReceivedUnderFullLoading}} between {{param|StartTime}} and {{param|EndTime}}.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="bytes"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="TotalBytesReceived" dmr:version="2.9">
+              <description>
+                The total number of {{units}} (at the IP layer) received on the Interface between {{param|StartTime}} and {{param|EndTime}}.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|#.Interface}} object at {{param|StartTime}} and at {{param|EndTime}} and subtracting.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="bytes"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="TotalBytesSent" dmr:version="2.9">
+              <description>
+                The total number of {{units}} (at the IP layer) sent on the Interface between {{param|StartTime}} and {{param|EndTime}}.  This MAY be calculated by sampling Stats.bytesSent on the {{param|#.Interface}} object at {{param|StartTime}} and at {{param|EndTime}} and subtracting.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="bytes"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="StartTime" dmr:version="2.9">
+              <description>
+                The start time of this interval which MUST be specified to microsecond precision.
+                For example: 2008-04-09T15:01:05.123456Z
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="EndTime" dmr:version="2.9">
+              <description>
+                The end time of this interval which MUST be specified to microsecond precision.
+                For example: 2008-04-09T15:01:05.123456Z
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+          </object>
+        </output>
+      </command>
+      <parameter name="UploadTransports" access="readOnly" dmr:version="2.0">
+        <description>
+          Supported ''UploadDiagnostics'' transport protocols for a CPE device.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="HTTP"/>
+            <enumeration value="FTP" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UploadDiagnosticsMaxConnections" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates the maximum number of connections that are supported by Upload Diagnostics.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="UploadDiagnosticsMaxIncrementalResult" access="readOnly" dmr:version="2.9">
+        <description>
+          The maximum number of rows in {{object|UploadDiagnostics().IncrementalResult}} that the CPE will store.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <command name="UploadDiagnostics()" async="true" dmr: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 dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Interface" dmr:version="2.0">
+            <description>
+              {{reference}} The IP-layer interface over which the test is to be performed. Example: Device.IP.Interface.1
+              If {{empty}} is specified, the CPE MUST use the interface as directed by its routing policy (''Forwarding'' table entries) to determine the appropriate interface.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+                <pathRef refType="weak" targetType="row"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="UploadURL" dmr:version="2.0">
+            <description>
+              The URL, as defined in {{bibref|RFC3986}}, for the CPE to Upload to. This parameter MUST be in the form of a valid HTTP {{bibref|RFC2616}} or FTP {{bibref|RFC959}} URL.
+              * When using FTP transport, FTP binary transfer MUST be used.
+              * When using HTTP transport, persistent connections MUST be used and pipelining MUST NOT be used.
+              * When using HTTP transport the HTTP Authentication MUST NOT be used.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="DSCP" dmr:version="2.0">
+            <description>
+              DiffServ code point for marking packets transmitted in the test.
+              The default value SHOULD be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="63"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="EthernetPriority" dmr:version="2.0">
+            <description>
+              Ethernet priority code for marking packets transmitted in the test (if applicable).
+              The default value SHOULD be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="7"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TestFileLength" dmr:version="2.0">
+            <description>
+              The size of the file (in bytes) to be uploaded to the server.
+              The CPE MUST insure the appropriate number of bytes are sent.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="TimeBasedTestDuration" dmr:version="2.9">
+            <description>
+              Controls time based testing {{bibref|TR-143a1|Section 4.3}}. When {{param}} &gt; 0, {{param}} is the duration in {{units}} of a time based test. If {{param}} is 0, the test is not based on time, but on the size of the file to be uploaded.  The default value SHOULD be 0.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="999"/>
+                <units value="seconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TimeBasedTestMeasurementInterval" dmr:version="2.9">
+            <description>
+              The measurement interval duration in {{units}} for objects in {{object|IncrementalResult}} for a time based FTP/HTTP upload test (when {{param|TimeBasedTestDuration}} &gt; 0).  The default value SHOULD be 0, which implies {{object|IncrementalResult}} collection is disabled.
+              For example if {{param|TimeBasedTestDuration}} is 90 seconds and {{param}} is 10 {{units}}, there will be 9 results in {{object|IncrementalResult}}, each with a 10 {{units}} duration.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="999"/>
+                <units value="seconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TimeBasedTestMeasurementOffset" dmr:version="2.9">
+            <description>
+              This {{param}} works in conjunction with {{param|TimeBasedTestMeasurementInterval}} and allows the interval measurement to start a number of {{units}} after {{param|BOMTime}}. The test measurement interval in  {{object|IncrementalResult}} starts at time {{param|BOMTime}} + {{param}} to allow for slow start window removal of file transfers.
+              This {{param}} is in {{units}}.  The default value SHOULD be 0.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="255"/>
+                <units value="seconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="ProtocolVersion" dmr:version="2.9">
+            <description>
+              Indicates the IP protocol version to be used.  The default value SHOULD be {{enum|Any}}.
+            </description>
+            <syntax>
+              <string>
+                <enumeration value="Any">
+                  <description>
+                    Use either IPv4 or IPv6 depending on the system preference.
+                  </description>
+                </enumeration>
+                <enumeration value="IPv4">
+                  <description>
+                    Use IPv4 for the requests
+                  </description>
+                </enumeration>
+                <enumeration value="IPv6">
+                  <description>
+                    Use IPv6 for the requests.
+                  </description>
+                </enumeration>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="NumberOfConnections" dmr:version="2.9">
+            <description>
+              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>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="EnablePerConnectionResults" dmr:version="2.9">
+            <description>
+              The results must be returned in the {{object|PerConnectionResult}} table for every connection when set to {{true}}. The default value SHOULD be {{false}}.
+            </description>
+            <syntax>
+              <boolean/>
+            </syntax>
+          </parameter>
+        </input>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <parameter name="IPAddressUsed" dmr:version="2.9">
+            <description>
+              Indicates which IP address was used to send the request.
+            </description>
+            <syntax>
+              <dataType ref="IPAddress"/>
+            </syntax>
+          </parameter>
+          <parameter name="ROMTime" dmr:version="2.0">
+            <description>
+              Request time in UTC, which MUST be specified to microsecond precision.
+              For example: 2008-04-09T15:01:05.123456Z
+              * For HTTP this is the time at which the client sends the GET command.
+              * For FTP this is the time at which the client sends the RTRV command.
+              If multiple connections are used, then {{param}} is set to the earliest {{param}} across all connections.
+            </description>
+            <syntax>
+              <dateTime/>
+            </syntax>
+          </parameter>
+          <parameter name="BOMTime" dmr:version="2.0">
+            <description>
+              Begin of transmission time in UTC, which MUST be specified to microsecond precision
+              For example: 2008-04-09T15:01:05.123456Z
+              * For HTTP this is the time at which the first data packet is received.
+              * For FTP this is the time at which the client receives the first data packet on the data connection.
+              If multiple connections are used, then {{param}} is set to the earliest {{param}} across all connections.
+            </description>
+            <syntax>
+              <dateTime/>
+            </syntax>
+          </parameter>
+          <parameter name="EOMTime" dmr:version="2.0">
+            <description>
+              End of transmission in UTC, which MUST be specified to microsecond precision.
+              For example: 2008-04-09T15:01:05.123456Z
+              * For HTTP this is the time at which the last data packet is received.
+              * For FTP this is the time at which the client receives the last packet on the data connection.
+              If multiple connections are used, then {{param}} is set to the latest {{param}} across all connections.
+            </description>
+            <syntax>
+              <dateTime/>
+            </syntax>
+          </parameter>
+          <parameter name="TestBytesSent" dmr:version="2.9">
+            <description>
+              The number of {{units}} of the test file sent during the FTP/HTTP transaction including FTP/HTTP headers, between {{param|BOMTime}} and {{param|EOMTime}} acrosss all connections.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="bytes"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TotalBytesReceived" dmr:version="2.9">
+            <description>
+              The total number of {{units}} (at the IP layer) received on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="bytes"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TotalBytesSent" dmr:version="2.0">
+            <description>
+              The total number of {{units}} (at the IP layer) sent on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesSent on the {{param|Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="bytes"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TestBytesSentUnderFullLoading" dmr:version="2.9">
+            <description>
+              The number of {{units}} of the test file sent between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}} across all connections.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="bytes"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TotalBytesReceivedUnderFullLoading" dmr:version="2.9">
+            <description>
+              The total number of {{units}} (at the IP layer) received between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}} across all connections in the test.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|Interface}} object at the latest {{param|PerConnectionResult.{i}.BOMTime}} and at the earliest {{param|PerConnectionResult.{i}.EOMTime}} and subtracting.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="bytes"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TotalBytesSentUnderFullLoading" dmr:version="2.9">
+            <description>
+              The total number of {{units}} (at the IP layer) sent between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}} across all connections in the test.  This MAY be calculated by sampling Stats.bytesSent on the {{param|Interface}} object at the latest {{param|PerConnectionResult.{i}.BOMTime}} and at the earliest {{param|PerConnectionResult.{i}.EOMTime}} and subtracting.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="bytes"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="PeriodOfFullLoading" dmr:version="2.9">
+            <description>
+              The period of time in {{units}} between the latest {{param|PerConnectionResult.{i}.BOMTime}} and the earliest {{param|PerConnectionResult.{i}.EOMTime}} of the test.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="microseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="TCPOpenRequestTime" dmr:version="2.0">
+            <description>
+              Request time in UTC, which MUST be specified to microsecond precision.
+              For example: 2008-04-09T15:01:05.123456Z
+              * For HTTP this is the time at which the TCP socket open (SYN) was sent for the HTTP connection.
+              * For FTP this is the time at which the TCP socket open (SYN) was sent for the data connection.
+              Note: Interval of 1 microsecond SHOULD be supported.
+              If multiple connections are used, then {{param}} is set to the latest {{param}} across all connections.
+            </description>
+            <syntax>
+              <dateTime/>
+            </syntax>
+          </parameter>
+          <parameter name="TCPOpenResponseTime" dmr:version="2.0">
+            <description>
+              Response time in UTC, which MUST be specified to microsecond precision.
+              For example: 2008-04-09T15:01:05.123456Z
+              * For HTTP this is the time at which the TCP ACK to the socket opening the HTTP connection was received.
+              * For FTP this is the time at which the TCP ACK to the socket opening the data connection was received.
+              Note: Interval of 1 microsecond SHOULD be supported.
+              If multiple connections are used, then {{param}} is set to the latest {{param}} across all connections.
+            </description>
+            <syntax>
+              <dateTime/>
+            </syntax>
+          </parameter>
+          <object name="PerConnectionResult.{i}." minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+            <description>
+              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>
+            <parameter name="ROMTime" dmr:version="2.9">
+              <description>
+                Request time in UTC, which MUST be specified to microsecond precision.
+                For example: 2008-04-09T15:01:05.123456Z
+                * For HTTP this is the time at which the client sends the GET command.
+                * For FTP this is the time at which the client sends the RTRV command.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="BOMTime" dmr:version="2.9">
+              <description>
+                Begin of transmission time in UTC, which MUST be specified to microsecond precision
+                For example: 2008-04-09T15:01:05.123456Z
+                * For HTTP this is the time at which the first data packet is received.
+                * For FTP this is the time at which the client receives the first data packet on the data connection.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="EOMTime" dmr:version="2.9">
+              <description>
+                End of transmission in UTC, which MUST be specified to microsecond precision.
+                For example: 2008-04-09T15:01:05.123456Z
+                * For HTTP this is the time at which the last data packet is received.
+                * For FTP this is the time at which the client receives the last packet on the data connection.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="TestBytesSent" dmr:version="2.9">
+              <description>
+                The number of {{units}} of the test file sent during the FTP/HTTP transaction including FTP/HTTP headers, between {{param|BOMTime}} and {{param|EOMTime}}.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="bytes"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="TotalBytesReceived" dmr:version="2.9">
+              <description>
+                The total number of {{units}} (at the IP layer) received on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|#.Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="bytes"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="TotalBytesSent" dmr:version="2.9">
+              <description>
+                The total number of {{units}} (at the IP layer) sent on the Interface between {{param|BOMTime}} and {{param|EOMTime}}.  This MAY be calculated by sampling Stats.bytesSent on the {{param|#.Interface}} object at {{param|BOMTime}} and at {{param|EOMTime}} and subtracting.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="bytes"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="TCPOpenRequestTime" dmr:version="2.9">
+              <description>
+                Request time in UTC, which MUST be specified to microsecond precision.
+                For example: 2008-04-09T15:01:05.123456Z
+                * For HTTP this is the time at which the TCP socket open (SYN) was sent for the HTTP connection.
+                * For FTP this is the time at which the TCP socket open (SYN) was sent for the data connection.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="TCPOpenResponseTime" dmr:version="2.9">
+              <description>
+                Response time in UTC, which MUST be specified to microsecond precision.
+                For example: 2008-04-09T15:01:05.123456Z
+                * For HTTP this is the time at which the TCP ACK to the socket opening the HTTP connection was received.
+                * For FTP this is the time at which the TCP ACK to the socket opening the data connection was received.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+          </object>
+          <object name="IncrementalResult.{i}." minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+            <description>
+              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>
+            <parameter name="TestBytesSent" dmr:version="2.9">
+              <description>
+                Change in the value of {{param|#.TestBytesSent}} between {{param|StartTime}} and {{param|EndTime}}.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="bytes"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="TotalBytesReceived" dmr:version="2.9">
+              <description>
+                The total number of {{units}} (at the IP layer) received on the Interface between {{param|StartTime}} and {{param|EndTime}}.  This MAY be calculated by sampling Stats.bytesReceived on the {{param|#.Interface}} object at {{param|StartTime}} and at {{param|EndTime}} and subtracting.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="bytes"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="TotalBytesSent" dmr:version="2.9">
+              <description>
+                The total number of {{units}} (at the IP layer) sent on the Interface between {{param|StartTime}} and {{param|EndTime}}.  This MAY be calculated by sampling Stats.bytesSent on the {{param|#.Interface}} object at {{param|StartTime}} and at {{param|EndTime}} and subtracting.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="bytes"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="StartTime" dmr:version="2.9">
+              <description>
+                The start time of this interval which MUST be specified to microsecond precision.
+                For example: 2008-04-09T15:01:05.123456Z
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="EndTime" dmr:version="2.9">
+              <description>
+                The end time of this interval which MUST be specified to microsecond precision.
+                For example: 2008-04-09T15:01:05.123456Z
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+          </object>
+        </output>
+      </command>
+      <parameter name="UDPEchoDiagnosticsMaxResults" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          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>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <command name="UDPEchoDiagnostics()" async="true" dmr:version="2.12">
+        <description>
+          This command defines the diagnostics configuration for a UDP Echo test {{bibref|TR-143a1|Appendix A.1}} defined in {{bibref|RFC862}} or a UDP Echo Plus test defined in {{bibref|TR-143a1|Appendix A.1}}.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Interface" dmr:version="2.9">
+            <description>
+              {{reference|the IP-layer interface over which the test is to be performed|ignore}} Example: Device.IP.Interface.1
+              If {{empty}} is specified, the CPE MUST use the interface as directed by its routing policy (''Forwarding'' table entries) to determine the appropriate interface.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+                <pathRef refType="strong" targetParent=".WANDevice.{i}.WANConnectionDevice.{i}.WANIPConnection. .WANDevice.{i}.WANConnectionDevice.{i}.WANPPPConnection. .IP.Interface." targetType="row"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="Host" dmr:version="2.9">
+            <description>
+              Host name or address of the host to perform tests to.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="Port" dmr:version="2.9">
+            <description>
+              Port on the host to perform tests to.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1" maxInclusive="65535"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="NumberOfRepetitions" dmr:version="2.9">
+            <description>
+              Number of repetitions of the test to perform before reporting the results. The default value SHOULD be 1.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="Timeout" dmr:version="2.9">
+            <description>
+              Timeout in {{units}} for the test. That is, the amount of time to wait for the return of a packet that was sent to the {{param|Host}}.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1"/>
+                <units value="milliseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="DataBlockSize" dmr:version="2.9">
+            <description>
+              Size of the data block in {{units}} to be sent for each packet.  The default value SHOULD be 24.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1" maxInclusive="65535"/>
+                <units value="bytes"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="DSCP" dmr:version="2.9">
+            <description>
+              DiffServ codepoint to be used for the test packets. The default value SHOULD be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="0" maxInclusive="63"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="InterTransmissionTime" dmr:version="2.9">
+            <description>
+              The time in {{units}} between the {{param|NumberOfRepetitions}} of packets sent during a given test.  The default value SHOULD be 1000.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1" maxInclusive="65535"/>
+                <units value="milliseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="ProtocolVersion" dmr:version="2.9">
+            <description>
+              Indicates the IP protocol version to be used.  The default value SHOULD be {{enum|Any}}.
+            </description>
+            <syntax>
+              <string>
+                <enumeration value="Any">
+                  <description>
+                    Use either IPv4 or IPv6 depending on the system preference.
+                  </description>
+                </enumeration>
+                <enumeration value="IPv4">
+                  <description>
+                    Use IPv4 for the requests
+                  </description>
+                </enumeration>
+                <enumeration value="IPv6">
+                  <description>
+                    Use IPv6 for the requests.
+                  </description>
+                </enumeration>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="EnableIndividualPacketResults" dmr:version="2.9">
+            <description>
+              The results must be returned in the {{object|IndividualPacketResult}} table for every repetition of the test when set to {{true}}. The default value SHOULD be {{false}}.
+            </description>
+            <syntax>
+              <boolean/>
+            </syntax>
+          </parameter>
+        </input>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <parameter name="IPAddressUsed" dmr:version="2.9">
+            <description>
+              Indicates which IP address was used to send the request.
+            </description>
+            <syntax>
+              <dataType ref="IPAddress"/>
+            </syntax>
+          </parameter>
+          <parameter name="SuccessCount" dmr:version="2.9">
+            <description>
+              Result parameter indicating the number of successful packets (those in which a successful response was received prior to the timeout) in the most recent test.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="FailureCount" dmr:version="2.9">
+            <description>
+              Result parameter indicating the number of failed packets (those in which a successful response was not received prior to the timeout) in the most recent test.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="AverageResponseTime" dmr:version="2.9">
+            <description>
+              Result parameter indicating the average response time in {{units}} over all repetitions with successful responses of the most recent test. If there were no successful responses, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="microseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="MinimumResponseTime" dmr:version="2.9">
+            <description>
+              Result parameter indicating the minimum response time in {{units}} over all repetitions with successful responses of the most recent test. If there were no successful responses, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="microseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="MaximumResponseTime" dmr:version="2.9">
+            <description>
+              Result parameter indicating the maximum response time in {{units}} over all repetitions with successful responses of the most recent test. If there were no successful responses, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="microseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <object name="IndividualPacketResult.{i}." minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+            <description>
+              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>
+            <parameter name="PacketSuccess" dmr:version="2.9">
+              <description>
+                Indicates that the response to this UDP Echo Plus packet sent was received by the client. When this value is {{true}}, then all the remaining parameters in this instance are valid. Otherwise only the values originally set by the CPE client (e.g. {{param|PacketSendTime}} and {{param|TestGenSN}}) MAY be set to valid values.
+              </description>
+              <syntax>
+                <boolean/>
+              </syntax>
+            </parameter>
+            <parameter name="PacketSendTime" dmr:version="2.9">
+              <description>
+                Time the client sent this UDP Echo Plus packet in UTC, which MUST be specified to microsecond precision.
+                For example: 2008-04-09T15:01:05.123456Z
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="PacketReceiveTime" dmr:version="2.9">
+              <description>
+                Time the client receives the response packet in UTC, which MUST be specified to microsecond precision.
+                For example: 2008-04-09T15:01:05.123456Z
+                If this response is never received, {{param}} SHOULD be set to the Unknown Time value as specified in {{bibref|TR-106a7|Section 3.2.2}}.
+              </description>
+              <syntax>
+                <dateTime/>
+              </syntax>
+            </parameter>
+            <parameter name="TestGenSN" dmr:version="2.9">
+              <description>
+                The TestGenSN field in the UDPEcho Plus packet {{bibref|TR-143a1|Section A.1.4}} sent by the CPE client.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="TestRespSN" dmr:version="2.9">
+              <description>
+                The TestRespSN field in the response packet {{bibref|TR-143a1|Section A.1.4}} from the UDP Echo Plus server (i.e. {{param|#.Host}}) for this Echo Plus packet sent by the CPE client. If {{param|PacketSuccess}} is {{false}}, {{param}} SHOULD be 0.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+            <parameter name="TestRespRcvTimeStamp" dmr:version="2.9">
+              <description>
+                The TestRespRcvTimeStamp field in the response packet {{bibref|TR-143a1|Section A.1.4}} from the UDP Echo Plus server (i.e. {{param|#.Host}}) to record the reception time of this UDP Echo Plus packet sent from the CPE client. If {{param|PacketSuccess}} is {{false}}, {{param}} SHOULD be 0.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="microseconds"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="TestRespReplyTimeStamp" dmr:version="2.9">
+              <description>
+                The TestRespReplyTimeStamp field in the response packet {{bibref|TR-143a1|Section A.1.4}} from the UDP Echo Plus server (i.e. {{param|#.Host}}) to record the server reply time of this UDP Echo Plus packet sent from the CPE client.
+                That is, the time that the server returned the UDP Echo Plus packet. If {{param|PacketSuccess}} is {{false}}, {{param}} SHOULD be 0.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="microseconds"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+            <parameter name="TestRespReplyFailureCount" dmr:version="2.9">
+              <description>
+                The count value that was set by the UDP Echo Plus server (i.e. {{param|#.Host}}) to record the number of dropped echo response packets by the server. This count is incremented if a valid echo request packet is received at a UDP EchoPlus server but for some reason cannot be responded to (e.g. due to local buffer overflow, CPU utilization, etc...).  If {{param|PacketSuccess}} is {{false}}, {{param}} SHOULD be 0.
+              </description>
+              <syntax>
+                <unsignedInt/>
+              </syntax>
+            </parameter>
+          </object>
+        </output>
+      </command>
+      <command name="ServerSelectionDiagnostics()" async="true" dmr: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 dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Interface" dmr:version="2.9">
+            <description>
+              {{reference|the IP-layer interface over which the test is to be performed|ignore}} Example: Device.IP.Interface.1
+              If {{empty}} is specified, the CPE MUST use the interface as directed by its routing policy (''Forwarding'' table entries) to determine the appropriate interface.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+                <pathRef refType="strong" targetParent=".WANDevice.{i}.WANConnectionDevice.{i}.WANIPConnection. .WANDevice.{i}.WANConnectionDevice.{i}.WANPPPConnection. .IP.Interface." targetType="row"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="ProtocolVersion" dmr:version="2.9">
+            <description>
+              Indicates the IP protocol version to be used.
+            </description>
+            <syntax>
+              <string>
+                <enumeration value="Any">
+                  <description>
+                    Use either IPv4 or IPv6 depending on the system preference.
+                  </description>
+                </enumeration>
+                <enumeration value="IPv4">
+                  <description>
+                    Use IPv4 for the requests.
+                  </description>
+                </enumeration>
+                <enumeration value="IPv6">
+                  <description>
+                    Use IPv6 for the requests.
+                  </description>
+                </enumeration>
+              </string>
+              <default type="factory" value="Any"/>
+            </syntax>
+          </parameter>
+          <parameter name="Protocol" dmr:version="2.9">
+            <description>
+              The protocol over which the test is to be performed.
+            </description>
+            <syntax>
+              <string>
+                <enumeration value="ICMP"/>
+                <enumeration value="UDP Echo"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="HostList" dmr:version="2.9">
+            <description>
+              Each entry is a Host name or address of a host to ping.
+            </description>
+            <syntax>
+              <list maxItems="10"/>
+              <string>
+                <size maxLength="256"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="NumberOfRepetitions" dmr:version="2.9">
+            <description>
+              Number of repetitions of the ping test to perform for each {{param|HostList}} entry before reporting the results.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="Timeout" dmr:version="2.9">
+            <description>
+              Timeout in {{units}} for each iteration of the ping test where the total number of iterations is the value of {{param|NumberOfRepetitions}} times the number of entities in the {{param|HostList}} Parameter.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <range minInclusive="1"/>
+                <units value="milliseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+        </input>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <parameter name="FastestHost" dmr:version="2.9">
+            <description>
+              Result parameter indicating the Host (one of the items within the {{param|HostList}} Parameter) with the smallest average response time.
+            </description>
+            <syntax>
+              <string/>
+            </syntax>
+          </parameter>
+          <parameter name="MinimumResponseTime" dmr:version="2.9">
+            <description>
+              Result parameter indicating the minimum response time in {{units}} over all repetitions with successful responses of the most recent ping test for the Host identified in {{param|FastestHost}}. Success is defined by the underlying protocol used.   If there were no successful responses across all Hosts, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="microseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="AverageResponseTime" dmr:version="2.9">
+            <description>
+              Result parameter indicating the average response time in {{units}} over all repetitions with successful responses of the most recent ping test for the Host identified in {{param|FastestHost}}. Success is defined by the underlying protocol used.   If there were no successful responses across all Hosts, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="microseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="MaximumResponseTime" dmr:version="2.9">
+            <description>
+              Result parameter indicating the maximum response time in {{units}} over all repetitions with successful responses of the most recent ping test for the Host identified in {{param|FastestHost}}. Success is defined by the underlying protocol used.   If there were no successful responses across all Hosts, this value MUST be zero.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="microseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="IPAddressUsed" dmr:version="2.9">
+            <description>
+              Indicates which IP address was used to send the request to the host identified in {{param|FastestHost}}.
+            </description>
+            <syntax>
+              <dataType ref="IPAddress"/>
+            </syntax>
+          </parameter>
+        </output>
+      </command>
+    </object>
+    <object name="Device.IP.Diagnostics.UDPEchoConfig." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object allows the CPE to be configured to perform the UDP Echo Service defined in {{bibref|RFC862}} and UDP Echo Plus Service defined in {{bibref|TR-143|Appendix A.1}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          MUST be enabled to receive UDP echo. When enabled from a disabled state all related timestamps, statistics and UDP Echo Plus counters are cleared.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference|IP-layer interface over which the CPE MUST listen and receive UDP echo requests on}}
+          The value of this parameter MUST be either a valid interface or {{empty}}.  An attempt to set this parameter to a different value MUST be rejected as an invalid parameter value.
+          If {{empty}} is specified, the CPE MUST listen and receive UDP echo requests on all interfaces.
+          Note: Interfaces behind a NAT MAY require port forwarding rules configured in the Gateway to enable receiving the UDP packets.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIPAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          The Source IP address of the UDP echo packet. The CPE MUST only respond to a UDP echo from this source IP address.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="UDPPort" access="readWrite" dmr:version="2.0">
+        <description>
+          The UDP port on which the UDP server MUST listen and respond to UDP echo requests.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="EchoPlusEnabled" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{true}} the CPE will perform necessary packet processing for UDP Echo Plus packets.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EchoPlusSupported" access="readOnly" dmr:version="2.0">
+        <description>
+          {{true}} if UDP Echo Plus is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Incremented upon each valid UDP echo packet received.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsResponded" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Incremented for each UDP echo response sent.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The number of UDP received bytes including payload and UDP header after the UDPEchoConfig is enabled.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesResponded" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The number of UDP responded bytes, including payload and UDP header sent after the UDPEchoConfig is enabled.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TimeFirstPacketReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456,
+          The time that the server receives the first UDP echo packet after the UDPEchoConfig is enabled.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="TimeLastPacketReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Time in UTC, which MUST be specified to microsecond precision.
+          For example: 2008-04-09T15:01:05.123456
+          The time that the server receives the most recent UDP echo packet.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LLDP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object contains Link Layer Discovery Protocol (LLDP) {{bibref|802.1AB-2009}} related objects and parameters.
+      </description>
+    </object>
+    <object name="Device.LLDP.Discovery." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object is used for managing the discovery of LLDP devices.
+        The CPE MAY, but need not, retain some or all of the information in this object across reboot.
+      </description>
+      <parameter name="DeviceNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LLDP.Discovery.Device.{i}." access="readOnly" numEntriesParameter="DeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        This table contains information about discovered LLDP devices.
+      </description>
+      <uniqueKey>
+        <parameter ref="ChassisIDSubtype"/>
+        <parameter ref="ChassisID"/>
+      </uniqueKey>
+      <parameter name="Interface" access="readOnly" dmr:version="2.8">
+        <description>
+          {{reference|the interface via which the LLDP device was discovered}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ChassisIDSubtype" access="readOnly" dmr:version="2.8">
+        <description>
+          The chassis identifier subtype, which is included in the value of the ''LLDPDU's'' Chassis ID TLV (TLV Type = 1).  The following subtype values are defined:
+          * ''0'' (Reserved)
+          * ''1'' (Chassis component)
+          * ''2'' (Interface alias)
+          * ''3'' (Port component)
+          * ''4'' (MAC address)
+          * ''5'' (Network address)
+          * ''6'' (Interface name)
+          * ''7'' (Locally assigned)
+          * ''8-255'' (Reserved)
+          Note: It is assumed that this integer might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, the Chassis ID is set to the representative MAC address (chassis ID subtype = 4) for ''HTIP-Ethernet Bridge''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ChassisID" access="readOnly" dmr:version="2.8">
+        <description>
+          The chassis identifier, which is included in the value of the ''LLDPDU's'' Chassis ID TLV (TLV Type = 1).
+          Note: It is assumed that this string might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, the Chassis ID is set to the representative MAC address. If ''LLDPDU''s are sent and received from two or more LLDP agents of the same ''HTIP-Ethernet Bridge'', this value is same in all ''LLDPDU''s.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="1" maxLength="255"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.8">
+        <description>
+          {{list}}Indicates the full path names of all Host table entries, whether active or inactive, that correspond to this device.
+          When the entries are added to or removed from the Host tables, the value of this parameter MUST be updated accordingly.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".Hosts.Host." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PortNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LLDP.Discovery.Device.{i}.Port.{i}." access="readOnly" numEntriesParameter="PortNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        This table contains information about ports on discovered LLDP devices.
+      </description>
+      <uniqueKey>
+        <parameter ref="PortIDSubtype"/>
+        <parameter ref="PortID"/>
+      </uniqueKey>
+      <parameter name="PortIDSubtype" access="readOnly" dmr:version="2.8">
+        <description>
+          The port identifier subtype, which is included in the value of the ''LLDPDU's'' Port ID TLV (TLV Type = 2).  The following subtype values are defined:
+          * ''0'' (Reserved)
+          * ''1'' (Interface alias)
+          * ''2'' (Port component)
+          * ''3'' (MAC address)
+          * ''4'' (Network address)
+          * ''5'' (Interface name)
+          * ''6'' (Agent circuit ID)
+          * ''7'' (Locally assigned)
+          * ''8-255'' (Reserved)
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PortID" access="readOnly" dmr:version="2.8">
+        <description>
+          The port identifier, which is included in the value of the ''LLDPDU's'' Port ID TLV (TLV Type = 2).
+        </description>
+        <syntax>
+          <string>
+            <size minLength="1" maxLength="255"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TTL" access="readOnly" dmr:version="2.8">
+        <description>
+          The ''LLDPDU'' lifetime (in {{units}}), which is the value of the latest TimeToLive TLV (TLV Type = 3).
+          If this value is 0, it means that the LLDP agent or the MAC service function of the port is stopped.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PortDescription" access="readOnly" dmr:version="2.8">
+        <description>
+          The port description, which is the value of the latest Port Description TLV (TLV Type = 4), or {{empty}} if no Port Description TLV has been received.
+          Note: It is assumed that this string might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, the parameter value is likely to be one of the names defined in {{bibref|JJ-300.00|Appendix A (''List of Interface Standard Names'')}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MACAddressList" access="readOnly" dmr:version="2.8">
+        <description>
+          The device's MAC addresses, which are included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127), or {{empty}} if no list of MAC addresses has been received.
+          The parameter is relevant when there is a LLDP device which has a MAC copy function and has two or more MAC addresses.
+          Note: It is assumed that it might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, the {{bibref|OUI}} in the third octet is E0271A (''TTC-OUI'') and the organizationally defined subtype in the sixth octet is 3 (''MAC Address List'').
+        </description>
+        <syntax>
+          <list maxItems="255"/>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" dmr:version="2.8">
+        <description>
+          The date and time at which the last LLDPDU was received for this ({{object|#}},{{object}}).
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LLDP.Discovery.Device.{i}.Port.{i}.LinkInformation." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        The port's link information, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127).
+        Note: It is assumed that this object might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, the {{bibref|OUI}} in the third octet is E0271A (''TTC-OUI'') and the organizationally defined subtype in the sixth octet is 2 (''Link Information'').
+      </description>
+      <parameter name="InterfaceType" access="readOnly" dmr:version="2.8">
+        <description>
+          The port's interface type, or 0 if no interface type has been received.
+          Note: It is assumed that it might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, it's an IANA interface type {{bibref|IANAifType}}.
+          For example, IANAifType defines the following interface types for wired line (UTP cable), wireless line, power line, and coaxial cable:
+          * ''6'' (Wired line)
+          * ''71'' (Wireless)
+          * ''174'' (PLC)
+          * ''236'' (Coaxial cable)
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MACForwardingTable" access="readOnly" dmr:version="2.8">
+        <description>
+          The port's MAC forwarding table, or the value is {{empty}} if no forwarding table was supplied.
+        </description>
+        <syntax>
+          <list maxItems="255"/>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LLDP.Discovery.Device.{i}.DeviceInformation." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        The device information, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127).
+        Note: It is assumed that this object might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, this table contains the Organizationally Specific TLV (TLV Type = 127) of ''LLDPDU'', in which the {{bibref|OUI}} in the third octet is E0271A (''TTC-OUI'') and the organizationally defined subtype in the sixth octet is 1 (''Device Information'').
+      </description>
+      <parameter name="DeviceCategory" access="readOnly" dmr:version="2.8">
+        <description>
+          Each list item indicates a device category (e.g."AV_TV" and "AV_Recorder"), or the value is {{empty}} if no device categories were provided.
+          Note: It is assumed that this list might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. Standard HTIP device categories are defined in {{bibref|JJ-300.01}}. In this case, the maximum length of the list is 127 and of each item is 31, and any non-HTIP device categories SHOULD NOT conflict with standard HTIP device categories.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerOUI" access="readOnly" dmr:version="2.8">
+        <description>
+          The manufacturer OUI, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127), or {{empty}} if no manufacturer OUI was provided.
+          {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <size minLength="0" maxLength="6"/>
+            <pattern value="">
+              <description>
+                {{empty}}
+              </description>
+            </pattern>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModelName" access="readOnly" dmr:version="2.8">
+        <description>
+          The model name, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127), or {{empty}} if no model name was provided.
+          Note: It is assumed that this string might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="31"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModelNumber" access="readOnly" dmr:version="2.8">
+        <description>
+          The model number, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127), or {{empty}} if no model number was provided.
+          Note: It is assumed that this string might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="31"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorSpecificNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LLDP.Discovery.Device.{i}.DeviceInformation.VendorSpecific.{i}." access="readOnly" numEntriesParameter="VendorSpecificNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        The vendor-specific device information, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127).
+        {{keys}}
+        Note: It is assumed that this object might be used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. In this case, this table contains the Organizationally Specific TLV (TLV Type = 127) of ''LLDPDU'', in which the {{bibref|OUI}} in the third octet is E0271A (''TTC-OUI''), the organizationally defined subtype in the sixth octet is 1 (''Device Information''), and the device information ID in the seventh octet is 255 (''Vendor-specific extension field'').
+      </description>
+      <uniqueKey>
+        <parameter ref="OrganizationCode"/>
+        <parameter ref="InformationType"/>
+      </uniqueKey>
+      <parameter name="OrganizationCode" access="readOnly" dmr:version="2.8">
+        <description>
+          The vendor-specific organization code, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127).
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InformationType" access="readOnly" dmr:version="2.8">
+        <description>
+          The vendor-specific device information type, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Information" access="readOnly" dmr:version="2.8">
+        <description>
+          The vendor-specific device information, which is included in the value of the ''LLDPDU's'' Organizationally Specific TLV (TLV Type = 127).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="248"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.5">
+      <description>
+        IPsec {{bibref|RFC4301}} object that supports the configuration of Encapsulating Security Payload (ESP) {{bibref|RFC4303}} and Authentication Header (AH) {{bibref|RFC4302}} in tunnel mode {{bibref|RFC4301|Section 3.2}}.
+        Use of IKEv2 {{bibref|RFC5996}} is assumed.  The IPsec object does not currently support static configuration of tunnels and child Security Associations (SAs).
+        See the IPsec Theory of Operation {{bibref|TR-181i2a5|Appendix IX}} for a description of the working of this IPsec data model.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.5">
+        <description>
+          Enables or disables IPsec.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.5">
+        <description>
+          IPsec status.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AHSupported" access="readOnly" dmr:version="2.5">
+        <description>
+          Indicates whether or not Authentication Header (AH) {{bibref|RFC4302}} is supported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2SupportedEncryptionAlgorithms" access="readOnly" dmr:version="2.5">
+        <description>
+          Supported IKEv2 encryption algorithms {{bibref|IKEv2-params|Transform Type 1}}.  {{enum}}
+          Note that these are the names from the above reference, transformed as follows:
+          * Leading ''ENCR_'' (when present) discarded because they are all encryption algorithms so it's not needed.
+          * Underscores changed to hyphens to preserve names used in existing data models (and because of inconsistent conventions).
+          * Phrases collapsed where unambiguous, e.g. "with a(n) NN octet ICV" -&gt; "-NN".
+          As additional algorithms are added to the above reference, this data model will be extended according to the above conventions.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="DES"/>
+            <enumeration value="3DES"/>
+            <enumeration value="RC5"/>
+            <enumeration value="IDEA"/>
+            <enumeration value="CAST"/>
+            <enumeration value="BLOWFISH"/>
+            <enumeration value="3IDEA"/>
+            <enumeration value="AES-CBC"/>
+            <enumeration value="AES-CTR"/>
+            <enumeration value="AES-CCM-8"/>
+            <enumeration value="AES-CCM-12"/>
+            <enumeration value="AES-CCM-16"/>
+            <enumeration value="AES-GCM-8"/>
+            <enumeration value="AES-GCM-12"/>
+            <enumeration value="AES-GCM-16"/>
+            <enumeration value="CAMELLIA-CBC"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ESPSupportedEncryptionAlgorithms" access="readOnly" dmr:version="2.5">
+        <description>
+          Supported ESP encryption algorithms {{bibref|IKEv2-params|Transform Type 1}} {{bibref|RFC4835|Section 3.1.1}}.  {{enum}}
+          Note that these are the names from the above reference, transformed as follows:
+          * Leading ''ENCR_'' (when present) discarded because they are all encryption algorithms so it's not needed.
+          * Underscores changed to hyphens to preserve names used in existing data models (and because of inconsistent conventions).
+          * Phrases collapsed where unambiguous, e.g. "with a(n) NN octet ICV" -&gt; "-NN".
+          * Some algorithms with apparently rather specialised application are omitted, e.g. ''ENCR_NULL_AUTH_AES_GMAC''.
+          As additional algorithms are added to the above reference, this data model will be extended according to the above conventions.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="NULL"/>
+            <enumeration value="DES-IV64"/>
+            <enumeration value="DES"/>
+            <enumeration value="3DES"/>
+            <enumeration value="RC5"/>
+            <enumeration value="IDEA"/>
+            <enumeration value="CAST"/>
+            <enumeration value="BLOWFISH"/>
+            <enumeration value="3IDEA"/>
+            <enumeration value="DES-IV32"/>
+            <enumeration value="AES-CBC"/>
+            <enumeration value="AES-CTR"/>
+            <enumeration value="AES-CCM-8"/>
+            <enumeration value="AES-CCM-12"/>
+            <enumeration value="AES-CCM-16"/>
+            <enumeration value="AES-GCM-8"/>
+            <enumeration value="AES-GCM-12"/>
+            <enumeration value="AES-GCM-16"/>
+            <enumeration value="NULL-AUTH-AES-GMAC"/>
+            <enumeration value="CAMELLIA-CBC"/>
+            <enumeration value="CAMELLIA-CTR"/>
+            <enumeration value="CAMELLIA-CCM-8"/>
+            <enumeration value="CAMELLIA-CCM-12"/>
+            <enumeration value="CAMELLIA-CCM-16"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2SupportedPseudoRandomFunctions" access="readOnly" dmr:version="2.5">
+        <description>
+          Supported IKEv2 pseudo-random functions {{bibref|IKEv2-params|Transform Type 2}}.  {{enum}}
+          Note that these are the names from the above reference, transformed as follows:
+          * Leading ''PRF_'' (when present) discarded because they all pseudo-random functions so it's not needed.
+          * Underscores changed to hyphens to preserve names used in existing data models.
+          * Hyphen inserted after ''AES'' (or other acronym) when immediately followed by a key length.
+          As additional functions are added to the above reference, this data model will be extended according to the above conventions.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="HMAC-MD5"/>
+            <enumeration value="HMAC-SHA1"/>
+            <enumeration value="HMAC-TIGER"/>
+            <enumeration value="AES-128-XCBC"/>
+            <enumeration value="HMAC-SHA2-256"/>
+            <enumeration value="HMAC-SHA2-384"/>
+            <enumeration value="HMAC-SHA2-512"/>
+            <enumeration value="AES-128-CMAC"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedIntegrityAlgorithms" access="readOnly" dmr:version="2.5">
+        <description>
+          Supported integrity algorithms {{bibref|IKEv2-params|Transform Type 3}}.  {{enum}}
+          Note that these are the names from the above reference, transformed as follows:
+          * Leading ''AUTH_'' (when present) discarded because they all authentication (integrity) algorithms so it's not needed.
+          * Underscores changed to hyphens to preserve names used in existing data models.
+          As additional algorithms are added to the above reference, this data model will be extended according to the above conventions.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="NONE"/>
+            <enumeration value="HMAC-MD5-96"/>
+            <enumeration value="HMAC-SHA1-96"/>
+            <enumeration value="DES-MAC"/>
+            <enumeration value="KPDK-MD5"/>
+            <enumeration value="AES-XCBC-96"/>
+            <enumeration value="HMAC-MD5-128"/>
+            <enumeration value="HMAC-SHA1-160"/>
+            <enumeration value="AES-CMAC-96"/>
+            <enumeration value="AES-128-GMAC"/>
+            <enumeration value="AES-192-GMAC"/>
+            <enumeration value="AES-256-GMAC"/>
+            <enumeration value="HMAC-SHA2-256-128"/>
+            <enumeration value="HMAC-SHA2-256-192"/>
+            <enumeration value="HMAC-SHA2-256-256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedDiffieHellmanGroupTransforms" access="readOnly" dmr:version="2.5">
+        <description>
+          Supported Diffie-Hellman group transforms {{bibref|IKEv2-params|Transform Type 4}}.  {{enum}}
+          Note that these are the names from the above reference, transformed as follows:
+          * Name (other than ''NONE'') always starts with the type of group, currently ''MODP'' or ''ECP'' (implies ECP random).
+          * This is followed by ''-NN'', where ''NN'' is the group length in bits.
+          * this is followed by ''-PRIME-NN'' for groups with prime order subgroups, where ''NN'' is the subgroup length in bits.
+          As additional algorithms are added to the above reference, this data model will be extended according to the above conventions.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="NONE"/>
+            <enumeration value="MODP-768"/>
+            <enumeration value="MODP-1024"/>
+            <enumeration value="MODP-1536"/>
+            <enumeration value="MODP-2048"/>
+            <enumeration value="MODP-3072"/>
+            <enumeration value="MODP-4096"/>
+            <enumeration value="MODP-6144"/>
+            <enumeration value="MODP-8192"/>
+            <enumeration value="ECP-256"/>
+            <enumeration value="ECP-384"/>
+            <enumeration value="ECP-521"/>
+            <enumeration value="MODP-1024-PRIME-160"/>
+            <enumeration value="MODP-2048-PRIME-224"/>
+            <enumeration value="MODP-2048-PRIME-256"/>
+            <enumeration value="ECP-192"/>
+            <enumeration value="ECP-224"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxFilterEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          The maximum number of entries in the {{object|Filter}} table.
+          A value of 0 means no specific limit.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxProfileEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          The maximum number of entries in the {{object|Profile}} table.
+          A value of 0 means no specific limit.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FilterNumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ProfileNumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TunnelNumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2SANumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.5">
+      <description>
+        Global IPsec statistics.  These statistics include all IPsec traffic, i.e. all IKEv2 negotiation, IKEv2 SAs and child SAs.
+        The CPE MUST reset global IPsec Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when IPsec is disabled ({{param|.IPsec.Enable}} is set to {{false}}) or when IPsec is enabled ({{param|.IPsec.Enable}} is set to {{true}}).
+      </description>
+      <parameter name="NegotiationFailures" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of times an IPsec negotiation failure has occurred.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} sent by IPsec.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} received by IPsec.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} sent by IPsec.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} received by IPsec.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} discarded by IPsec due to any error.  This can include packets dropped due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownSPIErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} discarded by IPsec due to an unknown SPI (Security Parameter Index).
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DecryptionErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} discarded by IPsec due to ESP decryption errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="IntegrityErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} discarded by IPsec due to integrity errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ReplayErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} discarded by IPsec due to replay errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PolicyErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} discarded by IPsec due to policy errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="OtherReceiveErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} discarded by IPsec due to errors other than unknown SPI, decryption, integrity, replay or policy errors. This can include packets dropped due to a lack of receive buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.Filter.{i}." access="readWrite" numEntriesParameter="FilterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.5">
+      <description>
+        Filter table that represents the IPsec Security Policy Database (SPD) {{bibref|RFC4301|Section 4.4.1}} selection criteria.  Each (ordered) entry defines a set of selection criteria and references a {{object|#.Profile}} table entry that specifies how matching packets will be processed.
+        SPD filtering is performed for all packets that might need to cross the IPsec boundary {{bibref|RFC4301|Section 3.1}}.  Given that IPsec operates at the IP level, this means that SPD filtering conceptually occurs after bridging and before routing.
+        For enabled table entries, if {{param|Interface}} is not a valid reference and {{param|AllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.5">
+        <description>
+          Enables or disables this IPsec Filter table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.5">
+        <description>
+          The status of this IPsec Filter table entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.5">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each packet, the highest ordered entry that matches the filter criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.5">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion. {{reference}}
+          This specifies the ingress interface associated with the entry.  It MAY be a layer 1, 2 or 3 interface.  However, the types of interfaces for which filters can be instantiated is a local matter to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllInterfaces" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          This specifies that all ingress interfaces are associated with the entry.  If {{true}}, the value of {{param|Interface}} is ignored since all ingress interfaces are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIP" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          Destination IP address.  {{empty}} indicates this criterion is not used, i.e. is ''ANY''.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMask" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          Destination IP address mask.  If not {{empty}}, only the indicated network portion of the {{param|DestIP}} address is to be used for selection.  {{empty}} indicates that the full {{param|DestIP}} address is to be used for selection.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIPExclude" access="readWrite" dmr:version="2.5">
+        <description>
+          If {{false}}, the rule matches only those packets that match the (masked) {{param|DestIP}} entry, if specified.
+          If {{true}}, the rule matches all packets except those that match the (masked) {{param|DestIP}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIP" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          Source IP address.  {{empty}} indicates this criterion is not used, i.e. is ''ANY''.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMask" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          Source IP address mask.  If not {{empty}}, only the indicated network portion of the {{param|SourceIP}} address is to be used for selection.  {{empty}} indicates that the full {{param|SourceIP}} address is to be used for selection.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIPExclude" access="readWrite" dmr:version="2.5">
+        <description>
+          If {{false}}, the rule matches only those packets that match the (masked) {{param|SourceIP}} entry, if specified.
+          If {{true}}, the rule matches all packets except those that match the (masked) {{param|SourceIP}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          Protocol number.  A value of -1 indicates this criterion is not used, i.e. is ''ANY''.
+          Note that {{bibref|RFC4301}} refers to this as the ''Next Layer Protocol''.  It is obtained from the IPv4 ''Protocol'' or the IPv6 ''Next Header'' fields.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="255"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolExclude" access="readWrite" dmr:version="2.5">
+        <description>
+          If {{false}}, the rule matches only those packets that match {{param|Protocol}}, if specified.
+          If {{true}}, the rule matches all packets except those that match {{param|Protocol}}, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPort" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          Destination port number.  A value of -1 indicates this criterion is not used, i.e. is ''ANY''.
+          The value of this parameter is ignored for protocols that do not use ports, e.g. ICMP (1).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortRangeMax" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          If specified, indicates a destination port address range from {{param|DestPort}} through {{param}} (inclusive), in which case {{param}} MUST be greater than or equal to {{param|DestPort}}.
+          A value of -1 indicates that no destination port range is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortExclude" access="readWrite" dmr:version="2.5">
+        <description>
+          If {{false}}, the rule matches only those packets that match {{param|DestPort}} (or port range), if specified.
+          If {{true}}, the rule matches all packets except those that match {{param|DestPort}} (or port range), if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePort" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          Source port number.  A value of -1 indicates this criterion is not used, i.e. is ''ANY''.
+          The value of this parameter is ignored for protocols that do not use ports, e.g. ICMP (1).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortRangeMax" access="readWrite" dmr:version="2.5">
+        <description>
+          SPD selection criterion.
+          If specified, indicates a source port address range from {{param|SourcePort}} through {{param}} (inclusive), in which case {{param}} MUST be greater than or equal to {{param|SourcePort}}.
+          A value of -1 indicates that no source port range is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortExclude" access="readWrite" dmr:version="2.5">
+        <description>
+          If {{false}}, the rule matches only those packets that match {{param|SourcePort}} (or port range), if specified.
+          If {{true}}, the rule matches all packets except those that match {{param|SourcePort}} (or port range), if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProcessingChoice" access="readWrite" dmr:version="2.5">
+        <description>
+          Indicates how packets that match this rule will be processed {{bibref|RFC4301|Section 4.4.1}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Discard">
+              <description>
+                Packet is not allowed to traverse the IPsec boundary; packet will be discarded
+              </description>
+            </enumeration>
+            <enumeration value="Bypass">
+              <description>
+                Packet is allowed to bypass traverse the IPsec boundary without protection
+              </description>
+            </enumeration>
+            <enumeration value="Protect">
+              <description>
+                Packet is afforded protection as specified by {{param|Profile}}
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Bypass"/>
+        </syntax>
+      </parameter>
+      <parameter name="Profile" access="readWrite" dmr:version="2.5">
+        <description>
+          The profile that defines the IPsec treatment for matching packets.  {{reference}}
+          If {{param|ProcessingChoice}} is {{enum|Protect|ProcessingChoice}}, {{param}} MUST NOT be {{empty}}.  In this case, if it ever becomes {{empty}}, e.g. because the referenced profile is deleted, this IPsec Filter table entry is invalid and {{param|Status}} MUST be set to {{enum|Error_Misconfigured|Status}}.
+          If {{param|ProcessingChoice}} is not {{enum|Protect|ProcessingChoice}}, {{param}} is ignored.
+          Any changes to the referenced profile will have an immediate effect on any established IPsec tunnels.  Such changes will often force IKEv2 sessions and child SAs to be re-established.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.Profile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.Profile.{i}." access="readWrite" numEntriesParameter="ProfileNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.5">
+      <description>
+        Profile table that represents the IPsec Security Policy Database (SPD) {{bibref|RFC4301|Section 4.4.1}} processing info.  Each entry defines the IPsec treatment for packets that match the {{object|#.Filter}} entries that reference the entry.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.5">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxChildSAs" access="readWrite" dmr:version="2.5">
+        <description>
+          Controls the maximum number of child Security Association (SA) pairs that can be negotiated by a single IKEv2 session.
+          If a new child SA pair is needed, but the current IKEv2 session already has {{param}} child SA pairs, an additional IKEv2 session (and therefore an additional IPsec tunnel) will be established.
+          A value of 0 means no specific limit.
+          Note that support for more than one child SA pair per IKEv2 session is OPTIONAL {{bibref|RFC5996|Section 1.3}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteEndpoints" access="readWrite" dmr:version="2.5">
+        <description>
+          The host name or IP address of the remote IPsec tunnel endpoint.  If more than one name/address is supplied, they will be tried in turn, i.e. they are in decreasing order of precedence.
+        </description>
+        <syntax>
+          <list maxItems="4"/>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingPolicy" access="readWrite" dmr:version="2.5">
+        <description>
+          Identifier of the forwarding policy associated with traffic that is associated with this profile.
+          The forwarding policy can be referenced by entries in the {{object|##.Routing.Router.{i}.IPv4Forwarding}} and {{object|##.Routing.Router.{i}.IPv6Forwarding}} tables, and therefore allows SPD selection criteria to influence the forwarding decision.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.5">
+        <description>
+          The "child" security protocol.
+          This is not to be confused with {{object|#.Filter}}.{{param|#.Filter.{i}.Protocol}}, which is an SPD selector that can select packets that already have AH or ESP headers.  {{object}}.{{param}} selects whether AH or ESP will be used when encapsulating a packet.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AH">
+              <description>
+                Authentication Header {{bibref|RFC4302}}; can only be selected if {{param|#.AHSupported}} is {{true}}
+              </description>
+            </enumeration>
+            <enumeration value="ESP">
+              <description>
+                Encapsulating Security Payload {{bibref|RFC4303}}
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="ESP"/>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2AuthenticationMethod" access="readWrite" dmr:version="2.5">
+        <description>
+          IKEv2 CPE authentication method {{bibref|RFC5996|Section 2.15}}. {{reference|an enabled row in the {{object|.Security.Certificate}} table or in another table that contains appropriate CPE credentials}}
+          If {{empty}}, or the referenced row is disabled or deleted, the CPE chooses the authentication method based on local policy.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2AllowedEncryptionAlgorithms" access="readWrite" dmr:version="2.5">
+        <description>
+          Allowed IKEv2 encryption algorithms.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam=".IPsec.IKEv2SupportedEncryptionAlgorithms"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ESPAllowedEncryptionAlgorithms" access="readWrite" dmr:version="2.5">
+        <description>
+          Allowed ESP encryption algorithms.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam=".IPsec.ESPSupportedEncryptionAlgorithms"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2AllowedPseudoRandomFunctions" access="readWrite" dmr:version="2.5">
+        <description>
+          Allowed IKEv2 pseudo-random functions.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam=".IPsec.IKEv2SupportedPseudoRandomFunctions"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2AllowedIntegrityAlgorithms" access="readWrite" dmr:version="2.5">
+        <description>
+          Allowed IKEv2 integrity algorithms.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam=".IPsec.SupportedIntegrityAlgorithms"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AHAllowedIntegrityAlgorithms" access="readWrite" dmr:version="2.5">
+        <description>
+          Allowed AH integrity algorithms {{bibref|IKEv2-params|Transform Type 3}} {{bibref|RFC4835|Section 3.2}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam=".IPsec.SupportedIntegrityAlgorithms"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ESPAllowedIntegrityAlgorithms" access="readWrite" dmr:version="2.5">
+        <description>
+          Allowed ESP integrity algorithms {{bibref|IKEv2-params|Transform Type 3}} {{bibref|RFC4835|Section 3.1.1}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam=".IPsec.SupportedIntegrityAlgorithms"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2AllowedDiffieHellmanGroupTransforms" access="readWrite" dmr:version="2.5">
+        <description>
+          Allowed IKEv2 Diffie-Hellman group transforms.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumerationRef targetParam=".IPsec.SupportedDiffieHellmanGroupTransforms"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2DeadPeerDetectionTimeout" access="readWrite" dmr:version="2.5">
+        <description>
+          IKEv2 Dead Peer Detection (DPD) timeout in {{units}}.  {{bibref|RFC5996|section 2.4}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2NATTKeepaliveTimeout" access="readWrite" dmr:version="2.5">
+        <description>
+          IKEv2 NAT traversal (NAT-T) keepalive timeout in {{units}}.  {{bibref|RFC3948|Section 4}}
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AntiReplayWindowSize" access="readWrite" dmr:version="2.5">
+        <description>
+          The size of the AH or ESP Anti-Replay Window.  {{bibref|RFC4302|Section B.2}} {{bibref|RFC4303|Section A2}}
+          A value of 0 means that Sequence Number Verification is disabled.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DoNotFragment" access="readWrite" dmr:version="2.5">
+        <description>
+          Controls the value of the ''Do Not Fragment'' (DF) bit.  {{bibref|RFC4301|Section 8.1}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Set"/>
+            <enumeration value="Clear"/>
+            <enumeration value="Copy">
+              <description>
+                Copy from inner header; applies only when both inner and outer headers are IPv4
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMarkPolicy" access="readWrite" dmr:version="2.5">
+        <description>
+          DSCP with which to mark the outer IP header for traffic that is associated with this IPsec channel.
+          A value of -1 indicates copy from the incoming packet.
+          A value of -2 indicates automatic marking of DSCP.
+          De-tunneled packets are never re-marked.
+          Automatic DSCP marking behavior is a local matter to the CPE, possibly influenced by other Broadband Forum standards that it supports.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2" maxInclusive="63"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2SATrafficLimit" access="readWrite" dmr:version="2.5">
+        <description>
+          IKEv2 SA lifetime in {{units}}, or zero if there is no traffic constraint on its expiration.
+          If both {{param}} and {{param|IKEv2SATimeLimit}} are non-zero, the IKEv2 SA is deleted when the first limit is reached.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="bytes"/>
+          </unsignedLong>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2SATimeLimit" access="readWrite" dmr:version="2.5">
+        <description>
+          IKEv2 SA lifetime in {{units}}, or zero if there is no time constraint on its expiration.
+          If both {{param}} and {{param|IKEv2SATrafficLimit}} are non-zero, the IKEv2 SA is deleted when the first limit is reached.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="IKEv2SAExpiryAction" access="readWrite" dmr:version="2.5">
+        <description>
+          Action to take when an IKEv2 SA expires, whether as a result of hitting a traffic limit or a time limit.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Renegotiate"/>
+            <enumeration value="Delete"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ChildSATrafficLimit" access="readWrite" dmr:version="2.5">
+        <description>
+          Child SA lifetime in {{units}}, or zero if there is no traffic constraint on its expiration.
+          If both {{param}} and {{param|ChildSATimeLimit}} are non-zero, the child SA is deleted when the first limit is reached.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="bytes"/>
+          </unsignedLong>
+        </syntax>
+      </parameter>
+      <parameter name="ChildSATimeLimit" access="readWrite" dmr:version="2.5">
+        <description>
+          Child SA lifetime in {{units}}, or zero if there is no time constraint on its expiration.
+          If both {{param}} and {{param|ChildSATrafficLimit}} are non-zero, the child SA is deleted when the first limit is reached.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ChildSAExpiryAction" access="readWrite" dmr:version="2.5">
+        <description>
+          Action to take when a Child SA expires, whether as a result of hitting a traffic limit or a time limit.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Renegotiate"/>
+            <enumeration value="Delete"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SentCPAttrNumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.Profile.{i}.SentCPAttr.{i}." access="readWrite" numEntriesParameter="SentCPAttrNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.5">
+      <description>
+        Each instance of this object represents an IKEv2 Configuration Payload (CP) {{bibref|RFC5996|Section 3.15}} Attribute that MUST, if enabled, be sent in IKEv2 CP CFG_REQUEST messages.  All such Attributes MUST be listed.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Type"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.5">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.5">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readWrite" dmr:version="2.5">
+        <description>
+          CP Attribute Type as described in {{bibref|RFC5996|Section 3.15.1}} and defined in {{bibref|IKEv2-params|IKEv2 Configuration Payload Attribute Types}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="32767"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.5">
+        <description>
+          A hexbinary encoded CP Attribute Value as described in {{bibref|RFC5996|Section 3.15.1}} and defined in {{bibref|IKEv2-params|IKEv2 Configuration Payload Attribute Types}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.Tunnel.{i}." access="readOnly" numEntriesParameter="TunnelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.5">
+      <description>
+        Represents an IPsec tunnel, i.e. a virtual IP interface that models an IPsec tunnel entry point and exit point.  A {{object}} instance always references (and has the same lifetime as) a ({{enum|Tunnel|.IP.Interface.{i}.Type}},{{enum|Tunneled|.IP.Interface.{i}.Type}}) {{object|.IP.Interface}} pair.  The {{object}} instance models the IPsec-specific concepts, the {{enum|Tunnel|.IP.Interface.{i}.Type}} {{object|.IP.Interface}} instance models the generic concepts, and the {{enum|Tunneled|.IP.Interface.{i}.Type}} {{object|.IP.Interface}} instance exists only so it can be referenced by forwarding or filter rules.
+        {{object}} instances are automatically created (as needed) when {{object|#.Filter}} instances are enabled and disabled.
+        Each instance's {{param|Filters}} parameter references the {{object|#.Filter}} instances that require the {{object}} instance to exist.  If this list ever becomes {{empty}}, e.g. because all the referenced {{object|#.Filter}} instances have been disabled or deleted, the CPE MAY choose not to delete the {{object}} instance (and its associated ({{enum|Tunnel|.IP.Interface.{i}.Type}},{{enum|Tunneled|.IP.Interface.{i}.Type}}) {{object|.IP.Interface}} pair).  This can be desirable, because {{object|.QoS.Classification}}, {{object|.Routing.Router.{i}.IPv4Forwarding}}, {{object|.Routing.Router.{i}.IPv6Forwarding}} etc instances might be referencing the {{object|.IP.Interface}} instances.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="TunnelInterface"/>
+        <parameter ref="TunneledInterface"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.5">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="TunnelInterface" access="readOnly" dmr:version="2.5">
+        <description>
+          The corresponding auto-created {{enum|Tunnel|Device.IP.Interface.{i}.Type}} {{object|.IP.Interface}} instance.  {{reference||delete}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TunneledInterface" access="readOnly" dmr:version="2.5">
+        <description>
+          The corresponding auto-created {{enum|Tunneled|Device.IP.Interface.{i}.Type}} {{object|.IP.Interface}} instance.  {{reference||delete}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Filters" access="readOnly" dmr:version="2.5">
+        <description>
+          The {{object|#.Filter}} instances that require this {{object}} instance to exist.  {{reference}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".IPsec.Filter." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.Tunnel.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.5">
+      <description>
+        Statistics for this IPsec tunnel, i.e. all traffic that has passed through the tunnel, including IKEv2 negotiation, IKEv2 SA and ChildSA traffic.
+        The CPE MUST reset the tunnel's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the tunnel becomes operationally down due to a previous administrative down (i.e. its associated {{param|.IP.Interface.{i}.Status}} parameter transitions to a down state after the tunnel has been disabled) or when the tunnel becomes administratively up (i.e. its associated {{param|.IP.Interface.{i}.Enable}} parameter transition from {{false}} to {{true}}).
+        Note that this object does not include generic statistics that are available in the associated {{object|.IP.Interface.{i}.Stats}} object.
+      </description>
+      <parameter name="DecryptionErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} discarded due to ESP decryption errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="IntegrityErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} discarded due to integrity errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ReplayErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} discarded due to replay errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PolicyErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} discarded due to policy errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="OtherReceiveErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} discarded due to errors other than decryption, integrity, replay or policy errors. This can include packets dropped due to a lack of receive buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.IKEv2SA.{i}." access="readOnly" numEntriesParameter="IKEv2SANumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.5" dmr:noUniqueKeys="true">
+      <description>
+        Represents an IKEv2 Security Association (SA), corresponding to an IKEv2 session.  Instances are automatically created and deleted as IKEv2 SAs are created and deleted.
+      </description>
+      <uniqueKey>
+        <parameter ref="Tunnel"/>
+      </uniqueKey>
+      <parameter name="Status" access="readOnly" dmr:version="2.5">
+        <description>
+          The current operational state of the IKEv2 SA.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.5">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tunnel" access="readOnly" dmr:version="2.5">
+        <description>
+          The associated {{object|#.Tunnel}} instance.  {{reference}}
+          Note that {{param}} is a unique key, i.e only one {{object}} instance is associated with a given {{object|#.Tunnel}} instance.  During rekeying {{bibref|RFC5996|Section 2.8}}, a new IKEv2 SA is created and inherits the existing IKEv2 SA's child SAs, then the old IKEv2 SA is deleted.  From the management point of view the new and old IKEv2 SAs are the same SA and MUST be modeled using the same {{object}} instance.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.Tunnel." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LocalAddress" access="readOnly" dmr:version="2.5">
+        <description>
+          The local IP address that this IKEv2 SA was negotiated with.  This is assigned via IKEv2 and will also be available via the associated {{object|#.Tunnel}}'s {{param|#.Tunnel.{i}.TunnelInterface}} {{object|##.IP.Interface.{i}.IPv4Address}} or {{object|##.IP.Interface.{i}.IPv6Address}} table (as appropriate).
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteAddress" access="readOnly" dmr:version="2.5">
+        <description>
+          The IP address of the peer that this IKEv2 SA was negotiated with.  This will be the IP address of one of the security gateways configured via {{param|#.Profile.{i}.RemoteEndpoints}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="EncryptionAlgorithm" access="readOnly" dmr:version="2.5">
+        <description>
+          The encryption algorithm applied to traffic carried by this IKEv2 SA.
+          This will be one of the {{param|#.Profile.{i}.IKEv2AllowedEncryptionAlgorithms}} from the {{object|#.Profile}} instance via which this IKEv2 SA was created.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EncryptionKeyLength" access="readOnly" dmr:version="2.5">
+        <description>
+          The length of the encryption key in {{units}} used for the algorithm specified in the {{param|EncryptionAlgorithm}} parameter.
+          The value is 0 if the key length is implicit in the specified algorithm or there is no encryption applied.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PseudoRandomFunction" access="readOnly" dmr:version="2.5">
+        <description>
+          The pseudo-random function used by this IKEv2 SA.
+          This will be one of the {{param|#.Profile.{i}.IKEv2AllowedPseudoRandomFunctions}} from the {{object|#.Profile}} instance via which this IKEv2 SA was created.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IntegrityAlgorithm" access="readOnly" dmr:version="2.5">
+        <description>
+          The integrity algorithm applied to the traffic carried by this IKEv2 SA.
+          This will be one of the {{param|#.Profile.{i}.IKEv2AllowedIntegrityAlgorithms}} from the {{object|#.Profile}} instance via which this IKEv2 SA was created.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DiffieHellmanGroupTransform" access="readOnly" dmr:version="2.5">
+        <description>
+          The Diffie-Hellman Group used by this IKEv2 SA.
+          This will be one of the {{param|#.Profile.{i}.IKEv2AllowedDiffieHellmanGroupTransforms}} from the {{object|#.Profile}} instance via which this IKEv2 SA was created.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CreationTime" access="readOnly" dmr:version="2.5">
+        <description>
+          When this IKEv2 SA was set up.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="NATDetected" access="readOnly" dmr:version="2.5">
+        <description>
+          Whether NAT traversal is supported by the device and, if so, whether a NAT was detected.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None"/>
+            <enumeration value="Local"/>
+            <enumeration value="Remote"/>
+            <enumeration value="Unsupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedCPAttrNumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ChildSANumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.IKEv2SA.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.5">
+      <description>
+        Statistics for this IKEv2 Security Association (SA).
+        The CPE MUST reset the IKEv2 SA's Stats parameters (unless otherwise stated in individual object or parameter descriptions) whenever the associated {{param|#.Tunnel}} instance's Stats parameters are reset.
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} handled in the outbound direction by the IKEv2 SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} handled in the inbound direction by the IKEv2 SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} handled in the outbound direction by the IKEv2 SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of {{units}} handled in the inbound direction by the IKEv2 SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of outbound {{units}} from this IKEv2 SA discarded for any reason. This can include {{units}} dropped due to a lack of transmit buffer space.
+          Note that this refers to IKE protocol {{units}}, and not to {{units}} carried by other SAs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DecryptionErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} to this IKEv2 SA discarded due to decryption errors.
+          Note that this refers to IKEv2 protocol {{units}}, and not to {units}} carried by other SAs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="IntegrityErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} to this IKEv2 SA discarded due to integrity errors.
+          Note that this refers to IKEv2 protocol {{units}}, and not to {{units}} carried by other SAs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="OtherReceiveErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The total number of inbound {{units}} to this IKEv2 SA discarded for reasons other than decryption or integrity errors. This can include {{units}} dropped due to a lack of receive buffer space.
+          Note that this refers to IKEv2 protocol {{units}}, and not to {{units}} carried by other SAs.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.IKEv2SA.{i}.ReceivedCPAttr.{i}." access="readWrite" numEntriesParameter="ReceivedCPAttrNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.5" dmr:noUniqueKeys="true">
+      <description>
+        This is a transitory table that lists all the IKEv2 Configuration Payload (CP) {{bibref|RFC5996|Section 3.15}} Attributes that have been received via CFG_REPLY messages.  Table entries are automatically created to correspond with received Attributes. However, it is a local matter to the CPE when to delete old table entries.
+        If the same Attribute is received multiple times, it is up to the CPE to decide which entries to include (i.e. whether the same Attribute will be present multiple times). In order to allow for the same Attribute to be present multiple times within the table, this table has no unique key defined.
+      </description>
+      <parameter name="Type" access="readOnly" dmr:version="2.5">
+        <description>
+          CP Attribute Type as described in {{bibref|RFC5996|Section 3.15.1}} and defined in {{bibref|IKEv2-params|IKEv2 Configuration Payload Attribute Types}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="32767"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.5">
+        <description>
+          A hexbinary encoded CP Attribute Value as described in {{bibref|RFC5996|Section 3.15.1}} and defined in {{bibref|IKEv2-params|IKEv2 Configuration Payload Attribute Types}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.IKEv2SA.{i}.ChildSA.{i}." access="readOnly" numEntriesParameter="ChildSANumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.5">
+      <description>
+        Represents a child Security Association (SA) pair, i.e. an inbound child SA and an outbound child SA.
+      </description>
+      <uniqueKey>
+        <parameter ref="InboundSPI"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="OutboundSPI"/>
+      </uniqueKey>
+      <parameter name="Status" access="readOnly" dmr:version="2.5">
+        <description>
+          The current operational state of the child SA pair.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.5">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="InboundSPI" access="readOnly" dmr:version="2.5">
+        <description>
+          The inbound child SA's Security Parameter Index (SPI).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OutboundSPI" access="readOnly" dmr:version="2.5">
+        <description>
+          The outbound child SA's Security Parameter Index (SPI).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CreationTime" access="readOnly" dmr:version="2.5">
+        <description>
+          The date and time when the child SA was created.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPsec.IKEv2SA.{i}.ChildSA.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.5">
+      <description>
+        Statistics for this child Security Association (SA).
+        The CPE MUST reset the child SA's Stats parameters (unless otherwise stated in individual object or parameter descriptions) whenever the parent {{object|#}} instance's Stats parameters are reset.
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} handled by the outbound child SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} handled by the inbound child SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} handled by the outbound child SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} handled by the inbound child SA.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} discarded by the outbound child SA due to any error. This can include compression errors or errors due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DecryptionErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} discarded by the inbound child SA due to decryption errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="IntegrityErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} discarded by the inbound child SA due to integrity errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ReplayErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} discarded by the inbound child SA due to replay errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PolicyErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} discarded by the inbound child SA due to policy errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="OtherReceiveErrors" access="readOnly" dmr:version="2.5">
+        <description>
+          The number of {{units}} discarded by the inbound child SA due to errors other than decryption, integrity, replay or policy errors. This can include decompression errors or errors due to a lack of receive buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.GRE." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        This object contains parameters associated with the Generic Routing Encapsulation (GRE) Tunnel ({{bibref|RFC2784}}) with Key and Sequence Number extensions ({{bibref|RFC2890}}). This object also provides a means to treat packets that are encapsulated within a GRE Tunnel by using a set of {{object|Filter}} objects to determine the treatment of the packet.
+      </description>
+      <parameter name="TunnelNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FilterNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.GRE.Tunnel.{i}." access="readWrite" numEntriesParameter="TunnelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        GRE Tunnel table, models the GRE Tunnel instance and represents the entry point and exit point of the tunnel in relation to the WAN interface. A {{object}} object has one or more {{object|Interface}} objects that further define the sessions or flows within the tunnel.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the tunnel.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The current operational state of the tunnel.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteEndpoints" access="readWrite" dmr:version="2.8">
+        <description>
+          The Fully Qualified Domain Name (FQDN) or IP address of the remote GRE tunnel endpoint. If more than one name/address is supplied, they will be tried in turn, i.e. they are in decreasing order of precedence.
+        </description>
+        <syntax>
+          <list maxItems="4"/>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAlivePolicy" access="readWrite" dmr:version="2.8">
+        <description>
+          The mechanism used to keep the tunnel from timing out at the {{param|ConnectedRemoteEndpoint}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ICMP"/>
+            <enumeration value="None"/>
+          </string>
+          <default type="object" value="None"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveTimeout" access="readWrite" dmr:version="2.8">
+        <description>
+          The tunnel keepalive timeout in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="10"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveThreshold" access="readWrite" dmr:version="2.8">
+        <description>
+          Number of KeepAlive messages unacknowledged by the {{param|ConnectedRemoteEndpoint}} before the {{object}} is perceived failed.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="3"/>
+        </syntax>
+      </parameter>
+      <parameter name="DeliveryHeaderProtocol" access="readWrite" dmr:version="2.8">
+        <description>
+          The protocol used for the delivery header.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IPv4"/>
+            <enumeration value="IPv6"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultDSCPMark" access="readWrite" dmr:version="2.8">
+        <description>
+          If the specified entries in the {{object|#.Filter}} table do not match this {{object}} object or an instance of the {{object|Interface}} object for this {{object}} object, then the value of this parameter is applied to the delivery header of the packets in this {{object}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectedRemoteEndpoint" access="readOnly" dmr:version="2.8">
+        <description>
+          The Fully Qualified Domain Name (FQDN) name or IP address of the connected remote GRE tunnel endpoint.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.GRE.Tunnel.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Statistics for this GRE tunnel, i.e. all traffic that has passed through the tunnel.
+        The device MUST reset the tunnel's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the tunnel becomes operationally down due to a previous administrative down (i.e., Status parameter transitions to a disabled state after the tunnel has been disabled) or when the tunnel becomes administratively up (i.e. the Enable parameter transitioned from {{false}} to {{true}}).
+      </description>
+      <parameter name="KeepAliveSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of KeepAlive {{units}} sent out the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="messages"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of KeepAlive {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="messages"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} sent by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} sent by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} discarded by the tunnel due to any error.  This can include packets dropped due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by the tunnel that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.GRE.Tunnel.{i}.Interface.{i}." access="readWrite" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        GRE Interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}). The {{object}} object models the GRE Header as defined in {{bibref|RFC2784}} and extensions to the GRE Header as defined in {{bibref|RFC2890}}. The {{object}} object provides a way to discriminate how sessions or flows are encapsulated within the GRE Tunnel. In addition the {{object}} object represents the entry point and exit point of the tunnel in relation to the LAN interface. Unless the Key Identifier of {{bibref|RFC2890}} is supported there is only one instance of this {{object}} object per tunnel.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.8">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.8">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolIdOverride" access="readWrite" dmr:version="2.8">
+        <description>
+          The Protocol ID assigned to this {{object}}. The Protocol Id is the EtherType value used to identify the encapsulated payload. When set to {{null}} the CPE determines the Protocol Id.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="UseChecksum" access="readWrite" dmr:version="2.8">
+        <description>
+          When {{true}}, includes the "Checksum" field in the GRE header as defined in {{bibref|RFC2784}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeyIdentifierGenerationPolicy" access="readWrite" dmr:version="2.8">
+        <description>
+          The method used to generate the Key Identifier extension as defined in.{{bibref|RFC2890}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Provisioned"/>
+            <enumeration value="CPE_Generated" optional="true">
+              <description>
+                The generation of the Key field is CPE specific implementation.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeyIdentifier" access="readWrite" dmr:version="2.8">
+        <description>
+          When the value of {{param|KeyIdentifierGenerationPolicy}} is {{enum|Provisioned|KeyIdentifierGenerationPolicy}} this {{param}} parameter is used to identify an individual traffic flow within a GRE tunnel, as defined in {{bibref|RFC2890}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="UseSequenceNumber" access="readWrite" dmr:version="2.8">
+        <description>
+          When {{true}}, includes the "SequenceNumber" field in the GRE header as defined in {{bibref|RFC2890}}
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.GRE.Tunnel.{i}.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Statistics for this GRE tunnel interface, i.e. all traffic that has passed through the interface.
+        The device MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e., the interface's Status parameter transitions to a down state after the interface has been disabled) or when the interface becomes administratively up (i.e. the Enable parameter transitioned from {{false}} to {{true}}).
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} sent by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} sent by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} discarded by this interface due to any error.  This can include packets dropped due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by this interface that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardChecksumReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by the tunnel interface that are discarded because of Checksum errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardSequenceNumberReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of {{units}} received by the tunnel interface that are discarded because of Sequence Number errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.GRE.Filter.{i}." access="readWrite" numEntriesParameter="FilterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        GRE Filter table. Entries in this table are applied against the packets that are to be encapsulated within the GRE Tunnel based on the following conditions:
+        * If the value of the {{param|AllInterfaces}} is {{true}}, then this entry will be applied to all {{object|#.Tunnel}} and {{object|#.Tunnel.{i}.Interface}} instances.
+        * If the value of {{param|AllInterfaces}} is {{false}} and the value of {{param|Interface}} parameter is a reference to a row in the {{object|#.Tunnel}} table then this entry is applied to all {{object|#.Tunnel.{i}.Interface}} instances of the {{object|#.Tunnel}} reference.
+        * If the value of {{param|AllInterfaces}} is {{false}} and the value of {{param|Interface}} parameter is a reference to a row in the {{object|#.Tunnel.{i}.Interface}} table then this entry is applied to the {{object|#.Tunnel.{i}.Interface}} reference.
+        * If no entries are matched for the packet, then the default treatment (e.g., {{param|#.Tunnel.{i}.DefaultDSCPMark}}) is applied to the packet.
+        For enabled table entries, if {{param|Interface}} is not a valid reference and {{param|AllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables this filter.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of this filter.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.8">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each packet, the highest ordered entry that matches the filter criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.8">
+        <description>
+          Filter criterion. {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Tunnel. #.Tunnel.{i}.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllInterfaces" access="readWrite" dmr:version="2.8">
+        <description>
+          Filter criterion. This specifies that all ingress GRE tunnel interfaces are associated with the entry. If {{true}}, the value of {{param|Interface}} is ignored since all ingress GRE tunnel interfaces are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDCheck" access="readWrite" dmr:version="2.8">
+        <description>
+          Filter criterion.
+          Current outer Ethernet VLAN ID as defined in 802.1Q. A value of -1 indicates this criterion is not used for filtering.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDExclude" access="readWrite" dmr:version="2.8">
+        <description>
+          If {{false}}, the filter includes only those packets that match the {{param|VLANIDCheck}} entry, if specified.
+          If {{true}}, the filter includes all packets except those that match the {{param|VLANIDCheck}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMarkPolicy" access="readWrite" dmr:version="2.8">
+        <description>
+          DSCP with which to mark the outer IP header for traffic that is associated with the interface criterion.
+          Automatic DSCP marking behavior is a local matter to the device, possibly influenced by other Broadband Forum standards that it supports.
+          * A value of -1 indicates copy from the upstream packet.
+          * A value of -2 indicates automatic marking of DSCP.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2" maxInclusive="63"/>
+          </int>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.L2TPv3." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object contains parameters associated with the configuration and monitoring of stateless tunnels using the Layer Two Tunneling Protocol version 3 (L2TPv3) ({{bibref|RFC3931}}).
+        This object also provides a means to treat packets that are encapsulated within a L2TPv3 Tunnel by using a set of {{object|Filter}} objects to determine the treatment of the packet.
+      </description>
+      <parameter name="TunnelNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FilterNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.L2TPv3.Tunnel.{i}." access="readWrite" numEntriesParameter="TunnelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        L2TPv3 Tunnel table, models the L2TPv3 Tunnel instance and represents the entry point and exit point of the tunnel in relation to the WAN interface.
+        A {{object}} object has one or more {{object|Interface}} objects that further define the sessions or flows within the tunnel.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables the tunnel.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the tunnel.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteEndpoints" access="readWrite" dmr:version="2.12">
+        <description>
+          The Fully Qualified Domain Name (FQDN) or IP address of the remote L2TPv3 tunnel endpoint.
+          If more than one name/address is supplied, they will be tried in turn, i.e. they are in decreasing order of precedence.
+        </description>
+        <syntax>
+          <list maxItems="4"/>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAlivePolicy" access="readWrite" dmr:version="2.12">
+        <description>
+          The mechanism used to keep the tunnel from timing out at the {{param|ConnectedRemoteEndpoint}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ICMP">
+              <description>
+                The version of the ICMP packet used for this {{param}} is based on the value of the {{param|DeliveryHeaderProtocol}} parameter (Either ICMP for IPv4 or ICMPv6 for IPv6).
+              </description>
+            </enumeration>
+            <enumeration value="None"/>
+          </string>
+          <default type="object" value="None"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveTimeout" access="readWrite" dmr:version="2.12">
+        <description>
+          The tunnel keepalive timeout in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="10"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveThreshold" access="readWrite" dmr:version="2.12">
+        <description>
+          Number of KeepAlive messages unacknowledged by the {{param|ConnectedRemoteEndpoint}} before the {{object}} is perceived failed.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="3"/>
+        </syntax>
+      </parameter>
+      <parameter name="DeliveryHeaderProtocol" access="readWrite" dmr:version="2.12">
+        <description>
+          The protocol used for the delivery header.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IPv4"/>
+            <enumeration value="IPv6"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultDSCPMark" access="readWrite" dmr:version="2.12">
+        <description>
+          If the specified entries in the {{object|#.Filter}} table do not match this {{object}} object or an instance of the {{object|Interface}} object for this {{object}} object, then the value of this parameter is applied to the delivery header of the packets in this {{object}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TunnelEncapsulation" access="readWrite" dmr:version="2.12">
+        <description>
+          The protocol that this {{object}} will be encapsulated
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IP"/>
+            <enumeration value="UDP"/>
+          </string>
+          <default type="object" value="IP"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectedRemoteEndpoint" access="readOnly" dmr:version="2.12">
+        <description>
+          The Fully Qualified Domain Name (FQDN) name or IP address of the connected remote L2TPv3 tunnel endpoint.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.L2TPv3.Tunnel.{i}.UDP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This {{object}} provides the parameters when the value of the {{param|##.Tunnel.{i}.TunnelEncapsulation}} parameter is {{enum|UDP|##.Tunnel.{i}.TunnelEncapsulation}}.
+      </description>
+      <parameter name="SourcePort" access="readWrite" dmr:version="2.12">
+        <description>
+          The source (local) port used to transmit PDUs. A value of 0 indicates that the port selection is performed by the device.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="1701"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemotePort" access="readWrite" dmr:version="2.12">
+        <description>
+          The remote port used to by the remote endpoint to transmit PDUs.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="1701"/>
+        </syntax>
+      </parameter>
+      <parameter name="EnableChecksum" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables checksum processing.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.L2TPv3.Tunnel.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        Statistics for this L2TPv3 tunnel, i.e. all traffic that has passed through the tunnel.
+        The device MUST reset the tunnel's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the tunnel becomes operationally down due to a previous administrative down (i.e., Status parameter transitions to a disabled state after the tunnel has been disabled) or when the tunnel becomes administratively up (i.e. the Enable parameter transitioned from {{false}} to {{true}}).
+      </description>
+      <parameter name="KeepAliveSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of KeepAlive {{units}} sent out the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="messages"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of KeepAlive {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="messages"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} discarded by the tunnel due to any error.  This can include packets dropped due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.L2TPv3.Tunnel.{i}.Interface.{i}." access="readWrite" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        L2TPv3 Interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+        The {{object}} object models the L2TPv3 Header as defined in {{bibref|RFC3931}} and the transport of L2 frames across over L2TPv3 as defined in {{bibref|RFC4719}}.
+        The {{object}} object provides a way to discriminate how sessions or flows are encapsulated within the L2TPv3 Tunnel.
+        In addition the {{object}} object represents the entry point and exit point of the tunnel in relation to the LAN interface.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.12">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}} See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SessionID" access="readWrite" dmr:version="2.12">
+        <description>
+          The unique Session ID to be used in the L2TPv3 header of the tunnel.
+          A Session ID with a value of -1 indicates that he CPE is to generate the session ids for this {{object}} instance.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="-1"/>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+      <parameter name="CookiePolicy" access="readWrite" dmr:version="2.12">
+        <description>
+          The policy that defines how the Cookie is handled in this {{object}} instance.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled">
+              <description>
+                The device does not perform Cooking processing.
+              </description>
+            </enumeration>
+            <enumeration value="Configured">
+              <description>
+                The value of the {{param|Cookie}} parameter is transmitted in the L2TPv3 header.
+              </description>
+            </enumeration>
+            <enumeration value="Generated">
+              <description>
+                The device generates the value of the Cookie transmitted in the L2TPv3 header.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Configured"/>
+        </syntax>
+      </parameter>
+      <parameter name="Cookie" access="readWrite" dmr:version="2.12">
+        <description>
+          The Cookie transmitted in the L2TPv3 header. The default is to set the Cookie to the device's MAC address that is encoded in the low order 6 bytes.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.L2TPv3.Tunnel.{i}.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        Statistics for this L2TPv3 tunnel interface, i.e. all traffic that has passed through the interface.
+        The device MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e., the interface's Status parameter transitions to a down state after the interface has been disabled) or when the interface becomes administratively up (i.e. the Enable parameter transitioned from {{false}} to {{true}}).
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} discarded by this interface due to any error.  This can include packets dropped due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by this interface that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardChecksumReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel interface that are discarded because of Checksum errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardSequenceNumberReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel interface that are discarded because of Sequence Number errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.L2TPv3.Filter.{i}." access="readWrite" numEntriesParameter="FilterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        L2TPv3 Filter table. Entries in this table are applied against the packets that are to be encapsulated within the L2TPv3 Tunnel based on the following conditions:
+        * If the value of the {{param|AllInterfaces}} is {{true}}, then this entry will be applied to all {{object|#.Tunnel}} and {{object|#.Tunnel.{i}.Interface}} instances.
+        * If the value of {{param|AllInterfaces}} is {{false}} and the value of {{param|Interface}} parameter is a reference to a row in the {{object|#.Tunnel}} table then this entry is applied to all {{object|#.Tunnel.{i}.Interface}} instances of the {{object|#.Tunnel}} reference.
+        * If the value of {{param|AllInterfaces}} is {{false}} and the value of {{param|Interface}} parameter is a reference to a row in the {{object|#.Tunnel.{i}.Interface}} table then this entry is applied to the {{object|#.Tunnel.{i}.Interface}} reference.
+        * If no entries are matched for the packet, then the default treatment (e.g., {{param|#.Tunnel.{i}.DefaultDSCPMark}}) is applied to the packet.
+        For enabled table entries, if {{param|Interface}} is not a valid reference and {{param|AllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this filter.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The status of this filter.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.12">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each packet, the highest ordered entry that matches the filter criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.12">
+        <description>
+          Filter criterion. {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Tunnel. #.Tunnel.{i}.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllInterfaces" access="readWrite" dmr:version="2.12">
+        <description>
+          Filter criterion. This specifies that all ingress L2TPv3 tunnel interfaces are associated with the entry. If {{true}}, the value of {{param|Interface}} is ignored since all ingress L2TPv3 tunnel interfaces are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDCheck" access="readWrite" dmr:version="2.12">
+        <description>
+          Filter criterion.
+          Current outer Ethernet VLAN ID as defined in 802.1Q. A value of -1 indicates this criterion is not used for filtering.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDExclude" access="readWrite" dmr:version="2.12">
+        <description>
+          If {{false}}, the filter includes only those packets that match the {{param|VLANIDCheck}} entry, if specified.
+          If {{true}}, the filter includes all packets except those that match the {{param|VLANIDCheck}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMarkPolicy" access="readWrite" dmr:version="2.12">
+        <description>
+          DSCP with which to mark the outer IP header for traffic that is associated with the interface criterion.
+          Automatic DSCP marking behavior is a local matter to the device, possibly influenced by other Broadband Forum standards that it supports.
+          * A value of -1 indicates copy from the upstream packet.
+          * A value of -2 indicates automatic marking of DSCP.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2" maxInclusive="63"/>
+          </int>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.VXLAN." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object contains parameters associated with the configuration and monitoring of stateless tunnels using the Virtual eXtensible Local Area Network (VXLAN) ({{bibref|RFC7348}}).
+        This object also provides a means to treat packets that are encapsulated within a VXLAN Tunnel by using a set of {{object|Filter}} objects to determine the treatment of the packet.
+      </description>
+      <parameter name="TunnelNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FilterNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.VXLAN.Tunnel.{i}." access="readWrite" numEntriesParameter="TunnelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        VXLAN Tunnel table, models the VXLAN Tunnel instance and represents the entry point and exit point of the tunnel in relation to the WAN interface.
+        A {{object}} object has one or more {{object|Interface}} objects that further define the sessions or flows within the tunnel.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables the tunnel.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the tunnel.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteEndpoints" access="readWrite" dmr:version="2.12">
+        <description>
+          The Fully Qualified Domain Name (FQDN) or IP address of the remote VXLAN tunnel endpoint.
+          If more than one name/address is supplied, they will be tried in turn, i.e. they are in decreasing order of precedence.
+        </description>
+        <syntax>
+          <list maxItems="4"/>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAlivePolicy" access="readWrite" dmr:version="2.12">
+        <description>
+          The mechanism used to keep the tunnel from timing out at the {{param|ConnectedRemoteEndpoint}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ICMP">
+              <description>
+                The version of the ICMP packet used for this {{param}} is based on the value of the {{param|DeliveryHeaderProtocol}} parameter (Either ICMP for IPv4 or ICMPv6 for IPv6).
+              </description>
+            </enumeration>
+            <enumeration value="None"/>
+          </string>
+          <default type="object" value="None"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveTimeout" access="readWrite" dmr:version="2.12">
+        <description>
+          The tunnel keepalive timeout in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="10"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveThreshold" access="readWrite" dmr:version="2.12">
+        <description>
+          Number of KeepAlive messages unacknowledged by the {{param|ConnectedRemoteEndpoint}} before the {{object}} is perceived failed.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="3"/>
+        </syntax>
+      </parameter>
+      <parameter name="DeliveryHeaderProtocol" access="readWrite" dmr:version="2.12">
+        <description>
+          The protocol used for the delivery header.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IPv4"/>
+            <enumeration value="IPv6"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultDSCPMark" access="readWrite" dmr:version="2.12">
+        <description>
+          If the specified entries in the {{object|#.Filter}} table do not match this {{object}} object or an instance of the {{object|Interface}} object for this {{object}} object, then the value of this parameter is applied to the delivery header of the packets in this {{object}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectedRemoteEndpoint" access="readOnly" dmr:version="2.12">
+        <description>
+          The Fully Qualified Domain Name (FQDN) name or IP address of the connected remote VXLAN tunnel endpoint.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePort" access="readWrite" dmr:version="2.12">
+        <description>
+          The source (local) port used to transmit PDUs. A value of 0 indicates that the port selection is performed by the device. In such case, it is recommended that the UDP source port number be calculated using a hash of fields from the inner packet and that it is in the dynamic/private port range 49152-65535.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemotePort" access="readWrite" dmr:version="2.12">
+        <description>
+          The remote port used to by the remote endpoint to transmit PDUs. The well-known port allocated by IANA is 4789, but it should be configurable.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="4789"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.VXLAN.Tunnel.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        Statistics for this VXLAN tunnel, i.e. all traffic that has passed through the tunnel.
+        The device MUST reset the tunnel's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the tunnel becomes operationally down due to a previous administrative down (i.e., Status parameter transitions to a disabled state after the tunnel has been disabled) or when the tunnel becomes administratively up (i.e. the Enable parameter transitioned from {{false}} to {{true}}).
+      </description>
+      <parameter name="KeepAliveSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of KeepAlive {{units}} sent out the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="messages"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of KeepAlive {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="messages"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} discarded by the tunnel due to any error.  This can include packets dropped due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.VXLAN.Tunnel.{i}.Interface.{i}." access="readWrite" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        VXLAN Interface table (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).
+        The {{object}} object models the VXLAN Header as defined in {{bibref|RFC7348}} for the transport of L2 frames across over VXLAN.
+        The {{object}} object provides a way to discriminate how multiple LAN segments are encapsulated within the VXLAN Tunnel.
+        In addition the {{object}} object represents the entry point and exit point of the tunnel in relation to the LAN interface.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.12">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VNI" access="readWrite" dmr:version="2.12">
+        <description>
+          The unique Virtual Network Identifier (VNI) to be used in the VXLAN header of the tunnel.
+          A VNI with a value of -1 indicates that the CPE is to generate the VNI for this {{object}} instance.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="-1"/>
+            <range minInclusive="0" maxInclusive="16777215"/>
+          </int>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.VXLAN.Tunnel.{i}.Interface.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        Statistics for this VXLAN tunnel interface, i.e. all traffic that has passed through the interface.
+        The device MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e., the interface's Status parameter transitions to a down state after the interface has been disabled) or when the interface becomes administratively up (i.e. the Enable parameter transitioned from {{false}} to {{true}}).
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="bytes"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} sent by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by this interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} discarded by this interface due to any error.  This can include packets dropped due to a lack of transmit buffers.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by this interface that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardChecksumReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel interface that are discarded because of Checksum errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardSequenceNumberReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of {{units}} received by the tunnel interface that are discarded because of Sequence Number errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.VXLAN.Filter.{i}." access="readWrite" numEntriesParameter="FilterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        VXLAN Filter table. Entries in this table are applied against the packets that are to be encapsulated within the VXLAN Tunnel based on the following conditions:
+        * If the value of the {{param|AllInterfaces}} is {{true}}, then this entry will be applied to all {{object|#.Tunnel}} and {{object|#.Tunnel.{i}.Interface}} instances.
+        * If the value of {{param|AllInterfaces}} is {{false}} and the value of {{param|Interface}} parameter is a reference to a row in the {{object|#.Tunnel}} table then this entry is applied to all {{object|#.Tunnel.{i}.Interface}} instances of the {{object|#.Tunnel}} reference.
+        * If the value of {{param|AllInterfaces}} is {{false}} and the value of {{param|Interface}} parameter is a reference to a row in the {{object|#.Tunnel.{i}.Interface}} table then this entry is applied to the {{object|#.Tunnel.{i}.Interface}} reference.
+        * If no entries are matched for the packet, then the default treatment (e.g., {{param|#.Tunnel.{i}.DefaultDSCPMark}}) is applied to the packet.
+        For enabled table entries, if {{param|Interface}} is not a valid reference and {{param|AllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this filter.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The status of this filter.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.12">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each packet, the highest ordered entry that matches the filter criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.12">
+        <description>
+          Filter criterion. {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Tunnel. #.Tunnel.{i}.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllInterfaces" access="readWrite" dmr:version="2.12">
+        <description>
+          Filter criterion. This specifies that all ingress VXLAN tunnel interfaces are associated with the entry. If {{true}}, the value of {{param|Interface}} is ignored since all ingress VXLAN tunnel interfaces are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDCheck" access="readWrite" dmr:version="2.12">
+        <description>
+          Filter criterion.
+          Current outer Ethernet VLAN ID as defined in 802.1Q. A value of -1 indicates this criterion is not used for filtering.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDExclude" access="readWrite" dmr:version="2.12">
+        <description>
+          If {{false}}, the filter includes only those packets that match the {{param|VLANIDCheck}} entry, if specified.
+          If {{true}}, the filter includes all packets except those that match the {{param|VLANIDCheck}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMarkPolicy" access="readWrite" dmr:version="2.12">
+        <description>
+          DSCP with which to mark the outer IP header for traffic that is associated with the interface criterion.
+          Automatic DSCP marking behavior is a local matter to the device, possibly influenced by other Broadband Forum standards that it supports.
+          * A value of -1 indicates copy from the upstream packet.
+          * A value of -2 indicates automatic marking of DSCP.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2" maxInclusive="63"/>
+          </int>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MAP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        The Mapping of Address and Port (MAP) object {{bibref|RFC7597}} {{bibref|RFC7599}} {{bibref|RFC7598}}. This object applies only to gateway devices that support IPv4 on the LAN side, include a {{object|#.NAT}}, and typically have only IPv6 connectivity on the WAN side.
+        See the MAP Theory of Operation {{bibref|TR-181i2a8|Appendix XV}} for a description of the working of this MAP data model.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables MAP.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="DomainNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MAP.Domain.{i}." access="readWrite" numEntriesParameter="DomainNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        MAP domain settings {{bibref|RFC7597}} {{bibref|RFC7599}}.  Each instance models a MAP domain.
+        MAP supports two transport modes, both of which use NAPT44 (modified to use a restricted port range):
+        * MAP-E ({{param|TransportMode}} = {{enum|Encapsulation|TransportMode}}) uses an IPv4-in-IPv6 tunnel.
+        * MAP-T ({{param|TransportMode}} = {{enum|Translation|TransportMode}}) uses stateless NAT64.
+        Note: There is an n:1 relationship between a MAP domain and the associated {{param|WANInterface}}, i.e. in theory multiple MAP domains can be associated with a single WAN IP interface (each domain would have its own ''End-user IPv6 prefix'' and ''MAP IPv6 address'').
+        Note: The {{object}} table includes unique key parameters that are strong references. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="WANInterface"/>
+        <parameter ref="IPv6Prefix"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the MAP domain.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The current operational state of the MAP domain.
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured" optional="true"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransportMode" access="readWrite" dmr:version="2.8">
+        <description>
+          The transport mode to use.
+          Corresponds to the {{bibref|RFC7598}} ''S46_CONT_MAPE'' and ''S46_CONT_MAPT'' container options.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Encapsulation">
+              <description>
+                MAP-E {{bibref|RFC7597}}
+              </description>
+            </enumeration>
+            <enumeration value="Translation">
+              <description>
+                MAP-T {{bibref|RFC7599}}
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Translation"/>
+        </syntax>
+      </parameter>
+      <parameter name="WANInterface" access="readWrite" dmr:version="2.8">
+        <description>
+          The IP interface with which this MAP domain is associated.  This will always be a NAT-ted upstream (WAN) interface.
+          The ''End-user IPv6 prefix'' {{param|IPv6Prefix}} is one of this IP interface's prefixes.
+          The ''MAP IPv6 address'' is derived from the ''End-user IPv6 prefix'' and is one of this IP interface's IP addresses, with an {{param|##.IP.Interface.{i}.IPv6Address.{i}.Origin}} of {{enum|MAP|##.IP.Interface.{i}.IPv6Address.{i}.Origin}}.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6Prefix" access="readWrite" dmr:version="2.8">
+        <description>
+          The MAP domain's ''End-user IPv6 prefix''.  This MUST reference one of {{param|WANInterface}}'s prefixes.
+          If the ACS configures this prefix directly, the CPE MUST use the ACS-configured prefix.  Otherwise, the CPE MUST select one of {{param|WANInterface}}'s prefixes; the selected prefix will typically have {{param|##.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} =  {{enum|PrefixDelegation|##.IP.Interface.{i}.IPv6Prefix.{i}.Origin}}.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BRIPv6Prefix" access="readWrite" dmr:version="2.8">
+        <description>
+          The MAP Border Relay (BR) address or prefix.
+          * For MAP-E this is the BR address and therefore MUST be a /128 {{bibref|RFC7597}}. Note this address can be an IPv6 anycast address. This address corresponds to the {{bibref|RFC7598}} ''OPTION_S46_BR'' (Border Relay) option.
+          * For MAP-T this is the BR prefix {{bibref|RFC7599}}. This address prefix corresponds to the {{bibref|RFC7598}} ''OPTION_S46_DMR'' (Default Mapping Rule) option.
+          Note: There will be a corresponding {{object|.Routing.Router.{i}.IPv4Forwarding}} default rule.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMarkPolicy" access="readWrite" dmr:version="2.8">
+        <description>
+          DSCP with which to mark the outer IP header for traffic that is associated with this MAP domain.
+          Downstream packets are never re-marked.
+          Automatic DSCP marking behavior is a local matter to the device, possibly influenced by other Broadband Forum standards that it supports.
+          * A value of -1 indicates copy from the incoming packet.
+          * A value of -2 indicates automatic marking of DSCP.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2" maxInclusive="63"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="PSIDOffset" access="readWrite" status="deprecated" dmr:version="2.8">
+        <description>
+          ''Port-set ID'' (PSID) offset in {{units}}.  The number of Port-sets is 2^{{param}}.
+          Corresponds to the {{bibref|RFC7598}} ''S46_PORTPARAMS'' (Port Parameters) option's ''offset'' field.
+          This parameter is DEPRECATED because details changed between drafting this data model and the RFC being published.  This parameter has been moved to the proper location within the {{object|Rule.{i}.}} object.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="15"/>
+            <units value="bits"/>
+          </unsignedInt>
+          <default type="object" value="6"/>
+        </syntax>
+      </parameter>
+      <parameter name="PSIDLength" access="readWrite" status="deprecated" dmr:version="2.8">
+        <description>
+          The length in {{units}} of the ''Port-set id'' (PSID) configured in the {{param|PSID}} parameter.
+          Corresponds to the {{bibref|RFC7598}} ''S46_PORTPARAMS'' (Port Parameters) option's ''PSID-len'' field.
+          This parameter is DEPRECATED because details changed between drafting this data model and the RFC being published.  This parameter has been moved to the proper location within the {{object|Rule.{i}.}} object.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="16"/>
+            <units value="bits"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PSID" access="readWrite" status="deprecated" dmr:version="2.8">
+        <description>
+          ''Port-set ID'' (PSID) to use in preference to the value extracted from the ''Embedded Address'' (EA) bits.
+          Only the high order {{param|PSIDLength}} bits of the {{param}} value are used, so the parameter is ignored when {{param|PSIDLength}} is zero.
+          Corresponds to the {{bibref|RFC7598}} ''S46_PORTPARAMS'' (Port Parameters) option's ''PSID'' field.
+          This parameter is DEPRECATED because details changed between drafting this data model and the RFC being published.  This parameter has been moved to the proper location within the {{object|Rule.{i}.}} object.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="IncludeSystemPorts" access="readWrite" dmr:version="2.8">
+        <description>
+          Whether to include low-numbered (system) ports in the Port-sets. Normally ports in the range [0:2^(16-{{param|PSIDOffset}})-1] are excluded, e.g. for the default {{param|PSIDOffset}} value of 4, ports [0:4095] are not included in the Port-sets.
+          This parameter is related to {{bibref|RFC7597}}'s ''N'', which is defined as ''the number of ports (e.g., 1024) excluded from the lower end of the range''.  The parameter is relevant only when {{param|PSIDOffset}} is 0; {{false}} corresponds to ''N=1024'' and {{true}} corresponds to ''N=0''.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="RuleNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MAP.Domain.{i}.Rule.{i}." access="readWrite" numEntriesParameter="RuleNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        The MAP domain's Mapping Rules {{bibref|RFC7597}}. The rule with the longest match between its {{param|IPv6Prefix}} and the end-user {{param|#.IPv6Prefix}} is the Basic Mapping Rule (BMR). Any of the rules (including the BMR) can be a Forwarding Mapping Rule.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="IPv6Prefix"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="IPv4Prefix"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enable or disable this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of this {{object}} instance.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.8">
+        <description>
+          The mechanism via which the {{object}} was created.
+          If the CPE supports MAP configuration via both DHCPv6 and CWMP, it is up to the implementation to determine how the two mechanisms will interact.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv6">
+              <description>
+                Created via a {{bibref|RFC7598}} ''S46_RULE'' option.
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                Present in the factory default configuration, created by the ACS, or created by some other management entity (e.g. via a GUI)
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6Prefix" access="readWrite" dmr:version="2.8">
+        <description>
+          The ''Rule IPv6 prefix''.
+          The Rule IPv6 prefix is a leading part of the end-user {{param|#.IPv6Prefix}}, i.e. its length MUST be less than or equal to the length of the end-user ''IPv6Prefix'', and it MUST match the end-user ''IPv6Prefix''.
+          Corresponds to the {{bibref|RFC7598}} ''S46_RULE'' option's ''ipv6-prefix'' field.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+          <default type="object" value="/0"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4Prefix" access="readWrite" dmr:version="2.8">
+        <description>
+          The ''Rule IPv4 prefix''.
+          Corresponds to the {{bibref|RFC7598}} ''S46_RULE'' option's ''ipv4-prefix'' field.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Prefix"/>
+          <default type="object" value="/0"/>
+        </syntax>
+      </parameter>
+      <parameter name="EABitsLength" access="readWrite" dmr:version="2.8">
+        <description>
+          The length in {{units}} of the ''Embedded Address (EA) bits'' in the end-user {{param|#.IPv6Prefix}}.
+          Corresponds to the {{bibref|RFC7598}} ''S46_RULE'' option's ''ea-len'' field.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="48"/>
+            <units value="bits"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="IsFMR" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates whether this rule is a ''Forwarding Mapping Rule'' (FMR), i.e. can be used for forwarding.
+          Corresponds to the {{bibref|RFC7598}} ''S46_RULE'' option's ''flags'' field's ''F-Flag''.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PSIDOffset" access="readWrite" dmr:version="2.12">
+        <description>
+          ''Port-set ID'' (PSID) offset in {{units}}.  The number of Port-sets is 2^{{param}}.
+          Corresponds to the {{bibref|RFC7598}} ''S46_PORTPARAMS'' (Port Parameters) option's ''offset'' field.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="15"/>
+            <units value="bits"/>
+          </unsignedInt>
+          <default type="object" value="6"/>
+        </syntax>
+      </parameter>
+      <parameter name="PSIDLength" access="readWrite" dmr:version="2.12">
+        <description>
+          The length in {{units}} of the ''Port-set id'' (PSID) configured in the {{param|PSID}} parameter.
+          Corresponds to the {{bibref|RFC7598}} ''S46_PORTPARAMS'' (Port Parameters) option's ''PSID-len'' field.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="16"/>
+            <units value="bits"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PSID" access="readWrite" dmr:version="2.12">
+        <description>
+          ''Port-set ID'' (PSID) to use in preference to the value extracted from the ''Embedded Address'' (EA) bits.
+          Only the high order {{param|PSIDLength}} bits of the {{param}} value are used, so the parameter is ignored when {{param|PSIDLength}} is zero.
+          Corresponds to the {{bibref|RFC7598}} ''S46_PORTPARAMS'' (Port Parameters) option's ''PSID'' field.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MAP.Domain.{i}.Interface." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        MAP interface (a stackable interface object as described in {{bibref|TR-181i2|Section 4.2}}).  This models the LAN side MAP domain interface.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the interface.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Down}} (or {{enum|NotPresent}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.8">
+        <description>
+          The textual name of the interface as assigned by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readWrite" dmr:version="2.8">
+        <description>
+          {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+          Note: Since this interface object is a MAP domain interface, it is expected that {{param}} will not be used.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MAP.Domain.{i}.Interface.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Throughput statistics for this MAP domain interface.
+        The CPE MUST reset the interface's Stats parameters (unless otherwise stated in individual object or parameter descriptions) either when the interface becomes operationally down due to a previous administrative down (i.e. the interface's {{param|#.Status}} parameter transitions to a down state after the interface is disabled) or when the interface becomes administratively up (i.e. the interface's {{param|#.Enable}} parameter transitions from {{false}} to {{true}}). Administrative and operational interface status is discussed in {{bibref|TR-181i2|section 4.2.2}}.
+      </description>
+      <parameter name="BytesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of bytes transmitted out of the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of bytes received on the interface, including framing characters.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets transmitted out of the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets received on the interface.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of outbound packets that could not be transmitted because of errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of inbound packets that contained errors preventing them from being delivered to a higher-layer protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets requested for transmission which were not addressed to a multicast or broadcast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnicastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were not addressed to a multicast or broadcast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of inbound packets which were chosen to be discarded even though no errors had been detected to  prevent their being delivered. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a multicast address at this layer, including those that were discarded or not sent.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MulticastPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a multicast address at this layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsSent" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of packets that higher-level protocols requested for transmission and which were addressed to a broadcast address at this layer, including those that were discarded or not sent.
+          Note that IPv6 does not define broadcast addresses, so IPv6 packets will never cause this counter to increment.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BroadcastPacketsReceived" access="readOnly" dmr:version="2.8">
+        <description>
+          The total number of received packets, delivered by this layer to a higher layer, which were addressed to a broadcast address at this layer.
+          Note that IPv6 does not define broadcast addresses, so IPv6 packets will never cause this counter to increment.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnknownProtoPacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          The total number of packets received via the interface which were discarded because of an unknown or unsupported  protocol.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.CaptivePortal." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains parameters relating to the captive portal configuration on the CPE.
+        The captive portal configuration defines the CPE's upstream HTTP (port 80) traffic redirect behavior.
+        When the captive portal is disabled, upstream HTTP (port 80) traffic MUST be permitted to all destinations.
+        When the captive portal is enabled, upstream HTTP (port 80) traffic MUST be permitted only to destinations listed in the {{param|AllowedList}}; traffic to all other destinations MUST be redirected to the {{param|URL}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the captive portal.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the status of the captive portal.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_URLEmpty">
+              <description>
+                {{param|URL}} is {{empty}}
+              </description>
+            </enumeration>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AllowedList" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} List items represent IP addresses to which HTTP (port 80) traffic MUST always be permitted, regardless of whether the captive portal is enabled.
+          Each entry in the list MUST be either an IP address, or an IP prefix specified using Classless Inter-Domain Routing (CIDR) notation {{bibref|RFC4632}}.
+          An IP prefix is specified as an IP address followed (with no intervening white space) by "/n", where ''n'' (the prefix size) is an integer in the range 0-32 (for IPv4) or 0-128 (for IPv6) that indicates the number of (leftmost) '1' bits of the prefix.
+          IPv4 example:
+          * 1.2.3.4 specifies a single IPv4 address, and 1.2.3.4/24 specifies a class C subnet with subnet mask 255.255.255.0.
+          * 1.2.0.0/22 represents the 1024 IPv4 addresses from 1.2.0.0 to 1.2.3.255.
+          IPv6 example:
+          * fec0::220:edff:fe6a:f76 specifies a single IPv6 address.
+          * 2001:edff:fe6a:f76::/64 represents the IPv6 addresses from 2001:edff:fe6a:f76:0:0:0:0 to 2001:edff:fe6a:f76:ffff:ffff:ffff:ffff.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="10000"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="URL" access="readWrite" dmr:version="2.0">
+        <description>
+          Captive portal URL to which upstream HTTP (port 80) traffic to destinations not listed in the {{param|AllowedList}} will be redirected.
+          The captive portal URL MUST be an HTTP (not HTTPS) URL.
+          The CPE MUST permit the captive portal URL to be set to {{empty}}, which has the effect of disabling the captive portal (if {{param|Enable}} is {{true}} and the captive portal URL is {{empty}}, {{param|Status}} MUST be {{enum|Error_URLEmpty|Status}}).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="2000"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Routing object that contains the {{object|Router}} table and {{object|RIP}} protocol object.
+      </description>
+      <parameter name="RouterNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing.Router.{i}." access="readWrite" numEntriesParameter="RouterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object allows the handling of the routing and forwarding configuration of the device.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this ''Router'' entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this ''Router'' entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4ForwardingNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6ForwardingNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing.Router.{i}.IPv4Forwarding.{i}." access="readWrite" numEntriesParameter="IPv4ForwardingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Layer 3 IPv4 forwarding table.
+        In addition to statically configured routes, this table MUST include dynamic routes learned through layer 3 routing protocols, including RIP (i.e. RIP version 2), OSPF, DHCPv4, and IPCP.  The CPE MAY reject attempts to delete or modify a dynamic route entry.
+        For each incoming packet, the layer 3 forwarding decision is conceptually made as follows:
+        * Only enabled table entries with a matching {{param|ForwardingPolicy}} are considered, i.e. those that either do not specify a {{param|ForwardingPolicy}}, or else specify a {{param|ForwardingPolicy}} that matches that of the incoming packet.
+        * Next, table entries that also have a matching destination address/mask are considered, and the matching entry with the longest prefix is applied to the packet (i.e. the entry with the most specific network). An unspecified destination address is a wild-card and always matches, but with a prefix length of zero.
+        For enabled table entries, if {{param|Interface}} is not a valid reference to an IPv4-capable interface (that is attached to the IPv4 stack), then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="DestIPAddress"/>
+        <parameter ref="DestSubnetMask"/>
+        <parameter ref="ForwardingPolicy"/>
+        <parameter ref="GatewayIPAddress"/>
+        <parameter ref="Interface"/>
+        <parameter ref="ForwardingMetric"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the forwarding entry.  On creation, an entry is disabled by default.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the status of the forwarding entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="StaticRoute" access="readOnly" dmr:version="2.0">
+        <description>
+          If {{true}}, this route is a Static route.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIPAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          Destination IPv4 address.  {{empty}} indicates no destination address is specified.
+          A Forwarding table entry for which {{param}} and {{param|DestSubnetMask}} are both {{empty}} is a default route.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestSubnetMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Destination subnet mask.  {{empty}} indicates no destination subnet mask is specified.
+          If a destination subnet mask is specified, the {{param}} is ANDed with the destination address before comparing with the {{param|DestIPAddress}}.  Otherwise, the full destination address is used as is.
+          A Forwarding table entry for which {{param|DestIPAddress}} and {{param}} are both {{empty}} is a default route.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingPolicy" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifier of a set of classes or flows that have the corresponding {{param}} value as defined in the {{object|Device.QoS}} object.
+          A value of -1 indicates no {{param}} is specified.
+          If specified, this forwarding entry is to apply only to traffic associated with the specified classes and flows.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="GatewayIPAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          IPv4 address of the gateway.
+          Only one of {{param}} and Interface SHOULD be configured for a route.
+          If both are configured, {{param}} and {{param|Interface}} MUST be consistent with each other.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Specifies the egress layer 3 interface associated with this entry. Example: Device.IP.Interface.1.
+          Only one of {{param|GatewayIPAddress}} and {{param}} SHOULD be configured for a route.
+          If both are configured, {{param|GatewayIPAddress}} and {{param}} MUST be consistent with each other.
+          For a route that was configured by setting {{param|GatewayIPAddress}} but not {{param}}, read access to {{param}} MUST return the full hierarchical parameter name for the routes egress interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.2">
+        <description>
+          Protocol via which the IPv4 forwarding rule was learned.  {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv4"/>
+            <enumeration value="OSPF"/>
+            <enumeration value="IPCP"/>
+            <enumeration value="RIP"/>
+            <enumeration value="Static">
+              <description>
+                For example, present in the factory default configuration, created by the ACS, or created by some other management entity (e.g. via a GUI).
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingMetric" access="readWrite" dmr:version="2.0">
+        <description>
+          Forwarding metric.  A value of -1 indicates this metric is not used.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing.Router.{i}.IPv6Forwarding.{i}." access="readWrite" numEntriesParameter="IPv6ForwardingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        Layer 3 IPv6 forwarding table.
+        In addition to statically configured routes, this table MUST include dynamic routes learned through layer 3 routing protocols, including RIPng, OSPF, DHCPv6, and RA.  The CPE MAY reject attempts to delete or modify a dynamic route entry.
+        For each incoming packet, the layer 3 forwarding decision is conceptually made as follows:
+        * Only enabled table entries with a matching {{param|ForwardingPolicy}} are considered, i.e. those that either do not specify a {{param|ForwardingPolicy}}, or else specify a {{param|ForwardingPolicy}} that matches that of the incoming packet.
+        * Next, table entries that also have a matching destination prefix are considered, and the matching entry with the longest prefix length is applied to the packet (i.e. the entry with the most specific network). An unspecified destination address is a wild-card and always matches, but with a prefix length of zero.
+        For enabled table entries, if {{param|Interface}} is not a valid reference to an IPv6-capable interface (that is attached to the IPv6 stack), then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        This object is based on ''inetCidrRouteTable'' from {{bibref|RFC4292}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="DestIPPrefix"/>
+        <parameter ref="ForwardingPolicy"/>
+        <parameter ref="NextHop"/>
+        <parameter ref="Interface"/>
+        <parameter ref="ForwardingMetric"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          Indicates the status of the forwarding entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIPPrefix" access="readWrite" dmr:version="2.2">
+        <description>
+          Destination IPv6 prefix. {{empty}} indicates that it matches all destination prefixes (i.e. equivalent to "::/0"). All bits to the right of the prefix MUST be zero, e.g. 2001:edff:fe6a:f76::/64.
+          Routes with a 128-bit prefix length (/128) are host routes for a specific IPv6 destination, e.g. 2001:db8:28:2:713e:a426:d167:37ab/128.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingPolicy" access="readWrite" dmr:version="2.2">
+        <description>
+          Identifier of a set of classes or flows that have the corresponding {{param}} value as defined in the {{object|.QoS}} object.
+          A value of -1 indicates no {{param}} is specified.
+          If specified, this forwarding entry is to apply only to traffic associated with the specified classes and flows.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="NextHop" access="readWrite" dmr:version="2.2">
+        <description>
+          IPv6 address of the next hop.
+          Only one of {{param}} and {{param|Interface}} SHOULD be configured for a route. {{empty}} indicates no {{param}} is specified.
+          If both are configured, {{param}} and {{param|Interface}} MUST be consistent with each other.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.2">
+        <description>
+          {{reference}} Specifies the egress layer 3 interface associated with this entry. Example: ''Device.IP.Interface.1''.
+          Only one of {{param|NextHop}} and {{param}} SHOULD be configured for a route. {{empty}} indicates no {{param}} is specified.
+          If both are configured, {{param|NextHop}} and {{param}} MUST be consistent with each other.
+          For a route that was configured by setting {{param|NextHop}} but not {{param}}, read access to {{param}} MUST return the full hierarchical parameter name for the route's egress interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.2">
+        <description>
+          Protocol via which the IPv6 forwarding rule was learned.  {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv6"/>
+            <enumeration value="OSPF"/>
+            <enumeration value="RA">
+              <description>
+                Router Advertisement Route Information Option {{bibref|RFC4191}}.
+              </description>
+            </enumeration>
+            <enumeration value="RIPng">
+              <description>
+                RIPng for IPv6 {{bibref|RFC2080}}
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                For example, present in the factory default configuration, created by the ACS, or created by some other management entity (e.g. via a GUI).
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingMetric" access="readWrite" dmr:version="2.2">
+        <description>
+          Forwarding metric.  A value of -1 indicates this metric is not used.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ExpirationTime" access="readOnly" dmr:version="2.2">
+        <description>
+          The time at which the route will expire, or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+          {{param}} is provided by an underlying dynamic routing protocol, e.g. by an {{bibref|RFC4191}} route information option.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="9999-12-31T23:59:59Z"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing.RIP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Routing Information Protocol (RIP) object.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables RIP on the device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedModes" access="readOnly" dmr:version="2.0">
+        <description>
+          The supported RIP protocol modes.  {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Send"/>
+            <enumeration value="Receive"/>
+            <enumeration value="Both"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceSettingNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing.RIP.InterfaceSetting.{i}." access="readWrite" numEntriesParameter="InterfaceSettingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        IP Interface RIP configuration table.
+        For enabled table entries, if {{param|Interface}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+        Note: This object only applies to RIP2; i.e. version 2 of the RIP protocol is used to accept or send over the specified {{param|Interface}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} This is the IP interface associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AcceptRA" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, RIP route advertisements received over {{param|Interface}} are accepted.
+          When set to {{false}}, RIP route advertisements received over {{param|Interface}} are rejected.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SendRA" access="readWrite" dmr:version="2.0">
+        <description>
+          When set to {{true}}, RIP route advertisements are to be sent over {{param|Interface}}.
+          When set to {{false}}, no RIP route advertisements will be sent over {{param|Interface}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing.RouteInformation." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        Received Router Advertisement (RA) route information {{bibref|RFC4191}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables receiving route information from the RA.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceSettingNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Routing.RouteInformation.InterfaceSetting.{i}." access="readOnly" numEntriesParameter="InterfaceSettingNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        IP Interface RA route information table. Contains received RA route information {{bibref|RFC4191}}. As such, the data in this table cannot be modified.
+      </description>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ForwardingEntryCreated"/>
+            <enumeration value="NoForwardingEntry"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readOnly" dmr:version="2.2">
+        <description>
+          {{reference}} This is the IP interface associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SourceRouter" access="readOnly" dmr:version="2.2">
+        <description>
+          IPv6 Address of the router that sent the RA that included this route info.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredRouteFlag" access="readOnly" dmr:version="2.2">
+        <description>
+          Flag included in a specific Route Information Option within an RA message (Prf flag), as defined in {{bibref|RFC4191|Section 2.3}}. {{enum}}
+          Note that this is not the Prf flag included in the base RA message. Also see {{bibref|RFC4191|Section 2.1}} which discusses how this flag is encoded on the wire.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="High"/>
+            <enumeration value="Medium"/>
+            <enumeration value="Low"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Prefix" access="readOnly" dmr:version="2.2">
+        <description>
+          IPv6 address prefix, as received in an instance of the Route Information Option of a RA message.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+        </syntax>
+      </parameter>
+      <parameter name="RouteLifetime" access="readOnly" dmr:version="2.2">
+        <description>
+          The time at which {{param|Prefix}} will cease to be usable for use as a forwarding entry, or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+          {{param}} is received in an instance of the Route Information Option of a RA message.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.NeighborDiscovery." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        The Neighbor Discovery Protocol (NDP) object {{bibref|RFC4861}}.  This object applies only to IPv6.  It contains an {{object|InterfaceSetting}} table that defines the NDP configuration for individual IP interfaces.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables Neighbor Discovery.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceSettingNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.NeighborDiscovery.InterfaceSetting.{i}." access="readWrite" numEntriesParameter="InterfaceSettingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        Per-interface Neighbor Discovery Protocol (NDP) configuration {{bibref|RFC4861}}.
+        For enabled table entries, if {{param|Interface}} is not a valid reference to an IPv6-capable interface (that is attached to the IPv6 stack), then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.2">
+        <description>
+          This is the IP interface associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="RetransTimer" access="readWrite" dmr:version="2.2">
+        <description>
+          Retransmission interval in {{units}}, as defined in {{bibref|RFC4861}}. For auto-configuration purposes, {{param}} specifies the delay between consecutive Neighbor Solicitation transmissions performed during Duplicate Address Detection (DAD) {{bibref|RFC4862|Section 5.4}}, as well as the time a node waits after sending the last Neighbor Solicitation before ending the DAD process.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="1000"/>
+        </syntax>
+      </parameter>
+      <parameter name="RtrSolicitationInterval" access="readWrite" dmr:version="2.2">
+        <description>
+          Retransmission interval in {{units}}, as defined in {{bibref|RFC4861}}. For auto-configuration purposes, {{param}} specifies the delay between consecutive Router Solicitation transmissions.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="4"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxRtrSolicitations" access="readWrite" dmr:version="2.2">
+        <description>
+          Maximum Number of Router Solicitation Transmission messages, as defined in {{bibref|RFC4861}}. For auto-configuration purposes {{param}} specifies the Maximum Number of Router Solicitation Transmission messages to help the host to conclude that there are no routers on the link.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="3"/>
+        </syntax>
+      </parameter>
+      <parameter name="NUDEnable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables Neighbor Unreachability Detection (NUD) {{bibref|RFC4861|Section 7}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RSEnable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables Router Solicitation (RS) on {{param|Interface}} {{bibref|RFC4861|Section 4.1}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.RouterAdvertisement." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        The Router Advertisement (RA) object {{bibref|RFC4861}}. This object applies only to IPv6. It contains an {{object|InterfaceSetting}} table that defines the RA configuration for individual IP interfaces.
+        Information received via router advertisement messages is automatically propagated to the relevant {{object|.IP.Interface}} sub-objects, e.g. to the {{object|.IP.Interface.{i}.IPv6Address}} and {{object|.IP.Interface.{i}.IPv6Prefix}} tables.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables Router Advertisement.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceSettingNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.RouterAdvertisement.InterfaceSetting.{i}." access="readWrite" numEntriesParameter="InterfaceSettingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        Per-interface Router Advertisement (RA) configuration {{bibref|RFC4861}}. Table entries are created for use in sending Router Advertisements.
+        For enabled table entries, if {{param|Interface}} is not a valid reference to an IPv6-capable interface (that is attached to the IPv6 stack), then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+          Defines the value of the ''IsRouter'' and ''AdvSendAdvertisements'' flags from {{bibref|RFC4861|Section 4.2}}
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.2">
+        <description>
+          This is the IP interface associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ManualPrefixes" access="readWrite" dmr:version="2.2">
+        <description>
+          {{list}} {{reference}}
+          Manually-configured prefixes that will be sent in Router Advertisement messages.  Each referenced prefix MUST have a  {{param|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}} of {{enum|Static|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}} or {{enum|Child|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}}.  Router Advertisement messages MUST include Prefix Information Options {{bibref|RFC4861}} for all ''Valid'' ({{param|.IP.Interface.{i}.IPv6Prefix.{i}.ValidLifetime}} is infinite or in the future) prefixes in this list.
+          Prefixes MUST be associated with the interface instance referenced by {{param|Interface}}.
+        </description>
+        <syntax>
+          <list maxItems="8"/>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Prefixes" access="readOnly" dmr:version="2.2">
+        <description>
+          {{list}} {{reference}}
+          All prefixes that will be included in Router Advertisement (RA) messages sent out this interface. This list can include:
+          * Prefixes from {{param|ManualPrefixes}} that are included in RA messages.
+          * Prefixes with {{param|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} = {{enum|Child|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} or {{enum|AutoConfigured|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} associated with the interface instance referenced by {{param|Interface}}.
+        </description>
+        <syntax>
+          <list maxItems="8"/>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxRtrAdvInterval" access="readWrite" dmr:version="2.2">
+        <description>
+          The maximum time allowed between sending unsolicited multicast Router Advertisements from the interface, in {{units}} (see {{bibref|RFC4861|Section 4.2}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="4" maxInclusive="1800"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="600"/>
+        </syntax>
+      </parameter>
+      <parameter name="MinRtrAdvInterval" access="readWrite" dmr:version="2.2">
+        <description>
+          The minimum time allowed between sending unsolicited multicast Router Advertisements from the interface, in {{units}} (see {{bibref|RFC4861|Section 4.2}}).
+          The value MUST be no greater than 3/4 * {{param|MaxRtrAdvInterval}}.
+          Note: The ''1350'' maximum was derived from the RFC, based on 3/4 times the maximum value of {{param|MaxRtrAdvInterval}}. Similarly, the ''200'' default was derived from the RFC, based on 1/3 times the default value of {{param|MaxRtrAdvInterval}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="3" maxInclusive="1350"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="200"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvDefaultLifetime" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Router Lifetime" field of Router Advertisement messages on this interface, in {{units}} (see {{bibref|RFC4861|Section 4.2}}).
+          The value can be zero or between {{param|MaxRtrAdvInterval}} and 9000 {{units}}, but these limits can be overridden by specific documents that describe how IPv6 operates over different link layers.
+          A value of zero indicates that the router is not to be used as a default router.
+          Note: The ''1800'' default was derived from the RFC, based on 3 times the default value of {{param|MaxRtrAdvInterval}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="1800"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvManagedFlag" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Managed address configuration" (M) flag field of Router Advertisement messages on this interafce (see {{bibref|RFC4861|Section 4.2}}, and {{bibref|RFC4862}}).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvOtherConfigFlag" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Other configuration" (O) flag field of Router Advertisement messages on this interface (see {{bibref|RFC4861|Section 4.2}}, and {{bibref|RFC4862}}).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvMobileAgentFlag" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Home agent" (H) flag field of Router Advertisement messages on this interface (see {{bibref|RFC3775|Section 7.1}}).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvPreferredRouterFlag" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Default Router Preference" (Prf) field of Router Advertisement messages on this interface, as defined in {{bibref|RFC4191|Section 2.2}}. {{enum}}
+          Also see {{bibref|RFC4191|Section 2.1}} which discusses how this flag is encoded on the wire.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="High"/>
+            <enumeration value="Medium"/>
+            <enumeration value="Low"/>
+          </string>
+          <default type="object" value="Medium"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvNDProxyFlag" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Proxy" (P) flag field of Router Advertisement messages on this interface (see {{bibref|RFC4389|Section 4.1.3.3}}).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvLinkMTU" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in MTU options of Router Advertisement messages on this interface. A value of zero indicates that no MTU options are included (see {{bibref|RFC4861|Section 4.6.4}}).
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvReachableTime" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Reachable Time" field of Router Advertisement messages on this interface, in {{units}} (see {{bibref|RFC4861|Section 4.2}}).
+          The value zero means unspecified (by the router).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="3600000"/>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvRetransTimer" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Retrans Timer" field of Router Advertisement messages on this interface (see {{bibref|RFC4861|Section 4.2}}).
+          The value zero means unspecified (by the router).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvCurHopLimit" access="readWrite" dmr:version="2.2">
+        <description>
+          The value placed in the "Cur Hop Limit" field of Router Advertisement messages on this interface (see {{bibref|RFC4861|Section 4.2}}).
+          The value zero means unspecified (by the router).
+          Note: The default can be overridden with the value specified in {{bibref|RFC3232}} that was in effect at the time of implementation.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="255"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.RouterAdvertisement.InterfaceSetting.{i}.Option.{i}." access="readWrite" numEntriesParameter="OptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        This object specifies the options in a Router Advertisement (RA) message {{bibref|RFC4861|Section 4.6}}. {{object}} entries are created for use in sending Router Advertisements (enabled options MUST be included in RA messages sent). This includes support for sending DNS information in the RA message as described in {{bibref|RFC6106}}.
+        This table is intended only for options that are not modeled elsewhere. For example, it is not appropriate for the MTU option (which is modeled via {{param|#.AdvLinkMTU}}).
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Tag"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tag" access="readWrite" dmr:version="2.2">
+        <description>
+          Option tag (type) {{bibref|RFC4861|Section 4.6}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.2">
+        <description>
+          A hexbinary encoded option value {{bibref|RFC4861|Section 4.6}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPv6rd." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        Settings allowing a CPE to derive and route IPv6 Rapid Deployment (6rd) delegated prefixes as specified in {{bibref|RFC5969}}.  The 6rd mechanism is intended to be implemented only on what {{bibref|RFC5969}} refers to as ''Customer Edge Routers'', i.e. on gateway devices, that support IPv6 on the LAN side and only have IPv4 connectivity on the WAN side.
+        See the 6rd Theory of Operation {{bibref|TR-181i2a2|Appendix VI}} for a description of the working of this 6rd data model.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables IPv6rd.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceSettingNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IPv6rd.InterfaceSetting.{i}." access="readOnly" numEntriesParameter="InterfaceSettingNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        6rd {{bibref|RFC5969}} settings.
+        A 6rd delegated prefix is expected to be of maximum length 64 bits, and is the concatenation of the following two items:
+        * Service provider IPv6 prefix: specified via the {{param|SPIPv6Prefix}} parameter
+        * IPv4 address suffix: the IPv4 address with the first {{param|IPv4MaskLength}} bits removed
+        This object definition is derived from {{bibref|RFC5969}} with some minor nomenclature changes.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enable or disable this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="BorderRelayIPv4Addresses" access="readWrite" dmr:version="2.2">
+        <description>
+          List items are the IPv4 addresses (possibly anycast) of the 6rd Relay(s).
+        </description>
+        <syntax>
+          <list maxItems="4"/>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="AllTrafficToBorderRelay" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{true}}, the destination address for all 6rd traffic will be set (IPv4 destination address) to one of the {{param|BorderRelayIPv4Addresses}}. If {{false}}, traffic whose destination address begins with the same prefix as {{param|SPIPv6Prefix}} will be sent directly to the destination IPv4 address of the endpoint, which is in the same 6rd domain. See 6rd Theory of Operation for further explanation {{bibref|TR-181i2a2|Appendix VI}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SPIPv6Prefix" access="readWrite" dmr:version="2.2">
+        <description>
+          The Service Provider's 6rd IPv6 prefix for this deployment and this 6rd RG.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4MaskLength" access="readWrite" dmr:version="2.2">
+        <description>
+          The number of high-order {{units}} that are identical across all IPv4 addresses within a given 6rd domain. This number of {{units}} MUST be removed from the start of the IPv4 address when generating the 6rd delegated prefix.
+          For example, if this value is 8, only the final 24 {{units}} of the subscriber IPv4 prefix will be used when creating the IPv6 delegated prefix, determining the destination IPv4 encapsulation address, etc.
+          If the value is 0, then the whole 32 {{units}} of the IPv4 address are used in the encoding.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="32"/>
+            <units value="bits"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AddressSource" access="readWrite" dmr:version="2.2">
+        <description>
+          {{reference}} Points to the IPv4 address that is the source of the IPv4 address embedded in the IPv6 6rd prefix, and used as the source encapsulating IPv4 address. If the value is {{empty}} or this parameter is not present, the device will use internal logic to determine which IPv4 source address to use.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv4Address." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TunnelInterface" access="readOnly" dmr:version="2.2">
+        <description>
+          {{reference}} This is an IP interface of ''Type'' {{enum|Tunnel|.IP.Interface.{i}.Type}} that is logically the tunnel entry point for upstream IPv6 traffic and is also logically the tunnel exit point for downstream IPv6 traffic (i.e. the entry point for non-tunneled upstream IPv6 traffic to enter a tunnel and become tunneled, or conversely, the exit point for downstream IPv6 traffic leaving a tunnel after being un-tunneled).
+          IPv6 traffic that enters {{param}} from the LAN is expected to continue on through {{param|TunneledInterface}}, and traffic from the WAN is expected to come from {{param|TunneledInterface}} into {{param}}. {{param}} is a logical interface that can allow for classification, marking (of IPv6 headers), and policing of IPv6 traffic that will be going over a 6rd tunnel. These functions are modeled in the {{object|.QoS.}} object.
+          {{param}} can be used also to represent the 6rd virtual interface defined in {{bibref|RFC5969}}.
+          Note: In 6rd, IPv6 packets arriving over one or more device LAN IP interfaces are logically fed into this {{param}}. Likewise, 6rd traffic from the WAN gets logically sent from this {{param}} to LAN IP interfaces.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TunneledInterface" access="readOnly" dmr:version="2.2">
+        <description>
+          {{reference}} This is an IP interface of ''Type'' {{enum|Tunneled|.IP.Interface.{i}.Type}} that provides information about the IPv4 headers used to encapsulate the IPv6 packets.
+          Encapsulated IPv6 traffic that enters {{param}} from the WAN is expected to continue on through {{param|TunnelInterface}}, and traffic from the LAN is expected to come from {{param|TunnelInterface}} into {{param}}. {{param}} is a logical interface that can allow for classification, marking (of IPv4 headers and VLAN tags), and policing of IPv4 packets that encapsulate IPv6 packets in 6rd traffic. These functions are modeled in the {{object|.QoS.}} object.
+          Note: In 6rd, {{param}} traffic originating from the LAN logically feeds into a WAN-side IPv4 capable IP interface that the "IPv6 6rd tunnel" goes over. 6rd traffic that enters over this IPv4 WAN interface gets logically sent to this {{param}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSLite." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        Settings allowing a CPE to configure and route IPv6 Dual-Stack Lite (DSLite) as specified in {{bibref|DSLite}}. The DS-Lite mechanism is intended to be implemented only on gateway devices that support IPv4 on the LAN side and only have IPv6 connectivity on the WAN side.
+        See the Dual-Stack Lite Theory of Operation {{bibref|TR-181i2a2|Appendix VII}} for a description of the working of this DS-Lite data model.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables DSLite.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceSettingNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DSLite.InterfaceSetting.{i}." access="readOnly" numEntriesParameter="InterfaceSettingNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        DSLite {{bibref|DSLite}} settings.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enable or disable this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="EndpointAssignmentPrecedence" access="readWrite" dmr:version="2.2">
+        <description>
+          Indicates the preferred method to be used in assigning values to {{param|EndpointName}} when both static and dynamic values are available.  See {{param|EndpointName}} for further clarification.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv6"/>
+            <enumeration value="Static"/>
+          </string>
+          <default type="factory" value="DHCPv6"/>
+        </syntax>
+      </parameter>
+      <parameter name="EndpointAddressTypePrecedence" access="readWrite" dmr:version="2.5">
+        <description>
+          Indicates the preferred method to be used to assign the address of the DS-Lite Endpoint when both {{param|EndpointName}} and {{param|EndpointAddress}} values are available and the {{enum|Static|EndpointAssignmentPrecedence}} method is used.  See {{param|EndpointName}} and {{param|EndpointAddress}} for further clarification.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="FQDN">
+              <description>
+                Derive from {{param|EndpointName}} via a DNS lookup.
+              </description>
+            </enumeration>
+            <enumeration value="IPv6Address">
+              <description>
+                Use {{param|EndpointAddress}} directly.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EndpointAddressInUse" access="readOnly" dmr:version="2.5">
+        <description>
+          Indicates the address currently in use for the tunnel concentrator (remote endpoint).  It is derived from the values of the {{param|EndpointAssignmentPrecedence}}, {{param|EndpointAddressTypePrecedence}}, {{param|EndpointName}} and {{param|EndpointAddress}} parameters.
+          It is {{empty}} if no endpoint address is currently known.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="EndpointName" access="readWrite" dmr:version="2.2">
+        <description>
+          The Fully Qualified Domain Name (FQDN) of the tunnel concentrator (remote endpoint).
+          This parameter is based on ''OPTION_DS_LITE_NAME'' from {{bibref|DSLite-options|Section 4}} and can be assigned statically (e.g. present in the factory default configuration or set by the ACS) or can be updated dynamically (via DHCPv6). If both statically and dynamically assigned, then {{param|EndpointAssignmentPrecedence}} indicates whether it is the static configuration or the DHCPv6 configuration that is actually applied to {{param}}.
+          Note: {{param}} is only writable when {{param|EndpointAssignmentPrecedence}} is {{enum|Static|EndpointAssignmentPrecedence}}; otherwise, {{param}} is automatically configured via the DHCPv6 received option.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EndpointAddress" access="readWrite" dmr:version="2.2">
+        <description>
+          The address of the tunnel concentrator (remote endpoint).
+          This parameter can only be assigned statically (e.g. present in the factory default configuration or set by the ACS).
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.2">
+        <description>
+          Method used to assign {{param|EndpointAddressInUse}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv6">
+              <description>
+                Assigned by DHCPv6 {{bibref|RFC3315}}.
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                For example, present in the factory default configuration, set by the ACS, or set by some other management entity (e.g. via a GUI).
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TunnelInterface" access="readOnly" dmr:version="2.2">
+        <description>
+          {{reference}} This is an IP interface of ''Type'' {{enum|Tunnel|.IP.Interface.{i}.Type}} that is logically the tunnel entry point for upstream IPv4 traffic and is also logically the tunnel exit point for downstream IPv4 traffic (i.e. the entry point for non-tunneled upstream IPv4 traffic to enter a tunnel and become tunneled, or conversely, the exit point for downstream IPv4 traffic leaving a tunnel after being un-tunneled).
+          IPv4 traffic that enters {{param}} is expected to continue on through {{param|TunneledInterface}} from the LAN, and traffic from the WAN is expected to come from TunneledInterface into TunnelInterface. TunnelInterface is a logical interface that can allow for classification, marking (of IPv4 headers), and policing of IPv4 traffic that will be going over a DS-Lite tunnel. These functions are modeled in the Device.QoS object.
+          Note: In DS-Lite, IPv4 packets arriving over one or more device LAN IP interfaces are logically fed into this {{param}}. Likewise, DS-Lite traffic from the WAN gets logically sent from this {{param}} to LAN IP interfaces.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TunneledInterface" access="readOnly" dmr:version="2.2">
+        <description>
+          {{reference}} This is an IP interface of ''Type'' {{enum|Tunneled|.IP.Interface.{i}.Type}} that provides information about the IPv6 headers used to encapsulate the IPv4 packets.
+          Encapsulated IPv4 traffic that enters {{param}} from the WAN is expected to continue on through {{param|TunnelInterface}}, and traffic from the LAN is expected to come from {{param|TunnelInterface}} into {{param}}. {{param}} is a logical interface that can allow for classification, marking (of IPv6 headers and VLAN tags), and policing of IPv6 packets that encapsulate IPv4 packets in DS-Lite traffic. These functions are modeled in the {{object|.QoS.}} object.
+          Note: In DS-Lite, {{param}} traffic originating from the LAN logically feeds into a WAN-side IPv6 capable IP interface that the "DSLite IPv4-in-IPv6 tunnel" goes over. DS-Lite traffic that enters over this IPv6 WAN interface gets logically sent to this {{param}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Queue management configuration object.
+      </description>
+      <parameter name="MaxClassificationEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the Classification table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ClassificationNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAppEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the {{object|App}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AppNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxFlowEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the {{object|Flow}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="FlowNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxPolicerEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the {{object|Policer}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PolicerNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxQueueEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the {{object|Queue}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueStatsNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxShaperEntries" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          The maximum number of entries available in the {{object|Shaper}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ShaperNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultForwardingPolicy" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifier of the forwarding policy associated with traffic not associated with any specified  classifier.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultTrafficClass" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifier of the traffic class associated with traffic not associated with any specified classifier.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultPolicer" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Indicates the ''Policer'' table entry for traffic not associated with any specified classifier.
+          {{empty}} indicates a null policer.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="Policer." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultQueue" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Indicates the ''Queue'' table entry for traffic not associated with any specified classifier. Note: The interpretation of {{empty}} value is implementation specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="Queue." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultDSCPMark" access="readWrite" dmr:version="2.0">
+        <description>
+          DSCP to mark traffic not associated with any specified classifier.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of DSCP based upon the EthernetPriority value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultEthernetPriorityMark" access="readWrite" dmr:version="2.0">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1Q-2011}}) to mark traffic not associated with any specified classifier.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2a5|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultInnerEthernetPriorityMark" access="readWrite" dmr:version="2.7">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1Q-2011}}) to mark traffic of the inner VLAN Tag as defined in 802.1Q, when the PDU is not associated with any specified classifier. This parameter is only applicable when the PDU has 2 VLAN Tags.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="AvailableAppList" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} List items represent URNs, each indicating a protocol supported for use as a ProtocolIdentifier in the App table.  This list MAY include any of the URNs defined in {{bibref|TR-181i2|Annex A}} as well as other URNs defined elsewhere.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS.Classification.{i}." access="readWrite" numEntriesParameter="ClassificationNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Classification table.
+        For enabled table entries, if {{param|Interface}} is not a valid reference and {{param|AllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Several of this object's parameters specify DHCP option values. Some cases are version neutral (the parameter can apply to both DHCPv4 and DHCPv6), but in other cases the representation of the option is different for DHCPv4 and DHCPv6, so it is necessary to define separate DHCPv4-specific and DHCPv6-specific parameters. Therefore, an instance of this object that uses DHCP option values as classification criteria will be associated with either DHCPv4 or DHCPv6, as indicated by the {{param|DHCPType}} parameter.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this classifier.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this classifier.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.0">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each packet, the highest ordered entry that matches the classification criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="DHCPType" access="readWrite" dmr:version="2.2">
+        <description>
+          The DHCP protocol associated with the {{object}} instance. Affects only parameters that specify DHCP option values as classification criteria (all such parameter descriptions note this fact).  {{enum}}
+          If {{param}} is {{enum|DHCPv4}}, then {{object}} parameters that are DHCPv6-specific are ignored. If {{param}} is {{enum|DHCPv6}}, then {{object}} parameters that are DHCPv4-specific are ignored.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv4"/>
+            <enumeration value="DHCPv6"/>
+          </string>
+          <default type="object" value="DHCPv4"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion. {{reference}}
+          This specifies the ingress interface associated with the entry. It MAY be a layer 1, 2 or 3 interface, however, the types of interfaces for which ''Classifications'' can be instantiated is a local matter to the CPE.
+          Note that this parameter is permitted to reference ''Tunnel'' instances in order to classify upstream packets that have just been encapsulated (such packets are conceptually similar to locally-generated traffic).  For example, this parameter might reference a {{object|.GRE.Tunnel}} or a {{object|.MAP.Domain}} instance.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllInterfaces" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion. This specifies that all ingress interfaces are associated with the entry. If {{true}}, the value of {{param|Interface}} is ignored since all ingress interfaces are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIP" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Destination IP address.  {{empty}} indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Destination IP address mask, represented as an IP routing prefix using CIDR notation [RFC4632]. The IP address part MUST be {{empty}} (and, if specified, MUST be ignored).
+        </description>
+        <syntax>
+          <dataType ref="IPPrefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIPExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the (masked) DestIP entry, if specified.
+          If {{true}}, the class includes all packets except those that match the (masked) DestIP entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIP" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Source IP address.  {{empty}} indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Source IP address mask, represented as an IP routing prefix using CIDR notation [RFC4632]. The IP address part MUST be {{empty}} (and, if specified, MUST be ignored).
+        </description>
+        <syntax>
+          <dataType ref="IPPrefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIPExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the (masked) {{param|SourceIP}} entry, if  specified.
+          If {{true}}, the class includes all packets except those that match the (masked) {{param|SourceIP}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Protocol number.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="255"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|Protocol}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|Protocol}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPort" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Destination port number.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortRangeMax" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          If specified, indicates the classification criterion is to include the port range from {{param|DestPort}} through {{param}} (inclusive).  If specified, {{param}} MUST be greater than or equal to {{param|DestPort}}.
+          A value of -1 indicates that no port range is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|DestPort}} entry (or port range), if  specified.
+          If {{true}}, the class includes all packets except those that match the {{param|DestPort}} entry (or port range), if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePort" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Source port number.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortRangeMax" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          If specified, indicates the classification criterion is to include the port range from {{param|SourcePort}} through {{param}} (inclusive).  If specified, {{param}} MUST be greater than or equal to SourcePort.
+          A value of -1 indicates that no port range is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|SourcePort}} entry (or port range),  if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|SourcePort}} entry (or port range), if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Source MAC Address.  {{empty}} indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Bit-mask for the MAC address, where matching of a packet's MAC address with the {{param|SourceMACAddress}} is  only to be done for bit positions set to one in the mask.  A mask of ''FF:FF:FF:FF:FF:FF'' or {{empty}} indicates all bits of the  {{param|SourceMACAddress}} are to be used for classification.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMACExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the (masked) {{param|SourceMACAddress}} entry, if  specified.
+          If {{true}}, the class includes all packets except those that match the (masked) {{param|SourceMACAddress}} entry, if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Destination MAC Address.  {{empty}} indicates this criterion is not used for classification.
+          The use of destination MAC address as a classification criterion is primarily useful only for bridged traffic.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Bit-mask for the MAC address, where matching of a packet's MAC address with the {{param|DestMACAddress}} is only to be done for bit positions set to one in the mask.  A mask of ''FF:FF:FF:FF:FF:FF'' or {{empty}} indicates all bits of the  {{param|DestMACAddress}} are to be used for classification.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMACExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the (masked) {{param|DestMACAddress}} entry, if  specified.
+          If {{true}}, the class includes all packets except those that match the (masked) {{param|DestMACAddress}} entry, if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Ethertype" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Ethertype as indicated in either the Ethernet or SNAP Type header.  A value of -1 indicates this criterion is not used for  classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthertypeExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|Ethertype}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|Ethertype}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SSAP" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          SSAP element in the LLC header.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SSAPExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|SSAP}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|SSAP}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSAP" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          DSAP element in the LLC header.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSAPExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|DSAP}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|DSAP}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="LLCControl" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Control element in the LLC header.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="LLCControlExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|LLCControl}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|LLCControl}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SNAPOUI" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          OUI element in the SNAP header.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SNAPOUIExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|SNAPOUI}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|SNAPOUI}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Used to identify one or more LAN devices, value of the DHCPv4 Vendor Class Identifier (Option 60) as defined in {{bibref|RFC2132}}, matched according to the criterion in {{param|SourceVendorClassIDMode}}.  Case sensitive.
+          This is a normal string, e.g. "abc" is represented as "abc" and not say "616263" hex. However, if the value includes non-printing characters then such characters have to be represented using XML escapes, e.g. #x0a for line-feed.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: This parameter is DHCPv4-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv4|DHCPType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorClassIDv6" access="readWrite" dmr:version="2.2">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCPv6 Vendor Class Identifier (Option 16) as defined in {{bibref|RFC3315}}. The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: This parameter is DHCPv6-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv6|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets sourced from LAN devices that match the {{param|SourceVendorClassID}} entry (for {{enum|DHCPv4|DHCPType}}) or the {{param|SourceVendorClassIDv6}} entry (for {{enum|DHCPv6|DHCPType}}), if specified.
+          If {{true}}, the class includes all packets except those sourced from LAN devices that match the {{param|SourceVendorClassID}} entry (for {{enum|DHCPv4|DHCPType}}) or the {{param|SourceVendorClassIDv6}} entry (for {{enum|DHCPv6|DHCPType}}), if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorClassIDMode" access="readWrite" dmr:version="2.0">
+        <description>
+          SourceVendorClassID pattern match criterion.  {{enum}}
+          For example, if {{param|SourceVendorClassID}} is "Example" then an Option 60 value of "Example device" will match with {{param}}  values of {{enum|Prefix}} or {{enum|Substring}}, but not with {{enum|Exact}} or {{enum|Suffix}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Exact"/>
+            <enumeration value="Prefix"/>
+            <enumeration value="Suffix"/>
+            <enumeration value="Substring"/>
+          </string>
+          <default type="object" value="Exact"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Used to identify one or more LAN devices, value of the DHCPv4 Vendor Class Identifier (Option 60) as defined in {{bibref|RFC2132}}, matched according to the criterion in {{param|DestVendorClassIDMode}}.  Case sensitive.
+          This is a normal string, e.g. "abc" is represented as "abc" and not say "616263" hex. However, if the value includes non-printing characters then such characters have to be represented using XML escapes, e.g. #x0a for line-feed.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: This parameter is DHCPv4-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv4|DHCPType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorClassIDv6" access="readWrite" dmr:version="2.2">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCPv6 Vendor Class Identifier (Option 16) as defined in {{bibref|RFC3315}}. The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: This parameter is DHCPv6-specific. It only applies when {{param|DHCPType}} is {{enum|DHCPv6|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets destined for LAN devices that match the {{param|DestVendorClassID}} entry (for {{enum|DHCPv4|DHCPType}}) or the {{param|DestVendorClassIDv6}} entry (for {{enum|DHCPv6|DHCPType}}), if specified.
+          If {{true}}, the class includes all packets except those destined for LAN devices that match the {{param|DestVendorClassID}} entry (for {{enum|DHCPv4|DHCPType}}) or the {{param|DestVendorClassIDv6}} entry (for {{enum|DHCPv6|DHCPType}}), if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorClassIDMode" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|DestVendorClassID}} pattern match criterion.  {{enum}}
+          For example, if {{param|DestVendorClassID}} is "Example" then an Option 60 value of "Example device" will match with {{param}} values  of {{enum|Prefix}} or {{enum|Substring}}, but not with {{enum|Exact}} or {{enum|Suffix}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Exact"/>
+            <enumeration value="Prefix"/>
+            <enumeration value="Suffix"/>
+            <enumeration value="Substring"/>
+          </string>
+          <default type="object" value="Exact"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceClientID" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP Client Identifier. The DHCP Client Identifier is Option 61 (as defined in {{bibref|RFC2132}}) for {{enum|DHCPv4|DHCPType}}, or is Option 1 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+          Note: DHCPv6 Option 1 (Client Identifier) is sometimes referred to as ''DUID''.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceClientIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets sourced from LAN devices that match the  {{param|SourceClientID}} entry, if specified.
+          If {{true}}, the class includes all packets except those sourced from LAN devices that match the {{param|SourceClientID}} entry, if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestClientID" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP Client Identifier. The DHCP Client Identifier is Option 61 (as defined in {{bibref|RFC2132}}) for {{enum|DHCPv4|DHCPType}}, or is Option 1 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+          Note: DHCPv6 Option 1 (Client Identifier) is sometimes referred to as ''DUID''.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestClientIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets destined for LAN devices that match the  {{param|DestClientID}} entry, if specified.
+          If {{true}}, the class includes all packets except those destined for LAN devices that match the {{param|DestClientID}} entry, if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceUserClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP User Class Identifier. The DHCP User Class Identifier is Option 77 (as defined in {{bibref|RFC3004}}) for {{enum|DHCPv4|DHCPType}}, or is Option 15 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceUserClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets sourced from LAN devices that match the  {{param|SourceUserClassID}} entry, if specified.
+          If {{true}}, the class includes all packets except those sourced from LAN devices that match the {{param|SourceUserClassID}} entry,  if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestUserClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP User Class Identifier. The DHCP User Class Identifier is Option 77 (as defined in {{bibref|RFC3004}}) for {{enum|DHCPv4|DHCPType}}, or is Option 15 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}. The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestUserClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets destined for LAN devices that match the  {{param|DestUserClassID}} entry, if specified.
+          If {{true}}, the class includes all packets except those destined for LAN devices that match the {{param|DestUserClassID}} entry, if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorSpecificInfo" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP Vendor-specific Information, matched according to the criteria in {{param|SourceVendorSpecificInfoEnterprise}} and {{param|SourceVendorSpecificInfoSubOption}}. The DHCP Vendor-specific Information is Option 125 (as defined in {{bibref|RFC3925}}) for {{enum|DHCPv4|DHCPType}}, or is Option 17 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorSpecificInfoExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets sourced from LAN devices that match the  {{param|SourceVendorSpecificInfo}} entry, if specified.
+          If {{true}}, the class includes all packets except those sourced from LAN devices that match the {{param|SourceVendorSpecificInfo}}  entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorSpecificInfoEnterprise" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|SourceVendorSpecificInfo}} Enterprise Number as defined in {{bibref|RFC3925}}.
+          The default value (0) is assigned to IANA and will probably need to be replaced with an appropriate enterprise number.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceVendorSpecificInfoSubOption" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|SourceVendorSpecificInfo}} Sub Option Code as defined in {{bibref|RFC3925}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="0" maxInclusive="255"/>
+          </int>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorSpecificInfo" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP Vendor-specific Information, matched according to the criteria in {{param|DestVendorSpecificInfoEnterprise}} and {{param|DestVendorSpecificInfoSubOption}}. The DHCP Vendor-specific Information is Option 125 (as defined in {{bibref|RFC3925}}) for {{enum|DHCPv4|DHCPType}}, or is Option 17 (as defined in {{bibref|RFC3315}}) for {{enum|DHCPv6|DHCPType}}.
+          {{empty}} indicates this criterion is not used for classification.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          Note: This parameter is DHCP version neutral. The specific DHCP version in use with this parameter is indicated by {{param|DHCPType}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorSpecificInfoExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets destined for LAN devices that match the  {{param|DestVendorSpecificInfo}} entry, if specified.
+          If {{true}}, the class includes all packets except those destined for LAN devices that match the {{param|DestVendorSpecificInfo}}  entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorSpecificInfoEnterprise" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|DestVendorSpecificInfo}} Enterprise Number as defined in {{bibref|RFC3925}}.
+          The default value (0) is assigned to IANA and will probably need to be replaced with an appropriate enterprise number.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestVendorSpecificInfoSubOption" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|DestVendorSpecificInfo}} Sub Option Code as defined in {{bibref|RFC3925}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="0" maxInclusive="255"/>
+          </int>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TCPACK" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          If {{false}}, this criterion is not used for classification.
+          If {{true}}, this criterion matches with all TCP segments that have the ACK control bit set.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="TCPACKExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|TCPACK}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|TCPACK}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPLengthMin" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Minimum IP Packet Length (including header) in bytes.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPLengthMax" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Maximum IP Packet Length (including header) in bytes.
+          A value of zero indicates that no maximum is specified (an umlimited maximum length).
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPLengthExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets whose length (including header) falls within the inclusive  range {{param|IPLengthMin}} through {{param|IPLengthMax}}.  A value of zero for both {{param|IPLengthMin}} and {{param|IPLengthMax}}  allows any length packet.  An equal non-zero value of {{param|IPLengthMin}} and {{param|IPLengthMax}} allows only a packet with the exact length specified.
+          If {{true}}, the class includes all packets except those whose length (including header) falls within the inclusive range  {{param|IPLengthMin}} through {{param|IPLengthMax}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPCheck" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          DiffServ codepoint (defined in {{bibref|RFC2474}}).
+          If set to a Class Selector Codepoint (defined in {{bibref|RFC2474}}), all DSCP values that match the first 3 bits will be considered a valid  match.
+          A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="63"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|DSCPCheck}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|DSCPCheck}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMark" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification result.
+          DSCP to mark traffic with that falls into this classification entry.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of DSCP based upon the EthernetPriority value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriorityCheck" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Current Ethernet priority of a VLAN Tag as defined in {{bibref|802.1Q-2011}} or Ethernet Priority field as defined in 802.1D. If more than 1 VLAN tag is present, then this parameter represents the outer VLAN Tag. A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriorityExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|EthernetPriorityCheck}} entry, if  specified.
+          If {{true}}, the class includes all packets except those that match the {{param|EthernetPriorityCheck}} entry, if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriorityMark" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification result.
+          Ethernet priority code (as defined in {{bibref|802.1Q-2011}}) to mark traffic with that falls into this classification entry associated with the {{param|EthernetPriorityCheck}}.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="InnerEthernetPriorityCheck" access="readWrite" dmr:version="2.7">
+        <description>
+          Classification criterion.
+          Current Ethernet priority of the inner VLAN Tag as defined in 802.1Q. This parameter is only applicable when the PDU has 2 VLAN Tags. A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="InnerEthernetPriorityExclude" access="readWrite" dmr:version="2.7">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|InnerEthernetPriorityCheck}} entry, if  specified.
+          If {{true}}, the class includes all packets except those that match the {{param|InnerEthernetPriorityCheck}} entry, if  specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="InnerEthernetPriorityMark" access="readWrite" dmr:version="2.7">
+        <description>
+          Classification result.
+          Ethernet priority code to mark traffic with that falls into this classification entry associated with the {{param|InnerEthernetPriorityCheck}}.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetDEICheck" access="readWrite" dmr:version="2.7">
+        <description>
+          Classification criterion.
+          Current Ethernet Drop eligible Indication (DEI) of the VLAN tag as defined in 802.1Q. If 2 VLAN Tags are present, then this parameter represents the outer VLAN tag. A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetDEIExclude" access="readWrite" dmr:version="2.7">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|EthernetDEICheck}} entry, if  specified.
+          If {{true}}, the class includes all packets except those that match the {{param|EthernetDEICheck}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDCheck" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Current Ethernet VLAN ID as defined in 802.1Q.  A value of -1 indicates this criterion is not used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="VLANIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the class includes only those packets that match the {{param|VLANIDCheck}} entry, if specified.
+          If {{true}}, the class includes all packets except those that match the {{param|VLANIDCheck}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="OutOfBandInfo" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification criterion.
+          Allows traffic to be distinguished based on out-of-band information such as physical port or application ID.  Primarily intended for,  but not restricted to, locally sourced traffic.
+          If specified, this entry applies to traffic with matching out-of-band information.  A value of -1 indicates this criterion is not  used for classification.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingPolicy" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification result.
+          Identifier of the forwarding policy associated with traffic that falls in this classification.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TrafficClass" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification result.
+          Identifier of the traffic class associated with traffic that falls in this classification.  If specified, at least one {{object|#.Queue}} table entry MUST include this traffic class in its {{param|#.Queue.{i}.TrafficClasses}} parameter (which is a comma-separated list).
+          A value of -1 indicates a null traffic class.
+          {{param}} and {{param|App}} are mutually exclusive and one of the two MUST be specified.  If {{param}} is {{null}}, {{param|App}} MUST be specified, and vice versa.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="Policer" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification result. {{reference}}
+          Indicates the ''Policer'' table entry for traffic that falls in this classification.
+          {{empty}} indicates a null policer.
+          {{param}} MAY optionally be specified in conjunction with {{param|TrafficClass}}. {{param}} and {{param|App}} are mutually exclusive.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Policer." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="App" access="readWrite" dmr:version="2.0">
+        <description>
+          Classification result. {{reference}}
+          Indicates the ''App'' table entry for traffic that falls in this classification.
+          {{empty}} indicates a null ''App''.
+          {{param|TrafficClass}} and {{param}} are mutually exclusive and one of the two MUST be specified.  If {{param|TrafficClass}} is null, {{param}} MUST be specified, and vice versa.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.App." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS.App.{i}." access="readWrite" numEntriesParameter="AppNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Application table.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this App table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this App table entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolIdentifier" access="readWrite" dmr:version="2.0">
+        <description>
+          URN identifying the protocol associated with the given application.  A set of defined URNs is given in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.0">
+        <description>
+          Human-readable name associated with this entry in the App table.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultForwardingPolicy" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifier of the forwarding policy associated with traffic associated with this App table entry, but not  associated with any specified flow.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultTrafficClass" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifier of the traffic class associated with traffic associated with this App table entry, but not associated with any specified flow.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultPolicer" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Indicates the ''Policer'' table entry for traffic associated with this {{object}} table entry, but not associated with any specified flow.
+          {{empty}} indicates a null policer.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Policer." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultDSCPMark" access="readWrite" dmr:version="2.0">
+        <description>
+          DSCP to mark traffic associated with this App table entry, but not associated with any specified flow.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of DSCP based upon the EthernetPriority value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultEthernetPriorityMark" access="readWrite" dmr:version="2.0">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1Q-2011}}) to mark traffic associated with this App table entry, but not  associated with any specified flow.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2a5|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultInnerEthernetPriorityMark" access="readWrite" dmr:version="2.7">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1Q-2011}}) to mark the inner VLAN Tags as defined in 802.1Q with this {{object}} table entry where the packet is not associated with any specified flow. This parameter is only applicable when the PDU has 2 VLAN Tags.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS.Flow.{i}." access="readWrite" numEntriesParameter="FlowNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Flow table.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this Flow table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this Flow table entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readWrite" dmr:version="2.0">
+        <description>
+          URN identifying the type of flow to be associated with the specified policer.  A set of defined URNs is given in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="TypeParameters" access="readWrite" dmr:version="2.0">
+        <description>
+          List of name-value pairs representing additional criteria to identify the flow type.  The use and interpretation is specific to the particular FlowType URN.Encoded using the "x-www-form-urlencoded" content type defined in {{bibref|HTML4.01}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.0">
+        <description>
+          Human-readable name associated with this entry in the Flow table.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="App" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Indicates the ''App'' table entry associated with this flow.  {{empty}} indicates the flow table is not associated with any App table entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.App." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingPolicy" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifier of the forwarding policy associated with this flow.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TrafficClass" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifier of the traffic class associated with this flow.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Policer" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Indicates the ''Policer'' table entry for traffic that falls in this flow.
+          {{empty}} indicates a null policer.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Policer." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPMark" access="readWrite" dmr:version="2.0">
+        <description>
+          DSCP to mark traffic with that falls into this flow.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of DSCP based upon the EthernetPriority value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="EthernetPriorityMark" access="readWrite" dmr:version="2.0">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1Q-2011}}) to mark traffic with that falls into this flow.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2a5|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="InnerEthernetPriorityMark" access="readWrite" dmr:version="2.7">
+        <description>
+          Ethernet priority code (as defined in {{bibref|802.1Q-2011}}) to mark the inner VLAN Tags with for traffic that falls into this flow.
+          A value of -1 indicates no change from the incoming packet.
+          A value of -2 indicates automatic marking of EthernetPriority based upon the DSCP value of the incoming packet as defined in {{bibref|TR-181i2|Annex A}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-2"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS.Policer.{i}." access="readWrite" numEntriesParameter="PolicerNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Policer table.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this policer.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this policer.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="CommittedRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Committed rate allowed for this policer in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="CommittedBurstSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Committed Burstsize in bytes.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ExcessBurstSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Excess Burstsize in bytes.
+          Applied for a {{enum|SingleRateThreeColor|MeterType}} meter.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PeakRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Peak rate allowed for this Meter in {{units}}.
+          Applied for {{enum|TwoRateThreeColor|MeterType}} meters.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="bits per second"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PeakBurstSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Peak Burstsize in bytes.
+          Applied for {{enum|TwoRateThreeColor|MeterType}} meters.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="MeterType" access="readWrite" dmr:version="2.0">
+        <description>
+          Identifies the method of traffic measurement to be used for this policer.  {{enum}}
+          {{enum|SimpleTokenBucket}} makes use of {{param|CommittedRate}} and {{param|CommittedBurstSize}}.
+          {{enum|SingleRateThreeColor}} makes use of {{param|CommittedRate}}, {{param|CommittedBurstSize}}, and {{param|ExcessBurstSize}} as  defined in {{bibref|RFC2697}}.
+          {{enum|TwoRateThreeColor}} makes use of {{param|CommittedRate}}, {{param|CommittedBurstSize}}, {{param|PeakRate}}, and  {{param|PeakBurstSize}} as defined in {{bibref|RFC2698}}.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="PossibleMeterTypes"/>
+          </string>
+          <default type="object" value="SimpleTokenBucket"/>
+        </syntax>
+      </parameter>
+      <parameter name="PossibleMeterTypes" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Indicates supported meter types.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="SimpleTokenBucket"/>
+            <enumeration value="SingleRateThreeColor"/>
+            <enumeration value="TwoRateThreeColor"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ConformingAction" access="readWrite" dmr:version="2.0">
+        <description>
+          Instructions for how to handle traffic that is conforming.  {{pattern}}
+          {{pattern|Null}} corresponds with no action.
+          ''&lt;DSCP Value&gt;'' is an unsigned integer that corresponds with a mark action overwriting the traffic's DSCP with the configured  DSCP.
+          ''&lt;:Ethernet Priority&gt;'' is a colon (":") followed by an unsigned integer (no white space).  It corresponds with a mark action  overwriting the traffic's Ethernet Priority with the configured Ethernet Priority.
+          ''&lt;DSCP Value:Ethernet Priority&gt;'' is an unsigned integer followed by a colon (":") and a second unsigned integer (no white  space).  It corresponds with a mark action overwriting the traffic's DSCP and Ethernet Priority with the configured values.
+          For example, "24" specifies a DSCP value of 24, ":3" specifies an Ethernet Priority of 3, and "24:3" specifies both.
+        </description>
+        <syntax>
+          <string>
+            <pattern value="Null"/>
+            <pattern value="Drop"/>
+            <pattern value="[0-9]|[1-5][0-9]|6[0-3]">
+              <description>
+                &lt;DSCP Value&gt;
+              </description>
+            </pattern>
+            <pattern value=":[0-7]">
+              <description>
+                &lt;Ethernet Priority&gt;
+              </description>
+            </pattern>
+            <pattern value="([0-9]|[1-5][0-9]|6[0-3]):[0-7]">
+              <description>
+                &lt;DSCP Value:Ethernet Priority&gt;
+              </description>
+            </pattern>
+          </string>
+          <default type="object" value="Null"/>
+        </syntax>
+      </parameter>
+      <parameter name="PartialConformingAction" access="readWrite" dmr:version="2.0">
+        <description>
+          Instructions for how to handle traffic that is partially conforming (colored yellow).  {{pattern}}
+          {{pattern|Null}} corresponds with no action.
+          ''&lt;DSCP Value&gt;'' is an unsigned integer that corresponds with a mark action overwriting the traffic's DSCP with the configured  DSCP.Only applies for three-color meters.
+          ''&lt;:Ethernet Priority&gt;'' is a colon (":") followed by an unsigned integer (no white space).  It corresponds with a mark action  overwriting the traffic's Ethernet Priority with the configured Ethernet Priority.
+          ''&lt;DSCP Value:Ethernet Priority&gt;'' is an unsigned integer followed by a colon (":") and a second unsigned integer (no white  space).  It corresponds with a mark action overwriting the traffic's DSCP and Ethernet Priority with the configured values.
+          For example, "24" specifies a DSCP value of 24, ":3" specifies an Ethernet Priority of 3, and "24:3" specifies both.
+        </description>
+        <syntax>
+          <string>
+            <pattern value="Null"/>
+            <pattern value="Drop"/>
+            <pattern value="[0-9]|[1-5][0-9]|6[0-3]">
+              <description>
+                &lt;DSCP Value&gt;
+              </description>
+            </pattern>
+            <pattern value=":[0-7]">
+              <description>
+                &lt;Ethernet Priority&gt;
+              </description>
+            </pattern>
+            <pattern value="([0-9]|[1-5][0-9]|6[0-3]):[0-7]">
+              <description>
+                &lt;DSCP Value:Ethernet Priority&gt;
+              </description>
+            </pattern>
+          </string>
+          <default type="object" value="Drop"/>
+        </syntax>
+      </parameter>
+      <parameter name="NonConformingAction" access="readWrite" dmr:version="2.0">
+        <description>
+          Instructions for how to handle traffic that is non-conforming.  {{pattern}}
+          {{pattern|Null}} corresponds with no action.
+          ''&lt;DSCP Value&gt;'' is an unsigned integer that corresponds with a mark action overwriting the traffic's DSCP with the configured  DSCP.
+          ''&lt;:Ethernet Priority&gt;'' is a colon (":") followed by an unsigned integer (no white space).  It corresponds with a mark action  overwriting the traffic's Ethernet Priority with the configured Ethernet Priority.
+          ''&lt;DSCP Value:Ethernet Priority&gt;'' is an unsigned integer followed by a colon (":") and a second unsigned integer (no white  space).  It corresponds with a mark action overwriting the traffic's DSCP and Ethernet Priority with the configured values.
+          For example, "24" specifies a DSCP value of 24, ":3" specifies an Ethernet Priority of 3, and "24:3" specifies both.
+        </description>
+        <syntax>
+          <string>
+            <pattern value="Null"/>
+            <pattern value="Drop"/>
+            <pattern value="[0-9]|[1-5][0-9]|6[0-3]">
+              <description>
+                &lt;DSCP Value&gt;
+              </description>
+            </pattern>
+            <pattern value=":[0-7]">
+              <description>
+                &lt;Ethernet Priority&gt;
+              </description>
+            </pattern>
+            <pattern value="([0-9]|[1-5][0-9]|6[0-3]):[0-7]">
+              <description>
+                &lt;DSCP Value:Ethernet Priority&gt;
+              </description>
+            </pattern>
+          </string>
+          <default type="object" value="Drop"/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalCountedPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of Packets counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TotalCountedBytes" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Total number of Bytes counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConformingCountedPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of conforming Packets counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConformingCountedBytes" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of conforming Bytes counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PartiallyConformingCountedPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of partially conforming Packets counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PartiallyConformingCountedBytes" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of partially conforming Bytes counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="NonConformingCountedPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of non-conforming Packets counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="NonConformingCountedBytes" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of non-conforming Bytes counted by this policer, regardless of meter action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS.Queue.{i}." access="readWrite" numEntriesParameter="QueueNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Queue table. Each entry is associated with a set of traffic classes, which are specified via the {{param|TrafficClasses}} parameter, and is configured with weight, precedence, drop algorithm, scheduler algorithm etc as appropriate for the traffic classes. An entry can be associated either with all egress interfaces (in which case an actual queue will be instantiated on each egress interface on which traffic of that traffic class can be generated) or else with a single specified egress interface.
+        For enabled table entries, if {{param|Interface}} is not a valid reference and {{param|AllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this queue.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this queue.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="TrafficClasses" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} Each list item identifies the set of traffic classes associated with this queue.
+          Traffic is sent to this queue if a {{object|#.Classification}}, {{object|#.App}} or {{object|#.Flow}} table entry specifies a traffic class, e.g. via the {{param|#.Classification.{i}.TrafficClass}} parameter.
+          If more than one queue on a given egress interface is associated with a given traffic class, the implementation will choose which queue to send traffic of this class to.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <unsignedInt/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Specifies the egress interface for which the specified queue MUST exist.
+          This MAY be a layer 1, 2 or 3 interface, however, the types of interfaces for which ''Queues'' can be instantiated is a local matter to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllInterfaces" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates that the specified queue MUST exist for all egress interfaces (i.e. this queue entry is to apply to all egress interfaces). If {{true}}, the value of {{param|Interface}} is ignored since all egress interfaces are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="HardwareAssisted" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates whether ''all'' the queues corresponding to this table entry are hardware assisted. If any of the queues corresponding to this table entry are not hardware assisted, the parameter value MUST be {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="BufferLength" access="readOnly" dmr:version="2.0">
+        <description>
+          Number of bytes in the buffer.
+          Queue buffer size for all egress interfaces for which this queue exists.  If the buffer size is not the same for all such egress  interfaces, this parameter MUST be 0.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Weight" access="readWrite" dmr:version="2.0">
+        <description>
+          Weight of this queue in case of {{enum|WFQ|SchedulerAlgorithm}} or {{enum|WRR|SchedulerAlgorithm}}, but only  used for queues of equal precedence.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Precedence" access="readWrite" dmr:version="2.0">
+        <description>
+          Precedence of this queue relative to others. Lower numbers imply greater precedence.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+          <default type="object" value="1"/>
+        </syntax>
+      </parameter>
+      <parameter name="REDThreshold" access="readWrite" dmr:version="2.0">
+        <description>
+          Random Early Detection threshold, used only when {{param|DropAlgorithm}} is {{enum|RED|DropAlgorithm}}.
+          This is the minimum threshold (''min_th'') and is measured as a percentage of the queue size.  If the value is set to zero, the CPE  MUST choose a sensible value, e.g. 5 (but the value MUST still read back as zero).
+          In this version of the data model, there is no way to set the maximum threshold (''max_th'').  The CPE MUST choose a sensible value,  e.g. three times the minimum threshold.
+          In this version of the data model, there is no way to set the RED weight (''w_q'').  The CPE MUST choose a sensible value, e.g.  0.002.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="100"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="REDPercentage" access="readWrite" dmr:version="2.0">
+        <description>
+          Random Early Detection percentage, used only when {{param|DropAlgorithm}} is {{enum|RED|DropAlgorithm}}.
+          This is the maximum value of the packet marking probability (''max_p'').  If the value is set to zero, the CPE MUST choose a sensible  value, e.g. 10 (but the value MUST still read back as zero).
+          In this version of the data model, there is no way to set the RED weight (''w_q'').  The CPE MUST choose a sensible value, e.g.  0.002.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="100"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DropAlgorithm" access="readWrite" dmr:version="2.0">
+        <description>
+          Dropping algorithm used for this queue if congested.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="RED">
+              <description>
+                Random Early Detection {{bibref|RED}}
+              </description>
+            </enumeration>
+            <enumeration value="DT">
+              <description>
+                Drop Tail
+              </description>
+            </enumeration>
+            <enumeration value="WRED">
+              <description>
+                Weighted RED
+              </description>
+            </enumeration>
+            <enumeration value="BLUE">
+              <description>
+                {{bibref|BLUE}}
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="DT"/>
+        </syntax>
+      </parameter>
+      <parameter name="SchedulerAlgorithm" access="readWrite" dmr:version="2.0">
+        <description>
+          Scheduling Algorithm used by scheduler.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="WFQ">
+              <description>
+                Weighted Fair Queueing
+              </description>
+            </enumeration>
+            <enumeration value="WRR">
+              <description>
+                Weighted Round Robin
+              </description>
+            </enumeration>
+            <enumeration value="SP">
+              <description>
+                Strict Priority
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="SP"/>
+        </syntax>
+      </parameter>
+      <parameter name="ShapingRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Rate to shape this queue's traffic to.  For leaky bucket (constant rate shaping), this is the constant rate.  For token bucket (variable rate shaping), this is the average rate.
+          If &lt;= 100, in percent of the rate of the highest rate-constrained layer over which the packet will travel on egress.
+          If &gt; 100, in bits per second.
+          A value of -1 indicates no shaping.
+          For example, for packets destined for a WAN DSL interface, if the egress will be on a PPP or IP link with a specified ''ShapingRate'', the percentage is calculated relative to this rate.  Otherwise, if the ATM layer is rate-constrained, then the rate is calculated relative to this rate.  Otherwise, the rate is calculated relative to the physical-layer DSL rate.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ShapingBurstSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Burst size in bytes.  For both leaky bucket (constant rate shaping) and token bucket (variable rate shaping)  this is the bucket size and is therefore the maximum burst size.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS.QueueStats.{i}." access="readWrite" numEntriesParameter="QueueStatsNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Queue statistics table. This table is managed by the ACS, which will create entries only for those {Queue, Interface} combinations for which statistics are to be collected.
+        Note: The {{object}} table includes unique key parameters that are strong references. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Queue"/>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this object.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this object.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled">
+              <description>
+                Enabled and {Queue,Interface} is valid
+              </description>
+            </enumeration>
+            <enumeration value="Error">
+              <description>
+                Enabled but {Queue,Interface} is invalid
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Queue" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Indicates ''Queue'' entry with which this object is associated.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Queue." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Specifies the egress interface for which this object contains statistics.
+          This MAY be a layer 1, 2 or 3 interface, however, the types of interfaces for which ''QueueStats'' can be instantiated is a local matter to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="OutputPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of packets output through the queue.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="OutputBytes" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of bytes output through the queue.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DroppedPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of packets dropped by the queue.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DroppedBytes" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Number of bytes dropped by the queue.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueOccupancyPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Queue occupancy in packets (gives a measure of queue latency).
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueOccupancyPercentage" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Queue occupancy measured as a {{units}}, i.e. 100 * queue occupancy in bytes / queue size in bytes (gives a measure of queue usage).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+            <units value="percent"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.QoS.Shaper.{i}." access="readWrite" numEntriesParameter="ShaperNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Shaper table. Used to shape the queue(s) associated with {{param|Interface}}. In case of a single queue for that interface, determines the egress rate of the queue. In case of multiple queues for that interface (possibly with per queue shaping rates), determines the aggregate egress rate on that interface.
+        For enabled table entries, if {{param|Interface}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this shaper.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this shaper.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}The interface object associated with this ''Shaper'' entry. It MAY be a layer 1, 2 or 3 interface, however, the types of interfaces for which ''Shapers'' can be instantiated is a local matter to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ShapingRate" access="readWrite" dmr:version="2.0">
+        <description>
+          Rate to shape the associated interface connection's egress traffic to.  For leaky bucket (constant rate shaping), this is the constant rate.  For token bucket (variable rate shaping), this is the average rate.
+          If &lt;= 100, in percent of the rate of the highest rate-constrained layer over which the packet will travel on egress.
+          If &gt; 100, in bits per second.
+          A value of -1 indicates no shaping.
+          For example, for packets destined for a WAN DSL interface, if the ATM layer is rate-constrained, then the rate is calculated relative to this rate.  Otherwise, the rate is calculated relative to the physical-layer DSL rate.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ShapingBurstSize" access="readWrite" dmr:version="2.0">
+        <description>
+          Burst size in bytes.  For both leaky bucket (constant rate shaping) and token bucket (variable rate shaping)  this is the bucket size and is therefore the maximum burst size.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LANConfigSecurity." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains generic device configuration information.
+      </description>
+      <parameter name="ConfigPassword" access="readWrite" dmr:version="2.0">
+        <description>
+          A password to allow LAN access to protected auto-configuration services.
+          If the CPE supports TR-064 (LAN-side DSL CPE Configuration Protocol), this parameter is to be used as the ''dslf-config'' password  (as defined in TR-064).
+          If the CPE has a user interface with password protection enabled, this parameter is also to be used as the user password for  password-protected operations.  However, this parameter MUST NOT be used to set the user password if the parameter  {{param|.UserInterface.PasswordUserSelectable}} is {{true}}.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Hosts." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object provides information about each of the hosts on the LAN, including those whose IP address was allocated by the CPE using DHCP as well as hosts with statically allocated IP addresses. It can also include non-IP  hosts.
+      </description>
+      <parameter name="HostNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Hosts.Host.{i}." access="readOnly" numEntriesParameter="HostNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Host table.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="PhysAddress"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" status="deprecated" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+          This parameter is DEPRECATED because {{object}} is a transient object.
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="PhysAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          Unique physical identifier of the host. For many layer 2 technologies this is typically a MAC address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          Current IP Address of the host. {{empty}} if no address is available.
+          If more than one IP address for this host is known, the CPE will choose a ''primary'' address.  All known IP addresses can be listed in the {{object|IPv4Address}} and {{object|IPv6Address}} tables.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="AddressSource" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          Indicates whether the IP address of the host was allocated by the CPE using DHCP, was assigned to the host statically, or was assigned using automatic IP address allocation.  {{enum}}
+          This parameter is DEPRECATED because only {{enum|None}} and {{enum|DHCP}} made sense (the CPE doesn't know whether the address is {{enum|Static}} or {{enum|AutoIP}}).  The {{enum|DHCP}} case is now handled via the {{param|DHCPClient}} reference.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCP"/>
+            <enumeration value="Static"/>
+            <enumeration value="AutoIP"/>
+            <enumeration value="None"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DHCPClient" access="readOnly" dmr:version="2.2">
+        <description>
+          {{reference}} Each list item is the DHCPv4 or DHCPv6 server's client entry that corresponds to the host.
+        </description>
+        <syntax>
+          <list maxItems="2"/>
+          <string>
+            <pathRef refType="strong" targetParent=".DHCPv4.Server.Pool.{i}.Client. .DHCPv6.Server.Pool.{i}.Client." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTimeRemaining" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          DHCP lease time remaining in {{units}}.  A value of -1 indicates an infinite lease.  The value MUST be 0 (zero) if the {{param|AddressSource}} is not {{enum|DHCP|AddressSource}}.
+          This parameter is DEPRECATED because DHCP lease/lifetime information can be accessed via the {{param|DHCPClient}} reference.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedDevice" access="readOnly" dmr:version="2.2">
+        <description>
+          {{noreference}}The value MUST the path name of the ''AssociatedDevice'' (or equivalent) table row that models the host, or {{null}} if there is no such table.
+          For example: ''Device.WiFi.AccessPoint.1.AssociatedDevice.2''
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Layer1Interface" access="readOnly" dmr:version="2.0">
+        <description>
+          {{noreference}}The value MUST be the path name of a row in a layer 1 interface table.  If the layer 1 device isn’t known, then {{param}} will be {{null}}.
+          For example: ''Device.Ethernet.Interface.2''
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Layer3Interface" access="readOnly" dmr:version="2.0">
+        <description>
+          {{reference}}  If the entry represents a non-IP device, then {{param}} will be {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassID" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          Vendor Class Identifier DHCP option (Option 60) of the host.
+          This is a normal string, e.g. "abc" is represented as "abc" and not say "616263" hex. However, if the value includes non-printing characters then such characters have to be represented using XML escapes, e.g. #x0a for line-feed.
+          It MAY be defined when {{param|AddressSource}} is {{enum|DHCP|AddressSource}}. {{empty}} indicates this option is not used.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          This parameter is DEPRECATED because host-supplied DHCP options can be accessed via the {{param|DHCPClient}} reference.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ClientID" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          A hexbinary string, Client Identifier DHCP option (Option 61) for the specific IP connection of the client.  The option value is binary, so an exact match is REQUIRED.
+          It MAY be defined when {{param|AddressSource}} is {{enum|DHCP|AddressSource}}. {{empty}} indicates this option is not used.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          This parameter is DEPRECATED because host-supplied DHCP options can be accessed via the {{param|DHCPClient}} reference.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="UserClassID" access="readOnly" status="deprecated" dmr:version="2.0">
+        <description>
+          A hexbinary string, User Class Identifier DHCP option (Option 77) of the host.
+          It MAY be defined when {{param|AddressSource}} is {{enum|DHCP|AddressSource}}. {{empty}} indicates this option is not used.
+          Note: DHCPv4 Option values are limited to a length of 255, while DHCPv6 Option values can have a maximum length of 65535.
+          This parameter is DEPRECATED because host-supplied DHCP options can be accessed via the {{param|DHCPClient}} reference.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="HostName" access="readOnly" dmr:version="2.0">
+        <description>
+          The device's host name or {{empty}} if unknown.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.0">
+        <description>
+          Whether or not the host is currently present on the LAN.  The method of presence detection is a local matter to  the CPE.
+          The ability to list inactive hosts is OPTIONAL.  If the CPE includes inactive hosts in this table, {{param}} MUST be set to {{false}}  for each inactive host.  The length of time an inactive host remains listed in this table is a local matter to the CPE.
+          Entries in Device.Hosts.Host SHOULD NOT be removed when they become inactive if there are {{object|WANStats}} statistics collected for the entry in the past seven days.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ActiveLastChange" access="readOnly" dmr:version="2.10">
+        <description>
+          The datetime when {{param|Active}} last changed from {{true}} to {{false}} or from {{false}} to {{true}}.  The initial detection of a host SHOULD be treated as a transition from {{false}} to {{true}}, showing the datetime when the host was first detected.
+          The ability to list inactive hosts is OPTIONAL. The length of time an inactive host remains listed in this table is a local matter to the CPE.
+          Entries in Device.Hosts.Host SHOULD NOT be removed when they become inactive if there are {{object|WANStats}} statistics collected for the entry in the past seven days.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4AddressNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6AddressNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Hosts.Host.{i}.IPv4Address.{i}." access="readOnly" numEntriesParameter="IPv4AddressNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        The host's known IPv4 addresses.  This includes any addresses assigned via DHCP, which can also be accessed via the {{param|#.DHCPClient}} reference.
+      </description>
+      <uniqueKey>
+        <parameter ref="IPAddress"/>
+      </uniqueKey>
+      <parameter name="IPAddress" access="readOnly" dmr:version="2.2">
+        <description>
+          IPv4 address.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Hosts.Host.{i}.IPv6Address.{i}." access="readOnly" numEntriesParameter="IPv6AddressNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        The host's known IPv6 addresses.  This includes any addresses assigned via DHCP, which can also be accessed via the {{param|#.DHCPClient}} reference.
+      </description>
+      <uniqueKey>
+        <parameter ref="IPAddress"/>
+      </uniqueKey>
+      <parameter name="IPAddress" access="readOnly" dmr:version="2.2">
+        <description>
+          IPv6 address.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Hosts.Host.{i}.WANStats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        These count bytes or packets at the IP layer sent to the WAN, or received from the WAN.
+      </description>
+      <parameter name="BytesSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of bytes transmitted to the WAN from the Host device at the IP layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="BytesReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of bytes received from the WAN and sent to the Host device at the IP layer.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of IP packets transmitted to the WAN from the Host device.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of IP packets received from the WAN and sent to the Host device.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorsSent" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of outbound IP packets to the WAN from the Host device that could not be transmitted because of errors. These may be due to the number of retransmissions exceeding the retry limit, or from other causes.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="RetransCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The total number of transmitted IP packets to the WAN from the Host device which were retransmissions. Two retransmissions of the same packet results in this counter incrementing by two.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="DiscardPacketsSent" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The total number of outbound IP packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Properties for Domain Name Service (DNS).
+      </description>
+      <parameter name="SupportedRecordTypes" access="readOnly" dmr:version="2.2">
+        <description>
+          The DNS record types that are supported by the device. {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="A">
+              <description>
+                {{bibref|RFC1035}}
+              </description>
+            </enumeration>
+            <enumeration value="AAAA">
+              <description>
+                {{bibref|RFC3596}}
+              </description>
+            </enumeration>
+            <enumeration value="SRV">
+              <description>
+                {{bibref|RFC2782}}
+              </description>
+            </enumeration>
+            <enumeration value="PTR">
+              <description>
+                {{bibref|RFC1035}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.Client." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Client properties for Domain Name Service (DNS). The DNS client resolves FQDN on behalf of device internal (client) applications.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the DNS client.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of the DNS client. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServerNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.Client.Server.{i}." access="readWrite" numEntriesParameter="ServerNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This table contains the DNS Server IP address to be used by the DHCP Client (it does ''not'' model a DNS Server). Entries are either automatically created as result of DHCP (v4 or v6), IPCP, or RA received DNS server information, or are statically configured by the ACS.
+      </description>
+      <uniqueKey>
+        <parameter ref="DNSServer"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="DNSServer" access="readWrite" dmr:version="2.0">
+        <description>
+          DNS server IP addresses.
+          Note: {{param}} is only writable when {{param|Type}} is {{enum|Static|Type}}; otherwise, {{param}} is automatically configured as result of DHCP, IPCP, or RA received DNS server information.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} This parameter specifies the IP interface over which the DNS query is sent.
+          If {{empty}} is specified, the CPE MUST use its routing policy (Forwarding table entries), if necessary, to determine the appropriate interface.
+          Note: {{param}} is only writable when {{param|Type}} is {{enum|Static|Type}}; otherwise, {{param}} is automatically configured as result of DHCP, IPCP, or RA received DNS server information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.0">
+        <description>
+          Method used to assign the {{param|DNSServer}} address.  {{enum}}
+          Table entries that are automatically created as result of DHCP, IPCP, or RA received DNS server information will have {{param}} set to {{enum|DHCPv4}}, {{enum|DHCPv6}}, {{enum|IPCP}}, or {{enum|RouterAdvertisement}}, as the case may be. Manually created table entires will have their {{param}} set to {{enum|Static}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCP" status="deprecated">
+              <description>
+                Replaced by {{enum|DHCPv4}}.
+              </description>
+            </enumeration>
+            <enumeration value="DHCPv4"/>
+            <enumeration value="DHCPv6"/>
+            <enumeration value="RouterAdvertisement"/>
+            <enumeration value="IPCP"/>
+            <enumeration value="Static"/>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.Relay." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        DNS Relay object. The DNS proxy (or relay) function allows the forwarding of local network DNS queries to local or external DNS server(s) {{bibref|RFC5625}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the DNS Relay function.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of the DNS relay. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.Relay.Forwarding.{i}." access="readWrite" numEntriesParameter="ForwardNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        DNS Server forwarding policy to be used by the DNS Relay.  Entries are either automatically created as result of DHCP (v4 or v6), IPCP, or RA received DNS server information, or are statically configured by the ACS.
+        Note: Management of re-directing queries to the device embedded DNS server is not defined in this version of the specification.
+      </description>
+      <uniqueKey>
+        <parameter ref="DNSServer"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="DNSServer" access="readWrite" dmr:version="2.0">
+        <description>
+          DNS server IP addresses.
+          Note: {{param}} is only writable when {{param|Type}} is {{enum|Static|Type}}; otherwise, {{param}} is automatically configured as result of DHCP, IPCP, or RA received DNS server information.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Specifies the IP interface over which the DNS query is sent.
+          If {{empty}} is specified, the CPE MUST use its routing policy (IP Forwarding table entries), if necessary, to determine the appropriate interface.
+          Note: {{param}} is only writable when {{param|Type}} is {{enum|Static|Type}}; otherwise, {{param}} is automatically configured as result of DHCP, IPCP, or RA received DNS server information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.0">
+        <description>
+          Method used to assign the {{param|DNSServer}} address.  {{enum}}
+          Table entries that are automatically created as result of DHCP, IPCP, or RA received DNS server information will have {{param}} set to {{enum|DHCPv4}}, {{enum|DHCPv6}}, {{enum|IPCP}}, or {{enum|RouterAdvertisement}}, as the case may be. Manually created table entires will have their {{param}} set to {{enum|Static}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCP" status="deprecated">
+              <description>
+                Replaced by {{enum|DHCPv4}}.
+              </description>
+            </enumeration>
+            <enumeration value="DHCPv4"/>
+            <enumeration value="DHCPv6"/>
+            <enumeration value="RouterAdvertisement"/>
+            <enumeration value="IPCP"/>
+            <enumeration value="Static"/>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.Diagnostics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The DNS Diagnostics object containing the {{object|NSLookupDiagnostics()}} test.
+      </description>
+      <command name="NSLookupDiagnostics()" async="true" dmr: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 dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Interface" dmr:version="2.0">
+            <description>
+              {{reference}} This parameter specifies the IP-layer interface over which the test is to be performed (i.e. the source IP address to use when performing the test).
+              If {{empty}} is specified, the CPE MUST use its routing policy (Forwarding table entries), if necessary, to determine the appropriate interface.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+                <pathRef refType="weak" targetType="row"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="HostName" dmr:version="2.0">
+            <description>
+              Specifies the Host Name that NS Lookup is to look for. The current domain name MUST be used unless the name is a fully qualified name.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="DNSServer" dmr:version="2.0">
+            <description>
+              Specifies the DNS Server name or IP address that NS Lookup is to use for the lookup. The name of this server will be resolved using the default DNS server unless an IP address is provided.
+              If {{empty}} is specified, the device's default DNS server will be used.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="Timeout" dmr:version="2.0">
+            <description>
+              Timeout in {{units}} that indicates that a request has failed.
+            </description>
+            <syntax>
+              <unsignedInt>
+                <units value="milliseconds"/>
+              </unsignedInt>
+            </syntax>
+          </parameter>
+          <parameter name="NumberOfRepetitions" dmr:version="2.0">
+            <description>
+              The number of times the device SHOULD repeat the execution of the NSLookup using the same input parameters.  If the diagnostics test fails the CPE MAY terminate the test without completing the full number of repetitions.
+              Each repetition will use a Result instance to hold the NSLookup result data.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+        </input>
+        <output dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <parameter name="SuccessCount" dmr:version="2.0">
+            <description>
+              Number of successfully executed repetitions.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <object name="Result.{i}." minEntries="0" maxEntries="unbounded" dmr:version="2.0" dmr:noUniqueKeys="true">
+            <description>
+              Results from the most recent invocation of the test, one instance per repetition.
+            </description>
+            <parameter name="Status" dmr:version="2.0">
+              <description>
+                Result Parameter to represent whether the NS Lookup was successful or not.
+              </description>
+              <syntax>
+                <string>
+                  <enumeration value="Success"/>
+                  <enumeration value="Error_DNSServerNotAvailable"/>
+                  <enumeration value="Error_HostNameNotResolved"/>
+                  <enumeration value="Error_Timeout"/>
+                  <enumeration value="Error_Other"/>
+                </string>
+              </syntax>
+            </parameter>
+            <parameter name="AnswerType" dmr:version="2.0">
+              <description>
+                Result parameter to represent whether the answer is Authoritative or not.
+              </description>
+              <syntax>
+                <string>
+                  <enumeration value="None">
+                    <description>
+                      Indicates that the NS Lookup failed to find the host.
+                    </description>
+                  </enumeration>
+                  <enumeration value="Authoritative"/>
+                  <enumeration value="NonAuthoritative"/>
+                </string>
+              </syntax>
+            </parameter>
+            <parameter name="HostNameReturned" dmr:version="2.0">
+              <description>
+                Result parameter to represent the fully qualified name for the Host Name in the calling parameter (e.g. HostName.DomainName); if no response was provided, then this parameter is {{empty}}.
+              </description>
+              <syntax>
+                <string>
+                  <size maxLength="256"/>
+                </string>
+              </syntax>
+            </parameter>
+            <parameter name="IPAddresses" dmr:version="2.0">
+              <description>
+                {{list}} Indicates the IP Address results returned by the NS Lookup; if no response was provided, then this parameter is {{empty}}.
+              </description>
+              <syntax>
+                <list maxItems="10"/>
+                <dataType ref="IPAddress"/>
+              </syntax>
+            </parameter>
+            <parameter name="DNSServerIP" dmr:version="2.0">
+              <description>
+                Result parameter to represent the actual DNS Server IP address that the NS Lookup used.
+              </description>
+              <syntax>
+                <dataType ref="IPAddress"/>
+              </syntax>
+            </parameter>
+            <parameter name="ResponseTime" dmr:version="2.0">
+              <description>
+                Response time (for the first response packet) in {{units}}, or 0 if no response was received.
+              </description>
+              <syntax>
+                <unsignedInt>
+                  <units value="milliseconds"/>
+                </unsignedInt>
+              </syntax>
+            </parameter>
+          </object>
+        </output>
+      </command>
+    </object>
+    <object name="Device.DNS.SD." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.6">
+      <description>
+        This object contains the DNS Service Discovery {{bibref|DNS-SD}} object and parameters necessary to discover services and their associated devices.
+        Upon reboot the the contents of the service table are repopulated. When the DNS.SD service is disabled, the contents of the service table is implementation specific.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.6">
+        <description>
+          The parameter, when {{true}}, enables the discovery of DNS-SD services hosted by other devices.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AdvertisedInterfaces" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|the {{object|##.IP.Interface}} object instance from which DNS-SD services are advertised}}
+          If this parameter is not supported by an implementation then DNS-SD services are advertised on all LAN interfaces.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="##.IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.SD.Service.{i}." access="readOnly" numEntriesParameter="ServiceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.6">
+      <description>
+        The {{object}} table contains discovered DNS-SD services. DNS.SD service information is provided in DNS RR SRV records {{bibref|RFC2782}}. The Service Instance Name {{bibref|DNS-SD|Section 4.1 Structured Instance Names}} further specifies information about the service name (RFC2782 Service field) and domain name (RFC2782 Name field) in the form:
+        Service Instance Name = &lt;InstanceName&gt; . &lt;Service&gt; . &lt;Domain&gt;
+        &lt;Service&gt; = _&lt;ApplicationProtocol&gt; . _&lt;TransportProtocol&gt;
+        RFC2782 Service field will always be equal to &lt;InstanceName&gt;. &lt;Service&gt;
+        RFC2782 Name field will always be equal to &lt;Domain&gt;
+        For example, an SSH service might have:
+        *{{param|InstanceName}} = "Secure Shell (SSH))"
+        *{{param|ApplicationProtocol}} = "ssh"
+        *{{param|TransportProtocol}} = "TCP"
+        *{{param|Domain}} = "example.com"
+        *{{param|Port}} = 22
+        *{{param|Target}} = "ssh.example.com."
+      </description>
+      <uniqueKey>
+        <parameter ref="InstanceName"/>
+        <parameter ref="ApplicationProtocol"/>
+        <parameter ref="TransportProtocol"/>
+        <parameter ref="Domain"/>
+      </uniqueKey>
+      <parameter name="InstanceName" access="readOnly" dmr:version="2.6">
+        <description>
+          Human-readable instance name {{bibref|DNS-SD|Section 4.1.1 Instance Names}} (i.e. The "&lt;{{param}}&gt;" portion of the '"Service Instance Name'").
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="63"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ApplicationProtocol" access="readOnly" dmr:version="2.6">
+        <description>
+          The Application Protocol, without the leading underscore, associated with the service (e.g., daap) as defined by the DNS-SD service {{bibref|DNS-SD|Section 7 Application Protocol Names}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="15"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TransportProtocol" access="readOnly" dmr:version="2.6">
+        <description>
+          The Transport Protocol associated with the service as defined by the DNS-SD service {{bibref|DNS-SD|Section 4.1.2 Service Names}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="TCP"/>
+            <enumeration value="UDP"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Domain" access="readOnly" dmr:version="2.6">
+        <description>
+          The value extracted from the Name field of the DNS SRV record {{bibref|RFC2782}} which represents the fully qualified domain name (FQDN) associated with the service as defined by the DNS-SD service {{bibref|DNS-SD|Section 4.1.3 Domain Names}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readOnly" dmr:version="2.6">
+        <description>
+          The value extracted from the Port field of the DNS SRV record {{bibref|RFC2782}} that is used to contact the service.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Target" access="readOnly" dmr:version="2.6">
+        <description>
+          The fully qualified domain name (FQDN) with the trailing dot "." of the target host implementing the service as in the DNS SRV record {{bibref|RFC2782}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.6">
+        <description>
+          The status of the discovered {{object}} at {{param|LastUpdate}} time. {{enum}}
+          The ability to instantiate an inactive {{object}} is OPTIONAL.
+          The time an inactive {{object}} remains listed in this table is a local matter to the device.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="LeaseActive">
+              <description>
+                The {{object}} has received a response record with TTL &gt; 0 and the {{param|#.Service.{i}.TimeToLive}} has not expired yet. The {{object}} is considered active.
+              </description>
+            </enumeration>
+            <enumeration value="GoodbyeReceived">
+              <description>
+                The device has received a response record containing TTL=0 indicating a goodbye message and the {{param|#.Service.{i}.TimeToLive}} has not expired yet. The {{object}} is considered inactive.
+              </description>
+            </enumeration>
+            <enumeration value="LeaseExpired">
+              <description>
+                The {{param|#.Service.{i}.TimeToLive}} has expired. The {{object}} is considered inactive
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" dmr:version="2.6">
+        <description>
+          The date and time at which the last advertisement for this {{object}} was received.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.6">
+        <description>
+          {{list}} {{reference|all Host table entries, active or inactive, that correspond to this discovered DNS.SD service. As such, when entries are added or removed from the Host tables the value of this parameter MUST be updated accordingly|ignore}}
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".LANDevice.{i}.Hosts.Host. .Hosts.Host." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TimeToLive" access="readOnly" dmr:version="2.6">
+        <description>
+          The value extracted from the TTL field of the DNS SRV record {{bibref|RFC2782}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="2147483647"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Priority" access="readOnly" dmr:version="2.6">
+        <description>
+          The value extracted from the Priority field of the DNS SRV record {{bibref|RFC2782}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Weight" access="readOnly" dmr:version="2.6">
+        <description>
+          A server selection mechanism. The value extracted from the Weight field of the DNS SRV record {{bibref|RFC2782}} that specifies the relative weight for entries with the same {{param|Priority}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="TextRecordNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DNS.SD.Service.{i}.TextRecord.{i}." access="readOnly" numEntriesParameter="TextRecordNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.6" dmr:noUniqueKeys="true">
+      <description>
+        This object maintains an instance of a (key/value pairs) of the service. The information is extracted from DNS TXT records {{bibref|RFC1035}} of the discovered service.
+        When multiple instances of the {{object}} table have the same value for the {{param|Key}} parameter, the implementation is CPE specific.
+      </description>
+      <parameter name="Key" access="readOnly" dmr:version="2.6">
+        <description>
+          The key that identifies the text record
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the text record.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.NAT." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Properties for Network Address Translation (NAT).
+        The entire {{object}} object only applies to IPv4.
+      </description>
+      <parameter name="InterfaceSettingNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PortMappingNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.NAT.InterfaceSetting.{i}." access="readWrite" numEntriesParameter="InterfaceSettingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        NAT settings for an associated IP Interface on which NAT is enabled.
+        For enabled table entries, if {{param|Interface}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the {{object}} entry, indicating if NAT is enabled for the referenced IP Interface instance.   On creation, an {{object}} entry is disabled by default.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Enabled_NATForcedDisabled">
+              <description>
+                NAT enabled but forced by a third party to be operationally disabled, e.g. because a {{object|##.MAP.Domain}} is enabled but there is no Basic Mapping Rule {{bibref|RFC7597}}.
+              </description>
+            </enumeration>
+            <enumeration value="Enabled_PortMappingDisabled">
+              <description>
+                NAT enabled but port mapping has been operationally disabled by a third party, e.g. because this is REQUIRED by the current {{object|##.Firewall}} level.
+              </description>
+            </enumeration>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The associated IP interface on which NAT is to be enabled.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.NAT.PortMapping.{i}." access="readWrite" numEntriesParameter="PortMappingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Port mapping table.
+        This table MUST contain all NAT port mappings associated with this connection, including static and dynamic port mappings programmatically created via local control protocol, such as UPnP.
+        This table MUST NOT contain dynamic NAT binding entries associated with the normal operation of NAT.
+        If the CPE hosts a firewall, it is assumed that it will appropriately configure the firewall for the port mapping.
+        For enabled table entries, if {{param|InternalClient}} is {{empty}}, or if {{param|Interface}} is not a valid reference and {{param|AllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="RemoteHost"/>
+        <parameter ref="ExternalPort"/>
+        <parameter ref="Protocol"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the port mapping instance.  On creation, an entry is disabled by default.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+          Note: There is no guarantee that the {{param}} value on automatically-created {{object}} instances will be retained. This is because automatically-created {{object}} instances can be transitory.
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} Specifies the IP interface to which this port mapping applies.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AllInterfaces" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates whether this port mapping applies to all IP interfaces that support port mappings. If {{true}}, the value of {{param|Interface}} is ignored since all supported IP interfaces are indicated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseDuration" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Determines the time to live, in {{units}}, of a port mapping lease, where "time to live" means the number of  seconds before the port mapping expires.
+          A value of 0 means the port mapping is static. Support for dynamic (non-static) port mappings is OPTIONAL.  That is, the only value  for {{param}} that MUST be supported is 0.
+          For a dynamic (non-static) port mapping, when this parameter is read, the value represents the time remaining on the port mapping  lease.  That is, for a dynamic port mapping, the value counts down toward 0.  When a dynamic port mapping lease expires, the CPE MUST  automatically terminate that port mapping, and MUST automatically delete the corresponding {{object}} table entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteHost" access="readWrite" dmr:version="2.0">
+        <description>
+          This parameter is the IP address of the source of inbound packets.  {{empty}} indicates a "wildcard", i.e. any IP address (this will be {{empty}} in most cases).  CPE are REQUIRED only to support {{empty}}.
+          When {{param}} is {{empty}}, all traffic sent to the {{param|ExternalPort}} on the WAN interface of the gateway is forwarded to the {{object|.IP.Interface}} associated with the {{param|InternalClient}} on the {{param|InternalPort}}.
+          When {{param}} is specified as one external IP address, the NAT will only forward inbound packets from this {{param}} to the {{param|InternalClient}}, all other packets will be dropped.
+          If a CPE supports non-empty values for {{param}}, it MAY additionally support the ability to have more than one port mapping with the same {{param|ExternalPort}} and {{param|Protocol}}, but with differing values of {{param}}.
+          When wildcard values are used for {{param}} and/or {{param|ExternalPort}}, the following precedence order applies (with the highest precedence listed first):
+          # Explicit {{param}}, explicit {{param|ExternalPort}}
+          # Explicit {{param}}, zero {{param|ExternalPort}}
+          # Empty {{param}}, explicit {{param|ExternalPort}}
+          # Empty {{param}}, zero {{param|ExternalPort}}
+          If an incoming packet matches the criteria associated with more than one entry in this table, the CPE MUST apply the port mapping associated with the highest precedence entry.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ExternalPort" access="readWrite" dmr:version="2.0">
+        <description>
+          The external port (or the first port of a range of external ports) that the NAT gateway would listen on for traffic to a corresponding {{param|InternalPort}}. Inbound packets to this external port on the WAN interface SHOULD be forwarded to the {{object|.IP.Interface}} associated with the {{param|InternalClient}} on the {{param|InternalPort}}.
+          A value of zero ({{null}}) represents a "wildcard", i.e. any port number.  If this value is {{null}}, traffic on all external ports (that are not otherwise mapped) will be forwarded to {{param|InternalClient}}, and the value(s) of  {{param|InternalPort}} on {{param|InternalClient}} are ignored.
+          When wildcard values are used for {{param|RemoteHost}} and/or {{param}}, the following precedence order applies (with the highest precedence listed first):
+          # Explicit {{param|RemoteHost}}, explicit {{param}}
+          # Explicit {{param|RemoteHost}}, zero {{param}}
+          # Empty {{param|RemoteHost}}, explicit {{param}}
+          # Empty {{param|RemoteHost}}, zero {{param}}
+          If an incoming packet matches the criteria associated with more than one entry in this table, the CPE MUST apply the port mapping associated with the highest precedence entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ExternalPortEndRange" access="readWrite" dmr:version="2.0">
+        <description>
+          Indicates the last port of the external port range that starts with {{param|ExternalPort}}.
+          If an external port range is specified, then the behavior described for {{param|ExternalPort}} applies to all ports within the range.
+          A value of zero (0) indicates that no external port range is specified, i.e. that the range consists only of {{param|ExternalPort}}.
+          If {{param|ExternalPort}} is zero (wildcard), the value of this parameter MUST be ignored.
+          If specified, the value of this parameter MUST be greater than or equal to the value of {{param|ExternalPort}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="InternalPort" access="readWrite" dmr:version="2.0">
+        <description>
+          The port on {{param|InternalClient}} that the gateway SHOULD forward traffic to.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.0">
+        <description>
+          The protocol of the port mapping.  {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="TCP"/>
+            <enumeration value="UDP"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InternalClient" access="readWrite" dmr:version="2.0">
+        <description>
+          The IP address or DNS host name of an internal client (on the LAN).
+          Support for an IP address is mandatory.  If {{param}} is specified as an IP address and the LAN device's IP address subsequently changes, the port mapping MUST remain associated with the original IP address.
+          Support for DNS host names is OPTIONAL.  If {{param}} is specified as a DNS host name and the LAN device's IP address subsequently changes, the port mapping MUST remain associated with this LAN device.  In this case, it is the responsibility of the CPE to maintain the name-to-address mapping in the event of IP address changes.  This can be accomplished, for example, by assigning the DNS host name via use of DHCP option 12 (Host Name) or option 81 (FQDN).  Note that the ACS can learn the host name associated with a given LAN device via the {{object|.Hosts.Host.}} table.
+          Read access to this parameter MUST always return the exact value that was last set by the ACS.  For example, if the internal client is set to a DNS host name, it MUST read back as a DNS host name and not as an IP address.
+          It MUST be possible to set the {{param}} to the broadcast IP address 255.255.255.255 for UDP mappings. This is to enable multiple NAT clients to use the same well-known port simultaneously.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readWrite" dmr:version="2.0">
+        <description>
+          User-readable description of this port mapping.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Properties for Port Control Protocol (PCP) {{bibref|RFC6887}}.
+        See the PCP Theory of Operation {{bibref|TR-181i2a8|Appendix XIV}} for a description of the working of this PCP data model.
+      </description>
+      <parameter name="SupportedVersions" access="readOnly" dmr:version="2.8">
+        <description>
+          {{list}} Each list item denotes a PCP version supported by the PCP Client. Currently known versions are 0, 1 and 2.
+          This parameter is based on Version from {{bibref|RFC6887}}.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredVersion" access="readWrite" dmr:version="2.8">
+        <description>
+          This is the version to be used in the first exchange with a new PCP Server.
+          The factory default MUST be the highest supported version, as described in {{bibref|RFC6887|Section 9}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="OptionList" access="readOnly" dmr:version="2.8">
+        <description>
+          {{list}} The list of the PCP Options supported by the PCP Client.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="254"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ClientNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP.Client.{i}." access="readWrite" numEntriesParameter="ClientNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        Client properties for Port Control Protocol (PCP). The PCP Client interacts with a PCP Server as defined in {{bibref|RFC6887}} for internal device applications or LAN device applications via Interworking functions.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="WANInterface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the PCP Client.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="WANInterface" access="readOnly" dmr:version="2.8">
+        <description>
+          {{reference|the interface stack instance representing the WAN interface this client operates on}} See {{object|.InterfaceStack.}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of the PCP Client. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MAPEnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the MAP OpCode.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PEEREnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the PEER OpCode.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ANNOUNCEEnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the ANNOUNCE OpCode.
+          When {{false}} the PCP Client does not support unsolicited ANNOUNCE messages.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="THIRDPARTYEnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the THIRD_PARTY Option.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="THIRDPARTYStatus" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates whether THIRD_PARTY Option is enabled or not. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FILTEREnable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the FILTER option.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP.Client.{i}.PCPProxy." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Properties for the Port Control Protocol (PCP) Proxy, as specified in {{bibref|PCPProxy}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the PCP Proxy for this PCP Client.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="HighestVersion" access="readOnly" dmr:version="2.8">
+        <description>
+          A string identifying the highest version of PCP that the proxy supports.
+          This parameter is based on Version from {{bibref|RFC6887}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of the PCP Proxy for this PCP Client. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP.Client.{i}.UPnPIWF." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.8">
+      <description>
+        Properties for the interworking function between UPnP IGD (Internet Gateway Device) and PCP, as specified in {{bibref|RFC6970}}.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables the UPnP IGD-PCP Interworking Function for this PCP Client.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of the UPnP IGD-PCP Interworking Function for this PCP Client. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP.Client.{i}.Server.{i}." access="readWrite" numEntriesParameter="ServerNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        This table contains the PCP Servers to be used by the PCP Client. Entries are either statically configured or automatically created via DHCP options OPTION_V4_PCP_SERVER and OPTION_V6_PCP_SERVER, as per {{bibref|RFC7291}}.
+        Each OPTION_V4_PCP_SERVER or OPTION_V6_PCP_SERVER option corresponds to a {{object}} instance.  If an option returns multiple addresses then that {{object}} instance has multiple addresses.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="ServerNameOrAddress"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables this PCP Server.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of the PCP Server. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Connecting"/>
+            <enumeration value="Error_Timeout"/>
+            <enumeration value="Error_HostNameNotResolved"/>
+            <enumeration value="Error_NetworkFailure"/>
+            <enumeration value="Error_NotAuthorized"/>
+            <enumeration value="Error_Unsupported"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.8">
+        <description>
+          Method used to assign {{param|ServerNameOrAddress}} and create this table entry. {{enum}}
+          Note: In the {{enum|DHCPv4}} and {{enum|DHCPv6}} cases, if more than one IP address is received {{param|ServerNameOrAddress}} will be the first address and {{param|AdditionalServerAddresses}} will be the remaining addresses.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="DHCPv4">
+              <description>
+                {{param|ServerNameOrAddress}} is an IPv4 address that was received via OPTION_V4_PCP_SERVER
+              </description>
+            </enumeration>
+            <enumeration value="DHCPv6">
+              <description>
+                {{param|ServerNameOrAddress}} is an IPv6 address that was received via OPTION_V6_PCP_SERVER
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                {{param|ServerNameOrAddress}} is an FQDN, IPv4 address or IPv6 address that was created by the ACS, by some other management entity (e.g. via a GUI), or is present in the factory default configuration
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Static"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerNameOrAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          The FQDN or IP address of the PCP Server, assigned as described under {{param|Origin}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServerAddressInUse" access="readOnly" dmr:version="2.8">
+        <description>
+          The IP address currently in use for the PCP Server, derived from the value of {{param|ServerNameOrAddress}}.
+          {{empty}} indicates that no PCP Server address is currently known.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalServerAddresses" access="readOnly" dmr:version="2.8">
+        <description>
+          PCP Server addresses in addition to {{param|ServerNameOrAddress}}.  This can be non-empty only if {{param|Origin}} is {{enum|DHCPv4|Origin}} or {{enum|DHCPv6|Origin}} and if more than one PCP Server address was received.
+        </description>
+        <syntax>
+          <list/>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ExternalIPAddress" access="readOnly" dmr:version="2.8">
+        <description>
+          The external IP address of the PCP-controlled device hosting this server.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentVersion" access="readOnly" dmr:version="2.8">
+        <description>
+          This is the version of PCP resulting from client-server Version Negotiation.
+          This parameter is based on Version from {{bibref|RFC6887}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaximumFilters" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates the maximum number of inbound filters allowed to be associated with a mapping entry on this server.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PortQuota" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates the maximum number of ports allocated to this PCP Client on this server.
+          A value of 0 means that there is no limitation.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredLifetime" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates the preferred lifetime (in {{units}}) to be used for mappings with this server when no preference is selected by an application/user.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Capabilities" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates the capabilities supported by the PCP Server. {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="NAT44"/>
+            <enumeration value="StatelessNAT64"/>
+            <enumeration value="StatefulNAT64"/>
+            <enumeration value="A+PPortRangeRouter"/>
+            <enumeration value="SupportsPORTSETOption"/>
+            <enumeration value="IPv4Firewall"/>
+            <enumeration value="IPv6Firewall"/>
+            <enumeration value="NPTv6"/>
+            <enumeration value="DSCPReMarkingFunction"/>
+            <enumeration value="FLOWDATAAwareFunction"/>
+            <enumeration value="ILNPTranslator"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InboundMappingNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OutboundMappingNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP.Client.{i}.Server.{i}.InboundMapping.{i}." access="readWrite" numEntriesParameter="InboundMappingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        Inbound Mapping table.
+        This table contains all Inbound Mappings requested by this PCP Client on this PCP Server. Such a mapping is created by a PCP request with OpCode MAP, as described in {{bibref|RFC6887|Section 11}}.
+        These requests can be issued from internal device applications, from static configuration or from other LAN device applications via interworking functions such as UPnP IGD or PCP proxies.  The {{param|Origin}} parameter indicates which mechanism requested the mapping.
+        For non-{{enum|Static|Origin}} mappings (here ''Static'' refers to the mechanism that created the mapping, not to the {{param|Lifetime}}), the ACS MAY modify the {{param||Enable}} parameter but MUST NOT modify any other parameters in the mapping or its sub-objects.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="InternalPort"/>
+        <parameter ref="ProtocolNumber"/>
+        <parameter ref="ThirdPartyAddress"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of this entry. {{enum}}
+          The {{enum|Error_PCPErrorCodeReceived}} value indicates that the PCP Client received an error code from the PCP Server.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_PCPErrorCodeReceived"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorCode" access="readOnly" dmr:version="2.8">
+        <description>
+          Provides the PCP error code when {{param|Status}} is {{enum|Error_PCPErrorCodeReceived|Status}}. Error code values are defined in {{bibref|RFC6887|Section 7.4}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.8">
+        <description>
+          Mechanism via which the mapping was requested. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Internal">
+              <description>
+                Requested via internal device application
+              </description>
+            </enumeration>
+            <enumeration value="UPnP_IWF">
+              <description>
+                Requested via UPnP IGD interworking function
+              </description>
+            </enumeration>
+            <enumeration value="PCP_Proxy">
+              <description>
+                Requested via PCP proxy
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                Requested via static configuration, i.e. created by the ACS, by some other management entity (e.g. via a GUI), or is present in the factory default configuration
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Lifetime" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          Determines the time to live, in {{units}}, of this Inbound Mapping lease, i.e. the remaining time before this port mapping expires.
+          A value of 0 means that the port mapping is permanent (referred to as a static mapping in {{bibref|RFC6887}}).
+          When a dynamic Inbound Mapping lease expires, the CPE MUST automatically delete the corresponding {{object}} table entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SuggestedExternalIPAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          The external IPv4 or IPv6 Address that the PCP-controlled device will listen on for incoming packets to be forwarded to the PCP Client.
+          This is useful for refreshing an Inbound Mapping, especially after the PCP Server loses state. If the PCP client does not know the external address, or does not have a preference, it MUST use {{empty}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SuggestedExternalPort" access="readWrite" dmr:version="2.8">
+        <description>
+          The external port (or the first port of a range of external ports) that the PCP-controlled device will listen on for incoming packets. Those inbound packets will be forwarded to {{param|InternalPort}}. If the PCP client does not know the external port, or does not have a preference, it MUST use 0.
+          This is useful for refreshing an Inbound Mapping, especially after the PCP Server loses state. If the PCP Client does not know the external port, or does not have a preference, it MUST use 0.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="SuggestedExternalPortEndRange" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates the last port of the external port range that starts with {{param|SuggestedExternalPort}}.
+          If an external port range is specified, then the behavior described for {{param|SuggestedExternalPort}} applies to all ports within the range.
+          A value of zero (0) indicates that no external port range is specified, i.e. that the range consists only of {{param|SuggestedExternalPort}}.
+          If {{param|SuggestedExternalPort}} is zero (wildcard), the value of {{param}} MUST be ignored.
+          If specified, the value of this parameter MUST be zero or be greater than or equal to the value of {{param|SuggestedExternalPort}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="InternalPort" access="readWrite" dmr:version="2.8">
+        <description>
+          The port on this PCP Client's {{param|##.WANInterface}} that the PCP-controlled device forwards incoming packets to.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolNumber" access="readWrite" dmr:version="2.8">
+        <description>
+          The protocol number of the {{object}}. Values are taken from {{bibref|IANA-protocolnumbers}}.
+          The value -1 means ''all protocols''.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="255"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ThirdPartyAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          Under certain conditions, the PCP Client can create a PCP mapping on behalf of another device, by using the THIRD_PARTY option, as specified in {{bibref|RFC6887|Section 7.3}}. In that case, {{param}} is the IP address of the device for which the PCP operation is requested.
+          For non-third-party mappings, {{param}} SHOULD be {{empty}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readWrite" dmr:version="2.8">
+        <description>
+          User-readable description of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AssignedExternalIPAddress" access="readOnly" dmr:version="2.8">
+        <description>
+          The external IPAddress returned by the PCP Server. The IP address that the PCP-controlled device is listening on for incoming packets to a corresponding PCP Client.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AssignedExternalPort" access="readOnly" dmr:version="2.8">
+        <description>
+          The external port returned by the PCP Server. The external port (or the first port of a range of external ports) that the PCP-controlled device is listening on for incoming packets to a corresponding {{param|InternalPort}}. Inbound packets to this external port on the External interface of the PCP-controlled device is forwarded to the on the {{param|InternalPort}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AssignedExternalPortEndRange" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates the last port of the external port range that starts with {{param|AssignedExternalPort}}.
+          If an external port range is specified, then the behavior described for {{param|AssignedExternalPort}} applies to all ports within the range.
+          A value of zero (0) indicates that no external port range is specified, i.e. that the range consists only of {{param|AssignedExternalPort}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="FilterNumberOfEntries" access="readOnly" dmr:version="2.8">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP.Client.{i}.Server.{i}.InboundMapping.{i}.Filter.{i}." access="readWrite" numEntriesParameter="FilterNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        Filter table.
+        This table contains all Filters restricting this Inbound Mapping, as defined in {{bibref|RFC6887|}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteHostIPAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          Permitted remote peer IP address for this filter.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="PrefixLength" access="readWrite" dmr:version="2.8">
+        <description>
+          Indicates how many bits of {{param|RemoteHostIPAddress}} are relevant for this filter.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="128"/>
+          </unsignedInt>
+          <default type="object" value="128"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemotePort" access="readWrite" dmr:version="2.8">
+        <description>
+          Permitted remote peer port number for this filter.
+          The value 0 indicates ''all ports''.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RemotePortEndRange" access="readOnly" dmr:version="2.8">
+        <description>
+          Indicates the last port of the remote port range that starts with {{param|RemotePort}}.
+          If an external port range is specified, then the behavior described for {{param|RemotePort}} applies to all ports within the range.
+          A value of zero (0) indicates that no remote port range is specified, i.e. that the range consists only of {{param|RemotePort}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PCP.Client.{i}.Server.{i}.OutboundMapping.{i}." access="readWrite" numEntriesParameter="OutboundMappingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.8">
+      <description>
+        Outbound Mapping table.
+        This table contains all Outbound Mappings requested by this PCP Client on this PCP Server. Such a mapping is created by a PCP request with OpCode PEER, as described in {{bibref|RFC6887|Section 12}}.
+        These requests can be issued from internal device applications, from static configuration or from other LAN device applications via interworking functions such as UPnP IGD or PCP proxies. The {{param|Origin}} parameter indicates which mechanism requested the mapping.
+        For non-{{enum|Static|Origin}} mappings (here ''Static'' refers to the mechanism that created the mapping, not to the {{param|Lifetime}}), the ACS MAY modify the {{param||Enable}} parameter but MUST NOT modify any other parameters in the mapping or its sub-objects.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="InternalPort"/>
+        <parameter ref="ProtocolNumber"/>
+        <parameter ref="ThirdPartyAddress"/>
+        <parameter ref="RemoteHostIPAddress"/>
+        <parameter ref="RemotePort"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.8">
+        <description>
+          Enables or disables this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.8">
+        <description>
+          The status of this entry. {{enum}}
+          The {{enum|Error_PCPErrorCodeReceived}} value indicates that the PCP Client received an error code from the PCP Server.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_PCPErrorCodeReceived"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorCode" access="readOnly" dmr:version="2.8">
+        <description>
+          Provides the PCP Error code when {{param|Status}} is {{enum|Error_PCPErrorCodeReceived|Status}}. Error code values are defined in {{bibref|RFC6887|Section 7.4}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.8">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Origin" access="readOnly" dmr:version="2.8">
+        <description>
+          Mechanism via which the mapping was requested. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Internal">
+              <description>
+                Requested via internal device application
+              </description>
+            </enumeration>
+            <enumeration value="UPnP_IWF">
+              <description>
+                Requested via UPnP IGD interworking function
+              </description>
+            </enumeration>
+            <enumeration value="PCP_Proxy">
+              <description>
+                Requested via PCP proxy
+              </description>
+            </enumeration>
+            <enumeration value="Static">
+              <description>
+                Requested via static configuration, i.e. created by the ACS, by some other management entity (e.g. via a GUI), or is present in the factory default configuration
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Lifetime" access="readWrite" dmr:version="2.8">
+        <description>
+          Determines the time to live, in {{units}}, of this Outbound Mapping lease, i.e. the remaining time before this port mapping expires.
+          A value of 0 means that the port mapping is permanent (referred to as a static mapping in {{bibref|RFC6887}}).
+          When a dynamic Outbound Mapping lease expires, the CPE MUST automatically delete the corresponding {{object}} table entry.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SuggestedExternalIPAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          The external IPv4 or IPv6 Address that the PCP-controlled device will use to send outgoing packets covered by this mapping.
+          This is useful for refreshing a mapping, especially after the PCP Server has lost state. If the PCP Client does not know the external address, or does not have a preference, it MUST use {{empty}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SuggestedExternalPort" access="readWrite" dmr:version="2.8">
+        <description>
+          The external port that the PCP-controlled device will use to send outgoing packets covered by this mapping.
+          This is useful for refreshing a mapping, especially after the PCP Server has lost state. If the PCP Client does not know the external port, or does not have a preference, it MUST use 0.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteHostIPAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          The remote peer's IP address, as seen from the PCP Client, for this Outbound Mapping.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="InternalPort" access="readWrite" dmr:version="2.8">
+        <description>
+          The port on PCP Client WAN Interface that the PCP-controlled device SHOULD listen to for this mapping.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RemotePort" access="readWrite" dmr:version="2.8">
+        <description>
+          The remote peer's port, as seen from the PCP Client, for this Outbound Mapping.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolNumber" access="readWrite" dmr:version="2.8">
+        <description>
+          The protocol number of the {{object}}. Values are taken from the {{bibref|IANA-protocolnumbers}}.
+          The value -1 means ''all protocols''.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="255"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ThirdPartyAddress" access="readWrite" dmr:version="2.8">
+        <description>
+          Under certain conditions, the PCP Client can create a PCP mapping on behalf of another device, by using the THIRD_PARTY option, as specified in {{bibref|RFC6887|Section 7.3}}. In that case, {{param}} is the IP address of the device for which the PCP operation is requested.
+          For non-third-party mappings, {{param}} SHOULD be {{empty}}.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readWrite" dmr:version="2.8">
+        <description>
+          User-readable description of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AssignedExternalIPAddress" access="readOnly" dmr:version="2.8">
+        <description>
+          The external IP address returned by the PCP Server. The IP address that the PCP-controlled device uses to send outgoing packets corresponding to this mapping.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="AssignedExternalPort" access="readOnly" dmr:version="2.8">
+        <description>
+          The external port returned by the PCP Server. The port that the PCP-controlled device uses to send outgoing packets corresponding to this mapping.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        The Dynamic Host Configuration Protocol (DHCP) IPv4 object {{bibref|RFC2131}}. This entire object applies to IPv4 only. It contains the {{object|Client}}, {{object|Server}}, and {{object|Relay}} objects.
+      </description>
+      <parameter name="ClientNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Client.{i}." access="readWrite" numEntriesParameter="ClientNumberOfEntries" enableParameter="Enable" minEntries="1" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object contains DHCP client settings for an associated ''IP Interface'' indicated by {{param|Interface}}.
+        For enabled table entries, if {{param|Interface}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the DHCP Client entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The IP Interface associated with the ''Client'' entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this table entry. {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="DHCPStatus" access="readOnly" dmr:version="2.0">
+        <description>
+          The DHCP Client status as defined in {{bibref|RFC2131}}. {{enum}}
+          Note: This value is only relevant when the DHCP Client is operationally enabled (i.e. when {{param|Status}} is {{enum|Enabled|Status}}).
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Init"/>
+            <enumeration value="Selecting"/>
+            <enumeration value="Requesting"/>
+            <enumeration value="Rebinding"/>
+            <enumeration value="Bound"/>
+            <enumeration value="Renewing"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IPAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          IPv4 Address option received from the DHCP Server. {{empty}} when {{param|Status}} is not equal to {{enum|Bound|DHCPStatus}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SubnetMask" access="readOnly" dmr:version="2.0">
+        <description>
+          Subnet mask option received from the DHCP Server. {{empty}} when {{param|Status}} is not equal to {{enum|Bound|DHCPStatus}}.
+          Value is information received via DHCP Option 1.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="IPRouters" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Items represent IP Router IPv4 Address(es) received from the DHCP server. {{empty}} when {{param|Status}} is not equal to {{enum|Bound|DHCPStatus}}.
+          Value is information received via DHCP Options 3, 33 or 121.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DNSServers" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Items represent DNS Server IPv4 Address(es) received from the DHCP server. {{empty}} when {{param|Status}} is not equal to {{enum|Bound|DHCPStatus}}.
+          Value is information received via DHCP Option 6.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTimeRemaining" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          DHCP lease time remaining in {{units}}. A value of -1 indicates an infinite lease.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="DHCPServer" access="readOnly" dmr:version="2.0">
+        <description>
+          The IPv4 address of the current DHCP server.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="PassthroughEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, the DHCP Client retrieved IP address information is configured on the referenced  {{param|Interface}} object.
+          If {{true}}, the DHCP Client retrieved information is propagated to the parameters in the referenced {{param|PassthroughDHCPPool}} object, replacing any existing configuration (including ''MinAddress'', ''MaxAddress'', ''SubnetMask'', ''IPRouters'', and ''DNSServers'').
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PassthroughDHCPPool" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}}When {{param}} is set to {{empty}}, {{param|PassthroughEnable}} MUST be set to {{false}} (i.e. passthrough can not be enabled without a pool reference specified).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.Server.Pool." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SentOptionNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ReqOptionNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <command name="Renew()" dmr:version="2.12">
+        <description>
+          The DHCP client will renew its DHCP lease.
+        </description>
+      </command>
+    </object>
+    <object name="Device.DHCPv4.Client.{i}.SentOption.{i}." access="readWrite" numEntriesParameter="SentOptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Each instance of this object represents a DHCP option that MUST, if enabled, be sent in DHCP client requests.  All  sent DHCP options MUST be listed.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Tag"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this SentOption table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tag" access="readWrite" dmr:version="2.0">
+        <description>
+          Option tag as defined in {{bibref|RFC2132}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="254"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.0">
+        <description>
+          A hexbinary encoded option value.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="255"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Client.{i}.ReqOption.{i}." access="readWrite" numEntriesParameter="ReqOptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Each instance of this object represents a DHCP option that MUST, if enabled, be requested in DHCP client requests.  All requested DHCP options MUST be listed.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Tag"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this ReqOption table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.0">
+        <description>
+          Position of the option in the DHCP client request.  A value of ''1'' indicates the first entry.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is  changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tag" access="readWrite" dmr:version="2.0">
+        <description>
+          Option tag as defined in {{bibref|RFC2132}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="254"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.0">
+        <description>
+          A hexbinary encoded, most recently received DHCP option value.
+          If no option value has been received, then the value MUST represent {{empty}}.
+          Received DHCP option values MAY, but need not, persist across CPE reboots.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="255"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Server." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        DHCP server configuration.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the DHCP server.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PoolNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Server.Pool.{i}." access="readWrite" numEntriesParameter="PoolNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        DHCP conditional serving pool table.
+        Each instance of this object defines a DHCP conditional serving pool. Client requests are associated with pools based on criteria such as source interface, supplied DHCP options, and MAC address.
+        Overlapping pool ranges MUST be supported.
+        For enabled table entries, if {{param|Interface}} is not a valid reference, or {{param|MinAddress}}, {{param|MaxAddress}}, or {{param|SubnetMask}} is not a valid value, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the Pool entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.0">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For  each DHCP request, the highest ordered entry that matches the association criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be  compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The IP Interface associated with the ''Pool'' entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          Used to identify one or more LAN devices, value of the DHCP Vendor Class Identifier (Option 60) as defined in {{bibref|RFC2132}}, matched according to the criterion in {{param|VendorClassIDMode}}.  Case sensitive.
+          This is a normal string, e.g. "abc" is represented as "abc" and not say "616263" hex. However, if the value includes non-printing characters then such characters have to be represented using XML escapes, e.g. #x0a for line-feed.
+          {{empty}} indicates this criterion is not used for conditional serving.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|VendorClassID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|VendorClassID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassIDMode" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|VendorClassID}} pattern match criterion.  {{enum}}
+          For example, if {{param|VendorClassID}} is "Example" then an Option 60 value of "Example device" will match with {{param}} values of  {{enum|Prefix}} or {{enum|Substring}}, but not with {{enum|Exact}} or {{enum|Suffix}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Exact"/>
+            <enumeration value="Prefix"/>
+            <enumeration value="Suffix"/>
+            <enumeration value="Substring"/>
+          </string>
+          <default type="object" value="Exact"/>
+        </syntax>
+      </parameter>
+      <parameter name="ClientID" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP Client Identifier (Option 61) as defined in {{bibref|RFC2132}}.  The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used for conditional serving.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="255"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ClientIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|ClientID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|ClientID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="UserClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP User Class Identifier (Option 77) as defined in {{bibref|RFC3004}}.
+          {{empty}} indicates this criterion is not used for conditional serving.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="255"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="UserClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|UserClassID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|UserClassID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Chaddr" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          Hardware address (MAC address) of the physical interface of the DHCP client.
+          {{empty}} indicates this criterion is not used for conditional serving.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ChaddrMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Bit-mask for the MAC address, where matching of a packet's MAC address with the {{param|Chaddr}} is only to be  done for bit positions set to one in the mask.  A mask of FF:FF:FF:FF:FF:FF  or {{empty}} indicates all bits of the {{param|Chaddr}}  are to be used for conditional serving classification.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ChaddrExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the (masked) {{param|Chaddr}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the (masked) {{param|Chaddr}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="MinAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies first IPv4 address in the pool to be assigned by the DHCP server on the LAN interface.
+          The parameter value can be overwritten by dynamic values retrieved via a DHCP client with {{param|##.Client.{i}.PassthroughEnable}} or a PPP interface with {{param|.PPP.Interface.{i}.IPCP.PassthroughEnable}} equal to {{true}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies last IPv4 address in the pool to be assigned by the DHCP server on the LAN interface.
+          The parameter value can be overwritten by dynamic values retrieved via a DHCP client with {{param|##.Client.{i}.PassthroughEnable}} or a PPP interface with {{param|.PPP.Interface.{i}.IPCP.PassthroughEnable}} equal to {{true}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReservedAddresses" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} List items represent addresses marked reserved from the address allocation pool.
+        </description>
+        <syntax>
+          <list maxItems="32"/>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SubnetMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies the client's network subnet mask.
+          The parameter value can be overwritten by dynamic values retrieved via a DHCP client with  {{param|##.Client.{i}.PassthroughEnable}} or a PPP interface with {{param|.PPP.Interface.{i}.IPCP.PassthroughEnable}} equal to {{true}}.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="DNSServers" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} List items represent DNS servers offered to DHCP clients.  Support for more than three DNS Servers is OPTIONAL.
+          The parameter value can be overwritten by dynamic values retrieved via a DHCP client with {{param|##.Client.{i}.PassthroughEnable}} or a PPP interface with {{param|.PPP.Interface.{i}.IPCP.PassthroughEnable}} equal to  {{true}}.
+        </description>
+        <syntax>
+          <list maxItems="4"/>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="DomainName" access="readWrite" dmr:version="2.0">
+        <description>
+          Sets the domain name to provide to clients on the LAN interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IPRouters" access="readWrite" dmr:version="2.0">
+        <description>
+          {{list}} List items represent addresses of routers on this subnet.  Also known as default gateway.  Support for more than one Router address is OPTIONAL.
+          The parameter value can be overwritten by dynamic values retrieved via a DHCP client with {{param|##.Client.{i}.PassthroughEnable}} or a PPP interface with {{param|.PPP.Interface.{i}.IPCP.PassthroughEnable}} equal to  {{true}}.
+        </description>
+        <syntax>
+          <list maxItems="4"/>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTime" access="readWrite" dmr:version="2.0">
+        <description>
+          Specifies the lease time in {{units}} of client assigned addresses.  A value of -1 indicates an infinite lease.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+          <default type="object" value="86400"/>
+        </syntax>
+      </parameter>
+      <parameter name="StaticAddressNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ClientNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Server.Pool.{i}.StaticAddress.{i}." access="readWrite" numEntriesParameter="StaticAddressNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        DHCP static address table.
+        Entries in this table correspond to what {{bibref|RFC2131}} calls "manual allocation", where a client's IP address is assigned by the network administrator, and DHCP is used simply to convey the assigned address to the client.
+        Each instance of this object specifies a hardware address (MAC address) and an IP address within the pool.  When serving from this pool, this IP address MUST, if available, be assigned to the DHCP client with this hardware address, and MUST NOT be assigned to any other client.
+        Note that it is possible that an IP address in this table is present in one or more of the other conditional serving pools, in which case it is possible that such an address will be assigned to a different client.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Chaddr"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the StaticAddress table entry.
+          Disabling an entry does not return the IP address to the pool.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Chaddr" access="readWrite" dmr:version="2.0">
+        <description>
+          Hardware address (MAC address) of the physical interface of the DHCP client.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Yiaddr" access="readWrite" dmr:version="2.0">
+        <description>
+          IPv4 address to be assigned by the DHCP server to the DHCP client with the specified hardware address (MAC address).
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Server.Pool.{i}.Option.{i}." access="readWrite" numEntriesParameter="OptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object specifies the DHCP options that MUST, if enabled, be returned to clients whose DHCP requests are  associated with this pool.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Tag"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this Option table entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tag" access="readWrite" dmr:version="2.0">
+        <description>
+          Option tag as defined in {{bibref|RFC2132}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="254"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.0">
+        <description>
+          A hexbinary encoded option value.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="255"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Server.Pool.{i}.Client.{i}." access="readOnly" numEntriesParameter="ClientNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        DHCPv4 client table.
+        This table lists details of DHCPv4 clients that matched the filter criteria of this {{object|#}} entry.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Chaddr"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+          Note: There is no guarantee that the {{param}} value on automatically-created {{object}} instances will be retained. This is because automatically-created {{object}} instances can be transitory.
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Chaddr" access="readOnly" dmr:version="2.2">
+        <description>
+          MAC address of the DHCPv4 client.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.2">
+        <description>
+          Whether or not the DHCPv4 client is currently present on the LAN.  The method of presence detection is a local matter to  the CPE.
+          The ability to list inactive DHCPv4 clients is OPTIONAL.  If the CPE includes inactive DHCPv4 clients in this table, {{param}} MUST be set to {{false}}  for each inactive DHCPv4 client.  The length of time an inactive DHCPv4 client remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4AddressNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Server.Pool.{i}.Client.{i}.IPv4Address.{i}." access="readOnly" numEntriesParameter="IPv4AddressNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        IPv4 addresses assigned to this client.
+      </description>
+      <uniqueKey>
+        <parameter ref="IPAddress"/>
+      </uniqueKey>
+      <parameter name="IPAddress" access="readOnly" dmr:version="2.2">
+        <description>
+          IPv4 address.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTimeRemaining" access="readOnly" dmr:version="2.2">
+        <description>
+          The time at which the DHCP lease will expire or {{null}} if not known. For an infinite lease, the parameter value MUST be 9999-12-31T23:59:59Z.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Server.Pool.{i}.Client.{i}.Option.{i}." access="readOnly" numEntriesParameter="OptionNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2" dmr:noUniqueKeys="true">
+      <description>
+        DHCPv4 options supplied by this client, e.g. ''VendorClassID'' (Option 60), ''ClientID'' (option 61) or ''UserClassID'' (Option 77).
+      </description>
+      <parameter name="Tag" access="readOnly" dmr:version="2.2">
+        <description>
+          Option tag as defined in {{bibref|RFC2132}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.2">
+        <description>
+          A hexbinary encoded option value.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="255"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Relay." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        DHCP Relay Agent (conditional relaying).
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the DHCP Relay Agent function.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of the DHCP relay. {{enum}}
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv4.Relay.Forwarding.{i}." access="readWrite" numEntriesParameter="ForwardingNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        DHCP Relay Agent Forwarding table.
+        For enabled table entries, if {{param|Interface}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables the Forwarding entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.0">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each DHCP request, the highest ordered entry that matches the association criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be  compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The IP Interface associated with the ''Forwarding'' entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          Used to identify one or more LAN devices, value of the DHCP Vendor Class Identifier (Option 60) as defined in {{bibref|RFC2132}}, matched according to the criterion in {{param|VendorClassIDMode}}.  Case sensitive.
+          This is a normal string, e.g. "abc" is represented as "abc" and not say "616263" hex. However, if the value includes non-printing characters then such characters have to be represented using XML escapes, e.g. #x0a for line-feed.
+          {{empty}} indicates this criterion is not used as a relay classification criterion.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|VendorClassID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|VendorClassID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassIDMode" access="readWrite" dmr:version="2.0">
+        <description>
+          {{param|VendorClassID}} pattern match criterion.  {{enum}}
+          For example, if {{param|VendorClassID}} is "Example" then an Option 60 value of "Example device" will match with {{param}} values of  {{enum|Prefix}} or {{enum|Substring}}, but not with {{enum|Exact}} or {{enum|Suffix}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Exact"/>
+            <enumeration value="Prefix"/>
+            <enumeration value="Suffix"/>
+            <enumeration value="Substring"/>
+          </string>
+          <default type="object" value="Exact"/>
+        </syntax>
+      </parameter>
+      <parameter name="ClientID" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP Client Identifier (Option 61) as defined in {{bibref|RFC2132}}.  The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used as a relay classification criterion.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="255"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ClientIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|ClientID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|ClientID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="UserClassID" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCP User Class Identifier (Option 77) as defined in {{bibref|RFC3004}}.
+          {{empty}} indicates this criterion is not used as a relay classification criterion.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="255"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="UserClassIDExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|UserClassID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|UserClassID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Chaddr" access="readWrite" dmr:version="2.0">
+        <description>
+          Pool association criterion.
+          Hardware address (MAC address) of the physical interface of the DHCP client.
+          {{empty}} indicates this criterion is not used as a relay classification criterion.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ChaddrMask" access="readWrite" dmr:version="2.0">
+        <description>
+          Bit-mask for the MAC address, where matching of a packet's MAC address with the {{param|Chaddr}} is only to be done for bit positions set to one in the mask.  A mask of FF:FF:FF:FF:FF:FF or {{empty}} indicates all bits of the {{param|Chaddr}} are to be used for relay classification.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ChaddrExclude" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{false}}, matching packets are those that match the (masked) {{param|Chaddr}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the (masked) {{param|Chaddr}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="LocallyServed" access="readWrite" dmr:version="2.0">
+        <description>
+          If {{true}}, incoming DHCP requests will be forwarded to the CPE DHCP Server. If {{false}}, incoming DHCP requests will be forwarded to the {{param|DHCPServerIPAddress}} configured for this forwarding entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DHCPServerIPAddress" access="readWrite" dmr:version="2.0">
+        <description>
+          IPv4 address of the DHCP server, where the request has to be sent to when there is a conditional match with this forwarding entry and {{param|LocallyServed}} is {{false}}. If {{param|LocallyServed}} is {{false}} and this parameter is not  configured, then the DHCP request is dropped.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        The Dynamic Host Configuration Protocol (DHCP) IPv6 object {{bibref|RFC3315}}. This entire object applies to IPv6 only. It contains the {{object|Client}} and {{object|Server}} objects.
+      </description>
+      <parameter name="ClientNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Client.{i}." access="readWrite" numEntriesParameter="ClientNumberOfEntries" enableParameter="Enable" minEntries="1" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        This object contains DHCPv6 client settings for an associated ''IP Interface'' indicated by {{param|Interface}}.
+        For enabled table entries, if {{param|Interface}} is not a valid reference to an IPv6-capable interface (that is attached to the IPv6 stack), then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference.  If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}.  However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.2">
+        <description>
+          {{reference}} The IP Interface associated with the {{object}} entry. This will reference an IPv6-capable interface (that is attached to the IPv6 stack), otherwise the table entry will be inoperable.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this table entry. {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="DUID" access="readOnly" dmr:version="2.2">
+        <description>
+          The client's DHCP Unique Identifier (DUID) {{bibref|RFC3315|Section 9}}. {{param}} is set by the CPE.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="130"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="RequestAddresses" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables inclusion of the ''Identity Association (IA) for Non-Temporary Address'' option OPTION_IA_NA(3) {{bibref|RFC3315|Section 22.4}} in Solicit messages.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="RequestPrefixes" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables inclusion of the ''Identity Association (IA) for Prefix Delegation'' option OPTION_IA_PD(25) {{bibref|RFC3633|Section 10}} in Solicit messages.
+          Note that this is only appropriate for an upstream interface on a requesting router, e.g. for an RG WAN interface.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="RapidCommit" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables inclusion of the ''Rapid Commit'' option OPTION_RAPID_COMMIT(14) {{bibref|RFC3315|Section 22.14}} in Solicit messages.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SuggestedT1" access="readWrite" dmr:version="2.2">
+        <description>
+          T1 value, in {{units}}, that the client SHOULD use when sending IA options, e.g. OPTION_IA_NA {{bibref|RFC3315|Section 22.4}} and OPTION_IA_PD {{bibref|RFC3633|Section 10}}.
+          A value of -1 indicates that no T1 value is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="SuggestedT2" access="readWrite" dmr:version="2.2">
+        <description>
+          T2 value, in {{units}}, that the client SHOULD use when sending IA options, e.g. OPTION_IA_NA {{bibref|RFC3315|Section 22.4}} and OPTION_IA_PD {{bibref|RFC3633|Section 10}}.
+          A value of -1 indicates that no T2 value is specified.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedOptions" access="readOnly" dmr:version="2.2">
+        <description>
+          {{list}} The options that the client is able to process in server responses.  This list MUST include both top-level and encapsulated options, e.g. if the client is able to process OPTION_IA_NA (3) with an encapsulated OPTION_IAADDR (5), the list would be expected to include both 3 and 5.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RequestedOptions" access="readWrite" dmr:version="2.2">
+        <description>
+          {{list}} An ordered list of the top-level options (i.e. not encapsulated options) that the client will explicitly request from the server.
+          This parameter is intended only for options that are not necessary for the basic operation of the protocol, and are not modeled elsewhere.  For example, it is appropriate for OPTION_DNS_SERVERS {{bibref|RFC3646}} but is not appropriate for OPTION_SERVERID (which is part of the protocol), OPTION_IA_NA (which is modeled via {{param|RequestAddresses}}) or OPTION_IA_PD (which is modeled via {{param|RequestPrefixes}}).  However, the CPE MUST NOT reject an attempt to set this parameter to a value that includes options that it regards as inappropriate; instead, it MUST accept the requested options and handle them as best it can.
+          Loosely speaking, these are the options that the client will include in OPTION_ORO {{bibref|RFC3315}} but the client is free to decide (in accordance with {{bibref|RFC3315}}) in which messages to request which option, whether also to request additional options, whether not to request inappropriate options, and in which order to request any options that are also in {{param|SupportedOptions}}.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SentOptionNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedOptionNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <command name="Renew()" dmr:version="2.12">
+        <description>
+          The {{object}} will renew its DHCPv6-supplied information (i.e. the Agent will do a renew or information request as needed, updating both stateful and stateless parameter values discovered by this Client instance).
+        </description>
+      </command>
+    </object>
+    <object name="Device.DHCPv6.Client.{i}.Server.{i}." access="readOnly" numEntriesParameter="ServerNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        This is a transitory table that lists the discovered DHCPv6 servers (it does ''not'' model a local DHCP server). Table entries are automatically created to correspond with these servers. However, it is a local matter to the CPE when to delete old table entries.
+      </description>
+      <uniqueKey>
+        <parameter ref="SourceAddress"/>
+      </uniqueKey>
+      <parameter name="SourceAddress" access="readOnly" dmr:version="2.2">
+        <description>
+          The IP address from which the message most recently received from this server was sent.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="DUID" access="readOnly" dmr:version="2.2">
+        <description>
+          The server's DHCP Unique Identifier (DUID) {{bibref|RFC3315|Section 9}} as received via OPTION_SERVERID.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="130"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="InformationRefreshTime" access="readOnly" dmr:version="2.2">
+        <description>
+          The OPTION_INFORMATION_REFRESH_TIME value {{bibref|RFC4242}} that was most recently received from this server, converted to the ''dateTime'' at which the associated information will expire.  If no such option has been received, the parameter value MUST be the "Unknown Time" {{null}}.  If the information will never expire, the parameter value MUST be infinite time 9999-12-31T23:59:59Z.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Client.{i}.SentOption.{i}." access="readWrite" numEntriesParameter="SentOptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        The top-level options and option values (including any encapsulated options) that the client will send to the server.
+        This table is intended only for options that are not part of the basic operation of the protocol, and whose values are simple, do not often change and are not modeled elsewhere.  For example, it is appropriate for OPTION_USER_CLASS (whose value is a list of user classes) but is not appropriate for OPTION_RECONF_MSG (which is part of the protocol), OPTION_IA_NA (which is modeled via {{param|#.RequestAddresses}}) or OPTION_RAPID_COMMIT (which is modeled via {{param|#.RapidCommit}}).
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Tag"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tag" access="readWrite" dmr:version="2.2">
+        <description>
+          Option tag (code) {{bibref|RFC3315|Section 22.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.2">
+        <description>
+          A hexbinary encoded option data {{bibref|RFC3315|Section 22.1}}.
+          Note: The length of the option data is ''option-len'' octets, as specified in {{bibref|RFC3315|Section 22.1}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Client.{i}.ReceivedOption.{i}." access="readOnly" numEntriesParameter="ReceivedOptionNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2" dmr:noUniqueKeys="true">
+      <description>
+        This is a transitory table that lists all the options received from all servers. Table entries are automatically created to correspond with received options. However, it is a local matter to the CPE when to delete old table entries.
+        If the same option is received multiple times, whether from one or more servers, it is up to the CPE to decide which entries to include (i.e. whether the same option will be present multiple times). In order to allow for the same option to be present multiple times within the table, this table has no unique key defined.
+      </description>
+      <parameter name="Tag" access="readOnly" dmr:version="2.2">
+        <description>
+          Option tag (code) {{bibref|RFC3315|Section 22.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.2">
+        <description>
+          A hexbinary encoded option data {{bibref|RFC3315|Section 22.1}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="Server" access="readOnly" dmr:version="2.2">
+        <description>
+          {{reference}} This is the server that sent the option to the client. Each {{object}} entry MUST have an associated server.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.Server." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Server." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.2">
+      <description>
+        DHCPv6 server configuration.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables the DHCPv6 server function.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PoolNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Server.Pool.{i}." access="readWrite" numEntriesParameter="PoolNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        DHCPv6 server pool table.
+        Each instance of this object defines a DHCPv6 server pool. Client requests are associated with pools based on criteria such as source interface, supplied DHCPv6 options, and source address.
+        Overlapping pool ranges MUST be supported.
+        For enabled table entries, if {{param|Interface}} is not a valid reference to an IPv6-capable interface (that is attached to the IPv6 stack) then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Order"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.2">
+        <description>
+          Position of the {{object}} entry in the order of precedence.  A value of ''1'' indicates the first entry considered (highest precedence).  For each DHCPv6 request, the highest ordered entry that matches the association criteria is applied.  All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.2">
+        <description>
+          {{reference}} The IP Interface associated with the {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DUID" access="readWrite" dmr:version="2.2">
+        <description>
+          Pool association criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCPv6 Client Identifier (Option 1) {{bibref|RFC3315|Section 22.2}}.  The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used.
+          Note: DHCPv6 Option 1 (DUID) is sometimes referred to as ''Client Identifier''.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="130"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DUIDExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|DUID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|DUID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassID" access="readWrite" dmr:version="2.2">
+        <description>
+          Pool association criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCPv6 Vendor Class Identifier (Option 16) {{bibref|RFC3315|Section 22.16}}.  The option value is binary, so an exact match is REQUIRED.
+          {{empty}} indicates this criterion is not used.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="VendorClassIDExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|VendorClassID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|VendorClassID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="UserClassID" access="readWrite" dmr:version="2.2">
+        <description>
+          Pool association criterion.
+          A hexbinary string used to identify one or more LAN devices, value of the DHCPv6 User Class Identifier (Option 15) {{bibref|RFC3315|Section 22.15}}.
+          {{empty}} indicates this criterion is not used.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="UserClassIDExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, matching packets are those that match the {{param|UserClassID}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the {{param|UserClassID}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceAddress" access="readWrite" dmr:version="2.2">
+        <description>
+          Pool association criterion.
+          Source address (link-layer address) of DHCPv6 messages sent from the DHCPv6 client.  This criterion is only likely to be useful if this is a link-layer address.
+          {{empty}} indicates this criterion is not used for serving.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceAddressMask" access="readWrite" dmr:version="2.2">
+        <description>
+          Bit-mask for the source address, where matching of a packet's source address with the {{param|SourceAddress}} is only to be done for bit positions set to one in the mask.  A mask of {{empty}} indicates all bits of the {{param|SourceAddress}} are to be used.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceAddressExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, matching packets are those that match the (masked) {{param|SourceAddress}} entry, if specified.
+          If {{true}}, matching packets are those that do not match the (masked) {{param|SourceAddress}} entry, if specified.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="IANAEnable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables IANA offers.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IANAManualPrefixes" access="readWrite" dmr:version="2.2">
+        <description>
+          {{list}} {{reference}}
+          Manually-configured prefixes from which IA_NA addresses will be assigned.  Each referenced prefix MUST have a  {{param|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}} of {{enum|Static|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}} or {{enum|Child|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}}.  All clients that request IA_NA and match filter criteria on this {{param|Interface}} MUST be offered IA_NA addresses from all of the ''Valid'' ({{param|.IP.Interface.{i}.IPv6Prefix.{i}.ValidLifetime}} is infinite or in the future) /64 prefixes in this list.
+          Prefixes MUST be associated with the interface instance referenced by {{param|Interface}}.
+        </description>
+        <syntax>
+          <list maxItems="8"/>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="IANAPrefixes" access="readOnly" dmr:version="2.2">
+        <description>
+          {{list}} {{reference}}
+          All prefixes from which IA_NA addresses will be assigned. This list can include:
+          * Prefixes from {{param|IANAManualPrefixes}} that are used for IA_NA offers.
+          * Prefixes with {{param|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} = {{enum|Child|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} or {{enum|AutoConfigured|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} associated with the interface instance referenced by {{param|Interface}}.
+        </description>
+        <syntax>
+          <list maxItems="8"/>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IAPDEnable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables IAPD offers.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IAPDManualPrefixes" access="readWrite" dmr:version="2.2">
+        <description>
+          {{list}} {{reference}}
+          Manually-configured prefixes from which IA_PD prefixes will be derived.  This list can include:
+          * Prefixes with {{param|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} = {{enum|Static|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} or {{enum|PrefixDelegation|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} associated with upstream interfaces (i.e. interfaces for which the physical layer interface object has ''Upstream'' = {{true}}).
+          * Prefixes with {{param|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}} = {{enum|Static|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}} or {{enum|Child|.IP.Interface.{i}.IPv6Prefix.{i}.StaticType}} associated with with the interface instance referenced by {{param|Interface}}.
+          All clients that request IA_PD and match filter criteria on this {{param|Interface}} MUST be offered IA_PD prefixes derived from all of the ''Valid'' ({{param|.IP.Interface.{i}.IPv6Prefix.{i}.ValidLifetime}} is infinite or in the future) prefixes in this list.
+        </description>
+        <syntax>
+          <list maxItems="8"/>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="IAPDPrefixes" access="readOnly" dmr:version="2.2">
+        <description>
+          {{list}} {{reference}}
+          All prefixes for which IA_PD prefixes will be assigned. This list can include:
+          * Prefixes from {{param|IAPDManualPrefixes}} that are used for IA_PD offers.
+          * Prefixes with {{param|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} = {{enum|PrefixDelegation|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} or {{enum|AutoConfigured|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} associated with upstream interfaces (i.e. interfaces for which the physical layer interface object has ''Upstream'' = {{true}}).
+          * Prefixes with {{param|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} = {{enum|Child|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} or {{enum|AutoConfigured|.IP.Interface.{i}.IPv6Prefix.{i}.Origin}} associated with the interface instance referenced by {{param|Interface}}.
+        </description>
+        <syntax>
+          <list maxItems="8"/>
+          <string>
+            <pathRef refType="strong" targetParent=".IP.Interface.{i}.IPv6Prefix." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IAPDAddLength" access="readWrite" dmr:version="2.2">
+        <description>
+          The RECOMMENDED minimum number of bits to add to {{param|IAPDManualPrefixes}} or {{param|IAPDPrefixes}} in order to determine the length of prefixes that are offered in an IA_PD.  The device is responsible for ensuring that it does not delegate a prefix longer than /64.  The device can have additional logic that is used (in conjunction with this parameter) to determine the actual length of prefixes offered in an IA_PD.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="64"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ClientNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Server.Pool.{i}.Client.{i}." access="readOnly" numEntriesParameter="ClientNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        DHCPv6 client table.
+        This table lists details of DHCPv6 clients that matched the filter criteria of this {{object|#}} entry.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="SourceAddress"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+          Note: There is no guarantee that the {{param}} value on automatically-created {{object}} instances will be retained. This is because automatically-created {{object}} instances can be transitory.
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceAddress" access="readOnly" dmr:version="2.2">
+        <description>
+          Source address of the DHCPv6 client.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="Active" access="readOnly" dmr:version="2.2">
+        <description>
+          Whether or not the DHCPv6 client is currently present on the LAN.  The method of presence detection is a local matter to  the CPE.
+          The ability to list inactive DHCPv6 clients is OPTIONAL.  If the CPE includes inactive DHCPv6 clients in this table, {{param}} MUST be set to {{false}}  for each inactive DHCPv6 client.  The length of time an inactive DHCPv6 client remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6AddressNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6PrefixNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Server.Pool.{i}.Client.{i}.IPv6Address.{i}." access="readOnly" numEntriesParameter="IPv6AddressNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        IPv6 addresses assigned to this client via IA_NA.
+      </description>
+      <uniqueKey>
+        <parameter ref="IPAddress"/>
+      </uniqueKey>
+      <parameter name="IPAddress" access="readOnly" dmr:version="2.2">
+        <description>
+          IPv6 address.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredLifetime" access="readOnly" dmr:version="2.2">
+        <description>
+          The time at which this address will cease to be preferred (i.e. will become deprecated), or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ValidLifetime" access="readOnly" dmr:version="2.2">
+        <description>
+          The time at which this address will cease to be valid (i.e. will become invalid), or {{null}} if unknown. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Server.Pool.{i}.Client.{i}.IPv6Prefix.{i}." access="readOnly" numEntriesParameter="IPv6PrefixNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        IPv6 prefixes delegated to this client via IA_PD.
+      </description>
+      <uniqueKey>
+        <parameter ref="Prefix"/>
+      </uniqueKey>
+      <parameter name="Prefix" access="readOnly" dmr:version="2.2">
+        <description>
+          IPv6 address prefix.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Prefix"/>
+        </syntax>
+      </parameter>
+      <parameter name="PreferredLifetime" access="readOnly" dmr:version="2.2">
+        <description>
+          The time at which this prefix will cease to be preferred (i.e. will become deprecated), or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ValidLifetime" access="readOnly" dmr:version="2.2">
+        <description>
+          The time at which this prefix will cease to be valid (i.e. will become invalid), or {{null}} if unknown. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Server.Pool.{i}.Client.{i}.Option.{i}." access="readOnly" numEntriesParameter="OptionNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2" dmr:noUniqueKeys="true">
+      <description>
+        DHCPv6 options supplied by this client, e.g. ''DUID'' (Option 1), ''UserClassID'' (Option 15) or ''VendorClassID'' (option 16).
+      </description>
+      <parameter name="Tag" access="readOnly" dmr:version="2.2">
+        <description>
+          Option tag (code) {{bibref|RFC3315|Section 22.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.2">
+        <description>
+          A hexbinary encoded option value.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DHCPv6.Server.Pool.{i}.Option.{i}." access="readWrite" numEntriesParameter="OptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        This object specifies the DHCPv6 options that MUST, if enabled, be offered to clients whose DHCPv6 requests are associated with this pool. If {{param|PassthroughClient}} is specified, and the referenced client has a value for a given option then the {{param|PassthroughClient}} option value will be sent instead of {{param|Value}}. Otherwise, {{param|Value}} will be sent.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Tag"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tag" access="readWrite" dmr:version="2.2">
+        <description>
+          Option tag (code) {{bibref|RFC3315|Section 22.1}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.2">
+        <description>
+          A hexbinary encoded option value.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="65535"/>
+          </hexBinary>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="PassthroughClient" access="readWrite" dmr:version="2.2">
+        <description>
+          {{reference}} Indicates whether this {{object}} entry is configured for passthrough.
+          If {{param}} is specified, and the referenced client (since boot) has received a value from an associated upstream DHCPv6 server for the given {{param|Tag}} option, then the referenced client's option value will be sent instead of {{param|Value}}. Otherwise, {{param|Value}} will be sent.
+          {{empty}} indicates that passthrough is not configured for this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="###.Client." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE8021x." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        IEEE 802.1x object {{bibref|802.1x-2004}}, where {{object|Supplicant}} models authentication supplicants.
+      </description>
+      <parameter name="SupplicantNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE8021x.Supplicant.{i}." access="readWrite" numEntriesParameter="SupplicantNumberOfEntries" enableParameter="Enable" minEntries="1" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        802.1x supplicant authentication provisioning and status information associated with an interface to be authenticated (e.g. an {{object|.Ethernet.Link}} instance).
+        For enabled table entries, if {{param|Interface}} is not a valid reference then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+        Note: The {{object}} table includes a unique key parameter that is a strong reference. If a strongly referenced object is deleted, the CPE will set the referencing parameter to {{empty}}. However, doing so under these circumstances might cause the updated {{object}} row to then violate the table's unique key constraint; if this occurs, the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}} and disable the offending {{object}} row.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Interface"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          This parameter controls whether this resource will utilize the 802.1x protocol as a supplicant for device  authentication purposes.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The current operational status of this 802.1x supplicant.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} The interface on which authentication is to be performed. Example:  Device.Ethernet.Link.1
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="PAEState" access="readOnly" dmr:version="2.0">
+        <description>
+          The current supplicant state machine as defined in {{bibref|802.1x-2004|9.5.1}}, Supplicant PAE (Port Access Entity) State.  {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disconnected"/>
+            <enumeration value="Logoff"/>
+            <enumeration value="Connecting"/>
+            <enumeration value="Authenticating"/>
+            <enumeration value="Authenticated"/>
+            <enumeration value="Held"/>
+            <enumeration value="Restart"/>
+            <enumeration value="ForceAuth"/>
+            <enumeration value="ForceUnauth"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EAPIdentity" access="readWrite" dmr:version="2.0">
+        <description>
+          The identity to be exchanged between the supplicant and authenticator.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxStart" access="readWrite" dmr:version="2.0">
+        <description>
+          The maximum number of times the device will attempt to send an EAP start message before authentication fails as defined in {{bibref|802.1x-2004|9.5.1}}, maxStart.
+          This is in support of {{bibref|802.1x-2004|Section 8.4.6}}, Migration Considerations.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="10"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="StartPeriod" access="readWrite" dmr:version="2.0">
+        <description>
+          The period in {{units}} a supplicant will wait before the device will attempt to re-send an EAP start message as defined in {{bibref|802.1x-2004|9.5.1}}, startPeriod.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="HeldPeriod" access="readWrite" dmr:version="2.0">
+        <description>
+          The hold-off period in {{units}} a supplicant will wait before re-attempting authentication as defined in {{bibref|802.1x-2004|9.5.1}}, heldPeriod.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AuthPeriod" access="readWrite" dmr:version="2.0">
+        <description>
+          The period in {{units}} after which a request will be considered timed out as defined in {{bibref|802.1x-2004|9.5.1}}, authPeriod.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AuthenticationCapabilities" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the authentication methods supported by the device.  {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="EAP-TLS"/>
+            <enumeration value="EAP-MD5"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="StartFailurePolicy" access="readWrite" dmr:version="2.0">
+        <description>
+          The action to be taken when authentication has failed, when the network fails to respond to the supplicant's start message, and the retries have been exceeded (since network does not yet support 802.1x).  {{enum}}
+          This is in support of {{bibref|802.1x-2004|Section 8.4.6}}, Migration Considerations.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="FailAuthentication"/>
+            <enumeration value="AssumeAuthentication"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AuthenticationSuccessPolicy" access="readWrite" dmr:version="2.0">
+        <description>
+          The action to be taken when authentication succeeds and a connection has already received an address and/or policy settings.  {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NoAction"/>
+            <enumeration value="RenewConnection"/>
+          </string>
+        </syntax>
+      </parameter>
+      <command name="Reset()" dmr: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()" dmr:version="2.12">
+        <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 name="Device.IEEE8021x.Supplicant.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        802.1x Authentication Supplicant EAP statistics information for this resource.
+      </description>
+      <parameter name="ReceivedFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAPOL frames of any type that have been received by this Supplicant; {{bibref|802.1x-2004|9.5.2}}, EAPOL frames received.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAPOL frames of any type that have been transmitted by this Supplicant; {{bibref|802.1x-2004|9.5.2}}, EAPOL frames transmitted.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedStartFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAPOL Start frames that have been transmitted by this Supplicant; {{bibref|802.1x-2004|9.5.2}}, EAPOL Start frames transmitted.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedLogoffFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAPOL Logoff frames that have been transmitted by this Supplicant; {{bibref|802.1x-2004|9.5.2}}, EAPOL Logoff frames transmitted.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedResponseIdFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAP Resp/Id frames that have been transmitted; {{bibref|802.1x-2004|9.5.2}}, EAP Resp/Id frames transmitted.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedResponseFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of valid EAP Response frames (other than Resp/Id frames) that have been transmitted by this  Supplicant; {{bibref|802.1x-2004|9.5.2}}, EAP Resp frames transmitted.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedRequestIdFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAP Req/Id frames that have been received by this Supplicant; {{bibref|802.1x-2004|9.5.2}}, EAP Req/Id frames received.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedRequestFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAP Request frames (other than Rq/Id frames) that have been received by this Supplicant; {{bibref|802.1x-2004|9.5.2}}, EAP Req frames received.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedInvalidFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAPOL frames that have been received by this Supplicant in which the frame type is not recognized; {{bibref|802.1x-2004|9.5.2}}, EAP Req frames received.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedLengthErrorFrames" access="readOnly" dmr:version="2.0">
+        <description>
+          The number of EAPOL frames that have been received by this Supplicant in which the Packet Body Length field is invalid; {{bibref|802.1x-2004|9.5.2}}, EAP length error frames received.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="LastFrameVersion" access="readOnly" dmr:version="2.0">
+        <description>
+          The protocol version number carried in the most recently received EAPOL frame; {{bibref|802.1x-2004|9.5.2}}, Last EAPOL frame version
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LastFrameSourceMACAddress" access="readOnly" dmr:version="2.0">
+        <description>
+          The source MAC address carried in the most recently received EAPOL frame; {{bibref|802.1x-2004|9.5.2}}, Last EAPOL frame source.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE8021x.Supplicant.{i}.EAPMD5." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        802.1x Authentication Supplicant provisioning information used for MD5 shared secret exchange. This object will not exist if EAP-MD5 is not a supported authentication type.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          This parameter enables or disables the supplicant's support for EAP-MD5.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SharedSecret" access="readWrite" dmr:version="2.0">
+        <description>
+          The shared secret to be exchanged between the supplicant and authenticator.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE8021x.Supplicant.{i}.EAPTLS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        802.1x Authentication Supplicant provisioning information used for TLS certificate authentication. This object will not exist if the EAP-TLS is not a supported authentication type.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          This parameter enables or disables the supplicant's support for EAP-TLS.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MutualAuthenticationEnable" access="readWrite" dmr:version="2.0">
+        <description>
+          The parameter controls if the supplicant will authenticate the authenticator.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Users." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Users object that contains the {{object|User}} table.
+      </description>
+      <parameter name="UserNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Users.User.{i}." access="readWrite" numEntriesParameter="UserNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object contains parameters relating to the user characteristics.
+      </description>
+      <uniqueKey>
+        <parameter ref="Username"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/disables this user object instance.
+          If the User being configured is currently accessing the device then a disable MUST apply to the next user session and the current user session MUST NOT be abruptly terminated.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="RemoteAccessCapable" access="readWrite" dmr:version="2.0">
+        <description>
+          Allows this user to remotely access the UserInterface via the mechanism defined in {{object|.UserInterface.RemoteAccess.}}
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.0">
+        <description>
+          Name of the current user. MUST NOT be {{empty}} for an enabled entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.0">
+        <description>
+          The user's password.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Language" access="readWrite" dmr:version="2.0">
+        <description>
+          String describing the default language for the local configuration interface, specified according to {{bibref|RFC3066}}.
+          If {{empty}}, {{param|.UserInterface.CurrentLanguage}} is used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="16"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.SmartCardReaders." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        SmartCardReaders object that contains the {{object|SmartCardReader}} table.
+      </description>
+      <parameter name="SmartCardReaderNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.SmartCardReaders.SmartCardReader.{i}." access="readOnly" numEntriesParameter="SmartCardReaderNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        This object describes the characteristics of the smart card reader.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this smart card reader.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates the status of this smart card reader.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled">
+              <description>
+                Indicates the smart card reader is enabled and functioning properly.
+              </description>
+            </enumeration>
+            <enumeration value="Error">
+              <description>
+                Indicates the smart card reader is enabled and not functioning properly.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.0">
+        <description>
+          Human-readable name associated with this smart card reader.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ResetTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The time at which this SmartCard Reader was reset.
+          Reset can be caused by:
+          * {{param|Status}} transition from Disabled to Enabled
+          * {{param|Reset}} set to {{true}}.
+          * An internal reset of the SmartCard Reader (including a reboot of the device).
+          Unknown Time value indicates that this SmartCard Reader has never been reset, which can only happen if it has never been enabled.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="DecryptionFailedCounter" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Counter incremented once each time decryption cannot be carried out.
+          This counter relates to the smart card reader, not to the smart card itself, i.e. it is reset when the {{param|Reset}} parameter is used and not when a Smart Card is inserted or removed.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DecryptionFailedNoKeyCounter" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          Counter incremented once each time the key is not available to decrypt it.  This is a subset of the more general {{param|DecryptionFailedCounter}} within the same object and thus will always be less than that parameter.
+          This counter relates to the smart card reader, not to the smart card itself, i.e. it is reset when the {{param|Reset}} parameter is used and not when a Smart Card is inserted or removed.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <command name="Reset()" dmr:version="2.12">
+        <description>
+          Reset the SmartCard Reader and the associated SmartCard.
+        </description>
+      </command>
+    </object>
+    <object name="Device.SmartCardReaders.SmartCardReader.{i}.SmartCard." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Status of currently associated smart card.
+      </description>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Status of the Smart Card.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="None">
+              <description>
+                Indicates that no Smart Card is inserted.
+              </description>
+            </enumeration>
+            <enumeration value="Running">
+              <description>
+                Indicates a Smart Card is present and working normally.
+              </description>
+            </enumeration>
+            <enumeration value="Error">
+              <description>
+                Indicates the Smart Card is present and in an error condition.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.0">
+        <description>
+          Smart Card Type. {{enum}}
+          Vendors can extend the enumerated values with vendor specific extensions, in which case the rules outlined in {{bibref|TR-106a2|Section 3.3}} MUST be adhered to.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="CA"/>
+            <enumeration value="DRM"/>
+            <enumeration value="UICC"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Application" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates Smart Card Application(s).  {{param}} is only relevant when {{param|Type}} has a value of UICC, otherwise it is {{empty}}. {{enum}}
+          Vendors can extend the enumerated values with vendor specific extensions, in which case the rules outlined in {{bibref|TR-106a2|Section 3.3}} MUST be adhered to.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="SIM"/>
+            <enumeration value="USIM"/>
+            <enumeration value="ISIM"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="2.0">
+        <description>
+          The Smart Card Serial Number or {{empty}} if the Smart Card serial Number is not available, e.g. in the case of IPTV due to restrictions of the Service Delivery Platform.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ATR" access="readOnly" dmr:version="2.0">
+        <description>
+          The Smart Card answer to a reset action. Issued by the Smart Card upon reset.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains all UPnP related objects and parameters including Device and Discovery related objects and parameters.
+      </description>
+    </object>
+    <object name="Device.UPnP.Device." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object defines the UPnP devices and UPnP services that are implemented by the CPE.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP support.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPMediaServer" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP Media Server.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPMediaRenderer" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP Media Renderer.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPWLANAccessPoint" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP Wireless Access Point.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPQoSDevice " access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP QoS Device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPQoSPolicyHolder" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP QoS Policy Holder.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPIGD" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP IGD.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPDMBasicMgmt" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP-DM Basic Management.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPDMConfigurationMgmt" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP-DM Configuration Management.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPDMSoftwareMgmt" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables/Disables UPnP-DM Software Management.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Device.Capabilities." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object defines what UPnP capabilities this device has.
+      </description>
+      <parameter name="UPnPArchitecture" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the major version of the supported UPnP architecture.
+          If UPnP 1.1 is supported the value is 1.  If UPnP 2.0 is supported the value is 2.
+          A value of 0 indicates no UPnP support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPArchitectureMinorVer" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the minor version of the supported UPnP architecture.
+          If UPnP 1.1 is supported the value is 1.  If UPnP 2.0 is supported the value is 0.
+          If {{param|UPnPArchitecture}} is 0 then this parameter SHOULD be ignored.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPMediaServer" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP Media Server.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPMediaRenderer" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP Media Renderer.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPWLANAccessPoint" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP Wireless Access Point.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPBasicDevice" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP Basic Device.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPQoSDevice" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP Qos Device.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPQoSPolicyHolder" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP Qos Policy Holder.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPIGD" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP IGD.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPDMBasicMgmt" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP-DM Basic Management.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPDMConfigurationMgmt" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP-DM Configuration Management.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="UPnPDMSoftwareMgmt" access="readOnly" dmr:version="2.0">
+        <description>
+          Numeric value indicating the supported revision for UPnP-DM Software Management.
+          A value of 0 indicates no support.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Discovery." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        UPnP {{bibref|UPnP-DAv1}} SSDP discovered root devices, embedded devices and embedded services.
+        The CPE MAY, but need not, retain some or all of the information in this object across reboots.
+      </description>
+      <parameter name="RootDeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Discovery.RootDevice.{i}." access="readOnly" numEntriesParameter="RootDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        UPnP root device table. This table contains an entry for each UPnP root device that has been discovered via SSDP.
+      </description>
+      <uniqueKey>
+        <parameter ref="UUID"/>
+      </uniqueKey>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of the UPnP root device. {{enum}}
+          The ability to list inactive UPnP root devices is OPTIONAL. The length of time an inactive device remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="LeaseActive">
+              <description>
+                Device is active and UPnP lease has not expired.
+              </description>
+            </enumeration>
+            <enumeration value="LeaseExpired">
+              <description>
+                Device is inactive because UPnP lease has expired.
+              </description>
+            </enumeration>
+            <enumeration value="ByebyeReceived">
+              <description>
+                Device is inactive because byebye message was received.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UUID" access="readOnly" dmr:version="2.0">
+        <description>
+          This UPnP root device's UUID (Universally Unique IDentifier) {{bibref|RFC4122}}, extracted from any of its USN (Unique Service Name) headers. This is a 36-byte string that uniquely identifies the device, the following is an example:
+          : ''02c29d2a-dbfd-2d91-99c9-306d537e9856''
+          {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="36"/>
+            <pattern value="[0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="USN" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the USN (Unique Service Name) header for this UPnP root device. Three discovery messages are sent for root devices, and this SHOULD be the value of the USN header of the following form:
+          : ''uuid:device-UUID::urn:domain-name:device:deviceType:v''
+          SSDP is an unreliable protocol and it is possible that no discovery message containing the USN header of the above form was ever received. If so, one of the other two forms MAY be used:
+          : ''uuid:device-UUID::upnp:rootdevice''
+          : ''uuid:device-UUID'' (for root device UUID)
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The UPnP root device lease time in {{units}}, extracted from the CACHE-CONTROL header.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Location" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the LOCATION header for this UPnP root device, which is the URL of the root device's DDD (Device Description Document).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Server" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the SERVER header for this UPnP root device, which is a string of the following form:
+          : ''OS/version UPnP/udaversion product/version''
+          where '''UPnP''' is a literal string, '''udaversion''' is the version of the UPnP Device Architecture.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the full path names of all Host table entries, whether active or inactive, that correspond to this UPnP root device.
+          As such entries are added to or removed from the Host tables, the value of this parameter MUST be updated accordingly.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" dmr:version="2.6">
+        <description>
+          The date and time at which the last advertisement from this {{object}} was received.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Discovery.Device.{i}." access="readOnly" numEntriesParameter="DeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        UPnP embedded device table. This table contains an entry for each UPnP embedded device that has been discovered via SSDP.
+      </description>
+      <uniqueKey>
+        <parameter ref="UUID"/>
+      </uniqueKey>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of the UPnP embedded device. {{enum}}
+          The ability to list inactive UPnP embedded devices is OPTIONAL. The length of time an inactive device remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="LeaseActive">
+              <description>
+                Device is active and UPnP lease has not expired.
+              </description>
+            </enumeration>
+            <enumeration value="LeaseExpired">
+              <description>
+                Device is inactive because UPnP lease has expired.
+              </description>
+            </enumeration>
+            <enumeration value="ByebyeReceived">
+              <description>
+                Device is inactive because byebye message was received.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UUID" access="readOnly" dmr:version="2.0">
+        <description>
+          This UPnP embedded device's UUID (Universally Unique IDentifier) {{bibref|RFC4122}}, extracted from any of its USN (Unique Service Name) headers. This is a 36-byte string that uniquely identifies the device, the following is an example:
+          : ''02c29d2a-dbfd-2d91-99c9-306d537e9856''
+          {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="36"/>
+            <pattern value="[0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="USN" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the USN (Unique Service Name) header for this UPnP embedded device. Two discovery messages are sent for embedded devices, and this SHOULD be the value of the USN header of the following form:
+          : ''uuid:device-UUID::urn:domain-name:device:deviceType:v''
+          SSDP is an unreliable protocol and it is possible that no discovery message containing the USN header of the above form was ever received. If so, the other form MAY be used:
+          : ''uuid:device-UUID''
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The UPnP embedded device lease time in {{units}}, extracted from the CACHE-CONTROL header.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Location" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the LOCATION header for this UPnP embedded device, which is the URL of the root device's DDD (Device Description Document).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Server" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the SERVER header for this UPnP embedded device, which is a string of the following form:
+          : ''OS/version UPnP/udaversion product/version''
+          where '''UPnP''' is a literal string, '''udaversion''' is the version of the UPnP Device Architecture.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the full path names of all Host table entries, whether active or inactive, that correspond to this UPnP embedded device.
+          As such entries are added to or removed from the Host tables, the value of this parameter MUST be updated accordingly.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" dmr:version="2.6">
+        <description>
+          The date and time at which the last advertisement from this {{object}} was received.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Discovery.Service.{i}." access="readOnly" numEntriesParameter="ServiceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        UPnP embedded service table. This table contains an entry for each UPnP embedded service that has been discovered via SSDP.
+      </description>
+      <uniqueKey>
+        <parameter ref="USN"/>
+      </uniqueKey>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          The status of the UPnP embedded service. {{enum}}
+          The ability to list inactive UPnP embedded services is OPTIONAL. The length of time an inactive service remains listed in this table is a local matter to the CPE.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="LeaseActive">
+              <description>
+                Service is active and UPnP lease has not expired.
+              </description>
+            </enumeration>
+            <enumeration value="LeaseExpired">
+              <description>
+                Service is inactive because UPnP lease has expired.
+              </description>
+            </enumeration>
+            <enumeration value="ByebyeReceived">
+              <description>
+                Service is inactive because byebye message was received.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="USN" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the USN (Unique Service Name) header for this UPnP embedded service. This is of the following form:
+          : ''uuid:device-UUID::urn:domain-name:service:serviceType:v''
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LeaseTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The UPnP embedded service lease time in {{units}}, extracted from the CACHE-CONTROL header.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Location" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the LOCATION header for this UPnP embedded service, which is the URL of the root device's DDD (Device Description Document).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Server" access="readOnly" dmr:version="2.0">
+        <description>
+          The value of the SERVER header for this UPnP embedded service, which is a string of the following form:
+          : ''OS/version UPnP/udaversion product/version''
+          where '''UPnP''' is a literal string, '''udaversion''' is the version of the UPnP Device Architecture.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the full path names of all Host table entries, whether active or inactive, that correspond to this UPnP embedded service.
+          As such entries are added to or removed from the Host tables, the value of this parameter MUST be updated accordingly.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" dmr:version="2.6">
+        <description>
+          The date and time at which the last advertisement from this {{object}} was received.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ParentDevice" access="readOnly" dmr:version="2.6">
+        <description>
+          {{reference|the {{object|#.RootDevice}} or {{object|#.Device}} table entries that embeds this {{object}}}} This parameter is populated by extracting the "device-UUID" from the service's USN and matching the value against the root device or embedded device UUID value.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.RootDevice. #.Device." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Description." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.6">
+      <description>
+        This object contains information from the  Description Document discovered from the UPnP Devices and Services.
+      </description>
+      <parameter name="DeviceDescriptionNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceInstanceNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceInstanceNumberOfEntries" access="readOnly" dmr:version="2.6">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Description.DeviceDescription.{i}." access="readOnly" numEntriesParameter="DeviceDescriptionNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.6">
+      <description>
+        This table contains information read from the Device Description Document of discovered root devices.
+        The CPE MAY, but need not, retain some or all of the information in this table after the associated SSDP advertisement (objects in the  UPnP.Discovery. object tables) expires.
+        In case the SSDP advertisement expires and the CPE deletes the related instances from the tables in UPnP.Discovery., the reference to such instances MUST be set to the empty string.
+      </description>
+      <uniqueKey>
+        <parameter ref="URLBase"/>
+      </uniqueKey>
+      <parameter name="URLBase" access="readOnly" dmr:version="2.6">
+        <description>
+          The value extracted from the URLBase element in the Device Description Document of the discovered root device. If the URLBase element in the root device's Device Description Document is empty or absent, the URL from which the device description was retrieved (e.g. the LOCATION from the SSDP message) is utilized as the URLBase.
+          Note: the URLBase element is not recommended by {{bibref|UPnP-DAv1}} and is not permitted by {{bibref|UPnP-DAv11}}, so the value of {{param}} will usually be the URL from which the device description was retrieved.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SpecVersion" access="readOnly" dmr:version="2.6">
+        <description>
+          The UPnP Device Architecture version extracted from the specVersion element in the Device Description Document of the discovered root device. The {{param}} is encoded as "major revison.minor revision". {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pattern value="\d+\.\d+"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readOnly" dmr:version="2.6">
+        <description>
+          {{list}} {{reference|the Host table entries associated with the root device from which the device description was retrieved|ignore}}
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".LANDevice.{i}.Hosts.Host. .Hosts.Host." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Description.DeviceInstance.{i}." access="readOnly" numEntriesParameter="DeviceInstanceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.6">
+      <description>
+        This table contains the information from Device Description Document retrieved for a discovered UPnP root or embedded device.
+      </description>
+      <uniqueKey>
+        <parameter ref="UDN"/>
+      </uniqueKey>
+      <parameter name="UDN" access="readOnly" dmr:version="2.6">
+        <description>
+          Unique Device Name of this device represented as a UUID for the device.
+          This value is extracted from the UDN element in the Device Description Document with the leading uuid: removed.
+        </description>
+        <syntax>
+          <dataType ref="UUID"/>
+        </syntax>
+      </parameter>
+      <parameter name="ParentDevice" access="readOnly" dmr:version="2.6">
+        <description>
+          {{reference|a {{object}} table entry (if this is an embedded device) or {{empty}} (if this is a root device)}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.DeviceInstance." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DiscoveryDevice" access="readOnly" dmr:version="2.6">
+        <description>
+          {{reference|a {{object|##.Discovery.RootDevice}} table entry (if this is a root device) or a {{object|##.Discovery.Device}} table entry (if this is an embedded device)}}
+          This {{param}} value can be {{empty}} because the referenced object has been deleted or the CPE was unable to retrieve the Description Document due to some out-of-band error. The determination to delete this {{object}} or use {{empty}} is implementation specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="##.Discovery.Device. ##.Discovery.RootDevice." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceType" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP deviceType element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FriendlyName" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP friendlyName element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceCategory" access="readOnly" dmr:version="2.8">
+        <description>
+          Each list item is the value of an element in the Device Description Document for this {{object}} that indicates a device category (e.g. "AV_TV" and "AV_Recorder"), or the value is {{empty}} if no such element is provided by the device.
+          Note: It is assumed that the ''htip:X_DeviceCategory'' Device Description Document element is used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}. Standard HTIP device categories are defined in {{bibref|JJ-300.01}}. In this case, the maximum length of the list is 127 and of each item is 31, and any non-HTIP device categories SHOULD NOT conflict with standard HTIP device categories.
+          Note: {{param}} is different from {{param|DeviceType}} and is included here for the purpose of HTIP usage.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Manufacturer" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP manufacturer element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerOUI" access="readOnly" dmr:version="2.8">
+        <description>
+          The value of an element in the Device Description Document for this {{object}} that indicates the manufacturer OUI if this value is provided by the device; or {{empty}} if this value is not provided by the device.
+          {{pattern}}
+          Note: It is assumed that the ''htip:X_ManufacturerOUI'' element is used for HTIP (Home-network Topology Identifying Protocol) {{bibref|JJ-300.00}} and {{bibref|G.9973}}.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="0" maxLength="6"/>
+            <pattern value=""/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerURL" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP manufacturerURL element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModelDescription" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP modelDescription element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModelName" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP modelName element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModelNumber" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP modelNumber element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ModelURL" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP modelURL element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP serialNumber element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UPC" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP UPC element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the device.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="12"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PresentationURL" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP presentationURL element in the Device Description Document for this {{object}} and MUST be an absolute URL.
+          The way to obtain an absolute URL from the presentationURL element is specified in {{bibref|UPnP-DAv1}} and {{bibref|UPnP-DAv11}}.
+          If the presentationURL is not provided by the device then this value MUST be {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.UPnP.Description.ServiceInstance.{i}." access="readOnly" numEntriesParameter="ServiceInstanceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.6">
+      <description>
+        This table contains the information from Device Description Document retrieved for a discovered UPnP service.
+      </description>
+      <uniqueKey>
+        <parameter ref="ParentDevice"/>
+        <parameter ref="ServiceId"/>
+      </uniqueKey>
+      <parameter name="ParentDevice" access="readOnly" dmr:version="2.6">
+        <description>
+          {{reference|a {{object|#.DeviceInstance}} table entry}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="#.DeviceInstance." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceId" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP serviceId element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the service.
+          If the UPnP serviceId is not provided by the UPnP service, this {{object}} MUST be deleted.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceDiscovery" access="readOnly" dmr:version="2.6">
+        <description>
+          {{reference|a {{object|##.Discovery.Service}} table entry}}
+          This {{param}} value can be {{empty}} because the referenced object has been deleted or the CPE was unable to retrieve the Description Document due to some out-of-band error. The determination to delete this {{object}} or use {{empty}} is implementation specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="##.Discovery.Service." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceType" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP serviceType element in the Device Description Document for this {{object}}, or {{empty}} if this value is not provided by the service.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SCPDURL" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP SCPDURL element in the Device Description Document for this {{object}} and MUST be an absolute URL.
+          The way to obtain an absolute URL from the SCPDURL element is specified in {{bibref|UPnP-DAv1}} and {{bibref|UPnP-DAv11}}.
+          If the SCPDURL is not provided by the device then this value MUST be {{empty}}.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ControlURL" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP controlURL element in the Device Description Document for this {{object}} and MUST be an absolute URL.
+          The way to obtain an absolute URL from the controlURL element is specified in {{bibref|UPnP-DAv1}} and {{bibref|UPnP-DAv11}}.
+          If the controlURL is not provided by the device then this value MUST be {{empty}}
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="EventSubURL" access="readOnly" dmr:version="2.6">
+        <description>
+          The value of the UPnP eventSubURL element in the Device Description Document for this {{object}} and MUST be an absolute URL.
+          The way to obtain an absolute URL from the eventSubURLL element is specified in {{bibref|UPnP-DAv1}} and {{bibref|UPnP-DAv11}}.
+          If the eventSubURL is not provided by the device then this value MUST be {{empty}}
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DLNA." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object contains all DLNA related objects and parameters.
+      </description>
+    </object>
+    <object name="Device.DLNA.Capabilities." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        DLNA capabilities.
+      </description>
+      <parameter name="HNDDeviceClass" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the supported DLNA Home Network Device Classes {{bibref|DLNA-NDIG|Table 4-1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceCapability" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the supported DLNA Device Capabilities {{bibref|DLNA-NDIG|Table 4-2}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="HIDDeviceClass" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the supported DLNA Home Infrastructure Device Classes {{bibref|DLNA-NDIG|Table 4-4}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ImageClassProfileID" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the DLNA Image Class Profile IDs supported by this device, from Tables 5-2 and 5-3 of {{bibref|DLNA-NDIG}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="AudioClassProfileID" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the DLNA Audio Class Profile IDs supported by this device, from Tables 5-4 through 5-10 of {{bibref|DLNA-NDIG}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="AVClassProfileID" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the DLNA AV Class Profile IDs supported by this device, from Tables 5-11 through 5-15 of {{bibref|DLNA-NDIG}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="MediaCollectionProfileID" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the DLNA Media Collection Profile IDs supported by this device {{bibref|DLNA-NDIG|Table 5-16}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="PrinterClassProfileID" access="readOnly" dmr:version="2.0">
+        <description>
+          {{list}} Indicates the DLNA Printer Class Profile IDs supported by this device {{bibref|DLNA-NDIG|Table 5-17}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Firewall." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        Firewall configuration object. The {{param|Config}} parameter enables and disables the Firewall, and can select either a predefined configuration ({{enum|High|Config}} or {{enum|Low|Config}}) or an explicitly-defined {{enum|Advanced|Config}} configuration.
+        For an {{enum|Advanced|Config}} configuration, {{param|AdvancedLevel}} controls the currently active Firewall Level, and the Firewall Levels are defined in the {{object|Level}}, {{object|Chain}} and {{object|Chain.{i}.Rule}} tables.
+        The Firewall rules modeled by this object operate only on the forwarding path. This means that they affect only routed traffic, and do not affect traffic that is destined for or generated by the CPE.  Note that any {{object|#.NAT}} processing on the ingress packet occurs before Firewall rules are applied so, for example, the Firewall rules will see the translated destination IP address and port in a downstream packet that has passed through the NAT.
+        See {{bibref|TR-181i2a2|Appendix VIII}} for an example {{enum|Advanced|Config}} configuration.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables the Firewall.
+          Firewalls often implement additional Denial of Service and other vulnerability protections, such as those described in {{bibref|ICSA-Baseline}}. If a {{enum|Stateful|Type}} Firewall is enabled, then it is assumed that all implemented stateful protections are enabled, unless they are overridden by some other part of the data model.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Config" access="readWrite" dmr:version="2.0">
+        <description>
+          How this firewall is configured. {{enum}}
+          Vendors can extend the enumerated values with vendor specific extensions, in which case the rules outlined in {{bibref|TR-106a2|Section 3.3}} MUST be adhered to.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="High">
+              <description>
+                The firewall implements the "Traffic Denied Inbound" and "Minimally Permit Common Services Outbound" components of the ICSA residential certification's Required Services Security Policy {{bibref|ICSA-Residential}}.  If DoS and vulnerability protections are implemented {{bibref|ICSA-Baseline}}, these are enabled.
+              </description>
+            </enumeration>
+            <enumeration value="Low">
+              <description>
+                All Outbound traffic and pinhole-defined Inbound traffic is allowed.  If DoS and vulnerability protections are implemented {{bibref|ICSA-Baseline}}, these are enabled.
+              </description>
+            </enumeration>
+            <enumeration value="Off" status="deprecated">
+              <description>
+                All Inbound and Outbound traffic is allowed, and the CPE is only protected by NAT settings (if supported and enabled).  If DoS and vulnerability protections are implemented {{bibref|ICSA-Baseline}}, these are disabled.
+                This value is DEPRECATED because it is the same as setting {{param|Enable}} to {{false}}.
+              </description>
+            </enumeration>
+            <enumeration value="Advanced" optional="true">
+              <description>
+                Advanced firewall configuration applies, as specified by {{param|AdvancedLevel}}.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdvancedLevel" access="readWrite" dmr:version="2.2">
+        <description>
+          Selects the currently active Firewall Level.
+          {{param}} only applies when {{param|Config}} is {{enum|Advanced|Config}}.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".Firewall.Level." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.2">
+        <description>
+          Firewall Type. {{enum}}
+          A {{enum|Stateless}} Firewall treats each packet individually and thus has no concept of sessions.  Therefore a {{enum|Stateless}} Firewall cannot distinguish between unsolicited downstream traffic and downstream traffic in response to outbound messages.  This means that it has to accept all incoming downstream traffic.  Furthermore, because a {{enum|Stateless}} Firewall treats each packet individually, it does not provide any DoS or vulnerability protections.
+          A {{enum|Stateful}} Firewall maintains state about previous packets and thus supports sessions.  Therefore a {{enum|Stateful}} Firewall can distinguish between solicited and unsolicited downstream traffic.  In a {{enum|Stateful}} Firewall, explicitly configured rules only apply to unsolicited traffic, and can not cause packets received in response to an upstream request to be dropped.  Furthermore, because a {{enum|Stateful}} Firewall maintains state, it can provide DoS and vulnerability protections.
+          A device that has a {{enum|Stateless}} Firewall depends on the NAT to provide protection against unsolicited downstream IPv4 traffic.  This is because, as noted above, a {{enum|Stateless}} Firewall has to be configured to accept all incoming downstream traffic.  For IPv6 there is no NAT, so a {{enum|Stateless}} Firewall can not provide simple security protections against unsolicited downstream IPv6 traffic.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Stateless">
+              <description>
+                The Firewall only implements stateless packet inspection.
+              </description>
+            </enumeration>
+            <enumeration value="Stateful">
+              <description>
+                The Firewall implements stateful packet inspection.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.0">
+        <description>
+          A string identifying the firewall settings version currently used in the CPE, or {{empty}} if the firewall settings are not associated with a version.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="16"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" dmr:version="2.0">
+        <description>
+          The time at which the firewall settings most recently changed.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LevelNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ChainNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Firewall.Level.{i}." access="readWrite" numEntriesParameter="LevelNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        Firewall Level table. When an {{enum|Advanced|#.Config}} configuration is selected, {{param|#.AdvancedLevel}} selects the currently active entry in this table. Each {{object}} table entry references the {{object|#.Chain}} that contains the rules for this level.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.2">
+        <description>
+          Human-readable name associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readWrite" dmr:version="2.2">
+        <description>
+          Human-readable description associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.2">
+        <description>
+          Position of the {{object}} entry for user interface display; levels can be presented according to an increasing or decreasing level of security.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all greater-valued {{param}} entries is incremented to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Chain" access="readOnly" dmr:version="2.2">
+        <description>
+          The Chain containing Firewall Level Rules associated with this {{object}} entry.
+          On creation of a new {{object}} entry, the device will automatically create a new {{object|#.Chain}} table entry that this {{param}} parameter will reference.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".Firewall.Chain." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PortMappingEnabled" access="readWrite" dmr:version="2.2">
+        <description>
+          Indicates whether NAT port mapping is enabled or disabled when this is the active Level.  For a {{enum|Stateless|#.Type}} Firewall this can be set to {{false}} to force any port mappings to be operationally disabled (for a {{enum|Stateful|#.Type}} Firewall this is not necessary because the same effect can be achieved via Firewall rules).
+          This parameter affects all the interfaces on which NAT is enabled.  It operationally enables or disables port mapping functionality and therefore does not affect the individual {{param|##.NAT.PortMapping.{i}.Enable}} settings.  Note that the current NAT status and NAT port mapping status are indicated by the {{param|##.NAT.InterfaceSetting.{i}.Status}} parameter.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultPolicy" access="readWrite" dmr:version="2.2">
+        <description>
+          Default action for packets not matching any of the level rules. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Drop">
+              <description>
+                The firewall discards packets matching this rule.
+              </description>
+            </enumeration>
+            <enumeration value="Accept">
+              <description>
+                The firewall forwards packets matching this rule.
+              </description>
+            </enumeration>
+            <enumeration value="Reject" optional="true">
+              <description>
+                The firewall discards packets matching this rule, and sends an ICMP message to the originating host.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Drop"/>
+        </syntax>
+      </parameter>
+      <parameter name="DefaultLogPolicy" access="readWrite" dmr:version="2.2">
+        <description>
+          Enable or disable logging, in a {{object|##.DeviceInfo.VendorLogFile}}, of packets not matching any of the level rules.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Firewall.Chain.{i}." access="readWrite" numEntriesParameter="ChainNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        Firewall Chain table. Each entry contains an ordered list of {{object|Rule}} objects which can themselves reference other {{object}} instances. A hierarchy of rules can therefore be created.
+        A given Firewall Chain's rules are all created by the same entity, as indicated by the {{param|Creator}} parameter.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.2">
+        <description>
+          Human-readable name associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Creator" access="readOnly" dmr:version="2.2">
+        <description>
+          Creator of this {{object}} entry and of its {{object|Rule}}s. {{enum}}
+          Note that this is the entity that originally created the {{object}} entry.  The value of this parameter does not change if the {{object}} entry or one of its rules is subsequently changed by another entity.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Defaults">
+              <description>
+                The {{object}} entry is present in the factory default configuration.
+              </description>
+            </enumeration>
+            <enumeration value="PortMapping">
+              <description>
+                The {{object}} entry was created as a side-effect of a {{bibref|UPnP-IGD:1}} or {{bibref|TR-064}} port mapping.
+              </description>
+            </enumeration>
+            <enumeration value="WANIPv6FirewallControl">
+              <description>
+                The {{object}} entry was created by {{bibref|UPnP-IGD:2}} WANIPv6FirewallControl.
+              </description>
+            </enumeration>
+            <enumeration value="ACS">
+              <description>
+                The {{object}} entry was created by the Auto Configuration Server.
+              </description>
+            </enumeration>
+            <enumeration value="UserInterface">
+              <description>
+                The {{object}} entry was created by device user interface or command line interface.
+              </description>
+            </enumeration>
+            <enumeration value="Other">
+              <description>
+                The {{object}} entry was created by another entity.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="ACS"/>
+        </syntax>
+      </parameter>
+      <parameter name="RuleNumberOfEntries" access="readOnly" dmr:version="2.2">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Firewall.Chain.{i}.Rule.{i}." access="readWrite" numEntriesParameter="RuleNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.2">
+      <description>
+        Firewall Rule table. Each entry defines a Firewall packet selection rule. The {{param|Target}} parameter defines the action to perform for traffic matching this rule: the packet can be dropped, accepted, rejected or passed to another {{object|#}}.
+        This table MUST NOT contain dynamic Firewall rules associated with {{enum|Stateful|##.Type}} Firewall sessions.
+        All entries are created by the creator of the parent {{object|#}}, as indicated by its {{param|#.Creator}} parameter.  {{object}} entries in a {{object|#}} with a {{param|#.Creator}} of {{enum|Defaults|#.Creator}}, {{enum|ACS|#.Creator}}, {{enum|UserInterface|#.Creator}} or (maybe) {{enum|Other|#.Creator}} are referred to as ''Static'' {{object}}s.  Whether or not a {{object}} in a {{object|#}} with {{param|#.Creator}} {{enum|Other|#.Creator}} is regarded as ''Static'' is a local matter to the CPE.  Some of this object's parameter descriptions refer to whether a {{object}} is ''Static'' when specifying whether or not the parameter value can be modified.
+        For enabled table entries, if {{param|SourceInterface}} is not a valid reference and {{param|SourceAllInterfaces}} is {{false}}, or if {{param|DestInterface}} is not a valid reference and {{param|DestAllInterfaces}} is {{false}}, then the table entry is inoperable and the CPE MUST set {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.2">
+        <description>
+          Enables or disables this {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.2">
+        <description>
+          The status of this {{object}} entry.  {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.2">
+        <description>
+          Position of the {{object}} entry in the order of precedence. A value of ''1'' indicates the first entry considered (highest precedence). For each packet, the highest ordered entry that matches the rule criteria is applied. All lower order entries are ignored.
+          When this value is modified, if the value matches that of an existing entry, the {{param}} value for the existing entry and all lower {{param}} entries is incremented (lowered in precedence) to ensure uniqueness of this value. A deletion causes {{param}} values to be compacted. When a value is changed, incrementing occurs before compaction.
+          The value of {{param}} on creation of a {{object}} table entry MUST be one greater than the largest current value (initially assigned the lowest precedence).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.2">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readWrite" dmr:version="2.2">
+        <description>
+          Human-readable description associated with this {{object}} entry.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Target" access="readWrite" dmr:version="2.2">
+        <description>
+          Action to perform for traffic matching this {{object}} entry. {{enum}}
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Drop">
+              <description>
+                The firewall discards packets matching this rule.
+              </description>
+            </enumeration>
+            <enumeration value="Accept">
+              <description>
+                The firewall forwards packets matching this rule.
+              </description>
+            </enumeration>
+            <enumeration value="Reject" optional="true">
+              <description>
+                The firewall discards packets matching this rule, and sends an ICMP message to the originating host.
+              </description>
+            </enumeration>
+            <enumeration value="Return" optional="true">
+              <description>
+                The firewall doesn't consider the remaining rules (if any) in the current chain.
+              </description>
+            </enumeration>
+            <enumeration value="TargetChain" optional="true">
+              <description>
+                The rules in the chain referenced by the {{param|TargetChain}} parameter are matched.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Drop"/>
+        </syntax>
+      </parameter>
+      <parameter name="TargetChain" access="readWrite" dmr:version="2.2">
+        <description>
+          Specifies the chain to process when {{param|Target}} equals {{enum|TargetChain|Target}}.  If there are no matching rules in the referenced chain, processing continues with the next rule in this chain (if any).  In other words, {{enum|TargetChain|Target}} behaves like a subroutine call.
+          {{empty}} indicates no {{param}} is specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".Firewall.Chain." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Log" access="readWrite" dmr:version="2.2">
+        <description>
+          Enable or disable logging, in a {{object|###.DeviceInfo.VendorLogFile}}, of packets matching this {{object}}.
+          If the {{object}} is not ''Static'' (as explained in the object description), whether changes to this parameter persist across re-boot is a local matter to the CPE.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="CreationDate" access="readOnly" dmr:version="2.2">
+        <description>
+          Date and time when this {{object}} entry was created.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ExpiryDate" access="readWrite" dmr:version="2.2">
+        <description>
+          The time at which this {{object}} entry will expire, or {{null}} if not known. For an infinite lifetime, the parameter value MUST be 9999-12-31T23:59:59Z.
+          The only value that MUST be supported is 9999-12-31T23:59:59Z (i.e. support for rules that expire is OPTIONAL).
+          When a rule expires, the CPE MUST automatically terminate that rule and MUST automatically delete the corresponding {{object}} table entry.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="9999-12-31T23:59:59Z"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceInterface" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion. {{reference}}
+          This specifies the ingress interface associated with the entry. It MAY be a layer 1, 2 or 3 interface, however, the types of interfaces for which Rules can be instantiated is a local matter to the CPE.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceInterfaceExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the {{param|SourceInterface}} entry, if specified.
+          If {{true}}, the rule matches all packets except those that match the {{param|SourceInterface}} entry, if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceAllInterfaces" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion. This specifies that all ingress interfaces are associated with the entry. If {{true}}, the values of {{param|SourceInterface}} and {{param|SourceInterfaceExclude}} are ignored since all ingress interfaces are indicated.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestInterface" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion. {{reference}}
+          This specifies the egress interface associated with the entry. It MAY be a layer 1, 2 or 3 interface, however, the types of interfaces for which Rules can be instantiated is a local matter to the CPE.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestInterfaceExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the {{param|DestInterface}} entry, if specified.
+          If {{true}}, the rule matches all packets except those that match the {{param|DestInterface}} entry, if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestAllInterfaces" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion. This specifies that all egress interfaces are associated with the entry. If {{true}}, the values of {{param|DestInterface}} and {{param|DestInterfaceExclude}} are ignored since all ingress interfaces are indicated.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPVersion" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          IP Protocol Version (e.g. 4 for IPv4 and 6 for IPv6). A value of -1 indicates this criterion is not used for matching.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="15"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIP" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          Destination IP address. {{empty}} indicates this criterion is not used for matching.
+          Note that Firewall rules are applied after any {{object|###.NAT}} processing, so if NAT is enabled on the source interface this is always the translated address.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestMask" access="readWrite" dmr:version="2.2">
+        <description>
+          Destination IP address mask, represented as an IP routing prefix using CIDR notation [RFC4632]. The IP address part MUST be {{empty}} (and, if specified, MUST be ignored).
+        </description>
+        <syntax>
+          <dataType ref="IPPrefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestIPExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the (masked) {{param|DestIP}} entry, if specified.
+          If {{true}}, the rule matches all packets except those that match the (masked) {{param|DestIP}} entry, if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIP" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          Source IP address. {{empty}} indicates this criterion is not used for matching.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceMask" access="readWrite" dmr:version="2.2">
+        <description>
+          Source IP address mask, represented as an IP routing prefix using CIDR notation [RFC4632]. The IP address part MUST be {{empty}} (and, if specified, MUST be ignored).
+        </description>
+        <syntax>
+          <dataType ref="IPPrefix"/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SourceIPExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the (masked) {{param|SourceIP}} entry, if specified.
+          If {{true}}, the rule matches all packets except those that match the (masked) {{param|SourceIP}} entry, if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          Protocol number. A value of -1 indicates this criterion is not used for matching.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="255"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the {{param|Protocol}} entry, if specified.
+          If {{true}}, the rule matches all packets except those that match the {{param|Protocol}} entry, if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPort" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          Destination port number. A value of -1 indicates this criterion is not used for matching.
+          Note that Firewall rules are applied after any {{object|###.NAT}} processing, so if NAT is enabled on the source interface this is always the translated port number.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortRangeMax" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          If specified, indicates the {{object}} criterion is to include the port range from {{param|DestPort}} through {{param}} (inclusive). If specified, {{param}} MUST be greater than or equal to {{param|DestPort}}.
+          A value of -1 indicates that no port range is specified.
+          Note that Firewall rules are applied after any {{object|###.NAT}} processing, so if NAT is enabled on the source interface this is always the translated port number.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DestPortExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the {{param|DestPort}} entry (or port range), if specified.
+          If {{true}}, the rule matches all packets except those that match the {{param|DestPort}} entry (or port range), if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePort" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          Source port number. A value of -1 indicates this criterion is not used for matching.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortRangeMax" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          If specified, indicates the {{object}} criterion is to include the port range from {{param|SourcePort}} through {{param}} (inclusive). If specified, {{param}} MUST be greater than or equal to {{param|SourcePort}}.
+          A value of -1 indicates that no port range is specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="SourcePortExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the {{param|SourcePort}} entry (or port range), if specified.
+          If {{true}}, the rule matches all packets except those that match the {{param|SourcePort}} entry (or port range), if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCP" access="readWrite" dmr:version="2.2">
+        <description>
+          {{object}} criterion.
+          DiffServ codepoint (defined in {{bibref|RFC2474}}).
+          If set to a Class Selector Codepoint (defined in {{bibref|RFC2474}}), all DSCP values that match the first 3 bits will be considered a valid match.
+          A value of -1 indicates this criterion is not used for matching.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="63"/>
+          </int>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="DSCPExclude" access="readWrite" dmr:version="2.2">
+        <description>
+          If {{false}}, the rule matches only those packets that match the {{param|DSCP}} entry, if specified.
+          If {{true}}, the rule matchess all packets except those that match the {{param|DSCP}} entry, if specified.
+          This parameter can only be modified if the {{object}} is ''Static'' (as explained in the object description).
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PeriodicStatistics." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.0">
+      <description>
+        This object configures collection of periodic statistics for the device.
+        Periodic statistics are measured over a sample interval (which can be aligned with absolute time) and are made available to the ACS as a comma-separated list of the most recent &lt;n&gt; samples.
+        This object provides a single set of global settings that affect the entire device unless overridden locally.
+      </description>
+      <parameter name="MinSampleInterval" access="readOnly" dmr:version="2.0">
+        <description>
+          Minimum sample interval in {{units}} that the CPE is able to support.
+          A value of 0 indicates no specific minimum sample interval.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxReportSamples" access="readOnly" dmr:version="2.0">
+        <description>
+          Maximum number of samples of each statistic that the CPE is able to store and report.
+          A value of 0 indicates no specific maximum number of samples.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SampleSetNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.PeriodicStatistics.SampleSet.{i}." access="readWrite" numEntriesParameter="SampleSetNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Periodic statistics sample set table.  Each sample set has its own sample interval etc.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables collection of periodic statistics for this sample set.
+          When collection of periodic statistics is enabled, any stored samples are discarded, and the first sample interval begins immediately.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.0">
+        <description>
+          Indicates availability of Sample statistics. {{enum}}
+          The {{enum|Trigger}} value is only used for triggering the ACS 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.
+        </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 ACS SHOULD now fetch the collected data.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Disabled"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.0">
+        <description>
+          The name of this sample set, which uniquely distinguishes each sample set.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SampleInterval" access="readWrite" dmr:version="2.0">
+        <description>
+          The sample interval in {{units}}. Each statistic is measured over this sample interval.
+          The CPE MAY reject a request to set {{param}} to less than {{param|.PeriodicStatistics.MinSampleInterval}}.
+          Sample intervals MUST begin every {{param}} {{units}}, with no delay between samples.
+          If {{param}} is changed while collection of periodic statistics is enabled, any stored samples are discarded, and the first sample interval begins immediately.
+          For example, if {{param|ReportSamples}} is 24 and {{param}} is 3600 (an hour), the CPE can store up to a day's worth of samples for each statistic.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="3600"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReportSamples" access="readWrite" dmr:version="2.0">
+        <description>
+          The number of samples that the CPE will store and report for each statistic.
+          The CPE MUST permit {{param}} to be set to at least {{param|.PeriodicStatistics.MaxReportSamples}}.
+          If {{param}} is changed while collection of periodic statistics is enabled, the CPE will truncate or extend its statistics buffers as appropriate, but statistics collection MUST NOT otherwise be affected.
+          For example, if {{param}} is 24 and {{param|SampleInterval}} is 3600 (an hour), the CPE can store up to a day's worth of samples for each statistic.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+          <default type="object" value="24"/>
+        </syntax>
+      </parameter>
+      <parameter name="TimeReference" access="readWrite" dmr:version="2.0">
+        <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 {{param|Status}} {{enum|Enabled|Status}} to {{enum|Trigger|Status}} to {{enum|Enabled|Status}} transitions that are 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 {{param|Status}} transition 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-106a2}} 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 {{param|Status}} {{enum|Enabled|Status}} to {{enum|Trigger|Status}} to {{enum|Enabled|Status}} transitions 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" dmr:version="2.0">
+        <description>
+          The number of sample intervals to be collected before transitioning {{param|Status}} from {{enum|Enabled|Status}} to {{enum|Trigger|Status}} to {{enum|Enabled|Status}}.
+          If this SampleSet is enabled and {{param}} is in the range [1:{{param|ReportSamples}}] then {{param|Status}} MUST transition from {{enum|Enabled|Status}} to {{enum|Trigger|Status}} to {{enum|Enabled|Status}} on completion of every {{param}} sample intervals.  Otherwise, the transition MUST NOT occur.
+          For example, if {{param|ReportSamples}} is 25 and {{param}} is 24, then the CPE will store 25 values for each monitored parameter and the above {{param|Status}} transition will occur as the CPE stores each 24th of 25 sample intervals, which means that the ACS could delay for up to two sample intervals before reading the stored values and would still not miss any samples (see also {{param|ForceSample}}).
+          To disable this trigger mechanism and still collect sampled statistics, {{param}} can be set to either 0 or a value greater than {{param|ReportSamples}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReportStartTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The absolute time at which the sample interval for the first stored sample (for each statistic) started.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ReportEndTime" access="readOnly" dmr:version="2.0">
+        <description>
+          The absolute time at which the sample interval for the last stored sample (for each statistic) ended.
+          If {{param|ForceSample}} has been used to force statistics for the current sample to be calculated and updated in the data model, then {{param}} MUST be updated to reflect the actual time over which stored data was collected.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SampleSeconds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Each entry indicates the number of {{units}} during which data was collected during the sample interval.
+          Individual {{param}} values can be less than {{param|SampleInterval}}, for several reasons, including:
+          : {{param|TimeReference}} has been set to a time other than the Unknown Time and the current sample interval started part of the way through a scheduled sample interval.
+          : {{param|ForceSample}} has been used to force statistics for the current sample to be calculated and updated in the data model.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ParameterNumberOfEntries" access="readOnly" dmr:version="2.0">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <command name="ForceSample()" dmr:version="2.12">
+        <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 {{param}} 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>
+    </object>
+    <object name="Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}." access="readWrite" numEntriesParameter="ParameterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.0">
+      <description>
+        Periodic statistics parameter table for this sample set.  This table contains entries for parameters whose values are to be sampled.
+        Note that the comma-separated lists in this object (SampleSeconds, SuspectData and Values) only ever change (a) when first enabled, (b) when ForceSample is set to true (a "sneak preview" of the current sample), or (c) at the end of the sample interval.
+      </description>
+      <uniqueKey>
+        <parameter ref="Reference"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.3">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.0">
+        <description>
+          Enables or disables this object instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Reference" access="readWrite" dmr:version="2.0">
+        <description>
+          {{reference}} This is the parameter being monitored by the Periodic Statistics mechanism.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetType="parameter"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SampleMode" access="readWrite" dmr:version="2.0">
+        <description>
+          Controls how this parameter's value is sampled. {{enum}}
+          Parameters of non-numeric types can only support {{enum|Current}}.  The value of the {{param}} MUST be ignored for such parameters.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Current">
+              <description>
+                Sampled value is current value
+              </description>
+            </enumeration>
+            <enumeration value="Change">
+              <description>
+                Sampled value is change in value since start of sample interval
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Current"/>
+        </syntax>
+      </parameter>
+      <parameter name="CalculationMode" access="readWrite" dmr:version="2.0">
+        <description>
+          Controls how this parameter's statistic is calculated from the sampled value(s). {{enum}}
+          Parameters of non-numeric types can only support {{enum|Latest}}.  The value of the {{param}} MUST be ignored for such parameters.
+          {{param|SampleMode}} MUST be applied before {{param}}, i.e. the inputs to the calculation will have already accounted for {{param|SampleMode}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Latest">
+              <description>
+                Statistic is sampled value at end of sample interval
+              </description>
+            </enumeration>
+            <enumeration value="Minimum">
+              <description>
+                Statistic is minimum sampled value during sample interval
+              </description>
+            </enumeration>
+            <enumeration value="Maximum">
+              <description>
+                Statistic is maximum sampled value during sample interval
+              </description>
+            </enumeration>
+            <enumeration value="Average">
+              <description>
+                Statistic is average (mean) sampled value during sample interval
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Latest"/>
+        </syntax>
+      </parameter>
+      <parameter name="LowThreshold" access="readWrite" dmr:version="2.0">
+        <description>
+          The low threshold value that controls the calculation of {{param|Failures}}.
+          A value equal to {{param|HighThreshold}} disables the threshold/failure mechanism.
+          Parameters of non-numeric types cannot support the threshold/failure mechanism. The value of this parameter MUST be ignored for such parameters.
+        </description>
+        <syntax>
+          <int/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="HighThreshold" access="readWrite" dmr:version="2.0">
+        <description>
+          The high threshold value that controls the calculation of {{param|Failures}}.
+          A value equal to {{param|LowThreshold}} disables the threshold/failure mechanism.
+          Parameters of non-numeric types cannot support the threshold/failure mechanism. The value of this parameter MUST be ignored for such parameters.
+        </description>
+        <syntax>
+          <int/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="SampleSeconds" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <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|.PeriodicStatistics.SampleSet.{i}.SampleInterval}}, for several reasons, including:
+          : Any of the reasons for which {{param|.PeriodicStatistics.SampleSet.{i}.SampleSeconds}} values might be less than {{param|.PeriodicStatistics.SampleSet.{i}.SampleInterval}}.
+          : The parameter doesn't exist, or was created or deleted during a sample interval.
+        </description>
+        <syntax>
+          <list/>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SuspectData" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <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>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Values" access="readOnly" activeNotify="canDeny" dmr:version="2.0">
+        <description>
+          {{list}} Each entry indicates the value of the referenced parameter, as determined by {{param|SampleMode}}, during the sample interval.
+          The statistics values in this comma-separated lists MUST be in time order, with the oldest one first and the most recent one last.
+          If the {{param|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/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Failures" access="readOnly" dmr:version="2.0">
+        <description>
+          Counts the number of times (since this object instance was last enabled) that a newly-calculated sample value (accounting for {{param|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|LowThreshold}} and less than {{param|HighThreshold}}.
+          * "out of range" : current value is less than or equal to {{param|LowThreshold}}, or greater than or equal to {{param|HighThreshold}}.
+          * "out of range (low)" : current value is less than or equal to {{param|LowThreshold}}.
+          * "out of range (high)" : current value is greater than or equal to {{param|HighThreshold}}.
+          Note that, if {{param|LowThreshold}} and {{param|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 ACS of such changes, as described in {{bibref|TR-069a2|Section 3.2.1}}.
+          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/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FaultMgmt." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters relating to Fault/Alarm Management.
+      </description>
+      <parameter name="SupportedAlarmNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxCurrentAlarmEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          The maximum number of entries allowed in the {{object|.FaultMgmt.CurrentAlarm.{i}.}} table.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentAlarmNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="HistoryEventNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ExpeditedEventNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QueuedEventNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FaultMgmt.SupportedAlarm.{i}." access="readOnly" numEntriesParameter="SupportedAlarmNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        Supported Alarm Entries which can be raised by the device.
+        The instance numbers for this table SHOULD be maintained across firmware upgrades of the device.
+      </description>
+      <uniqueKey>
+        <parameter ref="EventType"/>
+        <parameter ref="ProbableCause"/>
+        <parameter ref="SpecificProblem"/>
+        <parameter ref="PerceivedSeverity"/>
+      </uniqueKey>
+      <parameter name="EventType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the type of event.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProbableCause" access="readOnly" dmr:version="2.4">
+        <description>
+          Qualifies the alarm and provides further information than {{param|EventType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SpecificProblem" access="readOnly" dmr:version="2.4">
+        <description>
+          Provides further qualification on the alarm beyond {{param|EventType}} and {{param|ProbableCause}}.
+          This is vendor defined and will be {{empty}} if the device doesn't support unique indexing of the table using {{param}}.
+          The string can be set to "*" to indicate the default case if only a subset of {{param}} are to be contained within the table.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PerceivedSeverity" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the relative level of urgency for operator attention, see {{bibref|ITU-X.733}}. {{enum}}
+          This will be {{empty}} if the device doesn't support unique indexing of the table using {{param}}.
+          The string can be set to "*" to indicate the default case if only a subset of {{param}} are to be contained within the table.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="">
+              <description>
+                {{empty}}
+              </description>
+            </enumeration>
+            <enumeration value="*"/>
+            <enumeration value="Cleared"/>
+            <enumeration value="Critical"/>
+            <enumeration value="Major"/>
+            <enumeration value="Minor"/>
+            <enumeration value="Warning"/>
+            <enumeration value="Indeterminate"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ReportingMechanism" access="readWrite" dmr:version="2.4">
+        <description>
+          Indicates the reporting mechanism setting of the alarm. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="0 Expedited">
+              <description>
+                The device inserts the alarm into the {{object|.FaultMgmt.ExpeditedEvent.{i}.}} table and the {{object|.FaultMgmt.ExpeditedEvent.{i}.}} table.
+              </description>
+            </enumeration>
+            <enumeration value="1 Queued">
+              <description>
+                The device inserts the alarm into the {{object|.FaultMgmt.QueuedEvent.{i}.}} table and the {{object|.FaultMgmt.QueuedEvent.{i}.}} table.
+              </description>
+            </enumeration>
+            <enumeration value="2 Logged">
+              <description>
+                The device inserts the alarm into the {{object|.FaultMgmt.HistoryEvent.{i}.}} table.
+              </description>
+            </enumeration>
+            <enumeration value="3 Disabled">
+              <description>
+                The device ignores the alarm.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FaultMgmt.CurrentAlarm.{i}." access="readOnly" numEntriesParameter="CurrentAlarmNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        Contains all currently active alarms (whose {{param|.FaultMgmt.SupportedAlarm.{i}.PerceivedSeverity}} is not {{enum|Cleared|.FaultMgmt.SupportedAlarm.{i}.PerceivedSeverity}}).
+        Newly raised alarms result in a new entry in this table being added, any changes to the alarm as a result of an update event are updated in the existing table entry, and a clear event raised against an alarm results in the alarm being removed from this table.
+        If maximum entries as indicated by {{param|.FaultMgmt.MaxCurrentAlarmEntries}} is reached, the next event overrides the object with the oldest {{param|AlarmChangedTime}}.
+        When a new alarm replaces an existing alarm, then all parameter values for that instance are considered as changed for the purposes of value change notifications to the ACS (even if their new values are identical to those of the prior alarm).
+      </description>
+      <uniqueKey>
+        <parameter ref="AlarmIdentifier"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="EventType"/>
+        <parameter ref="ProbableCause"/>
+        <parameter ref="SpecificProblem"/>
+      </uniqueKey>
+      <parameter name="AlarmIdentifier" access="readOnly" dmr:version="2.4">
+        <description>
+          Identifies one Alarm Entry in the Alarm List.  This value MUST be uniquely allocated by the device to the alarm instance during the lifetime of the individual alarm.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AlarmRaisedTime" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the date and time when the alarm was first raised by the device.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="AlarmChangedTime" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the date and time when the alarm was last changed by the device.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ManagedObjectInstance" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the instance of the Informational Object Class in which the alarm occurred by carrying the Distinguished Name (DN) of this object instance. The format of the DN is specific to the application that is using this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="512"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EventType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the type of event.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProbableCause" access="readOnly" dmr:version="2.4">
+        <description>
+          Qualifies the alarm and provides further information than {{param|EventType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SpecificProblem" access="readOnly" dmr:version="2.4">
+        <description>
+          Provides further qualification on the alarm beyond {{param|EventType}} and {{param|ProbableCause}}.
+          This is vendor defined and will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PerceivedSeverity" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the relative level of urgency for operator attention, see {{bibref|ITU-X.733}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Critical"/>
+            <enumeration value="Major"/>
+            <enumeration value="Minor"/>
+            <enumeration value="Warning"/>
+            <enumeration value="Indeterminate"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalText" access="readOnly" dmr:version="2.4">
+        <description>
+          This provides a textual string which is vendor defined.
+          This will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalInformation" access="readOnly" dmr:version="2.4">
+        <description>
+          This contains additional information about the alarm and is vendor defined.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FaultMgmt.HistoryEvent.{i}." access="readOnly" numEntriesParameter="HistoryEventNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        Alarm events added or updated in {{object|.FaultMgmt.CurrentAlarm.{i}.}} are simultaneously entered into the this table. This table also contains alarm clearing events.
+        Active alarms at the time of a power failure or reboot might not get an alarm clearing event.
+        This object has a fixed number of entries with instance numbers from 1 to {{param|.FaultMgmt.HistoryEventNumberOfEntries}}.
+        If maximum instance number {{param|.FaultMgmt.HistoryEventNumberOfEntries}} is reached, the next event overrides the object with instance number 1.  Subsequent entries override objects at sequentially increasing instance numbers.  This logic provides for automatic "rolling" of records.
+      </description>
+      <uniqueKey>
+        <parameter ref="EventTime"/>
+        <parameter ref="AlarmIdentifier"/>
+      </uniqueKey>
+      <parameter name="EventTime" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the date and time when the alarm event occurs.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="AlarmIdentifier" access="readOnly" dmr:version="2.4">
+        <description>
+          Identifies one Alarm Entry in the Alarm List.  This value MUST be uniquely allocated by the device to the alarm instance during the lifetime of the individual alarm.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NotificationType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the reason for the specific alarm notification event. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NewAlarm"/>
+            <enumeration value="ChangedAlarm"/>
+            <enumeration value="ClearedAlarm"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManagedObjectInstance" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the instance of the Informational Object Class in which the alarm occurred by carrying the Distinguished Name (DN) of this object instance. The format of the DN is specific to the application that is using this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="512"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EventType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the type of event.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProbableCause" access="readOnly" dmr:version="2.4">
+        <description>
+          Qualifies the alarm and provides further information than {{param|EventType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SpecificProblem" access="readOnly" dmr:version="2.4">
+        <description>
+          Provides further qualification on the alarm beyond {{param|EventType}} and {{param|ProbableCause}}.
+          This is vendor defined and will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PerceivedSeverity" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the relative level of urgency for operator attention, see {{bibref|ITU-X.733}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Cleared"/>
+            <enumeration value="Critical"/>
+            <enumeration value="Major"/>
+            <enumeration value="Minor"/>
+            <enumeration value="Warning"/>
+            <enumeration value="Indeterminate"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalText" access="readOnly" dmr:version="2.4">
+        <description>
+          This provides a textual string which is vendor defined.
+          This will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalInformation" access="readOnly" dmr:version="2.4">
+        <description>
+          This contains additional information about the alarm and is vendor defined.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FaultMgmt.ExpeditedEvent.{i}." access="readOnly" numEntriesParameter="ExpeditedEventNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        Alarm events added or updated in {{object|.FaultMgmt.CurrentAlarm.{i}.}} are simultaneously entered into the this table if their corresponding entry in {{object|.FaultMgmt.SupportedAlarm.{i}.}} has {{param|.FaultMgmt.SupportedAlarm.{i}.ReportingMechanism}} set to {{enum|0 Expedited|.FaultMgmt.SupportedAlarm.{i}.ReportingMechanism}}. This table also contains alarm clearing events.
+        This object has a fixed number of entries with instance numbers from 1 to {{param|.FaultMgmt.ExpeditedEventNumberOfEntries}}.
+        Initially the table starts with all instances having {{param|EventTime}} set to the Unknown Time value, as defined in {{bibref|TR-106a4}}.
+        If maximum instance number {{param|.FaultMgmt.ExpeditedEventNumberOfEntries}} is reached, the next event overrides the object with instance number 1.  Subsequent entries override objects at sequentially increasing instance numbers.  This logic provides for automatic "rolling" of records.
+        When a new alarm replaces an existing alarm, then all parameter values for that instance are considered as changed for the purposes of value change notifications to the ACS (even if their new values are identical to those of the prior alarm).
+      </description>
+      <uniqueKey>
+        <parameter ref="AlarmIdentifier"/>
+      </uniqueKey>
+      <parameter name="EventTime" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the date and time when the alarm event occurs.
+          For an unpopulated entry, the value is the Unknown Time as defined in {{bibref|TR-106a4}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="AlarmIdentifier" access="readOnly" dmr:version="2.4">
+        <description>
+          Identifies one Alarm Entry in the Alarm List.  This value MUST be uniquely allocated by the device to the alarm instance during the lifetime of the individual alarm.
+          For an unpopulated entry, the value is {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NotificationType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the reason for the specific alarm notification event. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NewAlarm"/>
+            <enumeration value="ChangedAlarm"/>
+            <enumeration value="ClearedAlarm"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManagedObjectInstance" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the instance of the Informational Object Class in which the alarm occurred by carrying the Distinguished Name (DN) of this object instance. The format of the DN is specific to the application that is using this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="512"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EventType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the type of event.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProbableCause" access="readOnly" dmr:version="2.4">
+        <description>
+          Qualifies the alarm and provides further information than {{param|EventType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SpecificProblem" access="readOnly" dmr:version="2.4">
+        <description>
+          Provides further qualification on the alarm beyond {{param|EventType}} and {{param|ProbableCause}}.
+          This is vendor defined and will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PerceivedSeverity" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the relative level of urgency for operator attention, see {{bibref|ITU-X.733}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Cleared"/>
+            <enumeration value="Critical"/>
+            <enumeration value="Major"/>
+            <enumeration value="Minor"/>
+            <enumeration value="Warning"/>
+            <enumeration value="Indeterminate"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalText" access="readOnly" dmr:version="2.4">
+        <description>
+          This provides a textual string which is vendor defined.
+          This will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalInformation" access="readOnly" dmr:version="2.4">
+        <description>
+          This contains additional information about the alarm and is vendor defined.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FaultMgmt.QueuedEvent.{i}." access="readOnly" numEntriesParameter="QueuedEventNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        Alarm events added or updated in {{object|.FaultMgmt.CurrentAlarm.{i}.}} are simultaneously entered into the this table if their corresponding entry in {{object|.FaultMgmt.SupportedAlarm.{i}.}} has {{param|.FaultMgmt.SupportedAlarm.{i}.ReportingMechanism}} set to {{enum|1 Queued|.FaultMgmt.SupportedAlarm.{i}.ReportingMechanism}}. This table also contains alarm clearing events.
+        This object has a fixed number of entries with instance numbers from 1 to {{param|.FaultMgmt.QueuedEventNumberOfEntries}}.
+        Initially the table starts with all instances having {{param|EventTime}} set to the Unknown Time value, as defined in {{bibref|TR-106a4}}.
+        If maximum instance number {{param|.FaultMgmt.QueuedEventNumberOfEntries}} is reached, the next event overrides the object with instance number 1.  Subsequent entries override objects at sequentially increasing instance numbers.  This logic provides for automatic "rolling" of records.
+        When a new alarm replaces an existing alarm, then all parameter values for that instance are considered as changed for the purposes of value change notifications to the ACS (even if their new values are identical to those of the prior alarm).
+      </description>
+      <uniqueKey>
+        <parameter ref="AlarmIdentifier"/>
+      </uniqueKey>
+      <parameter name="EventTime" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the date and time when the alarm event occurs.
+          For an unpopulated entry, the value is the Unknown Time as defined in {{bibref|TR-106a4}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="AlarmIdentifier" access="readOnly" dmr:version="2.4">
+        <description>
+          Identifies one Alarm Entry in the Alarm List.  This value MUST be uniquely allocated by the device to the alarm instance during the lifetime of the individual alarm.
+          For an unpopulated entry, the value is {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NotificationType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the reason for the specific alarm notification event. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NewAlarm"/>
+            <enumeration value="ChangedAlarm"/>
+            <enumeration value="ClearedAlarm"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManagedObjectInstance" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the instance of the Informational Object Class in which the alarm occurred by carrying the Distinguished Name (DN) of this object instance. The format of the DN is specific to the application that is using this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="512"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EventType" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the type of event.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProbableCause" access="readOnly" dmr:version="2.4">
+        <description>
+          Qualifies the alarm and provides further information than {{param|EventType}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SpecificProblem" access="readOnly" dmr:version="2.4">
+        <description>
+          Provides further qualification on the alarm beyond {{param|EventType}} and {{param|ProbableCause}}.
+          This is vendor defined and will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PerceivedSeverity" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the relative level of urgency for operator attention, see {{bibref|ITU-X.733}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Cleared"/>
+            <enumeration value="Critical"/>
+            <enumeration value="Major"/>
+            <enumeration value="Minor"/>
+            <enumeration value="Warning"/>
+            <enumeration value="Indeterminate"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalText" access="readOnly" dmr:version="2.4">
+        <description>
+          This provides a textual string which is vendor defined.
+          This will be {{empty}} if the device doesn't support inclusion of this information.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AdditionalInformation" access="readOnly" dmr:version="2.4">
+        <description>
+          This contains additional information about the alarm and is vendor defined.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Security." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains general information related to managing security features on the device.
+      </description>
+      <parameter name="CertificateNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Security.Certificate.{i}." access="readOnly" numEntriesParameter="CertificateNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        This table provides information about all types of public key-based credentials, such as X.509 certificates, see {{bibref|RFC5280}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="SerialNumber"/>
+        <parameter ref="Issuer"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables this certificate.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="LastModif" access="readOnly" dmr:version="2.4">
+        <description>
+          The last modification time of this certificate.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="2.4">
+        <description>
+          The Serial Number field in an X.509 certificate, see {{bibref|RFC5280}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Issuer" access="readOnly" dmr:version="2.4">
+        <description>
+          The Issuer field in an X.509 certificate, see {{bibref|RFC5280}}; i.e. the Distinguished Name (DN) of the entity who has signed the certificate.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NotBefore" access="readOnly" dmr:version="2.4">
+        <description>
+          The beginning of the certificate validity period; i.e. the Not Before field in an X.509 certificate, see {{bibref|RFC5280}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="NotAfter" access="readOnly" dmr:version="2.4">
+        <description>
+          The end of the certificate validity period; i.e., the Not After field in an X.509 certificate, see {{bibref|RFC5280}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="Subject" access="readOnly" dmr:version="2.4">
+        <description>
+          The Distinguished Name (DN) of the entity associated with the Public Key; i.e., the Subject field in an X.509 certificate, see {{bibref|RFC5280}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SubjectAlt" access="readOnly" dmr:version="2.4">
+        <description>
+          {{list}} Each item is a DNS Name.
+          The Subject Alternative Names extension field in an X.509 certificate, see {{bibref|RFC5280}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="256"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SignatureAlgorithm" access="readOnly" dmr:version="2.4">
+        <description>
+          The algorithm used in signing the certificate; i.e. the Signature Algorithm field in an X.509 certificate, see {{bibref|RFC5280}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object is the container for all Femto related component objects, to prevent pollution of the so-called global namespace of the BBF with FAP specific objects.
+      </description>
+    </object>
+    <object name="Device.FAP.GPS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains the parameters relating to the GPS scan.
+      </description>
+      <parameter name="ScanOnBoot" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables GPS scans during the device start up.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="ScanPeriodically" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables periodic GPS scans.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="factory" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicInterval" access="readWrite" dmr:version="2.4">
+        <description>
+          When {{param|ScanPeriodically}} is {{true}}, this value indicates the interval in {{units}} which GPS scan is performed.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicTime" access="readWrite" dmr:version="2.4">
+        <description>
+          An absolute time reference in UTC to determine when the CPE will initiate the periodic GPS scan. Each GPS scan MUST occur at (or as soon as possible after) this reference time plus or minus an integer multiple of the {{param|PeriodicInterval}}.
+          {{param}} is used only to set the "phase" of the GPS scan. The actual value of {{param}} can be arbitrarily far into the past or future.
+          For example, if {{param|PeriodicInterval}} is 86400 (a day) and if {{param}} is set to UTC midnight on some day (in the past, present, or future) then periodic GPS scans will occur every day at UTC midnight. These MUST begin on the very next midnight, even if {{param}} refers to a day in the future.
+          The Unknown Time value defined in {{bibref|TR-106a4|Section 3.2}} indicates that no particular time reference is specified. That is, the CPE MAY locally choose the time reference, and needs only to adhere to the specified PeriodicInformInterval.
+          If absolute time is not available to the CPE, its periodic GPS scan behavior MUST be the same as if {{param}} parameter was set to the Unknown Time value.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ContinuousGPS" access="readWrite" dmr:version="2.4">
+        <description>
+          Whether or not the device SHOULD maintain a continuous GPS lock (e.g. as a frequency stability source).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ScanTimeout" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies the time-out value in {{units}} since the scan started after which the scan will time out. A timed out scan is to be reported as {{enum|Error_TIMEOUT|ScanStatus}} with {{param|ErrorDetails}} indicating "Timed out"
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ScanStatus" access="readOnly" dmr:version="2.4">
+        <description>
+          Indicates the current status of this scan.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Indeterminate">
+              <description>
+                The scan has not been executed and there are no valid scan results available
+              </description>
+            </enumeration>
+            <enumeration value="InProgress"/>
+            <enumeration value="Success"/>
+            <enumeration value="Error"/>
+            <enumeration value="Error_TIMEOUT"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ErrorDetails" access="readOnly" dmr:version="2.4">
+        <description>
+          Provides more detail when the {{param|ScanStatus}} is either {{enum|Error|ScanStatus}} or {{enum|Error_TIMEOUT|ScanStatus}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastScanTime" access="readOnly" activeNotify="forceDefaultEnabled" dmr:version="2.4">
+        <description>
+          The date and time when the last GPS scan completed.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LastSuccessfulScanTime" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          Specifies the date and time, when the GPS scan last completed successfully.
+          This value is retained across reboot and is only reset after another scan completes successfully or {{param|GPSReset}} is set to {{true}}.
+          The values for {{param|LockedLatitude}}, {{param|LockedLongitude}} and {{param|NumberOfSatellites}} correspond to this time. If a scan has never succeeded before, the value will be the Unknown Time value, as defined in {{bibref|TR-106a4|Section 3.2}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LockedLatitude" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          This parameter specifies the latitude of the device's position in degrees, multiplied by 1 million. The positive value signifies the direction, north of the equator. The negative value signifies the direction, south of the equator.
+          Range is from: 90d00.00' South (-90,000,000) to 90d00.00' North (90,000,000).
+          Example: A latitude of 13d19.43' N would be represented as 13,323,833, derived as (13*1,000,000)+((19.43*1,000,000)/60). Latitude of 50d00.00' S would be represented as value -50,000,000.
+          This value is retained across reboots and is only reset after another scan completes successfully or {{param|GPSReset}} is set to {{true}}. If a scan has never succeeded before, the value 0 is reported.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-90000000" maxInclusive="90000000"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="LockedLongitude" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          This parameter specifies the longitude of the device's position in degrees, multiplied by 1 million. The positive value signifies the direction, east of the prime meridian. The negative value signifies the direction, west of the prime meridian.
+          Range is from: 180d00.00' West (-180,000,000) to 180d00.00' East (180,000,000).
+          Example: A longitude of 13d19.43' E would be represented as 13,323,833, derived as (13*1,000,000)+((19.43*1,000,000)/60). A longitude of 50d00.00' W would be represented as value -50,000,000.
+          This value is retained across reboots and is only reset after another scan completes successfully or {{param|GPSReset}} is set to {{true}}. If a scan has never succeeded before, the value 0 is reported.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-180000000" maxInclusive="180000000"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfSatellites" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The number of satellites that were locked during the test execution. The greater the number of satellites the better the precision of the results.
+          This value is retained across reboots and is only reset after another scan completes successfully or {{param|GPSReset}} is set to {{true}}. If a scan has never succeeded before, the value 0 is reported.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <command name="GPSReset()" dmr:version="2.12">
+        <description>
+          Reset the GPS Hardware.
+        </description>
+      </command>
+    </object>
+    <object name="Device.FAP.GPS.ContinuousGPSStatus." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        When {{param|#.ContinuousGPS}} is {{true}}, the parameters in this object contain the GPS status as it is continuously monitored.
+        When {{param|#.ContinuousGPS}} is {{false}}, the parameters in this object are not being updated and their values are not accurate.
+      </description>
+      <parameter name="CurrentFix" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The value is {{true}} if the location fix is currently valid (i.e. GPS receiver is currently tracking satellite signals), otherwise it is {{false}}. After a reboot the value is {{false}} until the GPS receivers has a valid current position.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="GotFix" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The value is {{true}} if {{param|CurrentFix}} has transitioned to {{true}} at least once since {{param|#.ContinuousGPS}} was enabled, otherwise it is {{false}}. After a reboot the value is {{false}} until {{param|CurrentFix}} has transitioned to {{true}} again.
+          The GPS coordinates ({{param|Latitude}}, {{param|Longitude}}, and {{param|Elevation}}) are not valid until {{param}} has a value of {{true}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="TimingGood" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The value is {{true}} if the timing synchronization is good, otherwise it is {{false}}. After a reboot the value is {{false}} until the timing is synchronized again.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Latitude" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          This parameter represents the most recent latitude reading for the device's position in degrees, multiplied by 1 million. The positive value signifies the direction, north of the equator. The negative value signifies the direction, south of the equator.
+          Range is from: 90 deg 00.00' South (-90,000,000) to 90 deg 00.00' North (90,000,000).
+          Example: A latitude of 13 deg 19.43' N would be represented as 13,323,833, derived as (13*1,000,000)+((19.43*1,000,000)/60). Latitude of 50 deg 00.00' S would be represented as value -50,000,000.
+          {{param}} is not valid until {{param|GotFix}} is {{true}}.
+          If the parameter has never been set before, the value 0 is reported. The value SHOULD be maintained over a reboot.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-90000000" maxInclusive="90000000"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Longitude" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          This parameter represents the most recent longitude reading for the device's position in degrees, multiplied by 1 million. The positive value signifies the direction, east of the prime meridian. The negative value signifies the direction, west of the prime meridian.
+          Range is from: 180d00.00' West (-180,000,000) to 180d00.00' East (180,000,000).
+          Example: A longitude of 13d19.43' E would be represented as 13,323,833, derived as (13*1,000,000)+((19.43*1,000,000)/60). A longitude of 50d00.00' W would be represented as value -50,000,000.
+          {{param}} is not valid until {{param|GotFix}} is {{true}}.
+          If the parameter has never been set before, the value 0 is reported. The value SHOULD be maintained over a reboot.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-180000000" maxInclusive="180000000"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Elevation" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          This parameter represents the most recent elevation reading for the device's position in {{units}}, relative to the WGS84 ellipsoid. The positive value signifies the direction, above sea level. The negative value signifies the direction, below sea level.
+          Range is from: 5,000.000 meters below sea level (-5,000,000) to 25,000.000 meters above sea level (25,000,000).
+          {{param}} is not valid until {{param|GotFix}} is {{true}}.
+          If the parameter has never been set before, the value 0 is reported. The value SHOULD be maintained over a reboot.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-5000000" maxInclusive="25000000"/>
+            <units value="millimeters"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="LastFixTime" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          Represents the date and time when the last GPS Fix was acquired.
+          The Unknown Time value defined in {{bibref|TR-106a4|Section 3.2}} is used when {{param|GotFix}} is {{false}}. This applies too after a reboot of the device until a valid location is determined and {{param|GotFix}} transsitions to {{true}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LastFixDuration" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          Number of {{units}} of continuous GPS fix time. After a reboot this value is reset to 0.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FirstFixTimeout" access="readWrite" dmr:version="2.4">
+        <description>
+          Number of {{units}} to wait for first GPS fix before declaring a GPS fault.
+          A value of -1 means that there is no timeout and no fault logging.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="SatellitesTracked" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The number of satellites the receiver is tracking.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SatelliteTrackingInterval" access="readWrite" dmr:version="2.4">
+        <description>
+          The interval in {{units}} at which the GPS tracking information gets reported.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="60" maxInclusive="3600"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="ReceiverStatus" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          The output of the GPS receiver's status.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LocationType" access="readOnly" activeNotify="canDeny" dmr:version="2.4">
+        <description>
+          Indicates whether the {{param|Latitude}}, {{param|Longitude}}, and {{param|Elevation}} values are determined via a GPS Fix (where the value of this parameter would be {{enum|Real}}) or via some other means (where the value of this parameter would be {{enum|Reference}}).
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Real"/>
+            <enumeration value="Reference"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LockTimeOutDuration" access="readWrite" dmr:version="2.4">
+        <description>
+          The timer duration, in {{units}}, for which the device waits for GPS to acquire lock.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="120" maxInclusive="86400"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.GPS.AGPSServerConfig." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters for the configuration of the Assisted Global Positioning System (A-GPS) server. See also {{bibref|3GPP-TS.25.171|Section 3.2}}
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables the {{object}} entry.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerURL" access="readWrite" dmr:version="2.4">
+        <description>
+          A-GPS server host name or IP address.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServerPort" access="readWrite" dmr:version="2.4">
+        <description>
+          The port to use when communicating to the A-GPS Server.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.4">
+        <description>
+          Username to be used by the device to authenticate with the A-GPS server. This string is set to {{empty}} if no authentication is used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.4">
+        <description>
+          Password to be used by the device to authenticate with the A-GPS server. This string is set to {{empty}} if no authentication is used.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ReferenceLatitude" access="readWrite" dmr:version="2.4">
+        <description>
+          This parameter specifies the reference latitude for an A-GPS request position in degrees, multiplied by 1 million. The positive value signifies the direction, north of the equator. The negative value signifies the direction, south of the equator.
+          Range is from: 90d00.00' South (-90,000,000) to 90d00.00' North (90,000,000).
+          Example: A latitude of 13d19.43' N would be represented as 13,323,833, derived as (13*1,000,000)+((19.43*1,000,000)/60).  Latitude of 50d00.00' S would be represented as value -50,000,000.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-90000000" maxInclusive="90000000"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ReferenceLongitude" access="readWrite" dmr:version="2.4">
+        <description>
+          This parameter specifies the reference longitude for an A-GPS request position in degrees, multiplied by 1 million. The positive value signifies the direction, east of the prime meridian. The negative value signifies the direction, west of the prime meridian.
+          Range is from: 180d00.00' West (-180,000,000) to 180d00.00' East (180,000,000).
+          Example: A longitude of 13d19.43' E would be represented as 13,323,833, derived as (13*1,000,000)+((19.43*1,000,000)/60). A longitude of 50d00'00'' W would be represented as value -50,000,000.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-180000000" maxInclusive="180000000"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ServerInUse" access="readOnly" dmr:version="2.4">
+        <description>
+          The value is {{true}} if the device has successfully contacted and received A-GPS info from the A-GPS server, otherwise the value is {{false}}.
+          After a reboot the value is {{false}} until the server could be contacted again.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.PerfMgmt." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters relating to Performance Management in a Femto-related environment.
+      </description>
+      <parameter name="ConfigNumberOfEntries" access="readOnly" dmr:version="2.4">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.PerfMgmt.Config.{i}." access="readWrite" numEntriesParameter="ConfigNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.4">
+      <description>
+        This object contains parameters relating to File Management configuration for uploading of Performance Files to a designated File Server. Each table entry can be referenced by zero or more radio-specific objects contained in the FAPService instances. The periodic upload will upload data for all of the radio-specific objects that reference it.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="URL"/>
+        <parameter ref="PeriodicUploadInterval"/>
+        <parameter ref="PeriodicUploadTime"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables or disables this entry.  If this entry is disabled then its periodic uploads are not performed.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.4">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="URL" access="readWrite" dmr:version="2.4">
+        <description>
+          URL specifying the destination file location. HTTP and HTTPS transports MUST be supported. Other transports 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.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.4">
+        <description>
+          Username to be used by the device to authenticate with the file server. This string is set to {{empty}} if no authentication is used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.4">
+        <description>
+          Password to be used by the device to authenticate with the file server. This string is set to {{empty}} if no authentication is used.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicUploadInterval" access="readWrite" dmr:version="2.4">
+        <description>
+          The duration in {{units}} of the interval for which the device MUST create a Performance File and attempt to upload the file to {{param|URL}} if {{param|Enable}} is {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicUploadTime" access="readWrite" dmr:version="2.4">
+        <description>
+          An absolute time reference in UTC to determine when the device will initiate the periodic file upload. Each file upload MUST occur at this reference time plus or minus an integer multiple of the {{param|PeriodicUploadInterval}}.
+          {{param}} is used only to set the "phase" of the periodic uploads. The actual value of {{param}} can be arbitrarily far into the past or future.
+          For example, if {{param|PeriodicUploadInterval}} is 86400 (a day) and if {{param}} is set to UTC midnight on some day (in the past, present, or future) then periodic file uploads will occur every day at UTC midnight. These MUST begin on the very next midnight, even if {{param}} refers to a day in the future.
+          The Unknown Time value as defined in {{bibref|TR-106a4|Section 3.2}} indicates that no particular time reference is specified. That is, the device MAY locally choose the time reference, and is REQUIRED only to adhere to the specified {{param|PeriodicUploadInterval}}.
+          If absolute time is not available to the device, its periodic file upload behavior MUST be the same as if the {{param}} parameter was set to the Unknown Time value.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object defines the data model for the following Femtozone APIs.
+        * Femto Awareness
+        * SMS
+        * MMS
+        * Terminal Location
+        Femto Awareness, SMS, MMS, and Terminal Location APIs are defined in the Release 1 API Specifications of the Service SIG in the Femto Forum (non public document).
+        {{bibref|TR-262|appendix I}} provides the "Theory of Operation" for the usage of this object.
+      </description>
+      <parameter name="Version" access="readOnly" dmr:version="2.4">
+        <description>
+          Version of Femto Application Platform running on this device
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable the Femto ApplicationPlatform
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.4">
+        <description>
+          Current state of the Femto Application Platform.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled">
+              <description>
+                The Femto Application Platform is not available
+              </description>
+            </enumeration>
+            <enumeration value="Enabled">
+              <description>
+                The Femto Application Platform is available
+              </description>
+            </enumeration>
+            <enumeration value="Reset">
+              <description>
+                The FemtoApplicationPlatform is in the process of being reset and will transition to the {{enum|Disabled}} state when the reset operation is completed
+              </description>
+            </enumeration>
+            <enumeration value="Initializing">
+              <description>
+                The FemtoApplicationPlatform is being initialized and will transition to the {{enum|Enabled}} state once the initialization is completed
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxNumberOfApplications" access="readOnly" dmr:version="2.4">
+        <description>
+          Determines how many Femtozone Applications can be supported by the Femto Application Platform simultaneously.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentNumberofApplications" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies how many Femtozone Applications are currently communicating with the Femto Application Platform.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Capabilities." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the capabilities of the Femtozone Application Platform and the Femtozone APIs.
+      </description>
+      <parameter name="PresenceApplicationSupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the Femto Application Platform supports Presence-Based Femtozone Applications
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="FemtoAwarenessAPISupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the Femto Awareness API is supported on this device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SMSAPISupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the SMS API is supported on this device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SubscribeToNotificationsOfSMSSentToApplicationSupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the SubscribeToNotificationsOfSMSSentToApplication functionality is supported by the FAP SMS API.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QuerySMSDeliveryStatusSupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the QuerySMSDeliveryStatus functionality is supported by the FAP SMS API.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MMSAPISupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the MMS API is supported on this device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueryMMSDeliveryStatusSupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the QueryMMSDeliveryStatus functionality is supported by the FAP MMS API.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SubscribeToNotificationsOfMMSSentToApplicationSupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the SubscribeToNotificationsOfMMSSentToApplication functionality is supported by the FAP MMS API.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="TerminalLocationAPISupport" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the Terminal Location API is supported on this device.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="AuthenticationMethodsSupported" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the supported methods that 3rd Party Applications can use to authenticate with the Femto Application Platform at initialization. Comma separated list of strings.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="Basic"/>
+            <enumeration value="Digest"/>
+            <enumeration value="DigitalSignature"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AccessLevelsSupported" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the supported access levels that 3rd Party Applications can request when authenticating with the Femto Application Platform at initialization. This access level is with respect to resources within the Femto Application Platform only (not to be confused with Access Mode parameter in .FAPService.{i}.AccessMgmt).
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="Guest"/>
+            <enumeration value="Standard"/>
+            <enumeration value="Restricted"/>
+            <enumeration value="Administrator"/>
+            <enumeration value="Debug"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SendSMSTargetAddressType" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the supported types of addresses SMSs can be sent to.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="TelUri"/>
+            <enumeration value="AnonymousReference"/>
+            <enumeration value="All"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SendMMSTargetAddressType" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the supported types of addresses MMSs can be sent to.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="TelUri"/>
+            <enumeration value="AnonymousReference"/>
+            <enumeration value="All"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Control." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the operation of the Femtozone APIs.
+      </description>
+      <parameter name="AuthenticationMethod" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies how 3rd Party Applications have to authenticate against Femto APIs in order to use it. {{reference}}
+          '''''Note:''''' The credentials are not part of the data model and have to be supplied externally.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <enumerationRef targetParam="#.Capabilities.AuthenticationMethodsSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TunnelInst" access="readWrite" dmr:version="2.4">
+        <description>
+          This is the reference to the IPsec tunnel instance to be used by the Application Platform traffic.
+          If InternetGatewayDevice:1 {{bibref|TR-098}} or Device:1 {{bibref|TR-181i1}}) is used as root data model the {{param}} MUST point to a row in the ''.FAP.Tunnel.IKESA.{i}.'' table.
+          If the root data model used is Device:2 {{bibref|TR-181i2}} than the {{param}} MUST point to an tunnel instance defined in this data model.
+          If the referenced object is deleted, the parameter value MUST be set to an empty string.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Control.FemtoAwareness." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the Femto Awareness API.
+      </description>
+      <parameter name="APIEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable FemtoAwareness API exposure on FAP
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable Request queueing for the API
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Queueing " access="readWrite" dmr:version="2.4">
+        <description>
+          Determines how FAP handles simultaneous requests from different Applications to Femto Awareness API.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="FiFo"/>
+            <enumeration value="Priority"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAPIUsersNumber" access="readWrite" dmr:version="2.4">
+        <description>
+          Determines the Max Number of different Applications that can send Requests to Femto Awareness API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FemtozoneID" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies Identifier of the Femtozone.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NotificationsUserIdentifierMSISDN" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies whether the Mobile Station International Subscriber Directory Number (MSISDN) has to be used as UserIdentifier in Femto Awareness Notifications. A value of {{true}} means that the MSISDN is send as user identifier, a value of {{false}} means that an anonymous reference is used.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SubscribeToNotificationsResponseCallbackData" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies whether the OPTIONAL Argument "Callback Data" has to be used in Responses to Requests to "Subscribe To Femto Awareness Notifications".
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueryFemtocellResponseTimezone" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies whether the OPTIONAL Argument "Timezone" has to be used in Responses to Requests to "Query Femtocell Status".
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Control.SMS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the SMS API.
+      </description>
+      <parameter name="APIEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable SMS API exposure on FAP
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable Request queueing for the API
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Queueing " access="readWrite" dmr:version="2.4">
+        <description>
+          Determines how FAP handles simultaneous requests from different Applications to SMS API.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="FiFo"/>
+            <enumeration value="Priority"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAPIUsersNumber" access="readWrite" dmr:version="2.4">
+        <description>
+          Determines the Max Number of different Applications that can send Requests to SMS API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MinSendSMSTimeInterval" access="readWrite" dmr:version="2.4">
+        <description>
+          Determines the Minimum Time Interval in {{units}} between two consecutive Send SMS Requests by the same Application.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="3599"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="EnableQuerySMSDeliveryStatus" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable "QuerySMSDeliveryStatus" Operation on SMS API. When disabled, QuerySMSDeliveryStatus Requests to SMS API are ignored.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EnableSubscribeToNotificationsOfMessageSentToApplication" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable "SubscribeToNotificationsOfMessageSentToApplication" Operation on SMS API. When disabled, SubscribeTo NotificationsOfMessageSentToApplication Requests to SMS API are ignored.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Control.MMS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the MMS API.
+      </description>
+      <parameter name="APIEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable MMS API exposure on FAP
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable Request queueing for the API
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Queueing " access="readWrite" dmr:version="2.4">
+        <description>
+          Determines how FAP handles simultaneous requests from different Applications to MMS API.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="FiFo"/>
+            <enumeration value="Priority"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAPIUsersNumber" access="readWrite" dmr:version="2.4">
+        <description>
+          Determines the Max Number of different Applications that can send Requests to MMS API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MinSendMMSTimeInterval" access="readWrite" dmr:version="2.4">
+        <description>
+          Determines the Minimum Time Interval in {{units}} between two consecutive Send MMS Requests by the same Application.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="3599"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="EnableQueryMMSDeliveryStatus" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable "QuerySMSDeliveryStatus" Operation on MMS API. When disabled, QuerySMSDeliveryStatus Requests to MMS API are ignored.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EnableSubscribeToNotificationsOfMessageSentToApplication" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable "SubscribeTo NotificationsOfMessageSentToApplication" Operation on MMS API. When disabled, SubscribeTo NotificationsOfMessageSentToApplication Requests to MMS API are ignored.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Control.TerminalLocation." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the TerminalLocation API.
+      </description>
+      <parameter name="APIEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable TerminalLocation API exposure on FAP
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueEnable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enable or disable Request queueing for the API
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Queueing " access="readWrite" dmr:version="2.4">
+        <description>
+          Determines how FAP handles simultaneous requests from different Applications to TerminalLocation API.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="FiFo"/>
+            <enumeration value="Priority"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxAPIUsersNumber" access="readWrite" dmr:version="2.4">
+        <description>
+          Determines the Max Number of different Applications that can send Requests to TerminalLocation API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueryMobileLocationResponseAddress" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies Terminal Address  Format to be used in QueryMobileLocation Responses.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="TelUri"/>
+            <enumeration value="AnonymousReference"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="QueryMobileLocationResponseLongitudeLatitude" access="readWrite" dmr:version="2.4">
+        <description>
+          Include or exclude FAP Longitude and Latitude arguments in Responses to QueryMobileLocation Requests.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueryMobileLocationResponseAltitude" access="readWrite" dmr:version="2.4">
+        <description>
+          Include or exclude FAP Altitude argument in Responses to QueryMobileLocation Requests .
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="QueryMobileLocationResponseTimestamp" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies Response Timestamp in {{units}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="86399"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Monitoring." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the monitoring of the Femtozone Application Platform and the Femtozone APIs.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.4">
+        <description>
+          Enables and disables this entry.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MonitoringInterval" access="readWrite" dmr:version="2.4">
+        <description>
+          Specifies the interval in {{units}} used to collect the monitoring measurements.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="AuthenticationRequestsReceived" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the total number of authentication requests received by the Femto Application Platform. The counter will be reset whenever the device reboots or the {{param|Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="AuthenticationRequestsRejected" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of authentication requests received by the Femto Application Platform that were rejected. The counter will be reset whenever the device reboots or the {{param|Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Monitoring.FemtoAwareness." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the Monitoring of the FemtoAwareness API.
+      </description>
+      <parameter name="APIAvailable" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the FemtoAwareness API is currently available on this device (the API could be disabled or could have exhausted its resources)
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="APIUsers" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of Applications using the Femto Awareness API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueState" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the state of the Femto Awareness API Queue.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Ready"/>
+            <enumeration value="Flushed"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="QueueNum" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of requests waiting in the Femto Awareness API Queue.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueReceived" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the Femto Awareness API Queue that have been received. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueDiscarded" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the Femto Awareness API Queue that have been discarded. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Monitoring.SMS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the Monitoring of the SMS API.
+      </description>
+      <parameter name="APIAvailable" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the SMS API is currently available on this device (the API could be disabled or could have exhausted its resources)..
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="APIUsers" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of Applications using the SMS API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueState" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the state of the SMS API Queue.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Ready"/>
+            <enumeration value="Flushed"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="QueueNum" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of requests waiting in the SMS API Queue.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueReceived" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the SMS API Queue that have been received. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueDiscarded" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the SMS API Queue that have been discarded. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Monitoring.MMS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the Monitoring of the MMS API.
+      </description>
+      <parameter name="APIAvailable" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the MMS API is currently available on this device (the API could be disabled or could have exhausted its resources)..
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="APIUsers" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of Applications using the MMS API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueState" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the state of the MMS API Queue.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Ready"/>
+            <enumeration value="Flushed"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="QueueNum" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of requests waiting in the MMS API Queue.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueReceived" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the MMS API Queue that have been received. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueDiscarded" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the MMS API Queue that have been discarded. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.FAP.ApplicationPlatform.Monitoring.TerminalLocation." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.4">
+      <description>
+        This object contains parameters related to the Monitoring of the TerminalLocation API.
+      </description>
+      <parameter name="APIAvailable" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies whether the TerminalLocation API is currently available on this device (the API could be disabled or could have exhausted its resources)..
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="APIUsers" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of Applications using the Terminal Location API.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueState" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the state of the Terminal Location API Queue.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Ready"/>
+            <enumeration value="Flushed"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="QueueNum" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the current number of requests waiting in the Terminal Location API Queue.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="QueueReceived" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the Terminal Location API Queue that have been received. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="QueueDiscarded" access="readOnly" dmr:version="2.4">
+        <description>
+          Specifies the number of requests in the Terminal Location API Queue that have been discarded. The counter will be reset whenever the device reboots or the {{param|#.Enable}} parameter is set to {{true}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BulkData." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.5">
+      <description>
+        This object provides bulk data collection capabilities and global collection settings that affect the entire device.
+        Bulk Data utilizes various solutions (e.g., IPDR, HTTP) to collect data from devices and transfer the data to a collection server.
+        The IPDR solution is based on a service specification described in {{bibref|TR-232}}.
+        The HTTP solution is based on transfer mechanisms described in {{bibref|TR-157a10|Annex A}}.
+        The Bulk Data Collection Profiles are measured over a reporting interval (which can be aligned with absolute time) and are made available to the collection server.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.5">
+        <description>
+          Enables or disables all collection profiles.
+          If {{false}}, bulk data will not be collected or reported.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.5">
+        <description>
+          Indicates the status of the Bulk Data Collection mechanism.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Enabled">
+              <description>
+                Bulk Data Collection is enabled and working as intended.
+              </description>
+            </enumeration>
+            <enumeration value="Disabled">
+              <description>
+                Bulk Data Collection is disabled.
+              </description>
+            </enumeration>
+            <enumeration value="Error" optional="true">
+              <description>
+                Bulk Data Collection is enabled, but there is an error condition preventing the successful collection of bulk data.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MinReportingInterval" access="readOnly" dmr:version="2.5">
+        <description>
+          Minimum reporting interval in {{units}} that the CPE is capable of supporting.
+          A value of 0 indicates no minimum reporting interval.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Protocols" access="readOnly" dmr:version="2.5">
+        <description>
+          Represents the IPDR and transport protocols that this device is capable of supporting.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="Streaming">
+              <description>
+                IPDR Streaming Protocol {{bibref|IPDR-SP}}
+              </description>
+            </enumeration>
+            <enumeration value="File">
+              <description>
+                IPDR File Transfer Protocol {{bibref|IPDR-FTP}}
+              </description>
+            </enumeration>
+            <enumeration value="HTTP">
+              <description>
+                Hypertext Transfer Protocol {{bibref|RFC2616}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EncodingTypes" access="readOnly" dmr:version="2.5">
+        <description>
+          Represents the Encoding Types for the protocols that this device is capable of supporting.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="XML">
+              <description>
+                Used with the IPDR Streaming and File Protocols. {{bibref|IPDR-XML}}
+              </description>
+            </enumeration>
+            <enumeration value="XDR">
+              <description>
+                Used with the IPDR Streaming and File Protocols. {{bibref|IPDR-XDR}}
+              </description>
+            </enumeration>
+            <enumeration value="CSV">
+              <description>
+                Comma Separated Values. Used with the HTTP Protocol. {{bibref|RFC4180}}
+              </description>
+            </enumeration>
+            <enumeration value="JSON">
+              <description>
+                JavaScript Object Notation. Used with the HTTP Protocol {{bibref|RFC7159}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ParameterWildCardSupported" access="readOnly" dmr:version="2.10">
+        <description>
+          When {{true}}, the Device supports the use of wildcards to determine the parameters that are reported using a Profile.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxNumberOfProfiles" access="readOnly" dmr:version="2.5">
+        <description>
+          The maximum number of profiles that can exist at any given time.  Specifically, the maximum number of {{object|Profile.{i}.}} instances that the ACS can create.
+          If the value of this parameter is -1, then it means that the CPE doesn't have a limit to the number of profiles that can exist.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="MaxNumberOfParameterReferences" access="readOnly" dmr:version="2.5">
+        <description>
+          The maximum number of parameters that can be referenced via the bulk data collection mechanism.  Specifically, the maximum number of parameters that can be referenced via {{param|Profile.{i}.Parameter.{i}.Reference}} across all Profile and Parameter instances (including the expansion of partial paths within the Reference parameter).
+          If the value of this parameter is -1, then it means that the CPE doesn't have a limit to the number of parameter that can be referenced via the bulk data collection mechanism.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ProfileNumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BulkData.Profile.{i}." access="readWrite" numEntriesParameter="ProfileNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.5">
+      <description>
+        A set of Bulk Data Collection profiles.
+        Each profile represents a bulk data report, including its own timing configuration, communications configuration, and set of parameters.  This allows the ACS to configure multiple reports to be generated at different times for different sets of data.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.5">
+        <description>
+          Enables or disables this specific bulk data profile.
+          If {{false}}, this profile will not be collected or reported.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.5">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          The name of the profile.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="255"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Controller" access="readOnly" dmr:version="2.12">
+        <description>
+          {{reference|the {{object|Device.LocalAgent.Controller.}} instance that created or last updated this {{object}}}}
+          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 value of this parameter is automatically updated by the USP Agent upon {{object}} alteration using the reference to the USP Controller that changed the instance.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="Device.LocalAgent.Controller." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfRetainedFailedReports" access="readWrite" dmr:version="2.10">
+        <description>
+          The number of failed reports to be retained and transmitted (in addition to the current report) at the end of the current reporting interval.
+          If the value of the {{param|EncodingType}} parameter is modified any outstanding failed reports are deleted.
+          If the CPE cannot retain the number of failed reports from previous reporting intervals while transmitting the report of the current reporting interval, then the oldest failed reports are deleted until the CPE is able to transmit the report from the current reporting interval.
+          A value of 0 indicates that failed reports are not to be retained for transmission in the next reporting interval.
+          A value of -1 indicates that the CPE will retain as many failed reports as possible.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.5">
+        <description>
+          The Bulk Data Protocol being used for this collection profile.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="#.Protocols"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EncodingType" access="readWrite" dmr:version="2.5">
+        <description>
+          The Bulk Data encoding type being used for this collection profile.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="#.EncodingTypes"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ReportingInterval" access="readWrite" dmr:version="2.5">
+        <description>
+          The reporting interval in {{units}}. Each report is generated based on this interval and {{param|TimeReference}}.
+          The CPE MAY reject a request to set {{param}} to less than {{param|#.MinReportingInterval}}.
+          Reporting intervals MUST begin every {{param}} {{units}}.
+          If {{param}} is changed while collection is enabled, the first reporting interval begins immediately.
+          For example, if {{param}} is 86400 (a day) and if {{param|TimeReference}} is set to UTC midnight on some day (in the past, present, or future) then the CPE will generate (and transmit, if the {{param|Protocol}} parameter is set to {{enum|Streaming|#.Protocols}}) its report at midnight every 24 hours.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="86400"/>
+        </syntax>
+      </parameter>
+      <parameter name="TimeReference" access="readWrite" dmr:version="2.5">
+        <description>
+          An absolute time reference in UTC to determine when will be transmitted.  Each reporting interval MUST complete at this reference time plus or minus an integer multiple of {{param|ReportingInterval}}, unless unable to due to higher prioritized operations.
+          {{param}} is used only to set the "phase" of the reporting intervals.  The actual value of {{param}} can be arbitrarily far into the past or future.
+          If {{param}} is changed while collection of bulk data is enabled, the first reporting interval begins immediately.
+          The Unknown Time value as defined in {{bibref|TR-106a2}} 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 reporting intervals.
+          If absolute time is not available to the CPE, its reporting interval behavior MUST be the same as if the {{param}} parameter was set to the Unknown Time value.
+          For example, if {{param|ReportingInterval}} is 86400 (a day) and if {{param}} is set to UTC midnight on some day (in the past, present, or future) then the CPE will generate (and transmit, if in a "ITPush" mode) its report at midnight every 24 hours.
+          Note that, if {{param}} is set to a time other than the Unknown Time, the first reporting interval (which has to begin immediately) will almost certainly be shorter than {{param|ReportingInterval}}).  This is why {{param}} is defined in terms of when reporting intervals complete rather than start.
+        </description>
+        <syntax>
+          <dateTime/>
+          <default type="object" value="0001-01-01T00:00:00Z"/>
+        </syntax>
+      </parameter>
+      <parameter name="StreamingHost" access="readWrite" dmr:version="2.5">
+        <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}}).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="StreamingPort" access="readWrite" dmr:version="2.5">
+        <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}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="4737"/>
+        </syntax>
+      </parameter>
+      <parameter name="StreamingSessionID" access="readWrite" dmr:version="2.5">
+        <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}}).
+          An ACS 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'.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="48" maxInclusive="57"/>
+            <range minInclusive="65" maxInclusive="90"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FileTransferURL" access="readWrite" dmr:version="2.5">
+        <description>
+          This is the URL 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}}).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FileTransferUsername" access="readWrite" dmr:version="2.5">
+        <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}}).
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FileTransferPassword" access="readWrite" dmr:version="2.5">
+        <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}}).
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ControlFileFormat" access="readWrite" dmr:version="2.5">
+        <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.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ParameterNumberOfEntries" access="readOnly" dmr:version="2.5">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BulkData.Profile.{i}.Parameter.{i}." access="readWrite" numEntriesParameter="ParameterNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.5" dmr:noUniqueKeys="true">
+      <description>
+        Bulk data parameter table.
+        Each entry in this table represents a parameter (or set of parameters if a partial path is provided) to be collected and reported.
+      </description>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          Name of the parameter in the report body.
+          If the value of this parameter is {{empty}}, then the value of the {{param|Reference}} parameter is used as the name.
+          When the value {{param|Reference}} parameter contains wildcards and/or partial parameter names, the rules for determining the value of this parameter are specified in {{bibref|TR-157a10|Annex A.3.2.1}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Reference" access="readWrite" dmr:version="2.5">
+        <description>
+          Represents the parameter(s) that are part of this Bulk Data collection profile. The value MUST be a path name of a parameter or an object.
+          When the {{param|##.ParameterWildCardSupported}} parameter has a value of {{true}}, patterns for instance identifiers are permitted with wildcards (an "*" character) in place of instance identifiers; any attempt to set the value otherwise MUST be rejected by the CPE.
+          In the case where a partial parameter path is specified, the sub-objects of the resolved pattern and contained parameters will be part of the bulk data collected and reported. If the path name refers to an object then it MUST end with a '.'.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="weak" targetType="any"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BulkData.Profile.{i}.CSVEncoding." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10">
+      <description>
+        This object defines the properties to be used when the {{object|##.Profile}} object's {{param|#.EncodingType}} parameter value is {{enum|CSV|##.EncodingTypes}}.
+      </description>
+      <parameter name="FieldSeparator" access="readWrite" dmr:version="2.10">
+        <description>
+          Field separator to use when encoding CSV data.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value=","/>
+        </syntax>
+      </parameter>
+      <parameter name="RowSeparator" access="readWrite" dmr:version="2.10">
+        <description>
+          Row separator to use when encoding CSV data.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value="&#13;&#10;"/>
+        </syntax>
+      </parameter>
+      <parameter name="EscapeCharacter" access="readWrite" dmr:version="2.10">
+        <description>
+          Escape character to use when encoding CSV data.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value="&quot;"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReportFormat" access="readWrite" dmr:version="2.10">
+        <description>
+          This parameter describes the formatting used for reports defined by this profile as described in {{bibref|TR-157a10|Annex A.3.4}}.
+          Note: This parameter is encoded as a token in the BBF-Report-Format header field and MUST NOT include spaces or other characters excluded from token characters defined in {{bibref|RFC2616}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ParameterPerRow">
+              <description>
+                Reports are formatted with each parameter formatted as a row entry.
+              </description>
+            </enumeration>
+            <enumeration value="ParameterPerColumn">
+              <description>
+                Reports are formatted with each parameter formatted as a column entry.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="ParameterPerColumn"/>
+        </syntax>
+      </parameter>
+      <parameter name="RowTimestamp" access="readWrite" dmr:version="2.10">
+        <description>
+          The format of the timestamp to use for data inserted into the row.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Unix-Epoch">
+              <description>
+                Timestamp is inserted using the UNIX epoch time (milliseconds since Jan 1, 1970 UTC) timestamp format. If the CPE is unable to acquire a time, then the time that has elapsed since the last reboot of the device is used.
+              </description>
+            </enumeration>
+            <enumeration value="ISO-8601">
+              <description>
+                Timestamp is inserted using the ISO-8601 timestamp format. If the CPE is unable to acquire a time, then the processing described by the dateTime type in {{bibref|TR-069|Table 12}} is followed.
+              </description>
+            </enumeration>
+            <enumeration value="None">
+              <description>
+                Timestamp is not inserted in the row.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Unix-Epoch"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BulkData.Profile.{i}.JSONEncoding." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10">
+      <description>
+        This object defines the properties to be used when the {{object|##.Profile}} object's {{param|#.EncodingType}} parameter value is {{enum|JSON|##.EncodingTypes}}.
+      </description>
+      <parameter name="ReportFormat" access="readWrite" dmr:version="2.10">
+        <description>
+          This parameter describes the formatting used for the report as described in {{bibref|TR-157a10|Annex A.3.5}}.
+          Note: This parameter is encoded as a token in the BBF-Report-Format header field and MUST NOT include spaces or other characters excluded from token characters defined in {{bibref|RFC2616}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ObjectHierarchy">
+              <description>
+                Reports are formatted with each object in the object hierarchy of the data model encoded as a corresponding hierarchy of JSON Objects with the parameters of the object specified as name/value pairs of the JSON Object.
+              </description>
+            </enumeration>
+            <enumeration value="NameValuePair">
+              <description>
+                Reports are formatted with each parameter of the data model encoded as a corresponding array of JSON Objects with the parameters specified as name/value pairs.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="ObjectHierarchy"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReportTimestamp" access="readWrite" dmr:version="2.10">
+        <description>
+          The format of timestamp to use for the JSON Object named "CollectionTime" as described in {{bibref|TR-157a10}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Unix-Epoch">
+              <description>
+                Timestamp is inserted using the UNIX epoch time (milliseconds since Jan 1, 1970 UTC) timestamp format. If the CPE is unable to acquire a time, then the time that has elapsed since the last reboot of the device is used.
+              </description>
+            </enumeration>
+            <enumeration value="ISO-8601">
+              <description>
+                Timestamp is inserted using the ISO-8601 timestamp format. If the CPE is unable to acquire a time, then the processing described by the dateTime type in {{bibref|TR-069|Table 12}} is followed.
+              </description>
+            </enumeration>
+            <enumeration value="None">
+              <description>
+                Timestamp is not inserted.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Unix-Epoch"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BulkData.Profile.{i}.HTTP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10">
+      <description>
+        This object defines the properties to be used when transporting bulk data using the HTTP/HTTPS protocol. This object is used when the {{param|#.Protocol}} parameter has a value of {{enum|HTTP|##.Protocols}}. For authentication purposes the CPE MUST support HTTP Basic and Digest Access Authentication as defined in {{bibref|RFC2616}}.
+      </description>
+      <parameter name="URL" access="readWrite" dmr:version="2.10">
+        <description>
+          The URL, as defined in {{bibref|RFC3986}}, for the collection server to receive the Bulk Data transmitted by the CPE.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.10">
+        <description>
+          Username used to authenticate the CPE when making a connection to the collection server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.10">
+        <description>
+          Password used to authenticate the CPE when making a connection to the collection server.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CompressionsSupported" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the HTTP Compression mechanism(s) supported by this CPE for the purposes of transferring bulk data.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="GZIP">
+              <description>
+                As defined in {{bibref|RFC2616|Section 3.5}}
+              </description>
+            </enumeration>
+            <enumeration value="Compress">
+              <description>
+                As defined in {{bibref|RFC2616|Section 3.5}}
+              </description>
+            </enumeration>
+            <enumeration value="Deflate">
+              <description>
+                As defined in {{bibref|RFC2616|Section 3.5}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Compression" access="readWrite" dmr:version="2.10">
+        <description>
+          The value of this parameter represents the HTTP Compression mechanism to be used by the CPE when transferring data to the collection server.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="CompressionsSupported" nullValue="None"/>
+          </string>
+          <default type="object" value="None"/>
+        </syntax>
+      </parameter>
+      <parameter name="MethodsSupported" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the HTTP method(s) supported by this CPE for the purposes of transferring bulk data.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="POST">
+              <description>
+                As defined in {{bibref|RFC2616|Section 9.5}}
+              </description>
+            </enumeration>
+            <enumeration value="PUT">
+              <description>
+                As defined in {{bibref|RFC2616|Section 9.6}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Method" access="readWrite" dmr:version="2.10">
+        <description>
+          The value of this parameter represents the HTTP method to be used by the CPE when transferring data to the collection server.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="MethodsSupported"/>
+          </string>
+          <default type="object" value="POST"/>
+        </syntax>
+      </parameter>
+      <parameter name="UseDateHeader" access="readWrite" dmr:version="2.10">
+        <description>
+          When {{true}}, the CPE encodes the HTTP Date Header {{bibref|RFC2616|Section 14.18}} in the HTTP client request.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="RetryEnable" access="readWrite" dmr:version="2.10">
+        <description>
+          When {{true}}, the CPE retries unsuccessful attempts to transfer data.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="RetryMinimumWaitInterval" access="readWrite" dmr:version="2.10">
+        <description>
+          Configures the data transfer retry wait interval, in seconds, as specified in {{bibref|TR-157a10|Annex A.2.2.1}}.
+          The device MUST use a random value between {{param}}  and ({{param}} * {{param|RetryIntervalMultiplier}} / 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"/>
+          </unsignedInt>
+          <default type="object" value="5"/>
+        </syntax>
+      </parameter>
+      <parameter name="RetryIntervalMultiplier" access="readWrite" dmr:version="2.10">
+        <description>
+          Configures the retry interval multiplier as specified in {{bibref|TR-157a10|Annex A.2.2.1}}.
+          This value is expressed in units of 0.001.  Hence the values of the multiplier range between 1.000 and 65.535.
+          The device MUST use a random value between {{param|RetryMinimumWaitInterval}}  and ({{param|RetryMinimumWaitInterval}} * {{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="RequestURIParameterNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PersistAcrossReboot" access="readWrite" dmr:version="2.12">
+        <description>
+          Determines whether or not data transfers that have failed are required to be persisted across reboots.
+          If {{param}} is {{true}}, then failed data transfers MUST be persisted across reboots.
+          If {{param}} is {{false}}, then failed data transfers are not required to be persisted across reboots.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BulkData.Profile.{i}.HTTP.RequestURIParameter.{i}." access="readWrite" numEntriesParameter="RequestURIParameterNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.10" dmr:noUniqueKeys="true">
+      <description>
+        This object represents an instance of a parameter to be used in the report header used as part of the HTTP Request-URI transmitted by the CPE to the collection server using the Request-URI in addition to the parameters required by {{bibref|TR-157a10|Annex A.2.1}}.
+      </description>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          Name of the Request-URI parameter.
+          If {{param}} is {{empty}}, the name of the Request-URI parameter is the value of {{param|Reference}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Reference" access="readWrite" dmr:version="2.10">
+        <description>
+          The value MUST be the path name of a parameter to be used as the Request-URI parameter.
+          If the value of this parameter is empty, then this object is not encoded in the report header.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.XMPP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        The {{object}} represents the XMPP capabilities of the device as described in {{bibref|TR-069a5|Appendix III}}.
+      </description>
+      <parameter name="ConnectionNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedServerConnectAlgorithms" access="readOnly" dmr:version="2.11">
+        <description>
+          The algorithms supported by the CPE for resolving XMPP server addresses and ports. {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="DNS-SRV">
+              <description>
+                Use the preferred connection algorithm as specified in {{bibref|RFC6120|Section 3.2.1}} where the value of the {{param|Connection.{i}.Domain}} parameter is used to look up the server address and port to use.
+              </description>
+            </enumeration>
+            <enumeration value="DNS">
+              <description>
+                Use the fallback connection mechanism as specified in {{bibref|RFC6120|Section 3.2.2}}, where the value of the {{param|Connection.{i}.Domain}} parameter is used to look up the server address, and the port is the ''xmpp-client'' port (5222).
+              </description>
+            </enumeration>
+            <enumeration value="ServerTable">
+              <description>
+                Use the instances of the {{object|Connection.{i}.Server}} table based on the values of the {{param|Connection.{i}.Server.{i}.Priority}} and {{param|Connection.{i}.Server.{i}.Weight}} parameters as the basis for reconnect. Instances MUST be reachable and reachable instances with the lowest value MUST be preferred.
+              </description>
+            </enumeration>
+            <enumeration value="WebSocket">
+              <description>
+                Use the discovery and connection algorithm as specified in {{bibref|RFC7395|Section 4}} where the value of the {{param|Connection.{i}.Domain}} parameter is used to create a secure HTTP request to discover the URL to use for the XMPP over WebSocket connection.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.XMPP.Connection.{i}." access="readWrite" numEntriesParameter="ConnectionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        The {{object}} represents a XMPP connection between the device and a server. The {{param|Username}}, {{param|Domain}} and {{param|Resource}} comprise the full identity (JabberID) of this {{object}} for this device.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Username"/>
+        <parameter ref="Domain"/>
+        <parameter ref="Resource"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables this {{object}}.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.7">
+        <description>
+          The proposed local-part of the Jabber ID of this {{object}}, and the value to be used to authenticate this {{object}} when making a connection to the Server using the procedure outlined in {{bibref|RFC6120|Section 6}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.7">
+        <description>
+          Password used to authenticate this {{object}} when making a connection to the {{object|Server}} using the procedure outlined in {{bibref|RFC6120|Section 6}}.
+          Note that on a factory reset of the CPE, the value of this parameter might be reset to its factory value.  If an ACS modifies the  value of this parameter, it SHOULD be prepared to accommodate the situation that the original value is restored as the result of a  factory reset.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Domain" access="readWrite" dmr:version="2.7">
+        <description>
+          The proposed domain-part of the Jabber ID of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Resource" access="readWrite" dmr:version="2.7">
+        <description>
+          The proposed resource-part of the Jabber ID of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="JabberID" access="readOnly" dmr:version="2.7">
+        <description>
+          The complete Jabber ID as determined by the first-hop XMPP server at time of connection establishment.  This Jabber ID will usually be the standard concatentation of the local-part (Username), domain-part (Domain), and resource-part (Resource) as defined in {{bibref|RFC6120|Section 2.1}} (local-part@domain-part/resource-part), but since the Jabber ID is owned by the first-hop XMPP Server there are cases where the value will be different.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.7">
+        <description>
+          The current operational state of this {{object}} (see {{bibref|TR-181i2|Section 4.2.2}}).  {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Disabled}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Enabled}} if and only if the interface is able to transmit and receive PDUs; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Enabled}} if still operable when the expected actions have completed);  it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Enabled"/>
+            <enumeration value="Disabled"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="Connecting"/>
+            <enumeration value="ServerNotPresent"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error_AuthenticationFailure"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChangeDate" access="readOnly" dmr:version="2.7">
+        <description>
+          The date and time at which this {{object}} entered into its current operational state.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerConnectAlgorithm" access="readWrite" dmr:version="2.7">
+        <description>
+          The algorithm the {{object}} uses when connecting with the associated lists of servers.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="#.SupportedServerConnectAlgorithms"/>
+          </string>
+          <default type="object" value="DNS-SRV"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveInterval" access="readWrite" dmr:version="2.7">
+        <description>
+          The number of {{units}} that keep alive events as specified in {{bibref|RFC6120|Section 4.6.1}} are sent by this {{object}}.
+          A value of 0 disables the keep alive functionality. A value of -1 indicates that the keep alive interval is a vendor specific implementation.
+          {{bibref|RFC6120|Section 4.6.4}} recommends not checking more frequently than every 5 minutes (or 300 {{units}}).
+        </description>
+        <syntax>
+          <long>
+            <range minInclusive="-1"/>
+            <units value="seconds"/>
+          </long>
+          <default type="object" value="-1"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerConnectAttempts" access="readWrite" dmr:version="2.7">
+        <description>
+          The number of times that this {{object}} attempts to connect to a given IP address before moving on to the current server's next IP address, or to the next server if the current server has no more IP addresses.
+          If {{param}}, {{param|ServerRetryInitialInterval}}, {{param|ServerRetryIntervalMultiplier}} and {{param|ServerRetryMaxInterval}} all have their default values, the maximum reconnection wait intervals, in ''minutes'', will be ''{1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 512, 512, 512, 512, 512}''.  After the initial attempt there are 15 further attempts, making a total of 16.  The maximum reconnection wait interval is reached on the 10th retry, i.e. the 11th attempt.
+          NOTE: If this {{object}} fails to connect to any of the servers' IP addresses, fallback behavior SHOULD be as specified in {{bibref|RFC6120|Section 3.2}}.
+          NOTE: If the value of this parameter is 0, server connection and reconnection behavior is implementation-dependent.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="16"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerRetryInitialInterval" access="readWrite" dmr:version="2.7">
+        <description>
+          The maximum first reconnection wait interval, in {{units}}, as specified in {{bibref|TR-069a5|Annex K XMPP Connection Request}}.
+          The Device MUST use a random value between ''0'' and {{param}} as the first reconnection wait interval.
+          NOTE: If the value of the {{param|ServerConnectAttempts}} parameter is 0, the value of this parameter is ignored.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="60"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerRetryIntervalMultiplier" access="readWrite" dmr:version="2.7">
+        <description>
+          The reconnection interval multiplier as specified in {{bibref|TR-069a5|Annex K XMPP Connection Request}}. This value is expressed in units of 0.001. Hence the values of the multiplier range between 1.000 and 65.535.
+          For the ''n''th reconnection wait interval, the Device MUST use a random value, in ''seconds'', between ''0'' and {{param|ServerRetryInitialInterval}} * ({{param}} / 1000) ** (''n'' - ''1'').
+          NOTE: If the value of the {{param|ServerConnectAttempts}} parameter is 0, the value of this parameter is ignored.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1000" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="2000"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerRetryMaxInterval" access="readWrite" dmr:version="2.7">
+        <description>
+          The maximum reconnection wait interval, in {{units}}.
+          If the ''n''th reconnection wait interval calculated from {{param|ServerRetryInitialInterval}} and {{param|ServerRetryIntervalMultiplier}} exceeds the value of this parameter, then the Device MUST use the value of this parameter as the next reconnection wait interval.
+          NOTE: If the value of the {{param|ServerConnectAttempts}} parameter is 0, the value of this parameter is ignored.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="30720"/>
+        </syntax>
+      </parameter>
+      <parameter name="UseTLS" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter allows an ACS to configure whether or not this XMPP Connection is required to use TLS independent of whether or not the XMPP Server that is being connected to is configured for TLS "mandatory-to-negotiate".
+          If the value of {{param}} is {{true}} then the CPE will initiate TLS negotiation if not required to by the XMPP Server.
+          If the value of {{param}} is {{false}} then the CPE will not initiate TLS negotiation if not required to by the XMPP Server.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="TLSEstablished" access="readOnly" dmr:version="2.7">
+        <description>
+          This parameter represents the TLS state of this XMPP Connection.
+          If this XMPP Connection is established and is secured by TLS then the value of this parameter is {{true}}.
+          If this XMPP Connection is either not established or established but not secured by TLS then the value of this parameter is {{false}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerNumberOfEntries" access="readOnly" dmr:version="2.7">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.XMPP.Connection.{i}.Server.{i}." access="readWrite" numEntriesParameter="ServerNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.7">
+      <description>
+        The {{object}} represents an XMPP server to be used for a {{object|##.Connection}}.
+        This table is only relevant when {{param|##.Connection.{i}.ServerConnectAlgorithm}} is set to {{enum|ServerTable|##.Connection.{i}.ServerConnectAlgorithm}}.  If {{param|##.Connection.{i}.ServerConnectAlgorithm}} is set to {{enum|DNS-SRV|##.Connection.{i}.ServerConnectAlgorithm}} then any instances of this table are ignored by this {{object|##.Connection}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="ServerAddress"/>
+        <parameter ref="Port"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.7">
+        <description>
+          Enables or disables this {{object}}.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.7">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Priority" access="readWrite" dmr:version="2.7">
+        <description>
+          The priority of this {{object}} that is used by the {{object|##.Connection}} when determining the {{object}} to connect. The {{object|##.Connection}} MUST contact the {{object}} with the lowest-numbered priority that the {{object|##.Connection}} can reach as defined in {{bibref|RFC2782}}. The selection of {{object}}s with the same {{param}} value utilizes the {{param|Weight}} parameter to determine which {{object}} is selected by the {{object|##.Connection}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Weight" access="readWrite" dmr:version="2.7">
+        <description>
+          This parameter specifies a relative weight for entries with the same {{param|Priority}}. The mechanism is defined in {{bibref|RFC2782}}. A value of -1 indicates that the implementation of this parameter is specific to the Vendor.
+        </description>
+        <syntax>
+          <long>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </long>
+        </syntax>
+      </parameter>
+      <parameter name="ServerAddress" access="readWrite" dmr:version="2.7">
+        <description>
+          Fully Qualified Domain Name (FQDN) or IP address of the XMPP server for this {{object|##.Connection}}.
+          If the value of this Parameter is a FQDN that resolves to multiple addresses then each address SHOULD be attemtped (in an implemnetation-specific order) until a connection can be made or all addresses are exhausted, in which case the next {{object}} instance (based on {{param|Priority}} and {{param|Weight}}) SHOULD be used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.7">
+        <description>
+          Port number of the XMPP server for this {{object|##.Connection}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="5222"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.XMPP.Connection.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.7">
+      <description>
+        XMPP Connection statistics information for this resource.
+      </description>
+      <parameter name="ReceivedMessages" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of XMPP stanzas (iq, presence, or message) that have been received on this {{object|##.Connection}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedMessages" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of XMPP stanzas (iq, presence, or message) that have been transmitted by this {{object|##.Connection}}.
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReceivedErrorMessages" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of XMPP stanzas (iq, presence, or message) that have been received on this {{object|##.Connection}} where the type attribute had a value of "error".
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedErrorMessages" access="readOnly" dmr:version="2.7">
+        <description>
+          The number of XMPP stanzas (iq, presence, or message) that have been transmitted by this {{object|##.Connection}} where the type attribute had a value of "error".
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object represents the management functions for the 1905 capabilities as defined in {{bibref|IEEE1905.1a}}.
+      </description>
+      <parameter name="Version" access="readOnly" dmr:version="2.9">
+        <description>
+          1905 profile version number of the AL as would be sent in a Higher Layer response message as defined in {{bibref|IEEE1905.1a|Table 6-37: 1905 profile version TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="1905.1"/>
+            <enumeration value="1905.1a"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object represents the management functions for the 1905 Abstraction Layer as defined in {{bibref|IEEE1905.1a|Section 4.4 Abstraction Layer}}.
+      </description>
+      <parameter name="IEEE1905Id" access="readOnly" dmr:version="2.9">
+        <description>
+          1905 AL MAC Address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.9">
+        <description>
+          The current operational state of the 1905 Abstraction Layer. {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Up">
+              <description>
+                NOT RECOMMENDED for use; if used it  means {{enum|Enabled}}
+              </description>
+            </enumeration>
+            <enumeration value="Down">
+              <description>
+                NOT RECOMMENDED for use; if used it  means {{enum|Disabled}}
+              </description>
+            </enumeration>
+            <enumeration value="Unknown">
+              <description>
+                NOT RECOMMENDED for use; if used it  means {{enum|Error}}
+              </description>
+            </enumeration>
+            <enumeration value="Dormant">
+              <description>
+                NOT RECOMMENDED for use; if used it  means {{enum|Error}}
+              </description>
+            </enumeration>
+            <enumeration value="NotPresent">
+              <description>
+                NOT RECOMMENDED for use; if used it  means {{enum|Error}}
+              </description>
+            </enumeration>
+            <enumeration value="LowerLayerDown">
+              <description>
+                NOT RECOMMENDED for use; if used it  means {{enum|Error}}
+              </description>
+            </enumeration>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          This parameter is NOT RECOMMENDED to be used because IEEE1905 is not an interface.  The accumulated time in {{units}} since the 1905 Abstraction Layer entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readOnly" dmr:version="2.9">
+        <description>
+          This parameter is NOT RECOMMENDED to be used because IEEE1905 is not an interface.  {{list}} {{reference}} See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetParent="#.AL.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RegistrarFreqBand" access="readOnly" dmr:version="2.9">
+        <description>
+          {{list}} See {{bibref|IEEE1905.1a|Table 6-25: SupportedFreqBand TLV}}. {{enum}}
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <enumeration value="802.11 2.4 GHz"/>
+            <enumeration value="802.11 5 GHz"/>
+            <enumeration value="802.11 60 GHz"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        The 1905 interface table (described in {{bibref|IEEE1905.1a|sub-clause 5 Abstraction Layer Management}}).
+      </description>
+      <uniqueKey>
+        <parameter ref="InterfaceId"/>
+      </uniqueKey>
+      <parameter name="InterfaceId" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of this interface.  This is the value of the intfAddress parameter defined in {{bibref|IEEE1905.1a|Table 5-2: intfDescriptor elements}}
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.9">
+        <description>
+          This parameter is NOT RECOMMENDED to be used because it is not a parameter defined in a 1905 ALME primitive or protocol TLV.  The current operational state of the interface (see {{bibref|TR-181i2|Section 4.2.2}}). {{enum}}
+          It SHOULD change to {{enum|Up}} if and only if the interface is able to transmit and receive network traffic; it SHOULD normally be {{enum|Down}} when the interface cannot transmit and receive network traffic; it SHOULD change to {{enum|Dormant}} if and only if the interface is operable but is waiting for external actions before it can transmit and receive network traffic (and subsequently change to {{enum|Up}} if still operable when the expected actions have completed); it SHOULD change to {{enum|LowerLayerDown}} if and only if the interface is prevented from entering the {{enum|Up}} state because one or more of the interfaces beneath it is down; it SHOULD remain in the {{enum|Error}} state if there is an error or other fault condition detected on the interface; it SHOULD remain in the {{enum|NotPresent}} state if the interface has missing (typically hardware) components; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+          This parameter is based on ''ifOperStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Dormant"/>
+            <enumeration value="NotPresent"/>
+            <enumeration value="LowerLayerDown"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          This parameter is NOT RECOMMENDED to be used because it is not a parameter defined in a 1905 ALME primitive or protocol TLV.  The accumulated time in {{units}} since the interface entered its current operational state.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LowerLayers" access="readOnly" dmr:version="2.9">
+        <description>
+          This parameter is NOT RECOMMENDED to be used because it is not a parameter defined in a 1905 ALME primitive or protocol TLV.  {{list}} {{reference|an interface object that is stacked immediately below this interface object}}  See {{bibref|TR-181i2|Section 4.2.1}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceStackReference" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Path name of an interface object described by this 1905 {{object}}. Referenced interface object MUST have a MACAddress and the InterfaceId MUST be the same as the interface object MACAddress.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MediaType" access="readOnly" dmr:version="2.9">
+        <description>
+          Media type of this {{object}}. This is derived from the value of the intfType parameter defined in {{bibref|IEEE1905.1a|Tables 5.2: intfDescriptor elements}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IEEE 802.3u">
+              <description>
+                IEEE 802.3u Fast Ethernet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.3ab">
+              <description>
+                IEEE 802.3ab Gigabit Ethernet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11b">
+              <description>
+                IEEE 802.11b (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11g">
+              <description>
+                IEEE 802.11g (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11a">
+              <description>
+                IEEE 802.11a (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11n 2.4">
+              <description>
+                IEEE 802.11n (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11n 5.0">
+              <description>
+                IEEE 802.11n (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11ac">
+              <description>
+                IEEE 802.11ac (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11ad">
+              <description>
+                IEEE 802.11ad (60GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11af">
+              <description>
+                IEEE 802.11af
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 1901 Wavelet">
+              <description>
+                IEEE 1901 Wavelet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 1901 FFT">
+              <description>
+                IEEE 1901 FFT
+              </description>
+            </enumeration>
+            <enumeration value="MoCAv1.1">
+              <description>
+                MoCAv1.1
+              </description>
+            </enumeration>
+            <enumeration value="Generic PHY"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyOUI" access="readOnly" dmr:version="2.9">
+        <description>
+          OUI of the Generic Phy networking technology of the local interface that would be included in a Generic Phy Device Information Type TLV defined in {{bibref|IEEE1905.1a|Tables 6-29: Generic Phy Device Information type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyVariant" access="readOnly" dmr:version="2.9">
+        <description>
+          Variant Index of the Generic Phy networking technology of the local interface that would be included in a Generic Phy Device Information Type TLV defined in {{bibref|IEEE1905.1a|Tables 6-29: Generic Phy Device Information type TLV}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="1" maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyURL" access="readOnly" dmr:version="2.9">
+        <description>
+          URL to Generic Phy XML Description of the Generic Phy networking technology of the local interface that would be included in a Generic Phy Device Information Type TLV defined in {{bibref|IEEE1905.1a|Table 6-29: Generic Phy device information type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SetIntfPowerStateEnabled" access="readWrite" dmr:version="2.9">
+        <description>
+          Enables or disables the Abstraction Layer's ability to set the power state for the interface. Boolean can be {{true}} for "enabled" and {{false}} for "disabled".
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PowerState" access="readWrite" dmr:version="2.9">
+        <description>
+          The Power State of this {{object}}. This is derived from the value of the powerState parameter as defined in {{bibref|IEEE1905.1a|Tables 5.3: ALME-SET-INTF-PWR-STATE.request parameters and Table 5.7: ALME-GET-INTF-PWR-STATE.response parameters}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="On"/>
+            <enumeration value="Power_Save">
+              <description>
+                not used when written
+              </description>
+            </enumeration>
+            <enumeration value="Off"/>
+            <enumeration value="Unsupported">
+              <description>
+                not used when written
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorPropertiesNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LinkNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.Interface.{i}.VendorProperties.{i}." access="readOnly" numEntriesParameter="VendorPropertiesNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        This object defines the vendor specific properties (vendorSpecificInfo field) of this {{object|##.Interface}} as defined in {{bibref|IEEE1905.1a|Table 5-2: intfDescriptor elements}}.
+      </description>
+      <parameter name="OUI" access="readOnly" dmr:version="2.9">
+        <description>
+          Organizationally unique identifier of a manufacturer of this {{object|##.Interface}}.  Represented as a six hexadecimal-digit value using all upper-case letters and including any leading zeros according to {{bibref|IEEE1905.1a|Table 5-20: VendorSpecificInfo information element}}.  {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Information" access="readOnly" dmr:version="2.9">
+        <description>
+          A hexbinary string used to to provide vendor specific information about this {{object|##.Interface}}. This is the value of the vendorSpecificInfo parameter defined in {{bibref|IEEE1905.1a|Table 5-20: VendorSpecificInfo information element}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.Interface.{i}.Link.{i}." access="readOnly" numEntriesParameter="LinkNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object defines the 1905 neighbors and link properties.
+      </description>
+      <uniqueKey>
+        <parameter ref="InterfaceId"/>
+        <parameter ref="IEEE1905Id"/>
+      </uniqueKey>
+      <parameter name="InterfaceId" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of the interface of the Neighbor for this {{object}}. This value comes from the neighbor’s Topology discovery message as defined in {{bibref|IEEE1905.1a|Table 6-9: MAC address typeTLV}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="IEEE1905Id" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of the 1905 AL entity of the Neighbor device on this {{object}}. This value comes from the neighbor’s Topology discovery message as defined in {{bibref|IEEE1905.1a|Table 6-8: AL MAC address type TLV}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MediaType" access="readOnly" dmr:version="2.9">
+        <description>
+          Media type of this {{object}}. This value is derived from the neighbor’s Topology response message 1905 device information type TLV Media Type field as defined in {{bibref|IEEE1905.1a|Table 6-12: Media type}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IEEE 802.3u">
+              <description>
+                IEEE 802.3u Fast Ethernet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.3ab">
+              <description>
+                IEEE 802.3ab Gigabit Ethernet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11b">
+              <description>
+                IEEE 802.11b (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11g">
+              <description>
+                IEEE 802.11g (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11a">
+              <description>
+                IEEE 802.11a (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11n 2.4">
+              <description>
+                IEEE 802.11n (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11n 5.0">
+              <description>
+                IEEE 802.11n (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11ac">
+              <description>
+                IEEE 802.11ac (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11ad">
+              <description>
+                IEEE 802.11ad (60GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11af">
+              <description>
+                IEEE 802.11af
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 1901 Wavelet">
+              <description>
+                IEEE 1901 Wavelet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 1901 FFT">
+              <description>
+                IEEE 1901 FFT
+              </description>
+            </enumeration>
+            <enumeration value="MoCAv1.1">
+              <description>
+                MoCAv1.1
+              </description>
+            </enumeration>
+            <enumeration value="Generic PHY"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyOUI" access="readOnly" dmr:version="2.9">
+        <description>
+          OUI of the Generic Phy networking technology of the interface of the Neighbor for this {{object|#.Link}}. This value is from a Generic Phy response message field as defined in {{bibref|IEEE1905.1a|Tables 6-29: Generic Phy Device Information type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyVariant" access="readOnly" dmr:version="2.9">
+        <description>
+          Variant Index of the Generic Phy networking technology of the interface of the Neighbor for this {{object|#.Link}}. This value is from a Generic Phy response message variant index field as defined in {{bibref|IEEE1905.1a|Tables 6-29: Generic Phy Device Information type TLV}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="1" maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyURL" access="readOnly" dmr:version="2.9">
+        <description>
+          URL to Generic Phy XML Description of the Generic Phy networking technology of the interface of the Neighbor for this {{object|#.Link}}. This value is from a Generic Phy response message URL to Generic Phy field as defined in {{bibref|IEEE1905.1a|Table 6-29: Generic Phy device information type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.Interface.{i}.Link.{i}.Metric." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object represents the metrics for this {{object|##.Link}} as defined in {{bibref|IEEE1905.1a|Tables 6-18: 1905 transmitter link metrics and Table 6-20: 1905 receiver link metrics}}.
+      </description>
+      <parameter name="IEEE802dot1Bridge" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates whether or not the 1905 link includes one or more IEEE 802.1 bridges. If {{false}}, the 1905 link does not include an IEEE 802.1 bridge. If {{true}}, the 1905 link does include one or more IEEE 802.1 bridges.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Estimated number of lost {{units}} on the transmit side of the link {{bibref|IEEE1905.1a|Table 6-18: 1905 transmitter link metrics}} during a measurement period.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketErrorsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Estimated number of lost {{units}} on the receive side of the link {{bibref|IEEE1905.1a|Table 6-20: 1905 receiver link metrics}} during a measurement period.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedPackets" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Estimated number of {{units}} sent to the Neighbor on this {{object|##.Link}}, in the same measurement period used to estimate {{param|PacketErrors}}.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          Estimated number of {{units}} received from this Neighbor on this {{object|##.Link}} {{bibref|IEEE1905.1a|Table 6-20: 1905 receiver link metrics}}, in the same measurement period used to estimate {{param|PacketErrors}}.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="MACThroughputCapacity" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The maximum MAC throughput in {{units}} between this {{object|###.Interface}} and the Neighbor on this {{object|##.Link}} that is estimated at this {{object|###.Interface}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mb/s"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LinkAvailability" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The estimated average {{units}} of time that the {{object|##.Link}} is available for data transmissions.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+            <units value="percent"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PHYRate" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The Physical Layer (PHY) rate in {{units}} between this {{object|###.Interface}} and the Neighbor on this {{object|##.Link}} that is estimated at this {{object|###.Interface}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mb/s"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RSSI" access="readOnly" activeNotify="canDeny" dmr:version="2.9">
+        <description>
+          The estimated Received Signal Strength Indicator (RSSI) ratio in {{units}} between this {{object|###.Interface}} and the Neighbor on this {{object|##.Link}} that is estimated at the receive side of this {{object|###.Interface}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+            <units value="dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.ForwardingTable." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object represents the rules to forward PDUs between interfaces within the 1905 Abstraction Layer.
+      </description>
+      <parameter name="SetForwardingEnabled" access="readWrite" dmr:version="2.9">
+        <description>
+          Abstraction Layer ability to set, modify, and remove {{object|ForwardingRule}} entries for interfaces. Boolean can be {{true}} for "enabled" and {{false}} for "disabled".
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ForwardingRuleNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.ForwardingTable.ForwardingRule.{i}." access="readWrite" numEntriesParameter="ForwardingRuleNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        The 1905 fowarding rule for the ALME-SET-FWD-RULE.request and ALME-GET-FWD-RULES.response with classification criteria as defined in {{bibref|IEEE1905.1a|Table 5-9: ClassificationSet elements}}.
+      </description>
+      <parameter name="InterfaceList" access="readWrite" dmr:version="2.9">
+        <description>
+          The list of interfaces to which a frame satisfying the following classification criteria should be forwarded (intfAddressList parameter as defined in {{bibref|IEEE1905.1a|Table 5-8: ALME-SET-FWD-RULE.request parameters and Table 5-12: fwdRuleList elements}}). {{list}} Each list item MUST be the path name of an object, which MUST be a row of an {{object|##.Interface}} object. If the referenced item is deleted, the corresponding item MUST be removed from the list. {{noreference}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="##.Interface." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="MACDestinationAddress" access="readWrite" dmr:version="2.9">
+        <description>
+          Classification criterion.
+          The destination MAC address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MACDestinationAddressFlag" access="readWrite" dmr:version="2.9">
+        <description>
+          If {{false}}, the classification criterion {{param|MACDestinationAddress}} is ignored.  If {{true}}, the classification criterion {{param|MACDestinationAddress}} is used.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="MACSourceAddress" access="readWrite" dmr:version="2.9">
+        <description>
+          Classification criterion.
+          The source MAC address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MACSourceAddressFlag" access="readWrite" dmr:version="2.9">
+        <description>
+          If {{false}}, the classification criterion {{param|MACSourceAddress}} is ignored.  If {{true}}, the classification criterion {{param|MACSourceAddress}} is used.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="EtherType" access="readWrite" dmr:version="2.9">
+        <description>
+          Classification criterion.
+          Ether Type Field in a frame.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="EtherTypeFlag" access="readWrite" dmr:version="2.9">
+        <description>
+          If {{false}}, the classification criterion {{param|EtherType}} is ignored.  If {{true}}, the classification {{param|EtherType}} is used.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Vid" access="readWrite" dmr:version="2.9">
+        <description>
+          Classification criterion.
+          IEEE 802.1Q VLAN ID in a frame.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="4095"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="VidFlag" access="readWrite" dmr:version="2.9">
+        <description>
+          If {{false}}, the classification criterion {{param|Vid}} is ignored.  If {{true}}, the classification {{param|Vid}} is used.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PCP" access="readWrite" dmr:version="2.9">
+        <description>
+          Classification criterion.
+          IEEE 802.1Q Priority Code Point field.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="7"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PCPFlag" access="readWrite" dmr:version="2.9">
+        <description>
+          If {{false}}, the classification criterion {{param|PCP}} is ignored.  If {{true}}, the classification {{param|PCP}} is used.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object represents the 1905 Network Topology capabilities of this device.
+      </description>
+      <parameter name="Enable" access="readWrite" dmr:version="2.9">
+        <description>
+          Enables or disables the 1905 Network Topology reporting (via TR-069). When {{true}}, the device clears and (re)populates the {{object|IEEE1905Device}} and {{object|ChangeLog}} tables. When {{false}}, the contents of the {{object|IEEE1905Device}} and {{object|ChangeLog}} tables have no meaning.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.9">
+        <description>
+          When {{param|Enable}} is set to {{true}}, this parameter indicates the transient phase of the discovery of the {{object}}.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Incomplete">
+              <description>
+                Indicates that the device is populating the topology object during the transient phase.
+              </description>
+            </enumeration>
+            <enumeration value="Available">
+              <description>
+                Indicates that the transient phase is over and the device is maintaining and updating the topology object as changes occur.
+              </description>
+            </enumeration>
+            <enumeration value="Error_Misconfigured">
+              <description>
+                NOT RECOMMENDED for use; if used, indicates that a necessary configuration value is undefined or invalid.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxChangeLogEntries" access="readWrite" dmr:version="2.9">
+        <description>
+          The maximum number of entries allowed in the {{object|ChangeLog}} table.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" dmr:version="2.9">
+        <description>
+          {{reference}} If the {{object|ChangeLog}} is modified the parameter is modified to reflect the last entry added to the {{object|ChangeLog}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="ChangeLog." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IEEE1905DeviceNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ChangeLogNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.ChangeLog.{i}." access="readOnly" numEntriesParameter="ChangeLogNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        This object represents log entries for changes in the 1905 Network Topology. The Change Log is a First In First Out queue where the oldest entries (defined by values of the {{param|TimeStamp}} parameter) are deleted once the log is full.
+      </description>
+      <parameter name="TimeStamp" access="readOnly" dmr:version="2.9">
+        <description>
+          Date and Time at which the entry was added to the {{object}} table.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EventType" access="readOnly" dmr:version="2.9">
+        <description>
+          Type of event for this entry. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NewNeighbor">
+              <description>
+                Entry represents a discovery of a Neighbor.
+              </description>
+            </enumeration>
+            <enumeration value="LostNeighbor">
+              <description>
+                Entry represents the loss of a Neighbor.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ReporterDeviceId" access="readOnly" dmr:version="2.9">
+        <description>
+          1905 AL MAC Address of device which reported the change.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="ReporterInterfaceId" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of the interface of the reporting device on which the change has been detected.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="NeighborType" access="readOnly" dmr:version="2.9">
+        <description>
+          Type of Neighbor for this event. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IEEE1905"/>
+            <enumeration value="Non-IEEE1905"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NeighborId" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of the Neighbor of this event. If the value of the {{param|EventType}} parameter is {{enum|NewNeighbor|EventType}}, then the value of this parameter represents the MAC Address of the new Neighbor that joined the network; if the value of the {{param|EventType}} parameter is {{enum|LostNeighbor|EventType}}, then the value of this parameter represents the MAC Address of the Neighbor that left the network.
+          If value of the {{param|NeighborType}} parameter is {{enum|IEEE1905|NeighborType}}, then the value of this parameter is the 1905 AL MAC Address of the Neighbor.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}." access="readOnly" numEntriesParameter="IEEE1905DeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object represents an instance of discovered 1905 Devices in the network (received Topology discovery message as defined in {{bibref|IEEE1905.1a|Clause 6.3.1}}).
+      </description>
+      <uniqueKey>
+        <parameter ref="IEEE1905Id"/>
+      </uniqueKey>
+      <parameter name="IEEE1905Id" access="readOnly" dmr:version="2.9">
+        <description>
+          1905 AL MAC Address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.9">
+        <description>
+          1905 profile version number in Higher Layer Response message as defined in {{bibref|IEEE1905.1a|Table 6-37: 1905 profile version TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="1905.1"/>
+            <enumeration value="1905.1a"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RegistrarFreqBand" access="readOnly" dmr:version="2.9">
+        <description>
+          {{list}} of frequency bands identified as supported for a registrar role in an AP-autoconfiguration response message as defined in {{bibref|IEEE1905.1a|Table 6-25: SupportedFreqBand TLV}} {{enum}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <enumeration value="802.11 2.4 GHz"/>
+            <enumeration value="802.11 5 GHz"/>
+            <enumeration value="802.11 60 GHz"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="FriendlyName" access="readOnly" dmr:version="2.9">
+        <description>
+          Friendly Name String received in Higher Layer response message as defined in {{bibref|IEEE1905.1a|Table 6-30: Device Identification Type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerName" access="readOnly" dmr:version="2.9">
+        <description>
+          Manufacturer Name String received in Higher Layer response message as defined in {{bibref|IEEE1905.1a|Table 6-30: Device Identification Type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ManufacturerModel" access="readOnly" dmr:version="2.9">
+        <description>
+          Manufacturer Model String received in Higher Layer response message as defined in {{bibref|IEEE1905.1a|Table 6-30: Device Identification Type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ControlURL" access="readOnly" dmr:version="2.9">
+        <description>
+          Control URL received in Higher Layer response message as defined in defined in {{bibref|IEEE1905.1a|Table 6-31: Control URL Type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorPropertiesNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4AddressNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6AddressNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="InterfaceNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="NonIEEE1905NeighborNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="IEEE1905NeighborNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="L2NeighborNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BridgingTupleNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IPv4Address.{i}." access="readOnly" numEntriesParameter="IPv4AddressNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object represents represents all IPv4 addresses reported for a MAC address (AL or interface) in a Higher Layer response message for the IEEE1905Device as defined in {{bibref|IEEE1905.1a|Table 6-32: IPv4 type TLV}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+        <parameter ref="IPv4Address"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4Address" access="readOnly" dmr:version="2.9">
+        <description>
+          IPv4 Address.
+        </description>
+        <syntax>
+          <dataType ref="IPv4Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv4AddressType" access="readOnly" dmr:version="2.9">
+        <description>
+          The IPv4 Address Type of this {{param|IPv4Address}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Unknown"/>
+            <enumeration value="DHCP"/>
+            <enumeration value="Static"/>
+            <enumeration value="Auto-IP"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DHCPServer" access="readOnly" dmr:version="2.9">
+        <description>
+          Either IPv4 address of DHCPv4 server or IPv6 address of DHCPv6 server.
+        </description>
+        <syntax>
+          <dataType ref="IPAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IPv6Address.{i}." access="readOnly" numEntriesParameter="IPv6AddressNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object represents represents all IPv6 addresses reported for a MAC address (AL or interface) in a Higher Layer response message for the IEEE1905Device as defined in {{bibref|IEEE1905.1a|Table 6-34: IPv6 type TLV}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="MACAddress"/>
+        <parameter ref="IPv6Address"/>
+      </uniqueKey>
+      <parameter name="MACAddress" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6Address" access="readOnly" dmr:version="2.9">
+        <description>
+          IPv6 Address.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6AddressType" access="readOnly" dmr:version="2.9">
+        <description>
+          The IPv6 Address Type of this {{param|IPv6Address}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Unknown"/>
+            <enumeration value="LinkLocal"/>
+            <enumeration value="DHCP"/>
+            <enumeration value="Static"/>
+            <enumeration value="SLAAC"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="IPv6AddressOrigin" access="readOnly" dmr:version="2.9">
+        <description>
+          "::" or the IPv6 address of the origin of this IPv6 address.
+        </description>
+        <syntax>
+          <dataType ref="IPv6Address"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.VendorProperties.{i}." access="readOnly" numEntriesParameter="VendorPropertiesNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        This object represents vendor specific information received in a message with a Vendor specific TLV (as defined in in {{bibref|IEEE1905.1a|Table 6-7: Vendor specific TLV}}).
+      </description>
+      <parameter name="MessageType" access="readOnly" dmr:version="2.9">
+        <description>
+          The Message type of a message received from this IEEE1905Device that contained a Vendor specific TLV, as defined in {{bibref|IEEE1905.1a|Table 6-4: Message type}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="1" maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="OUI" access="readOnly" dmr:version="2.9">
+        <description>
+          This is the value of the Vendor specific OUI defined in {{bibref|IEEE1905.1a|Table 6-7: Vendor specific TLV}}.  {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Information" access="readOnly" dmr:version="2.9">
+        <description>
+          A hexbinary string used to provide vendor specific information. This is the value of the Vendor specific information parameter defined in {{bibref|IEEE1905.1a|Table 6-7: Vendor specific TLV}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="0" maxLength="65535"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.Interface.{i}." access="readOnly" numEntriesParameter="InterfaceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object represents an instance of an interface for the {{object|##.IEEE1905Device}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="InterfaceId"/>
+      </uniqueKey>
+      <parameter name="InterfaceId" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of the interface. This comes from the Topology response message as defined in {{bibref|IEEE1905.1a|Table 6-10: 1905 device information type TLV}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MediaType" access="readOnly" dmr:version="2.9">
+        <description>
+          Media type of this {{object}}. This comes from the Topology response message as defined in {{bibref|IEEE1905.1a|Table 6-10: 1905 device information type TLV}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="IEEE 802.3u">
+              <description>
+                IEEE 802.3u Fast Ethernet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.3ab">
+              <description>
+                IEEE 802.3ab Gigabit Ethernet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11b">
+              <description>
+                IEEE 802.11b (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11g">
+              <description>
+                IEEE 802.11g (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11a">
+              <description>
+                IEEE 802.11a (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11n 2.4">
+              <description>
+                IEEE 802.11n (2.4GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11n 5.0">
+              <description>
+                IEEE 802.11n (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11ac">
+              <description>
+                IEEE 802.11ac (5GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11ad">
+              <description>
+                IEEE 802.11ad (60GHz)
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 802.11af">
+              <description>
+                IEEE 802.11af
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 1901 Wavelet">
+              <description>
+                IEEE 1901 Wavelet
+              </description>
+            </enumeration>
+            <enumeration value="IEEE 1901 FFT">
+              <description>
+                IEEE 1901 FFT
+              </description>
+            </enumeration>
+            <enumeration value="MoCAv1.1">
+              <description>
+                MoCAv1.1
+              </description>
+            </enumeration>
+            <enumeration value="Generic PHY"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PowerState" access="readOnly" dmr:version="2.9">
+        <description>
+          The Power State of this {{object}}. "{{enum|Off}}" is used for interfaces identified in a Power Off Interface TLV as defined in {{bibref|IEEE1905.1a|Table 6-38}}. "{{enum|On}}" is used for all other interfaces. "{{enum|Power_Save}}" and "{{enum|Unsupported}}" are not used at this time. Updated as a result of a received Interface Power Change response with “request completed” or “alternate change made” Interface Power Change status as defined in {{bibref|IEEE1905.1a|Table 6-40: Interface Power Change status TLV}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="On"/>
+            <enumeration value="Power_Save"/>
+            <enumeration value="Off"/>
+            <enumeration value="Unsupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyOUI" access="readOnly" dmr:version="2.9">
+        <description>
+          {{param}} of this {{object|#.Interface}}. {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <size minLength="6" maxLength="6"/>
+            <pattern value="[0-9A-F]{6}"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyVariant" access="readOnly" dmr:version="2.9">
+        <description>
+          Variant Index of the Generic Phy networking technology of this {{object|#.Interface}}. This value is from a Generic Phy response message variant index field as defined in {{bibref|IEEE1905.1a|Table 6-29: Generic Phy device information type TLV}}.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="1" maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="GenericPhyURL" access="readOnly" dmr:version="2.9">
+        <description>
+          URL to Generic Phy XML Description of the Generic Phy networking technology of this {{object|#.Interface}}. This value is from a Generic Phy response message URL to generic phy field as defined in {{bibref|IEEE1905.1a|Table 6-29: Generic Phy device information type TLV}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NetworkMembership" access="readOnly" dmr:version="2.9">
+        <description>
+          MACAddress Field from Media specific information for an 802.11 interface provided in a Topology response message 1905 device information type TLV as defined in {{bibref|IEEE1905.1a|Table 6-13: IEEE 802.11 specific information}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Role" access="readOnly" dmr:version="2.9">
+        <description>
+          Field from Media specific information for an 802.11 interface provided in a Topology response message 1905 device information type TLV as defined in {{bibref|IEEE1905.1a|Table 6-13: IEEE 802.11 specific information}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="AP"/>
+            <enumeration value="non-AP/non-PCP STA"/>
+            <enumeration value="Wi-Fi P2P Client"/>
+            <enumeration value="Wi-Fi P2P Group Owner"/>
+            <enumeration value="802.11adPCP"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="APChannelBand" access="readOnly" dmr:version="2.9">
+        <description>
+          Hexadecimal digit. Field from Media specific information for an 802.11 interface provided in a Topology response message 1905 device information type TLV as defined in {{bibref|IEEE1905.1a|Table 6-13: IEEE 802.11 specific information}}
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="1" maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="FrequencyIndex1" access="readOnly" dmr:version="2.9">
+        <description>
+          Field from Media specific information for an 802.11 interface provided in a Topology response message 1905 device information type TLV as defined in {{bibref|IEEE1905.1a|Table 6-13: IEEE 802.11 specific information}}
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="1" maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="FrequencyIndex2" access="readOnly" dmr:version="2.9">
+        <description>
+          Field from Media specific information for an 802.11 interface provided in a Topology response message 1905 device information type TLV as defined in {{bibref|IEEE1905.1a|Table 6-13: IEEE 802.11 specific information}}
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="1" maxLength="1"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.NonIEEE1905Neighbor.{i}." access="readOnly" numEntriesParameter="NonIEEE1905NeighborNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object represents an instance of a Non-IEEE1905 Neighbor for the {{object|##.IEEE1905Device}}. These fields come from a Topology response message as defined in {{bibref|IEEE1905.1a|Table 6-14: Non-1905 neighbor device TLV}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="LocalInterface"/>
+        <parameter ref="NeighborInterfaceId"/>
+      </uniqueKey>
+      <parameter name="LocalInterface" access="readOnly" dmr:version="2.9">
+        <description>
+          {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="##.IEEE1905Device.{i}.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NeighborInterfaceId" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of the interface for the {{object}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.L2Neighbor.{i}." access="readOnly" numEntriesParameter="L2NeighborNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object represents an instance of an L2 Neighbor for the {{object|##.IEEE1905Device}}. These fields come from a Topology response message as defined in {{bibref|IEEE1905.1a|Table 6-41: L2 neighbor device TLV}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="LocalInterface"/>
+        <parameter ref="NeighborInterfaceId"/>
+      </uniqueKey>
+      <parameter name="LocalInterface" access="readOnly" dmr:version="2.9">
+        <description>
+          {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="##.IEEE1905Device.{i}.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NeighborInterfaceId" access="readOnly" dmr:version="2.9">
+        <description>
+          MAC Address of the {{object}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="BehindInterfaceIds" access="readOnly" dmr:version="2.9">
+        <description>
+          {{list}} Behind MAC Addresses of the {{object}}.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}." access="readOnly" numEntriesParameter="IEEE1905NeighborNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9">
+      <description>
+        This object represents an instance of an {{object}} for the {{object|##.IEEE1905Device}}. These values are from the Topology response message as defined in {{bibref|IEEE1905.1a|Table 6-15: 1905 neighbor device TLV}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="LocalInterface"/>
+        <parameter ref="NeighborDeviceId"/>
+      </uniqueKey>
+      <parameter name="LocalInterface" access="readOnly" dmr:version="2.9">
+        <description>
+          {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="##.IEEE1905Device.{i}.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="NeighborDeviceId" access="readOnly" dmr:version="2.9">
+        <description>
+          1905 AL MAC Address of the Neighbor.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="MetricNumberOfEntries" access="readOnly" dmr:version="2.9">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}.Metric.{i}." access="readOnly" numEntriesParameter="MetricNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        This object represents the metrics included in a Link metric response from the IEEE1905Device where {{param|#.LocalInterface}} is the MAC address of an interface in the receiving 1905 AL as defined in {{bibref|IEEE1905.1a|Table 6-17: 1905 transmitter link metric TLV}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="NeighborMACAddress"/>
+      </uniqueKey>
+      <parameter name="NeighborMACAddress" access="readOnly" dmr:version="2.9">
+        <description>
+          The MAC address of an interface in a neighbor 1905 device as defined in {{bibref|IEEE1905.1a|Table 6-17: 1905 transmitter link metric TLV or Table 6-19: 1905 receiver link metric TLV}}.
+        </description>
+        <syntax>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="IEEE802dot1Bridge" access="readOnly" dmr:version="2.9">
+        <description>
+          Indicates whether or not the 1905 link includes one or more IEEE 802.1 bridges. If {{false}}, the 1905 link does not include an IEEE 802.1 bridge. If {{true}}, the 1905 link does include one or more IEEE 802.1 bridges.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="PacketErrors" access="readOnly" dmr:version="2.9">
+        <description>
+          Estimated number of lost {{units}} on the transmit side of the link {{bibref|IEEE1905.1a|Table 6-18: 1905 transmitter link metrics}} during a measurement period.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketErrorsReceived" access="readOnly" dmr:version="2.9">
+        <description>
+          Estimated number of lost {{units}} on the receive side of the link {{bibref|IEEE1905.1a|Table 6-20: 1905 receiver link metrics}} during a measurement period.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="TransmittedPackets" access="readOnly" dmr:version="2.9">
+        <description>
+          Estimated number of {{units}} sent to the Neighbor on this link, in the same measurement period used to estimate {{param|PacketErrors}}.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="PacketsReceived" access="readOnly" dmr:version="2.9">
+        <description>
+          Estimated number of {{units}} received from this Neighbor {{bibref|IEEE1905.1a|Table 6-20: 1905 receiver link metrics}} on this link, in the same measurement period used to estimate {{param|PacketErrors}}.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32">
+            <units value="Packets"/>
+          </dataType>
+        </syntax>
+      </parameter>
+      <parameter name="MACThroughputCapacity" access="readOnly" dmr:version="2.9">
+        <description>
+          The maximum MAC throughput in {{units}} between this Interface and the Neighbor on this link that is estimated at this Interface.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mb/s"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LinkAvailability" access="readOnly" dmr:version="2.9">
+        <description>
+          The estimated average {{units}} of time that this link is idle.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="100"/>
+            <units value="percent"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PHYRate" access="readOnly" dmr:version="2.9">
+        <description>
+          The Physical Layer (PHY) rate in {{units}} between this Interface and the Neighbor on this link that is estimated at this Interface.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="Mb/s"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RSSI" access="readOnly" dmr:version="2.9">
+        <description>
+          The estimated Received Signal Strength Indicator (RSSI) ratio in {{units}} between this Interface and the Neighbor on this link that is estimated at the receive side of this Interface.  Note: This parameter is valid only for IEEE 802.11 Neighbors.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="255"/>
+            <units value="dB"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.BridgingTuple.{i}." access="readOnly" numEntriesParameter="BridgingTupleNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.9" dmr:noUniqueKeys="true">
+      <description>
+        This object represents an instance of an {{object}} for the {{object|##.IEEE1905Device}}. These values come from the 1905 Device’s Topology response message as defined in {{bibref|IEEE1905.1a|Table 6-11: Device bridging capability TLV}}.
+      </description>
+      <parameter name="InterfaceList" access="readOnly" dmr:version="2.9">
+        <description>
+          {{list}} {{reference}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="##.IEEE1905Device.{i}.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.Security." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object represents the Security configuration for the 1905 device as defined in {{bibref|IEEE1905.1a|Section 9.2 Security Setup Methods}}.
+      </description>
+      <parameter name="SetupMethod" access="readWrite" dmr:version="2.9">
+        <description>
+          {{list}} Supported security setup method(s) for the network. {{enum}}
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string>
+            <enumeration value="UCPK">
+              <description>
+                User Configured Passphrase or Key
+              </description>
+            </enumeration>
+            <enumeration value="PBC">
+              <description>
+                Push Button Configuration
+              </description>
+            </enumeration>
+            <enumeration value="NFCNK">
+              <description>
+                Near-field Communication Network Key
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.9">
+        <description>
+          1905 network passphrase for generating security keys.
+        </description>
+        <syntax hidden="true">
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.IEEE1905.AL.NetworkingRegistrar." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.9">
+      <description>
+        This object represents the detected Network Registrars detection function for the IEEE 1905 network. They are determined by received AP-autoconfiguration response messages with Registrar role, with supported band as defined in {{bibref|IEEE1905.1a|Table 6-25: SupportedFreqBand TLV}}
+      </description>
+      <parameter name="Registrar2dot4" access="readOnly" dmr:version="2.9">
+        <description>
+          {{list}} 1905 AL MAC addresses as determined by source MAC address in received AP-autoconfiguration response messages with supported frequency band of 802.11 2.4 GHz.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Registrar5" access="readOnly" dmr:version="2.9">
+        <description>
+          {{list}} 1905 AL MAC addresses as determined by source MAC address in received AP-autoconfiguration response messages with supported frequency band of 802.11 5 GHz.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+      <parameter name="Registrar60" access="readOnly" dmr:version="2.9">
+        <description>
+          {{list}} 1905 AL MAC addresses as determined by source MAC address in received AP-autoconfiguration response messages with supported frequency band of 802.11 60 GHz.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <dataType ref="MACAddress"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        MQTT Base object describing all MQTT related parameters and objects {{bibref|MQTT31}},
+      </description>
+      <parameter name="ClientNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="BrokerNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Capabilities." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        Indicates the MQTT capabilities of the device.
+      </description>
+      <parameter name="ProtocolVersionsSupported" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the supported protocol versions. {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="3.1">
+              <description>
+                Protocol according to {{bibref|MQTT31}}
+              </description>
+            </enumeration>
+            <enumeration value="3.1.1">
+              <description>
+                Protocol according to {{bibref|MQTT311}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TransportProtocolSupported" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the supported transport protocols. {{enum}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="TCP/IP"/>
+            <enumeration value="TLS"/>
+            <enumeration value="WebSocket"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MaxNumberOfClientSubscriptions" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the maximum number of subscriptions per MQTT client, which can be stored in the {{object|#.Client.{i}.Subscription}} table. A value of 0 means no limit.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxNumberOfBrokerBridges" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the maximum number of bridges, which can be configured in the {{object|#.Broker.{i}.Bridge}} table. A value of 0 means no limit.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxNumberOfBrokerBridgeSubscriptions" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the maximum number of subscriptions, which can be stored per bridge instance in the {{object|#.Broker.{i}.Bridge.{i}.Subscription}} table. A value of 0 means no limit.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Client.{i}." access="readWrite" numEntriesParameter="ClientNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        MQTT client table. Contains a list of configured MQTT clients.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          The textual name of the MQTT client.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Allows to enable or disable the MQTT client.
+          If a MQTT client gets enabled then the MQTT client has first to establish a MQTT broker session and then subscribe for all enabled topics in the {{object|Subscription.}} table. In case the {{param|CleanSession}} is set to {{false}} a subscription MUST only be sent for topics which haven't been subscribed before (see {{bibref|MQTT311|3.1.2.4}}).
+          If a connected MQTT client gets disabled ({{param|Status}} is either {{enum|Connecting|Status}} or {{enum|Connected|Status}}) then the MQTT client has to send a MQTT DISCONNECT message to disconnect from the MQTT broker ({{bibref|MQTT31|3.14}} or {{bibref|MQTT311|3.14}}), before setting the {{param|Status}} to {{enum|Disabled|Status}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the status of this MQTT client. {{enum}}
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid (e.g. The MQTT client can not use the defined port, because it is blocked)
+          The {{enum|Error_BrokerUnreachable}} value indicates that the connection to the MQTT broker could not be established.
+          The {{enum|Error}} value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Connecting"/>
+            <enumeration value="Connected"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error_BrokerUnreachable"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ClientID" access="readWrite" dmr:version="2.10">
+        <description>
+          The MQTT client identifier used in the CONNECT message (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.3.1}}). This parameter MUST NOT be {{empty}}, the CPE has to provide a default value for the parameter, which can be changed by the ACS.
+          A change of this parameter is only communicated to the MQTT broker with the next MQTT CONNECT message. If the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="1" maxLength="23"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.10">
+        <description>
+          Username used to authenticate the CPE when making a connection to the MQTT broker. {{bibref|MQTT31|3.1}} recommends that the username has 12 characters or fewer, but this is not required.
+          If this parameter is {{empty}} no authentication parameters are sent in the MQTT CONNECT message.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.10">
+        <description>
+          Password used to authenticate the CPE when making a connection to the MQTT broker (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.3.4}}).
+          This password is only sent in the MQTT CONNECT message if {{param|Username}} is not {{empty}}.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TransportProtocol" access="readWrite" dmr:version="2.10">
+        <description>
+          Indicates the transport protocol to be used for the MQTT broker connection.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="#.Capabilities.TransportProtocolSupported"/>
+          </string>
+          <default type="object" value="TCP/IP"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolVersion" access="readWrite" dmr:version="2.10">
+        <description>
+          Specifies the MQTT protocol version used in the communication with the MQTT broker.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="#.Capabilities.ProtocolVersionsSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CleanSession" access="readWrite" dmr:version="2.10">
+        <description>
+          The value of the MQTT clean session flag in the MQTT CONNECT message (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.4}}). If this flag is set to {{true}} (default), the MQTT broker will delete all subscription information after a Disconnect.
+          A change of this parameter is only effective after the next MQTT CONNECT message to the MQTT broker. If the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="MessageRetryTime" access="readWrite" dmr:version="2.10">
+        <description>
+          Message retry time in {{units}} defines the wait time before a MQTT message that expects a response (QoS value of message is &gt; 0, or PUBLISH, PUBREL, SUBSCRIBE, UNSUBSCRIBE message) is resent, because the response is not received (see {{bibref|MQTT31|4.2}} and {{bibref|MQTT311|4.4}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="5"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectRetryTime" access="readWrite" dmr:version="2.10">
+        <description>
+          Connect retry time in {{units}} defines the wait time before a failed MQTT broker connection is retried.
+          A failure can either be on the connection level (the TCP/IP or TLS can not be established) or on the Protocol level, the MQTT client does not receive a MQTT CONNACK message on a MQTT CONNECT message sent.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="30"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveTime" access="readWrite" dmr:version="2.10">
+        <description>
+          Keep Alive Time in {{units}} defines the maximum wait time after which a message has to be sent to the MQTT broker (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.10}}). If no regular messages can be sent a MQTT PINGREQ is sent.
+          A value of zero (0) means no keep alive message are sent and the MQTT client is not disconnected by the server.
+          A change of this parameter is only effective after the next MQTT CONNECT message to the MQTT broker. If the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="60"/>
+        </syntax>
+      </parameter>
+      <parameter name="BrokerAddress" access="readWrite" dmr:version="2.10">
+        <description>
+          Host name or IP address of the MQTT Broker.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BrokerPort" access="readWrite" dmr:version="2.10">
+        <description>
+          Port number of the MQTT broker.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="1883"/>
+        </syntax>
+      </parameter>
+      <parameter name="WillEnable" access="readWrite" dmr:version="2.10">
+        <description>
+          Enables or disables the will handling (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.5}}).. Changing this parameter while the MQTT client is connected will cause the client to disconnect and reconnect.
+          If the connection gets enabled and this parameter is set to {{true}} and either the parameter {{param|WillTopic}} or {{param|WillValue}} are {{empty}}, the CPE MUST set the {{param|Status}} to {{enum|Error_Misconfigured|Status}} (see {{bibref|MQTT311|3.1.2.5}}).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="WillTopic" access="readWrite" dmr:version="2.10">
+        <description>
+          The Topic sent in the Will Message (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.5}}). This parameter is only used if {{param|WillEnable}} is set to {{true}}.
+          A change of this parameter is only communicated to the MQTT broker with the next MQTT CONNECT message.
+          If the will handling is enabled (Paramter {{param|WillEnable}} is set to {{true}}) and the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="WillValue" access="readWrite" dmr:version="2.10">
+        <description>
+          The value sent in the Will Message (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.5}}). This parameter is only used if {{param|WillEnable}} is set to {{true}}.
+          A change of this parameter is only communicated to the MQTT broker with the next MQTT CONNECT message.
+          If the will handling is enabled (Paramter {{param|WillEnable}} is set to {{true}}) and the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="WillQoS" access="readWrite" dmr:version="2.10">
+        <description>
+          The MQTT QoS level assigned with the will message (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.6}}). This parameter is only used if {{param|WillEnable}} is set to {{true}}.
+          A change of this parameter is only communicated to the MQTT broker with the next MQTT CONNECT message.
+          If the will handling is enabled (Paramter {{param|WillEnable}} is set to {{true}}) and the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="2"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="WillRetain" access="readWrite" dmr:version="2.10">
+        <description>
+          Indicate to the MQTT broker to retain the Will over a Disconnect (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.7}}). This parameter is only used if {{param|WillEnable}} is set to {{true}}.
+          A change of this parameter is only communicated to the MQTT broker with the next MQTT CONNECT message.
+          If the will handling is enabled (Paramter {{param|WillEnable}} is set to {{true}}) and the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SubscriptionNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <command name="ForceReconnect()" dmr:version="2.12">
+        <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 name="Device.MQTT.Client.{i}.Subscription.{i}." access="readWrite" numEntriesParameter="SubscriptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        List of MQTT subscriptions handled by the MQTT client.
+        The MQTT client MUST subscribe with the MQTT broker for all subscription instances, whose parameter {{param|Enable}} is set to {{true}}, when it establishes a new connection to the MQTT broker. Disabled subscription instances with {{param|Enable}} set to {{false}} will be ignored during connection establishment.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Topic"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Setting Enable to {{true}} means the topic is subscribed at the MQTT broker with a MQTT SUBSCRIBE message, setting it to {{false}} will unsubscribe the topic from the MQTT broker with a MQTT UNSUBSCRIBE message. If the MQTT client is already connected with the Broker ({{param|#.Status}} is {{enum|Connected|#.Status}}), the MQTT SUBSCRIBE or UNSUBSCRIBE message is sent directly, otherwise it is sent after the next successful connect.
+          The actual status of the subscription is indicated with {{param|Status}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the status of this subscription. {{enum}}
+          The {{enum|Subscribed}} value indicates that the topic was successfully subscribed with the MQTT broker, the MQTT client received the SUBACK message for this topic from the server.
+          The {{enum|Subscribing}} value MAY be used by the CPE to indicate that the a SUBSCRIBE message for this topic was sent, and the CPE is waiting for a SUBACK message.
+          The {{enum|Unsubscribed}} value indicates that the topic is not reqistered with the MQTT broker.
+          The {{enum|Unsubscribing}} value MAY be used by the CPE to indicate that the an UNSUBSCRIBE message for this topic was sent, and the CPE is waiting for an UNSUBACK message.
+          If the {{param|Enable}} is set to {{false}} the status MUST be either {{enum|Unsubscribed}} or if the unsubscription failed {{enum|Error}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Unsubscribed"/>
+            <enumeration value="Subscribed"/>
+            <enumeration value="Subscribing" optional="true"/>
+            <enumeration value="Unsubscribing" optional="true"/>
+            <enumeration value="Error"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Topic" access="readWrite" dmr:version="2.10">
+        <description>
+          Name of the subscribed topic. Topic names may contain wildcards according to the rules specified in {{bibref|MQTT31|Appendix A}} and {{bibref|MQTT311|4.7}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="65535"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="QoS" access="readWrite" dmr:version="2.10">
+        <description>
+          The MQTT QoS level assigned with the subscription (see {{bibref|MQTT31|4.1}} and {{bibref|MQTT311|4.3}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="2"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Client.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        Contains the MQTT client statistics and usage information.
+        The CPE MUST reset the Stats parameters after the MQTT client gets (re-)enabled or if the MQTT client connects with a new MQTT broker (e.g. {{param|#.BrokerAddress}} has changed). The CPE MAY retain the values across a reboot if it reconnects with the same MQTT broker.
+      </description>
+      <parameter name="BrokerConnectionEstablished" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Time when the MQTT broker connection was established.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LastPublishMessageSent" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Time when the last publish message was sent to the MQTT broker.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LastPublishMessageReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Time when the last publish message was received from the MQTT broker.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="PublishSent" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of publish messages sent to the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PublishReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of publish messages received from to the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="SubscribeSent" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of subscribe messages sent to the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="UnSubscribeSent" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of unsubscribe messages sent to the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MQTTMessagesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Total number of MQTT messages sent to the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MQTTMessagesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Total number of MQTT messages received from the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of connection errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="PublishErrors" access="readOnly" dmr:version="2.10">
+        <description>
+          Number of errors which prevented sending publish messages.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Broker.{i}." access="readWrite" numEntriesParameter="BrokerNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        MQTT broker table. Contains a list of configured MQTT brokers.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          The textual name of the MQTT broker.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Allows to enable or disable the MQTT broker.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the status of the MQTT broker.  {{enum}}
+          The "{{enum|Error_Misconfigured}}" value indicates that a necessary configuration value is undefined or invalid.
+          The "{{enum|Error}}" value MAY be used by the CPE to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Enabled"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.10">
+        <description>
+          Port used by the MQTT Broker.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="1883"/>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.10">
+        <description>
+          If {{empty}} is specified, the CPE MUST bind the MQTT broker to all available interfaces.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent=".IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.10">
+        <description>
+          Username used to authenticate the MQTT clients, which connect to the MQTT broker.
+          If this parameter is {{empty}} no authentication is used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.10">
+        <description>
+          Password used used to authenticate the MQTT clients, which connect to the MQTT broker.
+          This password is only used if {{param|Username}} is not {{empty}}.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BridgeNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Broker.{i}.Bridge.{i}." access="readWrite" numEntriesParameter="BridgeNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        Configures MQTT bridges, which are used to communicate with other MQTT brokers.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          The textual name of the MQTT bridge used for identification.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Allows to enable or disable the MQTT Bridge.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the status of this MQTT Bridge. {{enum}}
+          The {{enum|Disabled}} value indicates that the MQTT bridge is not in service; parameter {{param|Enable}} is set to {{false}}.
+          The {{enum|Connecting}} value indicates that the MQTT bridge is currently established.
+          The {{enum|Connected}} value indicates that the MQTT bridge is currently active.
+          The {{enum|Error_Misconfigured}} value indicates that a necessary configuration value is undefined or invalid (e.g. No active Server entry, the MQTT broker can not use the defined bridge port, because it is blocked)
+          The {{enum|Error_BrokerUnreachable}} value indicates that the MQTT bridge connection to the remote MQTT broker could not be established.
+          The {{enum|Error}} value MAY be used to indicate a locally defined error condition.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled"/>
+            <enumeration value="Connecting"/>
+            <enumeration value="Connected"/>
+            <enumeration value="Enabled" status="deleted"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error_BrokerUnreachable"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ClientID" access="readWrite" dmr:version="2.10">
+        <description>
+          The MQTT client identifier used in the CONNECT message (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.3.1}}). This parameter MUST NOT be {{empty}}, the CPE has to provide a default value for the parameter, which may be changed by the ACS.
+          A change of this parameter is only communicated to the remote MQTT broker with the next MQTT CONNECT message. If the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="1" maxLength="23"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.10">
+        <description>
+          Username used to authenticate the MQTT broker when making a connection over the MQTT bridge (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.3.4}}). {{bibref|MQTT31|3.1}} recommends that the username has 12 characters or fewer, but this is not required.
+          If this parameter is {{empty}} no authentication parameters are sent in the MQTT CONNECT message.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.10">
+        <description>
+          Password used to authenticate the MQTT broker when making a connection over the MQTT bridge (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.3.4}}).
+          The password is only sent if {{param|Username}} is not {{empty}}.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TransportProtocol" access="readWrite" dmr:version="2.10">
+        <description>
+          Indicates the transport protocol to be used for the MQTT bridge connection.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="##.Capabilities.TransportProtocolSupported"/>
+          </string>
+          <default type="object" value="TCP/IP"/>
+        </syntax>
+      </parameter>
+      <parameter name="ProtocolVersion" access="readWrite" dmr:version="2.10">
+        <description>
+          Specifies the MQTT protocol version used in the MQTT bridge connection.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="##.Capabilities.ProtocolVersionsSupported"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CleanSession" access="readWrite" dmr:version="2.10">
+        <description>
+          The value of the MQTT clean session flag in the MQTT bridge connection (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.4}}). If this flag is set to {{true}} (default), the remote MQTT broker will delete all subscription information after a Disconnect.
+          A change of this parameter is only effective after the next MQTT CONNECT message to the remote MQTT broker. If the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="MessageRetryTime" access="readWrite" dmr:version="2.10">
+        <description>
+          Message retry time in {{units}} defines the wait time before a MQTT message that expects a response (QoS value of message is &gt; 0, or PUBLISH, PUBREL, SUBSCRIBE, UNSUBSCRIBE message) is resent, because the response is not received (see {{bibref|MQTT31|4.2}} and {{bibref|MQTT311|4.4}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="5"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectRetryTime" access="readWrite" dmr:version="2.10">
+        <description>
+          Connect retry time in {{units}} defines the wait time before a failed bridge connection is retried.
+          A failure can either be on the connection level (e.g. the TCP/IP or TLS conection can not be established) or on the Protocol level, the MQTT client does not receive a MQTT CONNACK message on a MQTT CONNECT message sent.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="30"/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveTime" access="readWrite" dmr:version="2.10">
+        <description>
+          Keep Alive Time in {{units}} defines the maximum wait time after which a message has to be sent to the remote MQTT broker (see {{bibref|MQTT31|3.1}} and {{bibref|MQTT311|3.1.2.10}}). If no regular messages can be sent a MQTT PINGREQ is sent.
+          A value of zero (0) means no keep alive message are sent and the bridge is not disconnected by the server.
+          A change of this parameter is only effective after the next MQTT CONNECT message to the remote MQTT broker. If the change needs to be applied immediately, the parameter {{param|ForceReconnect}} has to be set as well.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="60"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerSelectionAlgorithm" access="readWrite" dmr:version="2.10">
+        <description>
+          The algorithm used to select a server entry from the {{object|Server}} table
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Priority">
+              <description>
+                Select the server from the {{object|Server.}} table according to the sequence defined with the {{param|Server.{i}.Priority}} and {{param|Server.{i}.Weight}} values.
+              </description>
+            </enumeration>
+            <enumeration value="RoundRobin">
+              <description>
+                Select the servers round robin.
+              </description>
+            </enumeration>
+            <enumeration value="Random">
+              <description>
+                Select the servers randomly.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServerConnection" access="readOnly" dmr:version="2.10">
+        <description>
+          {{reference|the {{object|Server.}} instance that is used for this {{object}}, while the {{param|Status}} is {{enum|Connecting|Status}} or {{enum|Connected|Status}}. If the MQTT bridge is not connected the value MUST be an empty string}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.Bridge.{i}.Server." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServerNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SubscriptionNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <command name="ForceReconnect()" dmr:version="2.12">
+        <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 name="Device.MQTT.Broker.{i}.Bridge.{i}.Server.{i}." access="readWrite" numEntriesParameter="ServerNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10">
+      <description>
+        Each {{object}} instance represents a MQTT bridge server to be used for a {{object|##.Bridge}}. A remote MQTT broker, which is connected by a MQTT bridge can be reachable via several host addresses each represented by its own {{object}} table entry. For an active MQTT bridge at least one enabled entry has to exist.
+        If a MQTT bridge gets enabled by setting the parameter {{param|##.Bridge.{i}.Enable}} to {{true}}, which either has an empty {{object}} table or the {{object}} table only contains instances whose {{param|Enable}} is set to {{false}}, the {{param|##.Bridge.{i}.Status}} has to be set to {{enum|Error_Misconfigured|##.Bridge.{i}.Status}}.
+        Any attempt to delete an instance, which is currently in use ({{param|##.Bridge.{i}.ServerConnection}} refers to the instance to be deleted), has to be rejected.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Address"/>
+        <parameter ref="Port"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Enables or disables this {{object}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Priority" access="readWrite" dmr:version="2.10">
+        <description>
+          The priority of this {{object}} that is used by the {{object|##.Bridge}} when determining the {{object}} to connect to. The {{object|##.Bridge}} MUST contact the {{object}} with the lowest-numbered priority that the {{object|##.Bridge}} can reach as defined in {{bibref|RFC2782}}. The selection of {{object}}s with the same {{param}} value utilizes the {{param|Weight}} parameter to determine which {{object}} is selected by the {{object|##.Bridge}}.
+          This value is only used if {{param|##.Bridge.{i}.ServerSelectionAlgorithm}} is set to {{enum|Priority|##.Bridge.{i}.ServerSelectionAlgorithm}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Weight" access="readWrite" dmr:version="2.10">
+        <description>
+          This parameter specifies a relative weight for entries with the same {{param|Priority}}. The mechanism is defined in {{bibref|RFC2782}}. A value of -1 indicates that the implementation of this parameter is specific to the Vendor.
+          This value is only used if {{param|##.Bridge.{i}.ServerSelectionAlgorithm}} is set to {{enum|Priority|##.Bridge.{i}.ServerSelectionAlgorithm}}.
+        </description>
+        <syntax>
+          <long>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </long>
+        </syntax>
+      </parameter>
+      <parameter name="Address" access="readWrite" dmr:version="2.10">
+        <description>
+          Fully Qualified Domain Name (FQDN) or IP address of the MQTT broker server this {{object|##.Bridge}} connects to.
+          If the value of this parameter is a FQDN that resolves to multiple addresses then each address SHOULD be attempted (in an implementation-specific order) until a connection can be made or all addresses are exhausted, in which case the next {{object}} instance (based on rules defined over the selected {{param|##.Bridge.{i}.ServerSelectionAlgorithm}}) SHOULD be used.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.10">
+        <description>
+          Port number of the MQTT broker server this {{object|##.Bridge}} connects to.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="1883"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Broker.{i}.Bridge.{i}.Subscription.{i}." access="readWrite" numEntriesParameter="SubscriptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10">
+      <description>
+        List of MQTT subscriptions handled over the bridge.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Topic"/>
+        <parameter ref="Direction"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Setting Enable to {{true}} activates the handling of this subscription instance. In case of incoming directions ({{param|Direction}} is either {{enum|in|Direction}} or {{enum|both|Direction}}) the topic is subscribed over the bridge at the remote MQTT broker with a MQTT SUBSCRIBE message if {{param}} is set to {{true}} or unsubscribed from the remote MQTT broker with a MQTT UNSUBSCRIBE message if the value is set to {{false}}.
+          The actual status of the subscription is indicated with {{param|Status}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the status of this subscription. {{enum}}
+          The {{enum|Enabled}} value indicates that the this subscription is active. In case of incoming directions ({{param|Direction}} is either {{enum|in|Direction}} or {{enum|both|Direction}}) the topic was successfully subscribed with the remote MQTT broker.
+          The {{enum|Disabled}} value indicates that this subscription is not used.
+          The {{enum|Error}} value indicates that an error occured (e.g. an subscription could not be made with the remote MQTT broker) and the subscription is not in use.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Enabled"/>
+            <enumeration value="Disabled"/>
+            <enumeration value="Error"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Topic" access="readWrite" dmr:version="2.10">
+        <description>
+          Name of the subscribed topic. Topic names may contain wildcards according to the rules specified in {{bibref|MQTT31|Appendix A}} and {{bibref|MQTT311|4.7}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="65535"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Direction" access="readWrite" dmr:version="2.10">
+        <description>
+          The direction of the subscription. {{enum}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="out">
+              <description>
+                Indicates that all matching topics will be sent over the bridge to the next MQTT broker.
+              </description>
+            </enumeration>
+            <enumeration value="in">
+              <description>
+                Indicates that all matching topics will be received over the bridge from the next MQTT broker.
+              </description>
+            </enumeration>
+            <enumeration value="both">
+              <description>
+                Indicates that all matching topics will be sent and received over the bridge.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="QoS" access="readWrite" dmr:version="2.10">
+        <description>
+          The MQTT QoS level assigned with the subscription (see {{bibref|MQTT31|4.1}} and {{bibref|MQTT311|4.3}}).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="2"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="LocalPrefix" access="readWrite" dmr:version="2.10">
+        <description>
+          The local prefix is used for remapping received topics to the local topics of the MQTT broker and to select the topics to be sent over bridge to the remote MQTT broker.
+          * In incoming direction ({{param|Direction}} is either {{enum|in|Direction}} or {{enum|both|Direction}}):
+          : For remote topics received over the bridge the MQTT broker adds the LocalPrefix in front of the received topic, before processing it.
+          :: '' ''
+          : ''Example:''
+          :: Topic is "/bus/+", LocalPrefix is "/local", Direction is "in"
+          :: MQTT broker receives message with topic "/bus/tr181" over bridge =&gt; MQTT broker uses topic "/local/bus/tr181" for internal processing
+          * In outgoing direction ({{param|Direction}} is either {{enum|out|Direction}} or {{enum|both|Direction}}):
+          : For selection of the topics to be sent over the bridge the MQTT broker uses the combination of {{param}} and {{param|Topic}} to match the topics to be sent over bridge, and removes the {{param}} from the selected topic before sending it over the bridge.
+          :: '' ''
+          : ''Example:''
+          :: Topic is "/bus/+", LocalPrefix is "/local", Direction is "out"
+          :: MQTT broker receives message with topic "/local/bus/tr181" from a MQTT client =&gt; MQTT broker sends topic "/bus/tr181" to remote MQTT broker
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="RemotePrefix" access="readWrite" dmr:version="2.10">
+        <description>
+          The remote prefix is used for remapping topics to the remote MQTT broker topic lists.
+          * In incoming direction ({{param|Direction}} is either {{enum|in|Direction}} or {{enum|both|Direction}}):
+          : For remote topics received over the bridge the MQTT broker removes the remote prefix topic from the received topic (before handling the {{param|LocalPrefix}}), before processing it.
+          :: '' ''
+          : ''Example:''
+          :: Topic is "/bus/+", LocalPrefix is "/local", RemotePrefix is "/remote", Direction is "in"
+          :: MQTT broker receives message with topic "/remote/bus/tr181" over bridge =&gt; MQTT broker uses topic "/local/bus/tr181" for internal processing
+          : During activation of the bridge, the MQTT broker prepends the {{param|Topic}} with {{param}} topic and subscribes to the remote MQTT broker with it, in order to receive all applicable remote topics.
+          :: '' ''
+          : ''Example:''
+          :: Topic is "/bus/+", RemotePrefix is "/remote", Direction is "in"
+          :: MQTT broker sends a subscription to the remote MQTT broker with the topic "/remote/bus/+".
+          * In outgoing direction ({{param|Direction}} is either {{enum|out|Direction}} or {{enum|both|Direction}}):
+          : For all topics to be sent over the bridge ({{param|Direction}} is either {{enum|out|Direction}} or {{enum|both|Direction}}), the RemotePrefix will be prepended to the topic after the {{param|LocalPrefix}} has been processed and before sending the message over the bridge.
+          :: '' ''
+          : ''Example:''
+          :: Topic is "/bus/+", LocalPrefix is "/local", RemotePrefix is "/remote" Direction is "out"
+          :: MQTT broker receives message with topic "/local/bus/tr181" from a MQTT client =&gt; MQTT broker sends topic "/remote/bus/tr181" to remote MQTT broker
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.MQTT.Broker.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10" dmr:fixedObject="true">
+      <description>
+        The MQTT broker statistics values. These will reset with each MQTT broker start, either after reboot or if the MQTT broker gets (re-)enabled.
+      </description>
+      <parameter name="TotalNumberOfClients" access="readOnly" dmr:version="2.10">
+        <description>
+          Total number of MQTT clients registered with the MQTT broker.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfActiveClients" access="readOnly" dmr:version="2.10">
+        <description>
+          Number of MQTT clients, which have a connection with the MQTT broker established.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="NumberOfInactiveClients" access="readOnly" dmr:version="2.10">
+        <description>
+          Number of MQTT clients, which have no connection with the MQTT broker established.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Subscriptions" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of subscriptions held by the MQTT broker.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="PublishSent" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of publish messages sent by the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="PublishReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of publish messages received by the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MQTTMessagesSent" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Total number of MQTT messages sent by the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="MQTTMessagesReceived" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Total number of MQTT messages received by the MQTT broker.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter64"/>
+        </syntax>
+      </parameter>
+      <parameter name="ConnectionErrors" access="readOnly" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          Number of connection errors.
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+      <parameter name="PublishErrors" access="readOnly" dmr:version="2.10">
+        <description>
+          Number of errors which prevented sending publish messages
+        </description>
+        <syntax>
+          <dataType ref="StatsCounter32"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DynamicDNS." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.10">
+      <description>
+        Properties for Dynamic DNS.
+      </description>
+      <parameter name="ClientNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedServices" access="readOnly" dmr:version="2.10">
+        <description>
+          List of Dynamic DNS service names that are supported by the CPE.
+        </description>
+        <syntax>
+          <list>
+            <size maxLength="1024"/>
+          </list>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DynamicDNS.Client.{i}." access="readWrite" numEntriesParameter="ClientNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10">
+      <description>
+        Client properties for Dynamic DNS.
+        A dynamic DNS client is responsible for verifying IP address changes and updating information from a subscribed account on a Dynamic DNS Server.
+        For enabled table entries, if {{param|Server}} is not a valid reference then the table entry is inoperable and the CPE MUST set the {{param|Status}} to {{enum|Error_Misconfigured|Status}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="Server"/>
+        <parameter ref="Username"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Enables or disables this Dynamic DNS Client.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.10">
+        <description>
+          Status of this Dynamic DNS Client.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Connecting">
+              <description>
+                The Dynamic DNS Client is trying to connect to the Server.
+              </description>
+            </enumeration>
+            <enumeration value="Authenticating">
+              <description>
+                The Dynamic DNS Client is in the authentication phase.
+              </description>
+            </enumeration>
+            <enumeration value="Updated">
+              <description>
+                The Dynamic DNS Client has performed an update request since the last IP address change.
+              </description>
+            </enumeration>
+            <enumeration value="Error_Misconfigured">
+              <description>
+                Error due to configuration.
+              </description>
+            </enumeration>
+            <enumeration value="Error">
+              <description>
+                An error has occurred during the communication with the Server. The {{param|LastError}} parameter is updated with the detail of this error.
+              </description>
+            </enumeration>
+            <enumeration value="Disabled">
+              <description>
+                The Client is disabled.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="LastError" access="readOnly" dmr:version="2.10">
+        <description>
+          The last error this Dynamic DNS Client has encountered.
+          The parameter MAY instead indicate a vendor-specific cause, which MUST use the format defined in {{bibref|TR-106}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NO_ERROR"/>
+            <enumeration value="MISCONFIGURATION_ERROR"/>
+            <enumeration value="DNS_ERROR"/>
+            <enumeration value="CONNECTION_ERROR"/>
+            <enumeration value="AUTHENTICATION_ERROR"/>
+            <enumeration value="TIMEOUT_ERROR"/>
+            <enumeration value="PROTOCOL_ERROR"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Server" access="readWrite" dmr:version="2.10">
+        <description>
+          The DynamicDNS server associated with this Dynamic DNS Client.
+          {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="Device.DynamicDNS.Server." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.10">
+        <description>
+          The IP interface over which update queries to the server are sent.
+          {{reference}}
+          If an empty string is specified, the CPE MUST use its routing policy (Forwarding table entries), to determine the appropriate interface.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <pathRef refType="strong" targetParent="Device.IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.10">
+        <description>
+          Username used by this Dynamic DNS Client to authenticate with the Server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.10">
+        <description>
+          Password used by this Dynamic DNS Client to authenticate with the Server.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="HostnameNumberOfEntries" access="readOnly" dmr:version="2.10">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DynamicDNS.Client.{i}.Hostname.{i}." access="readWrite" numEntriesParameter="HostnameNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10">
+      <description>
+        Each table entry represents a fully qualified domain name updated by this Dynamic DNS Client.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Enables or disables this Hostname.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.10">
+        <description>
+          Status of this Hostname.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Registered">
+              <description>
+                The Hostname has been updated with the current IP address.
+              </description>
+            </enumeration>
+            <enumeration value="UpdateNeeded">
+              <description>
+                The IP address has changed since last update.
+              </description>
+            </enumeration>
+            <enumeration value="Updating">
+              <description>
+                The Client is trying to update this Hostname.
+              </description>
+            </enumeration>
+            <enumeration value="Error">
+              <description>
+                The Hostname doesn't exist for this Dynamic DNS account.
+              </description>
+            </enumeration>
+            <enumeration value="Disabled">
+              <description>
+                The Hostname is disabled.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          Fully qualified domain name that has to be updated with the IP address.
+          If the name is set to another value, the Client MUST immediately send an update request to the Server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastUpdate" access="readOnly" dmr:version="2.10">
+        <description>
+          The date time of the last successful update of this name to the Dynamic DNS Server.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.DynamicDNS.Server.{i}." access="readWrite" numEntriesParameter="ServerNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.10">
+      <description>
+        Table of Dynamic DNS servers available for this CPE.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.10">
+        <description>
+          Enables or disables Dynamic DNS Server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.10">
+        <description>
+          The textual name of the Dynamic DNS Server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.10">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServiceName" access="readWrite" dmr:version="2.10">
+        <description>
+          Dynamic DNS service used to contact this server.
+          {{reference}}
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+            <enumerationRef targetParam="Device.DynamicDNS.SupportedServices"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServerAddress" access="readWrite" dmr:version="2.10">
+        <description>
+          Host name or IP address of the Dynamic DNS server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ServerPort" access="readWrite" dmr:version="2.10">
+        <description>
+          Port number of the Dynamic DNS server.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="0" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedProtocols" access="readOnly" dmr:version="2.10">
+        <description>
+          Indicates the protocols that are supported by the CPE for sending requests to the Dynamic DNS server. {{list}} This list depends on the Dynamic DNS service defined by the {{param|ServiceName}} parameter.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <enumeration value="HTTP">
+              <description>
+                As defined in {{bibref|RFC2616}}
+              </description>
+            </enumeration>
+            <enumeration value="HTTPS">
+              <description>
+                As defined in {{bibref|RFC2818}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.10">
+        <description>
+          Indicates the protocol used to send requests to the Dynamic DNS server.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="SupportedProtocols"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CheckInterval" access="readWrite" dmr:version="2.10">
+        <description>
+          Interval (in {{units}}) between two checks for IP change.
+          A value of zero indicates that the CPE knows when IP changes and doesn’t need to check it periodically.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="RetryInterval" access="readWrite" dmr:version="2.10">
+        <description>
+          Initial retry interval (in {{units}}) after a failed request. This parameter can be used as a fixed value or as part of a retry interval calculation.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MaxRetries" access="readWrite" dmr:version="2.10">
+        <description>
+          Maximum number of retries after a failed request. When the maximum number is reached, no further requests are sent until the context changes.
+          A value of 0 means that there are no retries after a failed request.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LEDs." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object describes the LEDs on the device.
+      </description>
+      <parameter name="LEDNumberOfEntries" access="readOnly" dmr:version="2.11">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LEDs.LED.{i}." access="readOnly" numEntriesParameter="LEDNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.11">
+      <description>
+        Each instance of this object describes an LED on the device.
+        The default illumination characteristics (e.g., Color, Brightness) of an in use LED is vendor specific. When a cycle completes (i.e., {{param|CyclePeriodRepetitions}} = 0), the LED reverts back to its default illumination characteristics.
+        When the value of the {{param|Status}} parameter is {{enum|Controlled|Status}}, then the value of {{param|CycleElementNumberOfEntries}} and {{param|CycleElementNumberOfEntries}} parameters SHOULD be 0.
+        When the value of the {{param|RelativeXPosition}} and {{param|RelativeYPosition}} parameters are 0, this indicates that the position of the LED is unknown.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.11">
+        <description>
+          The internal name used to identify this LED.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.11">
+        <description>
+          The status of the LED.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Disabled">
+              <description>
+                The LED is currently not in use.
+              </description>
+            </enumeration>
+            <enumeration value="InUse">
+              <description>
+                The LED is currently being used by the CPE.
+              </description>
+            </enumeration>
+            <enumeration value="Controlled">
+              <description>
+                Indicates that the LED is controlled from an electronic circuit which cannot be monitored.
+              </description>
+            </enumeration>
+            <enumeration value="Error">
+              <description>
+                The LED status cannot be determined by the CPE.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Reason" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The textual purpose that represents the visual display of the LED (e.g., Broadband Down).
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="CyclePeriodRepetitions" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The number of cycle periods left for this LED. As each cycle period is completed this parameter is reduced by 1. A value of -1 indicates an infinite number of cycle period repetitions.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Location" access="readOnly" dmr:version="2.11">
+        <description>
+          The location of the LED as the user looks at the front of the device in its typical orientation (e.g., on-end, flat).
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Front"/>
+            <enumeration value="Back"/>
+            <enumeration value="Left"/>
+            <enumeration value="Right"/>
+            <enumeration value="Top"/>
+            <enumeration value="Bottom"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="RelativeXPosition" access="readOnly" dmr:version="2.11">
+        <description>
+          The relative x position of the LED from left to right (x) and top to bottom (y) as the user looks at the device from the orientation identified in the {{param|Location}} parameter in its typical orientation (e.g., on-end, flat).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RelativeYPosition" access="readOnly" dmr:version="2.11">
+        <description>
+          The relative y position of the LED from left to right (x) and top to bottom (y) as the user looks at the device from the orientation identified in the {{param|Location}} parameter in its typical orientation (e.g., on-end, flat).
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CycleElementNumberOfEntries" access="readOnly" dmr:version="2.11">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LEDs.LED.{i}.CycleElement.{i}." access="readWrite" numEntriesParameter="CycleElementNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.11">
+      <description>
+        Each instance of this object describes the LED characteristics for a portion of the LED cycle period.
+        The pattern of lighting for the LED corresponding to this table (i.e., the LED cycle period) is defined by the illumination of the LED according to the entries in this table, taken sequentially in the order specified by the {{param|Order}} parameter, with the duration for the portion of the LED illumination corresponding to a given instance specified by the {{param|Duration}} parameter.
+        The other parameters of the instance of this object (e.g., Color, Brightness) describes the illumination characteristics applied to the LED for this {{object}} instance.
+        The length of the complete LED cycle is the sum of the Duration parameters for all of the entries in this table.
+      </description>
+      <uniqueKey>
+        <parameter ref="Order"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.11">
+        <description>
+          Enables or disables this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.11">
+        <description>
+          The relative order of this {{object}} in the LED's cycle period.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Color" access="readWrite" dmr:version="2.11">
+        <description>
+          The color being displayed by the LED RGB hexadecimal notation (e.g., FF0088).
+          Note: If the parameter is set to an unsupported color the CPE MUST NOT infer a different color.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="Duration" access="readWrite" dmr:version="2.11">
+        <description>
+          The duration, in {{units}}, for this element of the cycle period.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="FadeInterval" access="readWrite" dmr:version="2.11">
+        <description>
+          The interval corresponding to this {{object}} instance, in {{units}}, from the starting from the target illumination characteristics of the previous {{object}} instance to the target illumination characteristics of this {{object}} instance.
+          The transition to the target illumination characteristics is uniformly interpolated "perceptually" over the value of this {{param}} parameter.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LEDs.LED.{i}.CurrentCycleElement." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.11">
+      <description>
+        This object describes the status of the current cycle element for this LED.
+      </description>
+      <parameter name="CycleElementReference" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          This object describes the current properties of the {{object|#.CycleElement.{i}}} object instance that is currently active.
+          {{reference}} If the LED instances does not have a current cycle element active, this parameter MUST be set to {{empty}}.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.CycleElement." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Color" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The color, formatted as RGB hexadecimal notation (e.g., FF0088), that is currently being displayed by the LED.
+        </description>
+        <syntax>
+          <hexBinary>
+            <size minLength="3" maxLength="3"/>
+          </hexBinary>
+        </syntax>
+      </parameter>
+      <parameter name="Duration" access="readOnly" activeNotify="canDeny" dmr:version="2.11">
+        <description>
+          The remaining duration, in {{units}}, for this element of the cycle period.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BASAPM." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object represents the objects necessary to manage and control the functionality for tests that utilize the Broadband Access Service Attributes and Performance Metrics measurement test framework as defined in by {{bibref|TR-304}}.
+      </description>
+      <parameter name="MeasurementEndpointNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BASAPM.MeasurementEndpoint.{i}." access="readWrite" numEntriesParameter="MeasurementEndpointNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents the measurement endpoint that provides additional contextual information regarding the measurement agent.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="MeasurementAgent"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="MeasurementAgent" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|##.LMAP.MeasurementAgent}} object that is associated with this measurement endpoint.}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="##.LMAP.MeasurementAgent." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DeviceOwnership" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter describes the ownership of the device that hosts the measurement endpoint.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="ISP">
+              <description>
+                ISP Owned Device
+              </description>
+            </enumeration>
+            <enumeration value="Customer">
+              <description>
+                Customer Owned Device
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="OperationalDomain" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter describes the operational domain for this measurement endpoint
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InternetDomain" access="readWrite" dmr:version="2.12">
+        <description>
+          The top level Internet domain used to identify this measurement endpoint.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UseMeasurementEndpointInReports" access="readWrite" dmr:version="2.12">
+        <description>
+          If the value of this parameter is {{false}} then the Measurement Endpoint MUST not be included in measurement reports.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BASAPM.MeasurementEndpoint.{i}.ISPDevice." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object represents the information necessary to utilize an ISP owned device within the measurement endpoint.
+      </description>
+      <parameter name="ReferencePoint" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter describes the measurement reference point of the measurement endpoint.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="STP">
+              <description>
+                Internet Source Test Point
+              </description>
+            </enumeration>
+            <enumeration value="IDTP">
+              <description>
+                Internet Drain Test Point
+              </description>
+            </enumeration>
+            <enumeration value="RNTP">
+              <description>
+                Regional Network Test Point
+              </description>
+            </enumeration>
+            <enumeration value="IRTP">
+              <description>
+                Internal Regional Test Point
+              </description>
+            </enumeration>
+            <enumeration value="MTP">
+              <description>
+                Metro Test Point
+              </description>
+            </enumeration>
+            <enumeration value="IATP">
+              <description>
+                Internal Access Test Point
+              </description>
+            </enumeration>
+            <enumeration value="UNITP">
+              <description>
+                User Network Interface Test Point
+              </description>
+            </enumeration>
+            <enumeration value="CEDTP">
+              <description>
+                Customer End Device Test Point
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="GeographicalLocation" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|###.DeviceInfo.Location}} object that describes the geographic location of the measurement endpoint}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="###.DeviceInfo.Location." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.BASAPM.MeasurementEndpoint.{i}.CustomerDevice." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object represents the information necessary to utilize customer owned device within the measurement endpoint.
+      </description>
+      <parameter name="EquipmentIdentifier" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter describes the customer equipment identifier of the measurement endpoint.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="CustomerIdentifier" access="readWrite" dmr:version="2.12">
+        <description>
+          The unique customer identifier within the operational domain for this measurement endpoint.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object represents the objects necessary to manage and control the functionality for Large-Scale Measurement of Broadband Performance{{bibref|RFC7594}} as defined in by {{bibref|LMAPIFM}}.
+      </description>
+      <parameter name="MeasurementAgentNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ReportNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="EventNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}." access="readWrite" numEntriesParameter="MeasurementAgentNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents the measurement agent that performs measurement tasks and reporting functions defined in {{bibref|RFC7594}}.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Identifier"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.12">
+        <description>
+          Version of the measurement agent.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="LastStarted" access="readOnly" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, in UTC that the measurement agent was successfully started.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="CapabilityTags" access="readOnly" dmr:version="2.12">
+        <description>
+          Capabilities of the measurement agent that cannot be expressed elsewhere in the data model.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Identifier" access="readWrite" dmr:version="2.12">
+        <description>
+          Identifier of the {{object}} instance.
+        </description>
+        <syntax>
+          <dataType ref="UUID"/>
+        </syntax>
+      </parameter>
+      <parameter name="GroupIdentifier" access="readWrite" dmr:version="2.12">
+        <description>
+          Identifier of the measurement group of interest to which the measurement agent belongs.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MeasurementPoint" access="readWrite" dmr:version="2.12">
+        <description>
+          Identifier of the measurement point indicating where the measurement agent is located on a path as defined in [bibref|RFC7398}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UseAgentIdentifierInReports" access="readWrite" dmr:version="2.12">
+        <description>
+          If the value of the {{param|Identifier}} parameter is not {{empty}} and the value of this parameter is {{false}} then the value of the {{param|Identifier}} parameter MUST not be included in measurement reports.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+      <parameter name="UseGroupIdentifierInReports" access="readWrite" dmr:version="2.12">
+        <description>
+          If the value of the {{param|GroupIdentifier}} parameter is not {{empty}} and the value of this parameter is {{false}} then the value of the {{param|GroupIdentifier}} parameter MUST not be included in measurement reports.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="UseMeasurementPointInReports" access="readWrite" dmr:version="2.12">
+        <description>
+          If the value of the {{param|MeasurementPoint}} parameter is not {{empty}} and the value of this parameter is {{false}} then the value of the {{param|MeasurementPoint}} parameter MUST not be included in measurement reports.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="PublicCredential" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|##.Security.Certificate}} object that is used to identify this measurement agent}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="##.Security.Certificate." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PrivateCredential" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|##.Security.Certificate}} object that is used to contain the private keys for this measurement agent}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="##.Security.Certificate." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EventLog" access="readOnly" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|##.DeviceInfo.VendorLogFile}} object that is used to record events for this measurement agent}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="##.DeviceInfo.VendorLogFile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TaskCapabilityNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="TaskNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CommunicationChannelNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="InstructionNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.TaskCapability.{i}." access="readOnly" numEntriesParameter="TaskCapabilityNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents a capabilities, in the context of a task, that are supported by the measurement agent. Types of capabilities include: Report tasks, Configuration Tasks and Instruction Tasks.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Name" access="readOnly" dmr:version="2.12">
+        <description>
+          Name of the supported task.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.12">
+        <description>
+          Version of the task.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TaskCapabilityRegistryNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.TaskCapability.{i}.Registry.{i}." access="readOnly" numEntriesParameter="TaskCapabilityRegistryNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents a registry function and an associated list of roles supported by this measurement agent
+      </description>
+      <uniqueKey>
+        <parameter ref="RegistryEntry"/>
+      </uniqueKey>
+      <parameter name="RegistryEntry" access="readOnly" dmr:version="2.12">
+        <description>
+          A URI ({{bibref|RFC3986}}) that is the value of the task registry entry as defined in {{bibref|LMAPREG}} or a value for a task that is understood by the measurement agent, measurement controller and measurement collector.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Roles" access="readOnly" dmr:version="2.12">
+        <description>
+          {{list| representing the roles of the function}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Controller." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This objects represents the measurement controller that is assigned to a measurement agent.
+      </description>
+      <parameter name="ControllerTimeout" access="readWrite" dmr:version="2.12">
+        <description>
+          The timer, in {{units}}, that is started after each successful contact with a measurement controller.
+          When the timer reaches the timeout en event is raised indicating that connectivity to the controller has been lost.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="0"/>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ControlSchedules" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|a {{object|#.Schedule}} object}}
+          This parameter lists the available control schedules for invoking control tasks by the measurement agent.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.Schedule." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ControlTasks" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|a {{object|#.Task}} object}}
+          This parameter lists the available control tasks that can be invoked by the measurement agent.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.Task." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ControlChannels" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|a {{object|#.CommunicationChannel}} object}}
+          The measurement agent to measurement controller channel is used for conveying results of communication sessions with the configuration, instruction status and logging information elements defined in defined in {{bibref|LMAPIFM}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.CommunicationChannel." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}." access="readWrite" numEntriesParameter="ScheduleNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents a schedule that is associated with a set of scheduled actions to be performed by a measurement agent.
+        Note: Actions of an occurrence of this {{object}} are gracefully terminated by the defining either the {{param|End}} or {{param|Duration}} parameters. Only one of these parameters may be defined at a time.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.12">
+        <description>
+          Name of the schedule.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="State" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the Schedule. Only one instance of the schedule is active. An active schedule is defined where the {{param}} parameter has a value of {{enum|Running|State}}.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Enabled"/>
+            <enumeration value="Suppressed"/>
+            <enumeration value="Disabled"/>
+            <enumeration value="Running"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Start" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|##.Event}} object that is used define the event to start an occurrence of this {{object}}}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="##.Event." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="End" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|##.Event}} object that is used define the event to gracefully terminate all actions associated with an occurrence of this {{object}}}}.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="##.Event." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Duration" access="readWrite" dmr:version="2.12">
+        <description>
+          When the {{param}} value is not 0, this parameter is used define the duration, in {{units}}, where after this duration all actions associated with an occurrence of this {{object}} are gracefully terminated.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Tags" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|each entry represents tags that are to be reported together with the measurement results.}}
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SuppressionTags" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|representing the suppression tags to be matched}}
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutionMode" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter describes the execution method to apply to this schedule for the associated Actions.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Sequential">
+              <description>
+                 Actions are executed in sequence as defined by the value of the {{param|Action.{i}.Order}} parameter.
+                The first Scheduled Action of the DestinationOutput is provided the input.
+              </description>
+            </enumeration>
+            <enumeration value="Parallel">
+              <description>
+                Actions are executed in parallel.
+                The all Scheduled Actions of the DestinationOutput are provided the input.
+              </description>
+            </enumeration>
+            <enumeration value="Pipelined">
+              <description>
+                Actions are executed in sequence where the output of one Action is used as the input of subsequent Action.
+                The first Scheduled Action of the DestinationOutput is provided the input.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Pipelined"/>
+        </syntax>
+      </parameter>
+      <parameter name="LastInvocation" access="readOnly" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, in UTC that the {{object}} was invoked by the measurement agent.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="Storage" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The amount of secondary storage, in {{units}}, allocated to an instance of this {{object}}.
+          The value of this parameter reflects the amount of allocated physical storage and not the storage used by logical data records.
+          For example the secondary storage can be the storage allocated in a file system holding temporary data.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="bytes"/>
+          </unsignedLong>
+        </syntax>
+      </parameter>
+      <parameter name="ActionNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object represents the statistics associated with this object.
+      </description>
+      <parameter name="Invocations" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of invocations of this schedule. This counter does not include suppressed invocations or invocations that were prevented due to an overlap with a previous invocation of this schedule.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="Suppressions" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of suppressed executions of this schedule.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="Overlaps" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of executions prevented due to overlaps with a previous invocation of this schedule.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="Failures" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of failed executions of this schedule. A failed execution is an execution where at least one action failed.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}." access="readWrite" numEntriesParameter="ActionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents an action that is associated with the this {{object|##.Schedule}} object.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object|##.Schedule.{i}.Action}} object.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="State" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the {{object}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Enabled"/>
+            <enumeration value="Suppressed"/>
+            <enumeration value="Disabled"/>
+            <enumeration value="Running"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.12">
+        <description>
+          The order of the scheduled action.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Task" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|##.Task}} object used in this scheduled action}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="##.Task." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="OutputDestination" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|a {{object|##.Schedule}} object used to receive the output(s) of this scheduled action}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="##.Schedule." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SuppressionTags" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|representing the suppression tags to be matched}}
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Tags" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|each entry represents tags that are to be reported together with the measurement results.}}
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Storage" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          The amount of secondary storage, in {{units}}, allocated to an instance of this {{object}}.
+          The value of this parameter reflects the amount of allocated physical storage and not the storage used by logical data records.
+          For example the secondary storage can be the storage allocated in a file system holding temporary data.
+        </description>
+        <syntax>
+          <unsignedLong>
+            <units value="bytes"/>
+          </unsignedLong>
+        </syntax>
+      </parameter>
+      <parameter name="LastInvocation" access="readOnly" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, in UTC that the {{object}} was invoked by the measurement agent.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LastSuccessfulCompletion" access="readOnly" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, in UTC of a successful completion of the {{object}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LastSuccessfulStatusCode" access="readOnly" dmr:version="2.12">
+        <description>
+          The status code returned by successful execution of the {{object}}. A value of 0 indicates successful completion.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="LastSuccessfulMessage" access="readOnly" dmr:version="2.12">
+        <description>
+          The message associated with the successful completion of the {{object}}.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="LastFailedCompletion" access="readOnly" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, in UTC of a failure to complete the {{object}}.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="LastFailedStatusCode" access="readOnly" dmr:version="2.12">
+        <description>
+          The status code returned by failed execution of the {{object}}. A value of 0 indicates successful completion.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="LastFailedMessage" access="readOnly" dmr:version="2.12">
+        <description>
+          The message associated with the failure to complete the task.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}.Stats." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object represents the statistics associated with this object.
+      </description>
+      <parameter name="Invocations" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of invocations of this action. This counter does not include suppressed invocations or invocations that were prevented due to an overlap with a previous invocation of this schedule.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="Suppressions" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of suppressed executions of this action.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="Overlaps" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of executions prevented due to overlaps with a previous invocation of this action.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+      <parameter name="Failures" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Number of failed executions of this action. A failed execution is an execution where at least one action failed.
+        </description>
+        <syntax>
+          <unsignedLong/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}.Option.{i}." access="readWrite" numEntriesParameter="OptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents an option associated with the Scheduled Action. When an option with the same Name exists between the Seheduled Action's Option and The Task's option, the option of the Scheduled Action takes precedence over the option associated with the Task.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.12">
+        <description>
+          The order of the Option.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.12">
+        <description>
+          The name of the option.
+          When the value of this parameter is equal to "channel", the option value specifies the Communication Channel used for this scheduled task.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.12">
+        <description>
+          The value associated with the Option.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Task.{i}." access="readWrite" numEntriesParameter="TaskNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        The {{object}} object defines the configuration for a task that can be performed by {{object|##.MeasurementAgent}} objects.
+        Tasks are performed by {{object|##.MeasurementAgent}} objects when a {{object|#.Schedule}} object invokes the Task.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.12">
+        <description>
+          Name of the task.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Tags" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|each entry represents tags that are to be reported together with the measurement results.}}
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RegistryNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Task.{i}.Registry.{i}." access="readWrite" numEntriesParameter="RegistryNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents a registry function and an associated list of roles for this task
+      </description>
+      <uniqueKey>
+        <parameter ref="RegistryEntry"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="RegistryEntry" access="readWrite" dmr:version="2.12">
+        <description>
+          A URI ({{bibref|RFC3986}}) that is the value of the task registry entry as defined in {{bibref|LMAPREG}} or a value for a task that is understood by the measurement agent, measurement controller and measurement collector.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Roles" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list| representing the roles of the function}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Task.{i}.Option.{i}." access="readWrite" numEntriesParameter="OptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents an option associated with the task.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.12">
+        <description>
+          The order of the Option.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.12">
+        <description>
+          The name of the option.
+          When the value of this parameter is equal to "channel", the option value specifies the Communication Channel used for this task.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.12">
+        <description>
+          The value associated with the Option.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.CommunicationChannel.{i}." access="readWrite" numEntriesParameter="CommunicationChannelNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents the properties communication channel used to establish communication between a measurement agent and other elements of the LMAP framework (e.g., measurement controller, measurement collector). The value of the {{param|Name}} parameter used for conveying information is defined as an option in the Task's or scheduled Task's option parameter.
+        When this object uses the BulkData capability, a {{object|###.BulkData.Profile.{i}}} object instance referred to by this object.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.12">
+        <description>
+          Name of the channel.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UseBulkDataProfile" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables the ability to use a bulk data profile for this communication channel
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="BulkDataProfile" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|###.BulkData.Profile}} object that is used to represent communication channel}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="###.BulkData.Profile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Target" access="readWrite" dmr:version="2.12">
+        <description>
+          The URL of the LMAP component that is the target of this communication channel.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TargetPublicCredential" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|###.Security.Certificate}} object that is used to identify the target of this channel}}
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="###.Security.Certificate." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Interface" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|an interface object used to restrict the data transmitted or received using this channel to a specific interface}} If the value of this parameter is {{empty}} the data that is transmitted or received using this channel is able to use any available interface.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Instruction.{i}." access="readWrite" numEntriesParameter="InstructionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        The {{object}} object defines the instruction to the measurement agent by the measurement controller. At most one {{object}} object for the {{object|##.MeasurementAgent}} instance is enabled at a time. .
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="LastChange" access="readOnly" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, in UTC that the {{object}} object or its sub-object's configuration was changed by a measurement agent's controller.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="InstructionSchedules" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|a {{object|#.Schedule}} object}}
+          This parameter lists the available instruction schedules for invoking control tasks by the measurement agent.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.Schedule." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InstructionTasks" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|a {{object|#.Task}} object}}
+          This parameter lists the available instruction tasks that can be invoked by the measurement agent.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.Task." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ReportChannels" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list}} {{reference|a {{object|#.CommunicationChannel}} object}}
+          This parameter defines the corresponding report channels to be used when reporting results of tasks to a measurement collector.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.CommunicationChannel." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="MeasurementSuppressionNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.MeasurementAgent.{i}.Instruction.{i}.MeasurementSuppression.{i}." access="readWrite" numEntriesParameter="MeasurementSuppressionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object defines the schedules and actions that are suppressed based on criteria defined in the {{param|SuppressionMatch}} parameter.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.12">
+        <description>
+          Name of the suppression object.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="State" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the {{object}}. {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Enabled"/>
+            <enumeration value="Active"/>
+            <enumeration value="Disabled"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="StopRunning" access="readWrite" dmr:version="2.12">
+        <description>
+          When {{true}}, the measurement agent is instructed to stop running schedules or actions that have been matched by this object.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Start" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|###.Event}} object that is used define the event that to start an occurrence of this {{object}}}} When {{empty}} the default behavior is to perform the suspension event immediately.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="###.Event." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="End" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|a {{object|###.Event}} object that is used define the event to gracefully suspend all actions associated with an occurrence of this {{object}}}} When {{empty}} the default behavior is for the suspension period to be indefinite.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="###.Event." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="SuppressionMatch" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|representing the match patterns to be used for applying suppression to {{object|##.Schedule.{i}}} (and their actions) and all {{object|##.Schedule.{i}.Action.{i}}} object instances that have a matched using their SuppressionTags parameters}} The match pattern syntax is defined in {{bibref|LMAPIFM}}.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Report.{i}." access="readOnly" numEntriesParameter="ReportNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12" dmr:noUniqueKeys="true">
+      <description>
+        This {{object}} object instance represents a report that is generated by a reporting task where the reporting task is defined as a {{object|#.MeasurementAgent.{i}.Task.{i}}} and executed as a scheduled action ({{object|#.MeasurementAgent.{i}.Schedule.{i}.Action.{i}}}).
+        The {{object}} replicates the {{object|#.MeasurementAgent.{i}}} object instance's data at the time of the action exection.
+        When a {{object|##.BulkData.Profile.{i}}} object instance is used to communicate a {{object}} instance, the CPE adds a {{object|##.BulkData.Profile.{i}.Parameter.{i}}} object instance referring to this {{object}} object instance.
+      </description>
+      <parameter name="ReportDate" access="readOnly" dmr:version="2.12">
+        <description>
+          The report date and time, based on {{bibref|RFC3339}}, that the report was sent to the collector.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="AgentIdentifier" access="readOnly" dmr:version="2.12">
+        <description>
+          Identifier of the measurement agent at the time the measurement was run.
+        </description>
+        <syntax>
+          <dataType ref="UUID"/>
+        </syntax>
+      </parameter>
+      <parameter name="GroupIdentifier" access="readOnly" dmr:version="2.12">
+        <description>
+          Identifier of the measurement group of interest to which the MA belongs.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="MeasurementPoint" access="readOnly" dmr:version="2.12">
+        <description>
+          Identifier of the measurement point indicating where the measurement agent is located on a path as defined in {{bibref|RFC7398}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ResultNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Report.{i}.Result.{i}." access="readOnly" numEntriesParameter="ResultNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12" dmr:noUniqueKeys="true">
+      <description>
+        The {{object}} object provides the meta-data of the result report of a single executed action that produced the result.
+      </description>
+      <uniqueKey>
+        <parameter ref="ScheduleName"/>
+        <parameter ref="ActionName"/>
+        <parameter ref="StartTime"/>
+      </uniqueKey>
+      <parameter name="TaskName" access="readOnly" dmr:version="2.12">
+        <description>
+          Name of the task that produced the result.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleName" access="readOnly" dmr:version="2.12">
+        <description>
+          Name of the schedule that produced the result.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ActionName" access="readOnly" dmr:version="2.12">
+        <description>
+          Name of the action that produced the result.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="EventTime" access="readOnly" dmr:version="2.12">
+        <description>
+          The date and time, based on {{bibref|RFC3339}}, that the event that triggered the schedule of the action that produced the reported result values in UTC.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="StartTime" access="readOnly" dmr:version="2.12">
+        <description>
+          The date and time, based on {{bibref|RFC3339}}, that the action started in UTC.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EndTime" access="readOnly" dmr:version="2.12">
+        <description>
+          The date and time, based on {{bibref|RFC3339}}, that the action was completed in UTC.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="CycleNumber" access="readOnly" dmr:version="2.12">
+        <description>
+          The cycle number derived from the {{param|EventTime}}.
+          The cycle number is the time, in UTC, closest to the {{param|EventTime}} that is a multiple of the cycle interval of the event that triggered the execution of the schedule.
+          The value is valid if the event that triggered the execution of the schedule has a defined cycle interval. An {{empty}} value represent an invalid CycleNumber.
+          {{pattern}}
+        </description>
+        <syntax>
+          <string>
+            <pattern value="YYYYMMDD.HHMMSS"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The status code returned by the execution of the action.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="Tags" access="readOnly" dmr:version="2.12">
+        <description>
+          {{list|each entry represents tags defined for the schedule, task and action objects that produced this result}}
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="OptionNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ResultConflictNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ResultReportTableNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Report.{i}.Result.{i}.Option.{i}." access="readOnly" numEntriesParameter="OptionNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents an option associated with the task or action object that produced the result.
+      </description>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Order" access="readOnly" dmr:version="2.12">
+        <description>
+          The order of the Option.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.12">
+        <description>
+          The name of the Option.
+          When the value of this parameter is equal to "channel", the option value specifies the Communication Channel used for this task.
+        </description>
+        <syntax>
+          <int/>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readOnly" dmr:version="2.12">
+        <description>
+          The value associated with the Option.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Report.{i}.Result.{i}.Conflict.{i}." access="readOnly" numEntriesParameter="ResultConflictNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents actions that might have impacted the results being reported.
+      </description>
+      <uniqueKey>
+        <parameter ref="ScheduleName"/>
+        <parameter ref="ActionName"/>
+        <parameter ref="TaskName"/>
+      </uniqueKey>
+      <parameter name="TaskName" access="readOnly" dmr:version="2.12">
+        <description>
+          Name of the task.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleName" access="readOnly" dmr:version="2.12">
+        <description>
+          Name of the schedule.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ActionName" access="readOnly" dmr:version="2.12">
+        <description>
+          Name of the action.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Report.{i}.Result.{i}.ReportTable.{i}." access="readOnly" numEntriesParameter="ResultReportTableNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12" dmr:noUniqueKeys="true">
+      <description>
+        This {{object}} object instances represents a row of results.
+      </description>
+      <parameter name="ColumnLabels" access="readOnly" dmr:version="2.12">
+        <description>
+          {{list}} This parameter contains the column labels used for the result.
+          The column labels are ordered with the corresponding entries in the {{object|ResultRow}} table.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ResultReportRowNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RegistryNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Report.{i}.Result.{i}.ReportTable.{i}.ResultRow.{i}." access="readOnly" numEntriesParameter="ResultReportRowNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12" dmr:noUniqueKeys="true">
+      <description>
+        This {{object}} object instances represents a row of results for the report.
+      </description>
+      <parameter name="Values" access="readOnly" dmr:version="2.12">
+        <description>
+          {{list}} This parameter contains an ordered set of values that align to the columns defined in the {{param|#.ColumnLabels}} parameter.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Report.{i}.Result.{i}.ReportTable.{i}.Registry.{i}." access="readOnly" numEntriesParameter="RegistryNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object represents a registry function and an associated list of roles for this result report.
+      </description>
+      <uniqueKey>
+        <parameter ref="RegistryEntry"/>
+      </uniqueKey>
+      <parameter name="RegistryEntry" access="readOnly" dmr:version="2.12">
+        <description>
+          A URI ({{bibref|RFC3986}}) that is the value of the registry entry as defined in {{bibref|LMAPREG}} or a value for a task that is understood by the measurement agent, measurement controller and measurement collector.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Roles" access="readOnly" dmr:version="2.12">
+        <description>
+          {{list| representing the roles of the function}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Event.{i}." access="readWrite" numEntriesParameter="EventNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This object defines the information associated with an event used within the measurement agent. Event instances may be referenced by various objects within the LMAP model.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}} instance.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.12">
+        <description>
+          Name of the Event.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter describes the type of {{object}} for this object instance. The timing of the event occurrence is adjusted based on the value of the {{param|RandomnessSpread}} parameter.
+          {{enum}}
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="PeriodicTiming">
+              <description>
+                Periodic Timing Event. When selected one or more event occurrences are emitted based on the parameters defined in the {{object|PeriodicTimer}} object.
+              </description>
+            </enumeration>
+            <enumeration value="CalendarTiming">
+              <description>
+                Calendar Timing Event. When selected one or more event occurrences are emitted based on the parameters defined in the {{object|CalendarTimer}} object.
+              </description>
+            </enumeration>
+            <enumeration value="OneOffTiming">
+              <description>
+                One-off Timing Event. When selected a single event occurrence is emitted based on the parameters defined in the {{object|OneOff}} object.
+              </description>
+            </enumeration>
+            <enumeration value="Immediate">
+              <description>
+                Immediate Timing Event. When selected a single event occurrence is emitted as soon as possible.
+              </description>
+            </enumeration>
+            <enumeration value="Startup">
+              <description>
+                Startup Timing Event. When selected a single event occurrence is emitted when the corresponding measurement agent starts up.
+              </description>
+            </enumeration>
+            <enumeration value="ControllerLost">
+              <description>
+                Controller Lost Event. When selected a single event occurrence is emitted when the connectivity to the controller is lost.
+              </description>
+            </enumeration>
+            <enumeration value="ControllerConnected">
+              <description>
+                Controller Connected Event. When selected a single event occurrence is emitted when the connectivity to the controller is established.
+              </description>
+            </enumeration>
+          </string>
+          <default type="object" value="Immediate"/>
+        </syntax>
+      </parameter>
+      <parameter name="RandomnessSpread" access="readWrite" dmr:version="2.12">
+        <description>
+          The spread, in {{units}}, of the Uniform Discrete random distribution algorithm. A value of 0 means that the random algorithm is not applied.
+        </description>
+        <syntax>
+          <int>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="CycleInterval" access="readWrite" dmr:version="2.12">
+        <description>
+          The duration of the time interval, in {{units}}, that used to calculate cycle numbers.
+        </description>
+        <syntax>
+          <int>
+            <units value="seconds"/>
+          </int>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Event.{i}.PeriodicTimer." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object defines a periodic timer instance. The periodic timer instance has attributes for when the timer is to begin ({{param|StartTime}}) and end ({{param|EndTime}}) as well as the interval to use.
+      </description>
+      <parameter name="StartTime" access="readWrite" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, that the {{object}} instance is to begin operation.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EndTime" access="readWrite" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, that the {{object}} instance is to end operation.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="Interval" access="readWrite" dmr:version="2.12">
+        <description>
+          The tolerable duration, in {{units}}, of the interval for this {{object}} instance.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Event.{i}.CalendarTimer." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object defines a calendar timer instance.
+        The calendar timer instance has attributes for when the timer is to begin ({{param|StartTime}}) and end ({{param|EndTime}}) as well as the schedule of the recurrence.
+        The algrorithm that defines how the schedule elements are evaluated is defined in {{bibref|LMAPIFM}}.
+        If the value of any of the {{param|ScheduleMonths}}, {{param|ScheduleDaysOfMonth}}, {{param|ScheduleDaysOfWeek}}, {{param|ScheduleHoursOfDay}}, {{param|ScheduleMinutesOfHour}} or {{param|ScheduleSecondsOfMinute}} is {{empty}} then any actions that use this object will not be invoked.
+      </description>
+      <parameter name="StartTime" access="readWrite" dmr:version="2.12">
+        <description>
+          Date and time that the {{object}} instance is to begin this operation.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="EndTime" access="readWrite" dmr:version="2.12">
+        <description>
+          Date and time that the {{object}} instance is to end this operation.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleMonths" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter represents either a list of the months of year that are applied to the schedule or an asterisk (*) that represents all the elements of the list.
+          Each entry in the months of the year list can be a numeric value or the name of the month (january (1), february (2), march (3), april (4), may (5), june (6), july (7), august (8), september (9), october (10), november (11), december (12)).
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleDaysOfMonth" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter represents either a list of the days of the month (1-31) that are applied to the schedule or an asterisk (*) that represents all the elements of the list.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleDaysOfWeek" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter represents either a list of the days of the week that are applied to the schedule or an asterisk (*) that represents all the elements of the list.
+          Each entry in the days of the week list can be a numeric value or the name of the day (sunday (1), monday (2), tuesday (3), wednesday (4), thursday (5), friday (6), saturday (7)).
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleHoursOfDay" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter represents either a list of the hours of the day (0-23) that are applied to the schedule or an asterisk (*) that represents all the elements of the list.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleMinutesOfHour" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter represents either a list of the minutes of the hour (0-59) that are applied to the schedule or an asterisk (*) that represents all the elements of the list.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleSecondsOfMinute" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter represents either a list of the minutes of the hour (0-59) that are applied to the schedule or an asterisk (*) that represents all the elements of the list.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="EnableScheduleTimezoneOffset" access="readWrite" dmr:version="2.12">
+        <description>
+          When {{true}}, the value of the {{param|ScheduleTimezoneOffset}} parameter is applied to the schedule elements.
+          When {{false}}, the device's system timezone offset is applied to the schedule elements.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="ScheduleTimezoneOffset" access="readWrite" dmr:version="2.12">
+        <description>
+          The timezone offset, in {{units}}, to be applied to the schedule elements.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-23" maxInclusive="23"/>
+            <units value="hours"/>
+          </int>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LMAP.Event.{i}.OneOff." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object defines a one off timer instance.
+      </description>
+      <parameter name="StartTime" access="readWrite" dmr:version="2.12">
+        <description>
+          Date and time, based on {{bibref|RFC3339}}, that the {{object}} instance is to begin operation.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LocalAgent." access="readOnly" minEntries="1" maxEntries="1" dmr: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>
+      <parameter name="EndpointID" access="readOnly" dmr:version="2.12">
+        <description>
+          The unique USP identifier for this USP Agent.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="SoftwareVersion" access="readOnly" dmr:version="2.12">
+        <description>
+          The current USP Agent software version; not the version of the overall device firmware, which is located in {{param|.DeviceInfo.SoftwareVersion}}.
+          To allow version comparisons, this element SHOULD be in the form of dot-delimited integers, where each successive integer represents  a more minor category of variation.  For example, ''3.0.21'' where the components mean: ''Major.Minor.Build''.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="UpTime" access="readOnly" activeNotify="canDeny" dmr:version="2.12">
+        <description>
+          Time in {{units}} since the USP Agent was last restarted (either via a reset of the software or reboot of the underlying device).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <event name="Periodic!" dmr:version="2.12">
+        <description>
+          Periodic event configured via the recipient Controller's {{param|Controller.{i}.PeriodicNotifInterval}} and {{param|Controller.{i}.PeriodicNotifTime}} parameters.
+        </description>
+      </event>
+      <event name="WakeUp!" dmr:version="2.12">
+        <description>
+          Wake-up event.
+        </description>
+      </event>
+      <event name="TransferComplete!" dmr:version="2.12">
+        <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" dmr:version="2.12">
+          <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" dmr:version="2.12">
+          <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" dmr:version="2.12">
+          <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" dmr:version="2.12">
+          <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" dmr:version="2.12">
+          <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" dmr:version="2.12">
+          <description>
+            The URL from or to which this transfer was performed, or {{empty}} if no such URL is available.
+          </description>
+          <syntax>
+            <string>
+              <size maxLength="1024"/>
+            </string>
+            <default type="parameter" value=""/>
+          </syntax>
+        </parameter>
+        <parameter name="StartTime" dmr:version="2.12">
+          <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" dmr:version="2.12">
+          <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" dmr:version="2.12">
+          <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" dmr:version="2.12">
+          <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>
+      </event>
+      <command name="AddCertificate()" dmr:version="2.12">
+        <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 dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Alias" dmr:version="2.12">
+            <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 commmand will fail.
+            </description>
+            <syntax>
+              <dataType ref="Alias"/>
+            </syntax>
+          </parameter>
+          <parameter name="Certificate" mandatory="true" dmr:version="2.12">
+            <description>
+              The X.509 certificate in Privacy-enhanced Electronic Mail (PEM) format.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="65535"/>
+              </string>
+            </syntax>
+          </parameter>
+        </input>
+      </command>
+      <parameter name="SupportedProtocols" access="readOnly" dmr:version="2.12">
+        <description>
+          USP Message Transfer Protocols supported by this USP Agent.  The USP Agent MUST support at least one Protocol.
+        </description>
+        <syntax>
+          <list minItems="1"/>
+          <string>
+            <enumeration value="CoAP">
+              <description>
+                See {{bibref|RFC7252}}
+              </description>
+            </enumeration>
+            <enumeration value="WebSocket">
+              <description>
+                See {{bibref|RFC6455}}
+              </description>
+            </enumeration>
+            <enumeration value="STOMP">
+              <description>
+                See {{bibref|STOMP1.2}}
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="SupportedFingerprintAlgorithms" access="readOnly" dmr:version="2.12">
+        <description>
+          {{list|each entry is an algorithm for calculating firgerprints that is supported by the Agent}}
+        </description>
+        <syntax>
+          <list/>
+          <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="AdvertisedDeviceSubtypes" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|each entry is a subtype component of the service type that is advertised for the device using mDNS as defined in {{bibref|RFC6762}}}}
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="MaxSubscriptionChangeAdoptionTime" access="readWrite" dmr:version="2.12">
+        <description>
+          The acceptable amount of time in {{units}} between the alteration of the Agent's Subscriptions (e.g. updated subscription, new subscription, removed subscription, etc.) and the notifications related to those subscriptions being delivered.
+          For example, if this parameter is set to 30 {{units}}, then once a Subscription has been updated, the Agent has 30 {{units}} before it needs to start delivering notifications based on the updated version of the Subscription (instead of the old version of the Subscription).
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="5"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="MTPNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ControllerNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SubscriptionNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="RequestNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CertificateNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LocalAgent.MTP.{i}." access="readWrite" numEntriesParameter="MTPNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        Each instance of this table represents a MTP used by the local Agent.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enable/Disable this {{object}} instance.
+          If this {{object}} instance is to be disabled and currently used for communication with the requesting controller, the agent has to send the request response first, before disabling it.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of the {{object}} instance.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Down">
+              <description>
+                Value when this {{object}} instance cannot establish communication.
+              </description>
+            </enumeration>
+            <enumeration value="Error" optional="true">
+              <description>
+                Value when this {{object}} instance is misconfigured.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.12">
+        <description>
+          The Message Transport Protocol (MTP) to be used for communications by a USP Endpoint.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="Device.LocalAgent.SupportedProtocols"/>
+          </string>
+          <default type="object" value="CoAP"/>
+        </syntax>
+      </parameter>
+      <parameter name="EnableMDNS" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter, when {{true}}, enables the advertisement of DNS-SD services defined for this {{object}} instance using mDNS as defined in {{bibref|RFC6762}}.
+          This parameter cannot be set to {{true}} if there are multiple {{object}} instances with the same value of the {{param|Protocol}} parameter.
+          When {{true}}, the hostname advertised in the SRV record MUST be a Fully Qualified Domain Name (FQDN).
+          The interfaces that advertise these DNS-SD services are restriced to the set of interfaces associated with this {{object}} instance and the interfaces defined by the {{param|##.DNS.SD.AdvertisedInterfaces}} parameter.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LocalAgent.MTP.{i}.CoAP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        If the USP Endpoint uses the CoAP Message Transport Protocol (MTP), then this object contains CoAP specific configuration parameters.
+      </description>
+      <parameter name="Interfaces" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|the {{object|###.IP.Interface}} object instance that this server will use as its host address to receive USP messages}}
+          {{empty}} will bind this server to all interfaces for this device.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="###.IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.12">
+        <description>
+          The port number used by the CoAP Server to receive USP messages.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="5683"/>
+        </syntax>
+      </parameter>
+      <parameter name="Path" access="readWrite" dmr:version="2.12">
+        <description>
+          The path that is used by the CoAP Server in order to receive USP messages.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="IsEncrypted" access="readOnly" dmr:version="2.12">
+        <description>
+          This parameter represents whether or not communications that utilize this {{object}} object instance are encrypted.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="EnableEncryption" access="readWrite" dmr:version="2.12">
+        <description>
+          When {{true}}, encryption is used for this MTP instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LocalAgent.MTP.{i}.STOMP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        If the USP Endpoint uses the STOMP Message Transport Protocol (MTP), then this object contains STOMP Client specific configuration parameters related to how the Agent communicates with the STOMP Server.
+      </description>
+      <parameter name="Reference" access="readWrite" dmr:version="2.12">
+        <description>
+          A reference to the STOMP Connection used by this Agent when communicating via the STOMP MTP.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".STOMP.Connection." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Destination" access="readWrite" dmr:version="2.12">
+        <description>
+          The STOMP destination where the Agent will be listening to incoming USP messages.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="DestinationFromServer" access="readOnly" dmr:version="2.12">
+        <description>
+          The STOMP destination contained in the subscribe-dest header of the CONNECTED STOMP Frame.
+          If the Agent doesn't receive a subscribe-dest header in the CONNECTED STOMP Frame, then the value of this Parameter is {{empty}}.
+          If this parameter's value is not empty then this is the STOMP destination address for this Agent, but if the value is empty the {{param|Destination}} Parameter contains the STOMP destination address for this Agent.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LocalAgent.MTP.{i}.WebSocket." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        If the USP Endpoint uses the WebSocket Message Transport Protocol (MTP) as a WebSocket server, then this object contains WebSocket specific configuration parameters.
+      </description>
+      <parameter name="Interfaces" access="readWrite" dmr:version="2.12">
+        <description>
+          {{reference|the {{object|###.IP.Interface}} object instance that this server will use as its host address to receive USP messages}}
+          {{empty}} will bind this server to all interfaces for this device.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="###.IP.Interface." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.12">
+        <description>
+          The port number used by the WebSocket Server to receive USP messages.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="5683"/>
+        </syntax>
+      </parameter>
+      <parameter name="Path" access="readWrite" dmr:version="2.12">
+        <description>
+          The path that is used by the WebSocket Server in order to receive USP messages.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LocalAgent.Controller.{i}." access="readWrite" numEntriesParameter="ControllerNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        Each instance of this table represents a USP Controller that has access to this USP Agent.
+      </description>
+      <uniqueKey>
+        <parameter ref="EndpointID"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="EndpointID" access="readWrite" dmr:version="2.12">
+        <description>
+          The unique USP identifier for this USP Controller.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ControllerCode" access="readWrite" dmr:version="2.12">
+        <description>
+          Information about the configuration state of an Agent as it pertains to the {{object}} instance.  This is not information related to an operator's installation or usage of the protocol, that information is maintained in {{param|ProvisioningCode}}.
+          This parameter could be used in scenarios where the Controller needs to perform some kind of initialization or periodic configuration monitoring. For example, a Controller might perform some initial configuration of an Agent on first contact (perhaps to configure the Subscriptions).  The Controller could inspect this parameter to determine the current state of the Agent's configuration, allowing the Controller to streamline the configuration process.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="ProvisioningCode" access="readWrite" dmr:version="2.12">
+        <description>
+          Identifying information which MAY be used by the {{object}} instance to determine {{object}} instance specific customization and provisioning parameters.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enable/Disable this {{object}} instance.
+          When {{false}}, messages (notifications) are not sent to the remote endpoint represented by this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="AssignedRole" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|each entry is a Role that has been assigned to this {{object}} instance by means other than the {{param|.LocalAgent.ControllerTrust.Credential.{i}.Role}} parameter}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="Device.LocalAgent.ControllerTrust.Role." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InheritedRole" access="readOnly" dmr:version="2.12">
+        <description>
+          {{list|each entry is a Role that has been assigned to this {{object}} instance from the {{param|.LocalAgent.ControllerTrust.Credential.{i}.Role}} parameter associated with the CA credential ({{param|.LocalAgent.ControllerTrust.Credential.{i}.Credential}}) used to validate the Controller certificate}}
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="Device.LocalAgent.ControllerTrust.Role." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Credential" access="readWrite" dmr:version="2.12">
+        <description>
+          {{nolist}}
+          Comma-separated list of strings, the set of certificates from {{object|#.Certificate.{i}}} that a Controller can present for use in authenticating the identity of this {{object}} instance.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.Certificate." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicNotifInterval" access="readWrite" dmr:version="2.12">
+        <description>
+          If a Periodic Event Notification {{object|#.Subscription}} instance is associated with this USP Controller, then this is the duration in {{units}} of the interval for which the USP Agent MUST attempt to issue a Periodic Notification to the USP Controller.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="PeriodicNotifTime" access="readWrite" dmr:version="2.12">
+        <description>
+          If a Periodic Event Notification {{object|#.Subscription}} instance is associated with this USP Controller, then this is an absolute time reference in UTC to determine when the USP Agent will issue a Periodic Notification. Each Periodic Notification MUST occur at this reference time plus or minus an integer multiple of the {{param|PeriodicNotifInterval}}.
+          {{param}} is used only to set the ''phase'' of the Periodic Event Notifications.  The actual value of {{param}} can be arbitrarily far into the  past or future.
+          For example, if {{param|PeriodicNotifInterval}} is 86400 (a day) and if {{param}} is set to UTC midnight on some day (in the past,  present, or future) then Periodic Notifications will be sent every day at UTC midnight.  These MUST begin on the very next midnight, even if {{param}} refers to a day in the future.
+          The Unknown Time value defined in {{bibref|TR-106a2|section 3.2}} indicates that no particular time reference is specified.  That is, the USP Agent MAY locally choose the time reference, and needs only to adhere to the specified {{param|PeriodicNotifInterval}}.
+          If absolute time is not available to the USP Agent, its Periodic Notification behavior MUST be the same as if the {{param}} parameter was set to the Unknown Time value.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="USPNotifRetryMinimumWaitInterval" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter is related to the retry mechanism for Notifications.
+          Configures the first retry wait interval, in {{units}}, as specified in {{bibref|TR-369|Section "Responses to Notifications and Notification Retry"}}.
+          A value of 5 corresponds to the default behavior.
+          The USP Agent MUST use a random value between {{param}} and ({{param}} * {{param|USPNotifRetryIntervalMultiplier}} / 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="USPNotifRetryIntervalMultiplier" access="readWrite" dmr:version="2.12">
+        <description>
+          This parameter is related to the retry mechanism for Notifications.
+          Configures the retry interval multiplier as specified in {{bibref|TR-369|Section "Responses to Notifications and Notification Retry"}}.
+          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.
+          The USP Agent MUST use a random value between {{param|USPNotifRetryMinimumWaitInterval}} and ({{param|USPNotifRetryMinimumWaitInterval}} *  {{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>
+      <command name="ScheduleTimer()" dmr:version="2.12">
+        <description>
+          Schedule a ''Timer!'' event on the associated {{object}}.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="DelaySeconds" mandatory="true" dmr:version="2.12">
+            <description>
+              The number of seconds 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>
+              <default type="parameter" value="0"/>
+            </syntax>
+          </parameter>
+        </input>
+      </command>
+      <event name="Timer!" dmr:version="2.12">
+        <description>
+          Timer event requested via a ScheduleTimer() command invoked on the same Controller instance via an Operate USP message.
+        </description>
+        <parameter name="CommandKey" dmr:version="2.12">
+          <description>
+            The ''command_key'' supplied when requesting the timer event.
+          </description>
+          <syntax>
+            <string/>
+          </syntax>
+        </parameter>
+      </event>
+      <command name="AddMyCertificate()" dmr:version="2.12">
+        <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.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="Alias" dmr:version="2.12">
+            <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 commmand will fail.
+            </description>
+            <syntax>
+              <dataType ref="Alias"/>
+            </syntax>
+          </parameter>
+          <parameter name="Certificate" mandatory="true" dmr:version="2.12">
+            <description>
+              The X.509 certificate in Privacy-enhanced Electronic Mail (PEM) format.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="65535"/>
+              </string>
+            </syntax>
+          </parameter>
+        </input>
+      </command>
+      <command name="SendOnBoardRequest()" dmr:version="2.12">
+        <description>
+          Requests the Agent to send an ''OnBoardRequest'' notification to this Controller.
+        </description>
+      </command>
+      <parameter name="BootParameterNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="MTPNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LocalAgent.Controller.{i}.MTP.{i}." access="readWrite" numEntriesParameter="MTPNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        Each instance of this table represents a MTP used by this Controller.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Protocol"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enable/Disable this {{object}} instance.
+          If this {{object}} instance is to be disabled and currently used for communication with the requesting controller, the agent has to send the request response first, before disabling it.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Protocol" access="readWrite" dmr:version="2.12">
+        <description>
+          The Message Transport Protocol (MTP) to be used for communications by a USP Endpoint.
+        </description>
+        <syntax>
+          <string>
+            <enumerationRef targetParam="Device.LocalAgent.SupportedProtocols"/>
+          </string>
+          <default type="object" value="CoAP"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LocalAgent.Controller.{i}.MTP.{i}.CoAP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        If the USP Endpoint uses the CoAP Message Transport Protocol (MTP), then this object contains CoAP specific configuration parameters.
+      </description>
+      <parameter name="Host" access="readWrite" dmr:version="2.12">
+        <description>
+          The hostname or IP Address of the Controller's CoAP server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.12">
+        <description>
+          The port number used by the Controller's CoAP Server to receive USP messages.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Path" access="readWrite" dmr:version="2.12">
+        <description>
+          The path that is used by the Controller's CoAP Server in order to receive USP messages.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="EnableEncryption" access="readWrite" dmr:version="2.12">
+        <description>
+          When {{true}}, encryption is used as specified in {{bibref|TR-369|Section "MTP Message Encryption"}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="true"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LocalAgent.Controller.{i}.MTP.{i}.STOMP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        If the USP Endpoint uses the STOMP Message Transport Protocol (MTP), then this object contains STOMP Client specific configuration parameters related to how this Controller communicates with the STOMP Server.
+      </description>
+      <parameter name="Reference" access="readWrite" dmr:version="2.12">
+        <description>
+          A reference to the STOMP Connection used by this Controller when communicating via the STOMP MTP.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent=".STOMP.Connection." targetType="row"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Destination" access="readWrite" dmr:version="2.12">
+        <description>
+          The STOMP destination where the Controller will be listening to incoming USP messages.
+        </description>
+        <syntax>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LocalAgent.Controller.{i}.MTP.{i}.WebSocket." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        If the USP Endpoint uses the WebSocket Message Transport Protocol (MTP) as a WebSocket client, then this object contains WebSocket specific configuration parameters.
+      </description>
+      <parameter name="Host" access="readWrite" dmr:version="2.12">
+        <description>
+          The hostname or IP Address of the Controller's WebSocket server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.12">
+        <description>
+          The port number used by the Controller's WebSocket server to receive USP messages.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Path" access="readWrite" dmr:version="2.12">
+        <description>
+          The path that is used by the Controller's WebSocket server in order to receive USP messages.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="IsEncrypted" access="readOnly" dmr:version="2.12">
+        <description>
+          This parameter represents whether or not communications that utilize this {{object}} object instance are encrypted.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="KeepAliveInterval" access="readWrite" dmr:version="2.12">
+        <description>
+          The the duration in {{units}} between when WebSocket ping control frames are transmitted by the Agent to the WebSocket server for the USP Controller.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentRetryCount" access="readOnly" dmr:version="2.12">
+        <description>
+          The current retry count of the session. When zero (0), the session is not in a retry state.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="SessionRetryMinimumWaitInterval" access="readWrite" dmr:version="2.12">
+        <description>
+          Configures the first retry wait interval, in {{units}}, as specified in {{bibref|TR-369|Section "WebSocket Session Retry"}}.
+          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" dmr:version="2.12">
+        <description>
+          Configures the retry interval multiplier as specified in {{bibref|TR-369|Section "WebSocket Session Retry"}}.
+          This value is expressed in units of 0.001. Hence the values of the multiplier range between 1.000 and 65.535.
+          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>
+      <command name="Reset()" async="true" dmr:version="2.12">
+        <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" dmr: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" dmr:version="2.12">
+        <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" numEntriesParameter="BootParameterNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr: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>
+        <parameter ref="ParameterName"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="ParameterName" access="readWrite" dmr:version="2.12">
+        <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" dmr: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" dmr:version="2.12">
+        <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.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <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 0 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" dmr:version="2.12">
+        <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" dmr:version="2.12">
+        <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" dmr:version="2.12">
+        <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" dmr:version="2.12">
+        <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" dmr:version="2.12">
+        <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.
+        </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" dmr:version="2.12">
+        <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" dmr:version="2.12">
+        <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="true" dmr:version="2.12">
+        <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" numEntriesParameter="SubscriptionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        A Subscription dictates how a USP Agent issues USP Notification Messages to a USP Controller.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Recipient"/>
+        <parameter ref="ID"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <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" dmr:version="2.12">
+        <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="ID" access="readWrite" dmr:version="2.12">
+        <description>
+          Unique identifier of the {{object}} itself, which is specific to the USP Controller that creates the instance of the {{object}}.
+          This value is also populated in the ''subscription_id'' element of every Notification message sent from a USP Agent to a USP Controller.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="CreationDate" access="readOnly" dmr:version="2.12">
+        <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" dmr:version="2.12">
+        <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" dmr:version="2.12">
+        <description>
+          Each entry in the list is a parameter path that determines the element 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}}.
+          Expressions are allowed in the list items, but in some cases could cause a dynamic set of instances to be monitored in order to fulfill the Subscription's requirements.
+          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.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Persistent" access="readWrite" dmr:version="2.12">
+        <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" dmr:version="2.12">
+        <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 paramater 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" dmr:version="2.12">
+        <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" dmr:version="2.12">
+        <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 tha 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 paramater 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" numEntriesParameter="RequestNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr: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.
+        When the command of the ''Operate'' completes, then this {{object}} instance is removed from this table.
+      </description>
+      <uniqueKey>
+        <parameter ref="Originator"/>
+        <parameter ref="Command"/>
+        <parameter ref="CommandKey"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Originator" access="readOnly" dmr:version="2.12">
+        <description>
+          The USP Endpoint Identifier that originated the command.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Command" access="readOnly" dmr:version="2.12">
+        <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" dmr:version="2.12">
+        <description>
+          The ''command_key'' from the USP ''Operate'' message.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <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()" dmr:version="2.12">
+        <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 name="Device.LocalAgent.Certificate.{i}." access="readOnly" numEntriesParameter="CertificateNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        Each instance of this table represents information related to a X.509 certificate (see {{bibref|RFC5280}}) of a Controller or Certificate Authority. Instances are referenced from  {{param|##.LocalAgent.Controller.{i}.Credential}} and {{param|##.LocalAgent.ControllerTrust.Credential.{i}.Credential}}.
+      </description>
+      <uniqueKey>
+        <parameter ref="SerialNumber"/>
+        <parameter ref="Issuer"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enable/Disable this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="SerialNumber" access="readOnly" dmr:version="2.12">
+        <description>
+          The Serial Number field in an X.509 certificate, see {{bibref|RFC5280}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Issuer" access="readOnly" dmr:version="2.12">
+        <description>
+          The Issuer field in an X.509 certificate, see {{bibref|RFC5280}}; i.e. the Distinguished Name (DN) of the entity who has signed the certificate.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <command name="Delete()" dmr:version="2.12">
+        <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()" dmr:version="2.12">
+        <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 dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="FingerprintAlgorithm" mandatory="true" dmr:version="2.12">
+            <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 dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <parameter name="Fingerprint" dmr:version="2.12">
+            <description>
+              The value of the fingerprint.
+            </description>
+            <syntax>
+              <hexBinary>
+                <size maxLength="128"/>
+              </hexBinary>
+            </syntax>
+          </parameter>
+        </output>
+      </command>
+    </object>
+    <object name="Device.LocalAgent.ControllerTrust." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object contains information that an Agent applies when establishing a trust relationship with a Controller.
+      </description>
+      <parameter name="UntrustedRole" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|each entry is a Role that is associated with Controllers whose identity cannot be authenticated. The value of the {{param}} parameter is appended to the {{param|##.LocalAgent.Controller.{i}.AssignedRole}} parameter}}
+          In some instances, this policy is set by the Agent and cannot be modified by Controllers. If the Agent does not allow modification of this parameter, the Agent MUST respond with an error to the request to set this parameter.
+        </description>
+        <syntax>
+          <list maxItems="1"/>
+          <string>
+            <pathRef refType="strong" targetParent="Role." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="BannedRole" access="readWrite" dmr:version="2.12">
+        <description>
+          The Role that is associated with Controllers indicate banned access.
+          When assigned to a Controller or associated with an entry in the {{object|Credential}} table, this MUST be the only value of the {{param}} parameter of the {{param|##.LocalAgent.Controller.{i}.AssignedRole}} parameter.
+          The Agent SHOULD refuse to accept USP messages from, or send USP messages to, any Controller that has this Role.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="Role." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="TOFUAllowed" access="readWrite" dmr:version="2.12">
+        <description>
+          When  {{true}}, Agent has active policy that allows for self-signed certificates and certificates from unknown Certificate Authorities (CAs) to be trusted on first use (TOFU).
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="TOFUInactivityTimer" access="readWrite" dmr:version="2.12">
+        <description>
+          Inactivity timer in {{units}}.
+          This timer is started when trust on first use (TOFU) policy is used to accept a Controller certificate. If no USP Message is received before this timer elapses, the Agent MUST tear down the MTP connection and underlying (D)TLS session.
+          A value of 0 means that the TOFU inactivity timer is effectively disabled.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="seconds"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <command name="RequestChallenge()" dmr:version="2.12">
+        <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 dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="ChallengeRef" mandatory="true" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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 dmr:version="2.12">
+          <description>
+            Output arguments.
+          </description>
+          <parameter name="Instruction" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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()" dmr:version="2.12">
+        <description>
+          This command is issued to return the response of challenge.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="ChallengeID" mandatory="true" dmr:version="2.12">
+            <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" dmr:version="2.12">
+            <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>
+      <parameter name="RoleNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="CredentialNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ChallengeNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LocalAgent.ControllerTrust.Role.{i}." access="readWrite" numEntriesParameter="RoleNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        Each instance of this table represents a Role that can be assigned to or inherited by a Controller via the Controller Trust mechanism.  The Role contains a set of permissions that determine how the Controller can interact with the data model.
+        If multiple permission entries associated with this table contain a Target that evaluates to the same instantiated Object/Parameter for multiple Roles, then the permissions to be used are a union of the identified permissions.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enable/Disable this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readWrite" dmr:version="2.12">
+        <description>
+          The Role assigned to this {{object}} instance.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="PermissionNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LocalAgent.ControllerTrust.Role.{i}.Permission.{i}." access="readWrite" numEntriesParameter="PermissionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        Each instance of this table represents the permissions that are extended to a set of Targets for a specified Role.
+        If there are multiple entries in this table for a specific Role where the Targets overlap, the permissions for the entry with the highest value takes priority over all others.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Order"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enable/Disable this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Order" access="readWrite" dmr:version="2.12">
+        <description>
+          The order (relative priority) to use when determining the permissions for overlapping Targets that are contained within the same {{object|#.}}.
+          The larger value of this parameter takes priority over a permission with a smaller value (i.e., 0 has the lowest priority).
+        </description>
+        <syntax>
+          <unsignedInt/>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="Targets" access="readWrite" dmr:version="2.12">
+        <description>
+          {{list|each entry is a target to which the value of the permissions parameters are assigned}}
+          When an entry is a value of a Partial Path, the permissions are associated to that Object and any child Object/Parameter.
+          When the value of an entry is an Object instance then the permissions are associated to all Parameters of the Object instance.
+          When an entry is a value of a Search Path as defined in {{bibref|TR-369}} that resolves to zero or more Parameter Paths, then all Parameter Paths that result from the evaluation of the Search Path are subject to the permissions assigned by this {{object}} instance.
+        </description>
+        <syntax>
+          <list/>
+          <string/>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="Param" access="readWrite" dmr:version="2.12">
+        <description>
+          The permissions of a Role for the specified Targets.
+          A string of 4 characters where each character represents a permission ("r" for Read, "w" for Write, "x" for Execute", and "n" for Notify).
+          The string is always in the same order (rwxn) and the lack of a permission is signified by a "-" character (e.g., r--n).
+          The following describes the meaning of the permissions for Parameter type of Targets:
+          # Read: Grants the capability to read the value of the Parameter via Get and read the meta-information of the Parameter via GetSupportedDM.
+          # Write: Grants the capability to update the value of the Parameter via Add or Set.
+          # Execute: Grants no capabilities; Parameters can not be executed.
+          # Notify: Grants the capability to use this Parameter in the ReferenceList of a ValueChange Subscription.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="4" maxLength="4"/>
+          </string>
+          <default type="object" value="----"/>
+        </syntax>
+      </parameter>
+      <parameter name="Obj" access="readWrite" dmr:version="2.12">
+        <description>
+          The permissions of a Role for the specified Targets.
+          A string of 4 characters where each character represents a permission ("r" for Read, "w" for Write, "x" for Execute", and "n" for Notify).
+          The string is always in the same order (rwxn) and the lack of a permission is signified by a "-" character (e.g., r--n).
+          The following describes the meaning of the permissions for Object type of Targets:
+          # Read: Grants the capability to read the meta-information of the Object via GetSupportedDM.
+          # Write: Grants no capabilities for Static Objects. Grants the capability to create a new instance of a Multi-Instanced Object via Add (e.g. Device.LocalAgent.Controller.).
+          # Execute: Grants no capabilities; Objects are not executable and Commands are controlled by the CommandEventPermissions.
+          # Notify: Grants the capability to use this Object in the ReferenceList of an ObjectCreation (for multi-instance objects only) Subscription.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="4" maxLength="4"/>
+          </string>
+          <default type="object" value="----"/>
+        </syntax>
+      </parameter>
+      <parameter name="InstantiatedObj" access="readWrite" dmr:version="2.12">
+        <description>
+          The permissions of a Role for the specified Targets.
+          A string of 4 characters where each character represents a permission ("r" for Read, "w" for Write, "x" for Execute", and "n" for Notify).
+          The string is always in the same order (rwxn) and the lack of a permission is signified by a "-" character (e.g., r--n).
+          The following describes the meaning of the permissions for Instantiated Object type of Targets:
+          # Read: Grants the capability to read the instance numbers and unique keys of the Instantiated Object via GetInstances.
+          # Write: Grants the capability to remove an existing instance of an Instantiated Object via Delete (e.g. Device.LocalAgent.Controller.1.).
+          # Execute: Grants no capabilities; Object Instances are not executable and Commands are controlled by the CommandEventPermissions.
+          # Notify: Grants the capability to use this Instantiated Object in the ReferenceList of an ObjectDeletion Subscription.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="4" maxLength="4"/>
+          </string>
+          <default type="object" value="----"/>
+        </syntax>
+      </parameter>
+      <parameter name="CommandEvent" access="readWrite" dmr:version="2.12">
+        <description>
+          The permissions of a Role for the specified Targets.
+          A string of 4 characters where each character represents a permission ("r" for Read, "w" for Write, "x" for Execute", and "n" for Notify).
+          The string is always in the same order (rwxn) and the lack of a permission is signified by a "-" character (e.g., r--n).
+          The following describes the meaning of the permissions for Command and Event type of Targets:
+          # Read: Grants the capability to read the meta-information of the Command (including input and output arguments) and Event (including arguments) via GetSupportedDM.
+          # Write: Grants no capabilities; Commands are executed instead of written to and Events are read only.
+          # Execute: Grants the capability to execute the Command via Operate, but grants no capabilities to an Event.
+          # Notify: Grants the capability to use this Event or Command in the ReferenceList of an Event or OperationComplete Subscription.
+        </description>
+        <syntax>
+          <string>
+            <size minLength="4" maxLength="4"/>
+          </string>
+          <default type="object" value="----"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LocalAgent.ControllerTrust.Credential.{i}." access="readWrite" numEntriesParameter="CredentialNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        Each instance of this table represents a trusted credential. The credential can be that of a certificate authority (CA) for a Controller whose EndpointID is unknown.
+        When a credential is supplied to the Agent by a Controller during authentication, the credentials in this table are used to determine if any of the supplied certificates (including those in the chain of trust) are considered "trusted".
+        If the Controller authenticated via an entry in this table is not previously known to the Agent, the associated Role entry is automatically applied to the Controller.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey>
+        <parameter ref="Credential"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enable/Disable this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Role" access="readWrite" dmr:version="2.12">
+        <description>
+          {{nolist}}
+          Comma-separated list of strings, the (set of) Role(s) applied to a Controller authenticated through this {{object}} instance.
+          The roles are added to the Controller's current list of Roles by replacing the value of the {{param|###.LocalAgent.Controller.{i}.InheritedRole}} parameter.
+          If the Controller is already known to the Agent, with an associated Role, this parameter has no impact.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.Role." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Credential" access="readWrite" dmr:version="2.12">
+        <description>
+          A reference to the {{object|##.Certificate.{i}}} instance for use in the authentication of certificates provided by a Controller and authorization of Controllers, and for authentication of certificates used for MTP encryption.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="##.Certificate." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AllowedUses" access="readWrite" dmr:version="2.12">
+        <description>
+          Identifies what usages the Certificate Authority (CA) authenticated by the associated credential is trusted to authorize.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="MTP-only">
+              <description>
+                The CA can only authorize MTP (domain) connectivity, and cannot authenticate Controllers.
+              </description>
+            </enumeration>
+            <enumeration value="MTP-and-USP">
+              <description>
+                The CA can authorize MTP (domain) connectivity and authenticate Controllers.
+              </description>
+            </enumeration>
+            <enumeration value="MTP-and-broker">
+              <description>
+                The CA can authorize MTP (domain) connectivity and the presenter of this certificate is trusted to have authenticated the identity of Endpoints whose Records it transmits such that the from_id can be trusted without additional authentication. See {{bibref|TR-369|"Authentication and Authorization"}} for additional description of the Trusted Broker function.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.LocalAgent.ControllerTrust.Challenge.{i}." access="readWrite" numEntriesParameter="ChallengeNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        Each instance of this table represents information that is used to challenge a Controller in order to assign a Role to the Controller or to determine the authenticity of a Certificate.
+        The Controller requests a type of challenge from an Agent using the RequestChallenge command.
+        The Agent returns the value of the {{param|Instruction}} for that type of challenge to the Controller which the Controller then provides a third-party.
+        The third-party responds to the Instruction which the Controller then sends to the Agent using the ChallengeResponse command.
+        The Agent verifies the response to the Challenges and executes an implementation specific Agent logic in order to establish trust with the Controller.
+        This could include (but is not limited to):
+        *Assignment of roles to the Controller is done by appending the non-duplicate roles of the {{param|Role}} parameter to the value of the {{param|###.LocalAgent.Controller.{i}.AssignedRole}} parameter.
+        *Use the Controller's certificate to which the challenge response was received in order to authenticate the identity of the Controller.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readWrite" dmr:version="2.12">
+        <description>
+          The description of this {{object}} instance.
+        </description>
+        <syntax>
+          <string/>
+        </syntax>
+      </parameter>
+      <parameter name="Role" access="readWrite" dmr:version="2.12">
+        <description>
+          {{nolist}}
+          Comma-separated list of strings, the (set of) role(s) appended (non-duplicate values only) to the value of the {{param|###.LocalAgent.Controller.{i}.AssignedRole}} parameter.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.Role." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enable/Disable this {{object}} instance.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readWrite" dmr:version="2.12">
+        <description>
+          The type of challenge that will be verified from the challenge response provided by the third-party through the Controller.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Passphrase">
+              <description>
+                The challenge uses a passphrase the third-party is expected to match.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Value" access="readWrite" dmr:version="2.12">
+        <description>
+          The value of the challenge that is specific to the type of challenge.
+        </description>
+        <syntax hidden="true">
+          <base64/>
+        </syntax>
+      </parameter>
+      <parameter name="ValueType" access="readWrite" dmr:version="2.12">
+        <description>
+          The media type with a format as defined by {{bibref|RFC6838}} of the content of the {{param|Value}} parameter.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="text/plain"/>
+            <enumeration value="image/jpeg"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Instruction" access="readWrite" dmr:version="2.12">
+        <description>
+          The instruction that is provided to the external party by the Controller requesting the challenge.
+        </description>
+        <syntax>
+          <base64/>
+        </syntax>
+      </parameter>
+      <parameter name="InstructionType" access="readWrite" dmr:version="2.12">
+        <description>
+          The media type with a format as defined by {{bibref|RFC6838}} of the content of the {{param|Instruction}} parameter.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="text/plain"/>
+            <enumeration value="image/jpeg"/>
+            <enumeration value="text/html"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Retries" access="readWrite" dmr:version="2.12">
+        <description>
+          The number of times a challenge is retried before the challenge procedure is terminated.
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="LockoutPeriod" access="readWrite" dmr:version="2.12">
+        <description>
+          The time, in {{units}} that a Controller that has failed the challenge is locked out (based on the value of the {{param|Retries}} parameter) prior to being provided the challenge again.
+          A value of zero means that a LockoutPeriod doesn't apply and the challenge can be provided indefinitely.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="0"/>
+            <units value="seconds"/>
+          </int>
+          <default type="object" value="30"/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.STOMP." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        The {{object}} represents the STOMP capabilities of the device as described in {{bibref|TR-369}}.
+      </description>
+      <parameter name="ConnectionNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.STOMP.Connection.{i}." access="readWrite" numEntriesParameter="ConnectionNumberOfEntries" enableParameter="Enable" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        The {{object}} represents a STOMP connection between the Agent and a STOMP server.
+      </description>
+      <uniqueKey>
+        <parameter ref="Host"/>
+        <parameter ref="Username"/>
+        <parameter ref="VirtualHost"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Enables or disables this {{object}}.
+          This parameter is based on ''ifAdminStatus'' from {{bibref|RFC2863}}.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          The current operational state of this {{object}} (see {{bibref|TR-181i2|Section 4.2.2}}).  {{enum}}
+          When {{param|Enable}} is {{false}} then {{param}} SHOULD normally be {{enum|Disabled}} or {{enum|Error}} if there is a fault condition on the interface).
+          When {{param|Enable}} is changed to {{true}} then {{param}} SHOULD change to {{enum|Enabled}} if and only if the interface is able to transmit and receive PDUs; it SHOULD change to {{enum|Unknown}} if the state of the interface can not be determined for some reason.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Enabled"/>
+            <enumeration value="Disabled"/>
+            <enumeration value="Unknown"/>
+            <enumeration value="Connecting"/>
+            <enumeration value="ServerNotPresent"/>
+            <enumeration value="Error_Misconfigured"/>
+            <enumeration value="Error_AuthenticationFailure"/>
+            <enumeration value="Error" optional="true"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="LastChangeDate" access="readOnly" dmr:version="2.12">
+        <description>
+          The date and time at which this {{object}} entered into its current operational state.
+        </description>
+        <syntax>
+          <dateTime/>
+        </syntax>
+      </parameter>
+      <parameter name="Host" access="readWrite" dmr:version="2.12">
+        <description>
+          The hostname or IP Address of the STOMP Server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Port" access="readWrite" dmr:version="2.12">
+        <description>
+          The port number of the STOMP Server.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="61613"/>
+        </syntax>
+      </parameter>
+      <parameter name="Username" access="readWrite" dmr:version="2.12">
+        <description>
+          The username part of the credentials to be used when authenticating this {{object}} during connection establishment with the STOMP Server.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Password" access="readWrite" dmr:version="2.12">
+        <description>
+          The password part of the credentials to be used when authenticating this {{object}} during connection establishment with the STOMP Server.
+        </description>
+        <syntax hidden="true">
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VirtualHost" access="readWrite" dmr:version="2.12">
+        <description>
+          The Virtual Host to use when establishing the connection.
+          Some STOMP Server implementations utilize virtual hosts to place a context around credentials, permissions, and internal resources.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+          <default type="object" value=""/>
+        </syntax>
+      </parameter>
+      <parameter name="EnableHeartbeats" access="readWrite" dmr:version="2.12">
+        <description>
+          Enable or disable the STOMP Heart-beating mechanism as described in STOMP (for this {{object}}).
+          When the STOMP Heart-beat mechanism is enabled, {{param|OutgoingHeartbeat}} and {{param|IncomingHeartbeat}} determine how the heart-beat header within the CONNECT frame is formatted.
+          When the STOMP Heart-beat mechanism is disabled, {{param|OutgoingHeartbeat}} and {{param|IncomingHeartbeat}} are ignored and the CONNECT frame MUST NOT contain a heart-beat header element.
+          Any changes to this parameter will not take effect until the next connection.
+        </description>
+        <syntax>
+          <boolean/>
+          <default type="object" value="false"/>
+        </syntax>
+      </parameter>
+      <parameter name="OutgoingHeartbeat" access="readWrite" dmr:version="2.12">
+        <description>
+          Represents the Outgoing heart-beat timing of the STOMP Heart-beating mechanism as described in STOMP (for this {{object}}).
+          The Outgoing heart-beat represents what the sender of the frame can do.  A value of 0 means that it cannot send heart-beats.
+          Any changes to this parameter will not take effect until the next connection.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="IncomingHeartbeat" access="readWrite" dmr:version="2.12">
+        <description>
+          Represents the Incoming heart-beat timing of the STOMP Heart-beating mechanism as described in STOMP (for this {{object}}).
+          The Incoming heart-beat represents what the sender of the frame would like to get.  A value of 0 means that it does not want to receive heart-beats.
+          Any changes to this parameter will not take effect until the next connection.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <units value="milliseconds"/>
+          </unsignedInt>
+          <default type="object" value="0"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerRetryInitialInterval" access="readWrite" dmr:version="2.12">
+        <description>
+          The maximum first reconnection wait interval, in {{units}}, as specified in {{bibref|TR-369}}.
+          The Device MUST use a random value between ''0'' and {{param}} as the first reconnection wait interval.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1" maxInclusive="65535"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="60"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerRetryIntervalMultiplier" access="readWrite" dmr:version="2.12">
+        <description>
+          The reconnection interval multiplier as specified in {{bibref|TR-369}}. This value is expressed in units of 0.001. Hence the values of the multiplier range between 1.000 and 65.535.
+          For the ''n''th reconnection wait interval, the Device MUST use a random value, in ''seconds'', between ''0'' and {{param|ServerRetryInitialInterval}} * ({{param}} / 1000) ** (''n'' - ''1'').
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1000" maxInclusive="65535"/>
+          </unsignedInt>
+          <default type="object" value="2000"/>
+        </syntax>
+      </parameter>
+      <parameter name="ServerRetryMaxInterval" access="readWrite" dmr:version="2.12">
+        <description>
+          The maximum reconnection wait interval, in {{units}}.
+          If the ''n''th reconnection wait interval calculated from {{param|ServerRetryInitialInterval}} and {{param|ServerRetryIntervalMultiplier}} exceeds the value of this parameter, then the Agent MUST use the value of this parameter as the next reconnection wait interval.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range minInclusive="1"/>
+            <units value="seconds"/>
+          </unsignedInt>
+          <default type="object" value="30720"/>
+        </syntax>
+      </parameter>
+      <parameter name="IsEncrypted" access="readOnly" dmr:version="2.12">
+        <description>
+          This parameter represents whether or not communications that utilize this {{object}} object instance are encrypted.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.Standby." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        Capabilities of a Device as it pertains to entering a standby state.
+      </description>
+      <parameter name="NetworkAware" access="readOnly" dmr:version="2.12">
+        <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" dmr:version="2.12">
+        <description>
+          Indicates that the device is capable of maintaining and responding to timers while in a standby state.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.SoftwareModules." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        Top level object for dynamically managed software applications.
+      </description>
+      <command name="InstallDU()" async="true" dmr:version="2.12">
+        <description>
+          Install one or more Deployment Units (DUs) to the associated {{object}}.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="URL" mandatory="true" dmr:version="2.12">
+            <description>
+              The URL, as defined in {{bibref|RFC3986}}, that specifies the location of the DU to be installed.
+              The URL MUST NOT include the "userinfo" component, as defined in {{bibref|RFC3986}}.
+              HTTP and HTTPS transports MUST be supported.  Other optional transports MAY be supported.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="UUID" dmr:version="2.12">
+            <description>
+              The UUID (see {{bibref|RFC4122}}) of the DU to be installed.
+              If this parameter is {{empty}} the device MUST generate the UUID based on the rules defined in {{bibref|RFC4122}} and {{bibref|TR-069|Annex H}}.
+            </description>
+            <syntax>
+              <dataType ref="UUID"/>
+            </syntax>
+          </parameter>
+          <parameter name="Username" dmr:version="2.12">
+            <description>
+              Username to be used by the device to authenticate with the file server, if authentication is required.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+              </string>
+              <default type="parameter" value=""/>
+            </syntax>
+          </parameter>
+          <parameter name="Password" dmr:version="2.12">
+            <description>
+              Password to be used by the device to authenticate with the file server, if authentication is required.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+              </string>
+              <default type="parameter" value=""/>
+            </syntax>
+          </parameter>
+          <parameter name="ExecutionEnvRef" dmr:version="2.12">
+            <description>
+              A reference to the Execution Environment upon which the DU to be installed.
+              If {{empty}} the device MUST choose the Execution Environment to use.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+                <pathRef refType="weak" targetParent=".SoftwareModules.ExecutionUnit." targetType="row"/>
+              </string>
+            </syntax>
+          </parameter>
+        </input>
+      </command>
+      <event name="DUStateChange!" dmr:version="2.12">
+        <description>
+          This event informs a Controller of the completion (successful or unsuccessful) of a DU state change.
+          When used, this event MUST be issued after the device has completed any file transfers and carried out all operations related to the DU State Change.
+          This event MAY contain the results from multiple DU state changes; it is implementation specific how the device chooses to aggregate the DU state changes, although the device MUST notify the Controller of any DU state changes within 24 hours of the time the operations were completed by the device.
+          The device SHOULD make every attempt to aggregate, as much as possible, the DU State Change notifications to the Controller in the interest of scalability.
+        </description>
+        <parameter name="UUID" dmr:version="2.12">
+          <description>
+            The UUID as defined in {{bibref|RFC4122}} of the DU that affected by the state change.
+          </description>
+          <syntax>
+            <dataType ref="UUID"/>
+          </syntax>
+        </parameter>
+        <parameter name="DeploymentUnitRef" dmr:version="2.12">
+          <description>
+            A reference to the DU that was affected by the state change.
+          </description>
+          <syntax>
+            <string>
+              <pathRef refType="weak" targetParent=".SoftwareModules.DeploymentUnit." targetType="row"/>
+            </string>
+          </syntax>
+        </parameter>
+        <parameter name="Version" dmr:version="2.12">
+          <description>
+            In the case of an Install, this will be the version of the DU created.  In the case of an Update, it will be the updated version of the DU. In the case of an Uninstall, it will be the version of the uninstalled DU.
+            This MUST match the {{param|.SoftwareModules.DeploymentUnit.{i}.Version}} Parameter contained within the instance of the DeploymentUnit that is contained within the {{param|DeploymentUnitRef}} argument.
+          </description>
+          <syntax>
+            <string>
+              <size maxLength="32"/>
+            </string>
+          </syntax>
+        </parameter>
+        <parameter name="CurrentState" dmr:version="2.12">
+          <description>
+            The current state of the created DU.
+          </description>
+          <syntax>
+            <string>
+              <enumeration value="Installed">
+                <description>
+                  The DU is in an Installed state due to one of the following: successful Install, successful Update, failed Update, or failed Uninstall.  In the case of a failed Update or failed Uninstall the Fault argument will contain an explanation of the failure.
+                </description>
+              </enumeration>
+              <enumeration value="UnInstalled">
+                <description>
+                  The DU was successfully uninstalled from the device.
+                </description>
+              </enumeration>
+              <enumeration value="Failed">
+                <description>
+                  The DU could not be installed in which case a DU instance MUST NOT be created in the Data Model.
+                </description>
+              </enumeration>
+            </string>
+          </syntax>
+        </parameter>
+        <parameter name="Resolved" dmr:version="2.12">
+          <description>
+            Whether or not the DU operation resolved all of its dependencies.
+            In the case of a successful Uninstall, this value is meaningless and should be {{true}}.
+          </description>
+          <syntax>
+            <boolean/>
+          </syntax>
+        </parameter>
+        <parameter name="ExecutionUnitRefList" dmr:version="2.12">
+          <description>
+            The Execution Units affected by this operation.
+            In the case of an Install, this will be the list of EUs that were created as a result of the DU’s installation.
+            In the case an Update, this will be the list of all EUs currently associated with the updated DU, including those that were created through the initial DU installation and any updates that had already occurred but not including any EUs that no longer exist on the device because of this or previous updates.
+            In the case of an Uninstall, this will be the list of the EUs removed from the device due to the DU being removed.
+          </description>
+          <syntax>
+            <list/>
+            <string>
+              <pathRef refType="weak" targetParent=".SoftwareModules.ExecutionUnit." targetType="row"/>
+            </string>
+          </syntax>
+        </parameter>
+        <parameter name="StartTime" dmr:version="2.12">
+          <description>
+            The date and time transfer was started in UTC. 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/>
+          </syntax>
+        </parameter>
+        <parameter name="CompleteTime" dmr:version="2.12">
+          <description>
+            The date and time the transfer was fully completed and applied in UTC. This need only be filled in if the transfer has been fully completed and applied. 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/>
+          </syntax>
+        </parameter>
+        <parameter name="OperationPerformed" dmr:version="2.12">
+          <description>
+            The operation that was performed against the DU causing the DU state change.
+          </description>
+          <syntax>
+            <string>
+              <enumeration value="Install">
+                <description>
+                  The operation attempted was the Installation of a DU.
+                </description>
+              </enumeration>
+              <enumeration value="Update">
+                <description>
+                  The operation attempted was the Update of an existing DU.
+                </description>
+              </enumeration>
+              <enumeration value="Uninstall">
+                <description>
+                  The operation attempted was the Un-Installation of an existing DU.
+                </description>
+              </enumeration>
+            </string>
+          </syntax>
+        </parameter>
+        <object name="Fault." minEntries="1" maxEntries="1" dmr:version="2.12">
+          <description>
+            Fault Structure. If the operation was successful, the {{param|FaultCode}} MUST be zero. Otherwise a non-zero {{param|FaultCode}} is specified along with a {{param|FaultString}} indicating the failure reason.
+          </description>
+          <parameter name="FaultCode" dmr:version="2.12">
+            <description>
+              The numerical fault code. Valid values are:
+              *If the operation was successful, the fault code is 0.
+              *If the device cannot complete the operation for some unknown reason, it SHOULD reject the operation with a 9001 (Request Denied) fault code.
+              *If the device detects the presence of the "userinfo" component in the file source URL, it SHOULD reject the operation with a 9003 (Invalid Arguments) fault code.
+              *If the device cannot find the Execution Environment specified in the Install or Update command, it SHOULD reject the operation with a 9023 (Unknown Execution Environment) fault code.
+              *If the device determines that the Deployment Unit being installed does not match either the Execution Environment specified or any Execution Environment on the device, it SHOULD reject the operation with a 9025 (Deployment Unit to Execution Environment Mismatch) fault code
+              *If the device detects that the Deployment Unit being installed already has the same version as one already installed on the same Execution Environment, it SHOULD reject the operation with a 9026 (Duplicate Deployment Unit) fault code.
+              *If the device detects that that there are no more system resources (disk space, memory, etc.) to perform the Install or Update of a Deployment Unit, it SHOULD reject the operation with a 9027 (System Resources Exceeded) fault code.
+              *If a requested operation attempts to alter the State of a Deployment Unit in a manner that conflicts with the Deployment Unit State Machine Diagram {{bibref|TR-369|Appendix I "Software Module Management"}}, it SHOULD reject the operation with a 9029 (Invalid Deployment Unit State) fault code.
+              *If a requested operation attempts to Uninstall a DU that caused an EE to come into existence, where that EE has at least 1 installed DU or at least 1 child EE, then the device SHOULD reject the operation with a 9029 (Invalid Deployment Unit State) fault code.
+            </description>
+            <syntax>
+              <unsignedInt/>
+            </syntax>
+          </parameter>
+          <parameter name="FaultString" dmr:version="2.12">
+            <description>
+              A human-readable text description of the fault. This field SHOULD be empty if the FaultCode equals 0 (zero).
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+              </string>
+            </syntax>
+          </parameter>
+        </object>
+      </event>
+      <parameter name="ExecEnvNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="DeploymentUnitNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutionUnitNumberOfEntries" access="readOnly" dmr:version="2.12">
+        <description>
+          {{numentries}}
+        </description>
+        <syntax>
+          <unsignedInt/>
+        </syntax>
+      </parameter>
+    </object>
+    <object name="Device.SoftwareModules.ExecEnv.{i}." access="readOnly" numEntriesParameter="ExecEnvNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        The Execution Environments that are available on the device, along with their properties and configurable settings.
+      </description>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Name"/>
+      </uniqueKey>
+      <parameter name="Enable" access="readWrite" dmr:version="2.12">
+        <description>
+          Indicates whether or not this {{object}} is enabled.
+          Disabling an enabled Execution Environment stops it, while enabling a disabled Execution Environment starts it.
+          When an Execution Environment is disabled, Deployment Units installed to that Execution Environment will be unaffected, but any Execution Units currently running on that Execution Environment will automatically transition to {{enum|Idle|#.ExecutionUnit.{i}.Status}}.
+          If an Update or Uninstall operation is attempted on a {{object|#.DeploymentUnit}} that is to be applied against a disabled {{object}}, that operation fails and the associated event will contain a FaultStruct for that operation.
+          Disabling an Execution Environment could place the device in a non-manageable state.  For example, if the operating system itself was modeled as an {{object}} and a Controller disabled it, the Agent might be terminated leaving the device unmanageable.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          Indicates the status of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Up"/>
+            <enumeration value="Error" optional="true"/>
+            <enumeration value="Disabled"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.12">
+        <description>
+          A Name provided by the device that adequately distinguishes this {{object}} from all other {{object}} instances.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Type" access="readOnly" dmr:version="2.12">
+        <description>
+          Indicates the complete type and specification version of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="InitialRunLevel" access="readWrite" dmr:version="2.12">
+        <description>
+          The run level that this {{object}} will be in upon startup (whether that is caused by a device Boot or the Execution Environment starting).
+          Run levels dictate which Execution Units will be started.  Execution Units will be started if {{param|CurrentRunLevel}} is greater than or equal to {{param|#.ExecutionUnit.{i}.RunLevel}} and {{param|#.ExecutionUnit.{i}.AutoStart}} is {{true}}.
+          If the value of {{param|CurrentRunLevel}} is -1, then the value of this parameter is irrelevant when read and setting its value has no impact on the Run Level of this {{object}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="CurrentRunLevel" access="readOnly" dmr:version="2.12">
+        <description>
+          The run level that this {{object}} is currently operating in.  This value is altered by executing the {{command|SetRunLevel()}} command.
+          Upon startup (whether that is caused by a device Boot or the Execution Environment starting) {{param}} will be equal to {{param|InitialRunLevel}}, unless Run Levels are not supported by this {{object}} in which case {{param}} will be -1.
+          Run levels dictate which Execution Units will be started.  Execution Units will be started if {{param}} is greater than or equal to {{param|#.ExecutionUnit.{i}.RunLevel}} and {{param|#.ExecutionUnit.{i}.AutoStart}} is {{true}}.
+          If {{param}} is -1 then Run Levels are not supported by this {{object}} and setting {{param|InitialRunLevel}} or executing the command {{command|SetRunLevel()}} will not impact the Run Level of this {{object}}.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="InitialExecutionUnitRunLevel" access="readWrite" dmr:version="2.12">
+        <description>
+          Indicates the initial value on creation for {{param|#.ExecutionUnit.{i}.RunLevel}} for all Execution Unit instances associated with this {{object}}.
+          If the value of {{param|CurrentRunLevel}} is -1, then the value of this parameter is irrelevant when read and setting its value has no impact on the Run Level of any Execution Unit.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1" maxInclusive="65535"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="Vendor" access="readOnly" dmr:version="2.12">
+        <description>
+          The vendor that produced this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.12">
+        <description>
+          The Version of this {{object}} as specified by the Vendor that implemented this {{object}}, not the version of the specification.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ParentExecEnv" access="readOnly" dmr:version="2.12">
+        <description>
+          Represents the parent {{object}} of this {{object}}.
+          If this value is {{empty}} then this is the Primary Execution Environment.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.ExecEnv." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AllocatedDiskSpace" access="readOnly" dmr:version="2.12">
+        <description>
+          The amount of disk space measured in {{units}} allocated to this {{object}}.  A value of -1 MUST be used for {{object}} instances where this parameter is not applicable.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="kilobytes"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="AvailableDiskSpace" access="readOnly" dmr:version="2.12">
+        <description>
+          The amount of disk space measured in {{units}} currently available to this {{object}}.  This value changes as the {{object|#.ExecutionUnit}} instances associated with this {{object}} consumes disk space.  A value of -1 MUST be used for {{object}} instances where this parameter is not applicable.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="kilobytes"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="AllocatedMemory" access="readOnly" dmr:version="2.12">
+        <description>
+          The amount of physical RAM measured in {{units}} allocated to this {{object}}.  A value of -1 MUST be used for {{object}} instances where this parameter is not applicable.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="kilobytes"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="AvailableMemory" access="readOnly" dmr:version="2.12">
+        <description>
+          The amount of physical RAM measured in {{units}} currently available to this {{object}}.  This value changes as the {{object|#.ExecutionUnit}} instances associated with this {{object}} are started/stopped and consume the physical RAM.  A value of -1 MUST be used for {{object}} instances where this parameter is not applicable.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="kilobytes"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="ActiveExecutionUnits" access="readOnly" dmr:version="2.12">
+        <description>
+          Represents the {{object|#.ExecutionUnit}} instances currently running on this {{object}}.  This parameter only contains {{object|#.ExecutionUnit}} instances that currently have a {{param|#.ExecutionUnit.{i}.Status}} of {{enum|Active|#.ExecutionUnit.{i}.Status}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.ExecutionUnit." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ProcessorRefList" access="readOnly" dmr:version="2.12">
+        <description>
+          Represents the processors that this {{object}} has available to it.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".DeviceInfo.Processor." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <command name="SetRunLevel()" dmr:version="2.12">
+        <description>
+          Provides a mechanism to remotely manipulate the run level of this {{object}}, meaning that altering this comand will change the value of the {{param|#.CurrentRunLevel}}.
+          Run levels dictate which Execution Units will be started.  Execution Units will be started if {{param|CurrentRunLevel}} is greater than or equal to {{param|#.ExecutionUnit.{i}.RunLevel}} and {{param|#.ExecutionUnit.{i}.AutoStart}} is {{true}}.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="RequestedRunLevel" dmr:version="2.12">
+            <description>
+              This parameter will request to change the value of the {{param|#.CurrentRunLevel}} to the value of this parameter.
+              Setting this value when {{param|#.CurrentRunLevel}} is -1 has no impact to the Run Level of this instance of the {{object|##.}} object.
+            </description>
+            <syntax>
+              <int>
+                <range minInclusive="-1" maxInclusive="65535"/>
+              </int>
+            </syntax>
+          </parameter>
+        </input>
+      </command>
+      <command name="Reset()" dmr:version="2.12">
+        <description>
+          This command causes this {{object}} to revert back to the state it was in when the device last issued a Boot event with a cause of a local or remote factory reset.
+          The following requirements dictate what MUST happen for the reset to be complete:
+          # All Deployment Units that were installed after the last Boot (with cause of a factory reset) event MUST be removed
+          # All persistent storage, configuration files, and log files that were associated with the removed Deployment Units MUST be removed
+          # Any Deployment Unit that is still installed against the Execution Environment MUST be restored to the version present when the last Boot (with cause of a factory reset) event event was issued
+          # Any Deployment Unit that was present when the last Boot (with cause of a factory reset) eventevent was issued, but was subsequently uninstalled and is now not present, MUST be installed with the version that was present when the last "0 BOOTSTRAP" Inform event was issued
+          # The Execution Environment MUST be restored to the version and configuration present when the last Boot (with cause of a factory reset) eventevent was issued
+          # The Execution Environment MUST be restarted after all other restoration requirements have been met
+        </description>
+      </command>
+    </object>
+    <object name="Device.SoftwareModules.DeploymentUnit.{i}." access="readOnly" numEntriesParameter="DeploymentUnitNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This table serves as the Deployment Unit inventory and contains status information about each Deployment Unit.
+        A new instance of this table gets created during the installation of a Software Module.
+      </description>
+      <uniqueKey>
+        <parameter ref="UUID"/>
+        <parameter ref="Version"/>
+        <parameter ref="ExecutionEnvRef"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="UUID" access="readOnly" dmr:version="2.12">
+        <description>
+          A Universally Unique Identifier either provided by the Controller, or generated by the device, at the time of Deployment Unit Installation.
+          The format of this value is defined by {{bibref|RFC4122}} Version 5 (Name-Based) and {{bibref|TR-181i2a12|Appendix TBD}}.
+          This value MUST NOT be altered when the {{object}} is updated.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="36"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DUID" access="readOnly" dmr:version="2.12">
+        <description>
+          Deployment Unit Identifier chosen by the targeted {{object|#.ExecEnv}}.  The format of this value is Execution Environment specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.12">
+        <description>
+          Indicates the Name of this {{object}}, which is chosen by the author of the Deployment Unit.
+          The value of this parameter is used in the generation of the {{param|UUID}} based on the rules defined in {{bibref|TR-069|Annex H}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          Indicates the status of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Installing">
+              <description>
+                This instance is in the process of being Installed and SHOULD transition to the {{enum|Installed}} state.
+              </description>
+            </enumeration>
+            <enumeration value="Installed">
+              <description>
+                This instance has been successfully Installed.  The {{param|Resolved}} flag SHOULD also be referenced for dependency resolution.
+              </description>
+            </enumeration>
+            <enumeration value="Updating">
+              <description>
+                This instance is in the process of being Updated and SHOULD transition to the {{enum|Installed}} state.
+              </description>
+            </enumeration>
+            <enumeration value="Uninstalling">
+              <description>
+                This instance is in the process of being Uninstalled and SHOULD transition to the {{enum|Uninstalled}} state.
+              </description>
+            </enumeration>
+            <enumeration value="Uninstalled">
+              <description>
+                This instance has been successfully Uninstalled.  This status will typically not be seen within a {{object}} instance.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Resolved" access="readOnly" dmr:version="2.12">
+        <description>
+          Indicates whether or not this {{object}} has resolved all of its dependencies.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="URL" access="readOnly" dmr:version="2.12">
+        <description>
+          Contains the URL used by the most recent ChangeDUState RPC to either Install or Update this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="1024"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readOnly" dmr:version="2.12">
+        <description>
+          Textual description of this {{object}}. The format of this value is Execution Environment specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Vendor" access="readOnly" dmr:version="2.12">
+        <description>
+          The author of this {{object}} formatted as a domain name.
+          The value of this parameter is used in the generation of the {{param|UUID}} based on the rules defined in {{bibref|TR-069a3|Annex H}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.12">
+        <description>
+          Version of this {{object}}.  The format of this value is Execution Environment specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorLogList" access="readOnly" dmr:version="2.12">
+        <description>
+          Represents the vendor log files that have come into existence because of this {{object}}.
+          This does not include any vendor log files that have come into existence because of {{object|#.ExecutionUnit}} instances that are contained within this {{object}}.
+          When this {{object}} is uninstalled the vendor log files referenced here SHOULD be removed from the device.
+          Not all {{object}} instances will actually have a corresponding vendor log file, in which case the value of this parameter will be {{empty}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".DeviceInfo.VendorLogFile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorConfigList" access="readOnly" dmr:version="2.12">
+        <description>
+          Represents the vendor config files that have come into existence because of this {{object}}.
+          This does not include any vendor config files that have come into existence because of {{object|#.ExecutionUnit}} instances that are contained within this {{object}}.
+          When this {{object}} is uninstalled the vendor config files referenced here SHOULD be removed from the device.
+          Not all {{object}} instances will actually have a corresponding vendor config file, in which case the value of this parameter will be {{empty}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".DeviceInfo.VendorConfigFile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutionUnitList" access="readOnly" dmr:version="2.12">
+        <description>
+          Represents the {{object|#.ExecutionUnit}} instances that are associated with this {{object}} instance.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent="#.ExecutionUnit." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutionEnvRef" access="readOnly" dmr:version="2.12">
+        <description>
+          Represents the {{object|#.ExecEnv}} instance where this {{object}} instance is installed.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.ExecEnv." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <command name="Update()" async="true" dmr:version="2.12">
+        <description>
+          Update the associated {{object}}.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="URL" dmr:version="2.12">
+            <description>
+              The URL, as defined in {{bibref|RFC3986}}, that specifies the location of the DU to be installed.
+              The URL MUST NOT include the "userinfo" component, as defined in {{bibref|RFC3986}}.
+              HTTP and HTTPS transports MUST be supported.  Other optional transports MAY be supported.
+              If the device receives an Update command with the same source URL as a previous Update or Install comamnd, the device MUST perform each Update as requested, and MUST NOT assume that the content of the file to be downloaded is the same each time.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+              </string>
+            </syntax>
+          </parameter>
+          <parameter name="Username" dmr:version="2.12">
+            <description>
+              Username to be used by the device to authenticate with the file server, if authentication is required.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+              </string>
+              <default type="parameter" value=""/>
+            </syntax>
+          </parameter>
+          <parameter name="Password" dmr:version="2.12">
+            <description>
+              Password to be used by the device to authenticate with the file server, if authentication is required.
+            </description>
+            <syntax>
+              <string>
+                <size maxLength="256"/>
+              </string>
+              <default type="parameter" value=""/>
+            </syntax>
+          </parameter>
+        </input>
+      </command>
+      <command name="Uninstall()" async="true" dmr:version="2.12">
+        <description>
+          Uninstall the associated {{object}}.
+        </description>
+      </command>
+    </object>
+    <object name="Device.SoftwareModules.ExecutionUnit.{i}." access="readOnly" numEntriesParameter="ExecutionUnitNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr:version="2.12">
+      <description>
+        This table serves as the Execution Unit inventory and contains both status information about each Execution Unit as well as configurable parameters for each Execution Unit.
+        Each {{object|#.DeploymentUnit}} that is installed can have zero or more Execution Units.
+        Once a Deployment Unit is installed it populates this table with its contained Execution Units.
+        When the Deployment Unit (that caused this {{object}} to come into existence) is updated, this instance MAY be removed and new instances MAY come into existence.  While the Deployment Unit (that caused this {{object}} to come into existence) is being updated, all {{object}} instances associated with the Deployment Unit will be stopped until the update is complete at which time they will be restored to the state that they were in before the update started.
+        When the Deployment Unit (that caused this {{object}} to come into existence) is uninstalled, this instance is removed.
+        Each {{object}} MAY also contain a set of vendor specific parameters displaying status and maintaining configuration that reside under the {{object|Extensions}} object.
+      </description>
+      <uniqueKey>
+        <parameter ref="EUID"/>
+      </uniqueKey>
+      <uniqueKey functional="false">
+        <parameter ref="Alias"/>
+      </uniqueKey>
+      <parameter name="EUID" access="readOnly" dmr:version="2.12">
+        <description>
+          Execution Unit Identifier chosen by the {{object|#.ExecEnv}} during installation of the associated {{object|#.DeploymentUnit}}.
+          The format of this value is Execution Environment specific, but it MUST be unique across {{object|#.ExecEnv}} instances.  Thus, it is recommended that this be a combination of the {{param|#.ExecEnv.{i}.Name}} and an Execution Environment local unique value.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+      <parameter name="Name" access="readOnly" dmr:version="2.12">
+        <description>
+          The name of this {{object}} as it pertains to its associated {{object|#.DeploymentUnit}}, which SHOULD be unique across all {{object}} instances contained within its associated {{object|#.DeploymentUnit}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ExecEnvLabel" access="readOnly" dmr:version="2.12">
+        <description>
+          The name of this {{object}} as provided by the {{object|#.ExecEnv}}, which SHOULD be unique across all {{object}} instances contained within a specific {{object|#.ExecEnv}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="64"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Status" access="readOnly" dmr:version="2.12">
+        <description>
+          Indicates the status of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="Idle">
+              <description>
+                This instance is in an Idle state and not running.
+              </description>
+            </enumeration>
+            <enumeration value="Starting">
+              <description>
+                This instance is in the process of Starting and SHOULD transition to the {{enum|Active}} state.
+              </description>
+            </enumeration>
+            <enumeration value="Active">
+              <description>
+                This instance is currently running.
+              </description>
+            </enumeration>
+            <enumeration value="Stopping">
+              <description>
+                This instance is in the process of Stopping and SHOULD transition to the {{enum|Idle}} state.
+              </description>
+            </enumeration>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutionFaultCode" access="readOnly" dmr:version="2.12">
+        <description>
+          If while running or transitioning between states this {{object}} identifies a fault this parameter embodies the problem.  The value of {{enum|NoFault}} MUST be used when everything is working as intended. {{enum}}
+          For fault codes not included in this list, the vendor MAY include vendor-specific values, which MUST use the format defined in {{bibref|TR-106a4|Section 3.3}}.
+        </description>
+        <syntax>
+          <string>
+            <enumeration value="NoFault"/>
+            <enumeration value="FailureOnStart"/>
+            <enumeration value="FailureOnAutoStart"/>
+            <enumeration value="FailureOnStop"/>
+            <enumeration value="FailureWhileActive"/>
+            <enumeration value="DependencyFailure"/>
+            <enumeration value="UnStartable"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutionFaultMessage" access="readOnly" dmr:version="2.12">
+        <description>
+          If while running or transitioning between states this {{object}} identifies a fault this parameter provides a more detailed explanation of the problem.
+          If {{param|ExecutionFaultCode}} has the value of {{enum|NoFault|ExecutionFaultCode}} then the value of this parameter MUST {{empty}} and ignored by the Controller.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AutoStart" access="readWrite" dmr:version="2.12">
+        <description>
+          If {{true}} and the {{param|RunLevel}} verification is also met, then this {{object}} will be automatically started by the device after its {{object|#.ExecEnv}} is either rebooted or restarted.
+          If {{false}} this {{object}} will not be started after its {{object|#.ExecEnv}} is either rebooted or restarted until it is explicitly commanded to do so by either the Controller or another Execution Unit.
+        </description>
+        <syntax>
+          <boolean/>
+        </syntax>
+      </parameter>
+      <parameter name="RunLevel" access="readWrite" dmr:version="2.12">
+        <description>
+          Determines when this {{object}} will be started.
+          If {{param|AutoStart}} is {{true}} and {{param|#.ExecEnv.{i}.CurrentRunLevel}} is greater than or equal to {{param}}, then this {{object}} will be started.
+          If the value of {{param|#.ExecEnv.{i}.CurrentRunLevel}} is -1, then the associated {{object|#.ExecEnv.}} doesn't support Run Levels, thus the value of this parameter is irrelevant when read and setting its value has no impact to the Run Level of this {{object}}.
+        </description>
+        <syntax>
+          <unsignedInt>
+            <range maxInclusive="65535"/>
+          </unsignedInt>
+        </syntax>
+      </parameter>
+      <parameter name="Vendor" access="readOnly" dmr:version="2.12">
+        <description>
+          Vendor of this {{object}}.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="128"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Version" access="readOnly" dmr:version="2.12">
+        <description>
+          Version of the {{object}}.  The format of this value is Execution Environment specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="32"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="Description" access="readOnly" dmr:version="2.12">
+        <description>
+          Textual description of this {{object}}. The format of this value is Execution Environment specific.
+        </description>
+        <syntax>
+          <string>
+            <size maxLength="256"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="DiskSpaceInUse" access="readOnly" dmr:version="2.12">
+        <description>
+          The amount of disk space measured in {{units}} currently being used by this {{object}}.  A value of -1 MUST be used for {{object}} instances where this parameter is not applicable.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="kilobytes"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="MemoryInUse" access="readOnly" dmr:version="2.12">
+        <description>
+          The amount of physical RAM measured in {{units}} currently being used by this {{object}}.  A value of -1 MUST be used for {{object}} instances where this parameter is not applicable.
+        </description>
+        <syntax>
+          <int>
+            <range minInclusive="-1"/>
+            <units value="kilobytes"/>
+          </int>
+        </syntax>
+      </parameter>
+      <parameter name="References" access="readOnly" dmr:version="2.12">
+        <description>
+          Represents the instances of multi-instanced objects that are directly controlled by, and have come into existence because of, this {{object}}.
+          NOTE: All other objects and parameters (i.e. not multi-instanced objects) that this {{object}} has caused to come into existence can be discovered via the GetSupportedDM and GetInstances USP messages.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="AssociatedProcessList" access="readOnly" dmr:version="2.12">
+        <description>
+          Represents the system processes that are active in the system because of this {{object}}.
+          If {{param|Status}} is not {{enum|Active|Status}} it is expected that this list will be {{empty}}.  Some {{object}} instances MIGHT NOT have any system processes irrespective of the value of {{param|Status}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".DeviceInfo.ProcessStatus.Process." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorLogList" access="readOnly" dmr:version="2.12">
+        <description>
+          Represents the vendor log files that have come into existence because of this {{object}}.
+          When the {{object|#.DeploymentUnit}} (that caused this {{object}} to come into existence) is uninstalled the vendor log files referenced here SHOULD be removed from the device.
+          Not all {{object}} instances will actually have a corresponding vendor log file, in which case the value of this parameter will be {{empty}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".DeviceInfo.VendorLogFile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="VendorConfigList" access="readOnly" dmr:version="2.12">
+        <description>
+          Represents the vendor config files that have come into existence because of this {{object}}.
+          When the {{object|#.DeploymentUnit}} (that caused this {{object}} to come into existence) is uninstalled the vendor config files referenced here SHOULD be removed from the device.
+          Not all {{object}} instances will actually have a corresponding vendor config file, in which case the value of this parameter will be {{empty}}.
+        </description>
+        <syntax>
+          <list/>
+          <string>
+            <pathRef refType="strong" targetParent=".DeviceInfo.VendorConfigFile." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <parameter name="ExecutionEnvRef" access="readOnly" dmr:version="2.12">
+        <description>
+          Represents the {{object|#.ExecEnv}} that this {{object}} is associated with.
+        </description>
+        <syntax>
+          <string>
+            <pathRef refType="strong" targetParent="#.ExecEnv." targetType="row"/>
+          </string>
+        </syntax>
+      </parameter>
+      <command name="SetRequestedState()" dmr:version="2.12">
+        <description>
+          Set the state transition that the Controller is requesting for this instance of the {{object}} object.  {{enum}}
+          If this instance of the {{object}} object is associated with an Execution Environment that is disabled and an attempt is made to alter this value, then a error message MUST be generated.
+        </description>
+        <input dmr:version="2.12">
+          <description>
+            Input arguments.
+          </description>
+          <parameter name="RequestedState" dmr:version="2.12">
+            <description>
+              Indicates the requested state to transition this instance of the {{object|##.}} object.  {{enum}}
+            </description>
+            <syntax>
+              <string>
+                <enumeration value="Idle">
+                  <description>
+                    If this {{object|##.}} is currently in {{enum|Starting|###.ExecutionUnit.{i}.Status}} or {{enum|Active|###.ExecutionUnit.{i}.Status}} the device will attempt to Stop the Execution Unit; otherwise this requested state is ignored.
+                  </description>
+                </enumeration>
+                <enumeration value="Active">
+                  <description>
+                    If this {{object|##.}} is currently in {{enum|Idle|###.ExecutionUnit.{i}.Status}} the device will attempt to Start the Execution Unit.
+                    If this {{object|##.}} is in {{enum|Stopping|###.ExecutionUnit.{i}.Status}} the request is rejected and a fault raised.  Otherwise this requested state is ignored.
+                  </description>
+                </enumeration>
+              </string>
+            </syntax>
+          </parameter>
+        </input>
+      </command>
+    </object>
+    <object name="Device.SoftwareModules.ExecutionUnit.{i}.Extensions." access="readOnly" minEntries="1" maxEntries="1" dmr:version="2.12">
+      <description>
+        This object proposes a general location for vendor extensions specific to this Execution Unit, which allows multiple Execution Units to expose parameters without the concern of conflicting parameter names.  These vendor extensions are related to displaying status and maintaining configuration for this Execution Unit.
+        It is also possible for the Execution Unit to expose status and configuration parameters within Service objects or as embedded objects and parameters directly within the root data model, in which case the combination of {{param|#.References}} and use of GetSupportDM and GetInstances USP messages will be used to determine their locations.
+      </description>
+    </object>
+    <object name="Device.ProxiedDevice.{i}." access="readOnly" mountType="mountPoint" numEntriesParameter="ProxiedDeviceNumberOfEntries" minEntries="0" maxEntries="unbounded" dmr: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>
+      <parameter name="Alias" access="readWrite" dmr:version="2.12">
+        <description>
+          {{datatype|expand}}
+        </description>
+        <syntax>
+          <dataType ref="Alias"/>
+        </syntax>
+      </parameter>
+    </object>
+    <profile name="UDPEcho:1" dmr:version="2.0">
+      <object ref="Device.IP.Diagnostics.UDPEchoConfig." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="SourceIPAddress" requirement="readWrite"/>
+        <parameter ref="UDPPort" requirement="readWrite"/>
+        <parameter ref="PacketsReceived" requirement="readOnly"/>
+        <parameter ref="PacketsResponded" requirement="readOnly"/>
+        <parameter ref="BytesReceived" requirement="readOnly"/>
+        <parameter ref="BytesResponded" requirement="readOnly"/>
+        <parameter ref="TimeFirstPacketReceived" requirement="readOnly"/>
+        <parameter ref="TimeLastPacketReceived" requirement="readOnly"/>
+        <parameter ref="EchoPlusSupported" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UDPEchoPlus:1" dmr:version="2.0">
+      <object ref="Device.IP.Diagnostics.UDPEchoConfig." requirement="present">
+        <parameter ref="EchoPlusEnabled" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="MemoryStatus:1" dmr:version="2.0">
+      <object ref="Device.DeviceInfo.MemoryStatus." requirement="present">
+        <parameter ref="Total" requirement="readOnly"/>
+        <parameter ref="Free" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ProcessStatus:1" dmr:version="2.0">
+      <object ref="Device.DeviceInfo.ProcessStatus." requirement="present">
+        <parameter ref="CPUUsage" requirement="readOnly"/>
+        <parameter ref="ProcessNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DeviceInfo.ProcessStatus.Process.{i}." requirement="present">
+        <parameter ref="PID" requirement="readOnly"/>
+        <parameter ref="Command" requirement="readOnly"/>
+        <parameter ref="Size" requirement="readOnly"/>
+        <parameter ref="Priority" requirement="readOnly"/>
+        <parameter ref="CPUTime" requirement="readOnly"/>
+        <parameter ref="State" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="TempStatus:1" dmr:version="2.0">
+      <object ref="Device.DeviceInfo.TemperatureStatus." requirement="present">
+        <parameter ref="TemperatureSensorNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DeviceInfo.TemperatureStatus.TemperatureSensor.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="ResetTime" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Value" requirement="readOnly"/>
+        <parameter ref="LastUpdate" requirement="readOnly"/>
+        <parameter ref="MinValue" requirement="readOnly"/>
+        <parameter ref="MinTime" requirement="readOnly"/>
+        <parameter ref="MaxValue" requirement="readOnly"/>
+        <parameter ref="MaxTime" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="User:1" dmr:version="2.0">
+      <object ref="Device.Users." requirement="present">
+        <parameter ref="UserNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Users.User.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Username" requirement="readWrite"/>
+        <parameter ref="Password" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="UPnPDev:1" dmr:version="2.0">
+      <object ref="Device.UPnP." requirement="present"/>
+      <object ref="Device.UPnP.Device." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="UPnPMediaServer" requirement="readWrite"/>
+        <parameter ref="UPnPMediaRenderer" requirement="readWrite"/>
+        <parameter ref="UPnPWLANAccessPoint" requirement="readWrite"/>
+        <parameter ref="UPnPQoSDevice " requirement="readWrite"/>
+        <parameter ref="UPnPQoSPolicyHolder" requirement="readWrite"/>
+        <parameter ref="UPnPIGD" requirement="readWrite"/>
+      </object>
+      <object ref="Device.UPnP.Device.Capabilities." requirement="present">
+        <parameter ref="UPnPArchitecture" requirement="readOnly"/>
+        <parameter ref="UPnPMediaServer" requirement="readOnly"/>
+        <parameter ref="UPnPMediaRenderer" requirement="readOnly"/>
+        <parameter ref="UPnPWLANAccessPoint" requirement="readOnly"/>
+        <parameter ref="UPnPBasicDevice" requirement="readOnly"/>
+        <parameter ref="UPnPQoSDevice" requirement="readOnly"/>
+        <parameter ref="UPnPQoSPolicyHolder" requirement="readOnly"/>
+        <parameter ref="UPnPIGD" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UPnPDiscBasic:1" dmr:version="2.0">
+      <object ref="Device.UPnP." requirement="present"/>
+      <object ref="Device.UPnP.Discovery." requirement="present">
+        <parameter ref="RootDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.UPnP.Discovery.RootDevice.{i}." requirement="present">
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="UUID" requirement="readOnly"/>
+        <parameter ref="USN" requirement="readOnly"/>
+        <parameter ref="LeaseTime" requirement="readOnly"/>
+        <parameter ref="Location" requirement="readOnly"/>
+        <parameter ref="Server" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UPnPDiscAdv:1" extends="UPnPDiscBasic:1" dmr:version="2.0">
+      <object ref="Device.UPnP.Discovery." requirement="present">
+        <parameter ref="DeviceNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ServiceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.UPnP.Discovery.Device.{i}." requirement="present">
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="UUID" requirement="readOnly"/>
+        <parameter ref="USN" requirement="readOnly"/>
+        <parameter ref="LeaseTime" requirement="readOnly"/>
+        <parameter ref="Location" requirement="readOnly"/>
+        <parameter ref="Server" requirement="readOnly"/>
+      </object>
+      <object ref="Device.UPnP.Discovery.Service.{i}." requirement="present">
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="USN" requirement="readOnly"/>
+        <parameter ref="LeaseTime" requirement="readOnly"/>
+        <parameter ref="Location" requirement="readOnly"/>
+        <parameter ref="Server" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UPnPDiscAdv:2" base="UPnPDiscAdv:1" dmr:version="2.6">
+      <object ref="Device.UPnP.Discovery.Device.{i}." requirement="present">
+        <parameter ref="LastUpdate" requirement="readOnly"/>
+        <parameter ref="Host" requirement="readOnly"/>
+      </object>
+      <object ref="Device.UPnP.Discovery.Service.{i}." requirement="present">
+        <parameter ref="LastUpdate" requirement="readOnly"/>
+        <parameter ref="Host" requirement="readOnly"/>
+        <parameter ref="ParentDevice" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="SimpleFirewall:1" dmr:version="2.0">
+      <object ref="Device.Firewall." requirement="present">
+        <parameter ref="Config" requirement="readWrite"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="AdvancedFirewall:1" extends="SimpleFirewall:1" dmr:version="2.2">
+      <object ref="Device.Firewall." requirement="present">
+        <parameter ref="AdvancedLevel" requirement="readWrite"/>
+        <parameter ref="Type" requirement="readOnly"/>
+        <parameter ref="LevelNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ChainNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Firewall.Level.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Chain" requirement="readOnly"/>
+        <parameter ref="PortMappingEnabled" requirement="readWrite">
+          <description>
+            REQUIRED only for devices that support NAT.
+          </description>
+        </parameter>
+        <parameter ref="DefaultPolicy" requirement="readWrite"/>
+        <parameter ref="DefaultLogPolicy" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Firewall.Chain.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Creator" requirement="readOnly"/>
+        <parameter ref="RuleNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Firewall.Chain.{i}.Rule.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Target" requirement="readWrite"/>
+        <parameter ref="TargetChain" requirement="readWrite"/>
+        <parameter ref="SourceInterface" requirement="readWrite"/>
+        <parameter ref="SourceInterfaceExclude" requirement="readWrite"/>
+        <parameter ref="SourceAllInterfaces" requirement="readWrite"/>
+        <parameter ref="DestInterface" requirement="readWrite"/>
+        <parameter ref="DestInterfaceExclude" requirement="readWrite"/>
+        <parameter ref="DestAllInterfaces" requirement="readWrite"/>
+        <parameter ref="IPVersion" requirement="readWrite"/>
+        <parameter ref="DestIP" requirement="readWrite"/>
+        <parameter ref="DestMask" requirement="readWrite"/>
+        <parameter ref="DestIPExclude" requirement="readWrite"/>
+        <parameter ref="SourceIP" requirement="readWrite"/>
+        <parameter ref="SourceMask" requirement="readWrite"/>
+        <parameter ref="SourceIPExclude" requirement="readWrite"/>
+        <parameter ref="Protocol" requirement="readWrite"/>
+        <parameter ref="ProtocolExclude" requirement="readWrite"/>
+        <parameter ref="DestPort" requirement="readWrite"/>
+        <parameter ref="DestPortRangeMax" requirement="readWrite"/>
+        <parameter ref="DestPortExclude" requirement="readWrite"/>
+        <parameter ref="SourcePort" requirement="readWrite"/>
+        <parameter ref="SourcePortRangeMax" requirement="readWrite"/>
+        <parameter ref="SourcePortExclude" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="USBHostsBasic:1" dmr:version="2.0">
+      <object ref="Device.USB.USBHosts." requirement="present">
+        <parameter ref="HostNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.USB.USBHosts.Host.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Type" requirement="readOnly"/>
+        <parameter ref="USBVersion" requirement="readOnly"/>
+        <parameter ref="DeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.USB.USBHosts.Host.{i}.Device.{i}." requirement="present">
+        <parameter ref="DeviceNumber" requirement="readOnly"/>
+        <parameter ref="USBVersion" requirement="readOnly"/>
+        <parameter ref="DeviceClass" requirement="readOnly"/>
+        <parameter ref="DeviceSubClass" requirement="readOnly"/>
+        <parameter ref="DeviceVersion" requirement="readOnly"/>
+        <parameter ref="DeviceProtocol" requirement="readOnly"/>
+        <parameter ref="ProductID" requirement="readOnly"/>
+        <parameter ref="VendorID" requirement="readOnly"/>
+        <parameter ref="Manufacturer" requirement="readOnly"/>
+        <parameter ref="ProductClass" requirement="readOnly"/>
+        <parameter ref="SerialNumber" requirement="readOnly"/>
+        <parameter ref="Port" requirement="readOnly"/>
+        <parameter ref="Rate" requirement="readOnly"/>
+        <parameter ref="Parent" requirement="readOnly"/>
+        <parameter ref="MaxChildren" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="PeriodicStatsBase:1" dmr:version="2.0">
+      <object ref="Device.PeriodicStatistics." requirement="present">
+        <parameter ref="MinSampleInterval" requirement="readOnly"/>
+        <parameter ref="MaxReportSamples" requirement="readOnly"/>
+        <parameter ref="SampleSetNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.PeriodicStatistics.SampleSet.{i}." requirement="createDelete">
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="SampleInterval" requirement="readWrite"/>
+        <parameter ref="ReportSamples" requirement="readWrite"/>
+        <parameter ref="ReportStartTime" requirement="readOnly"/>
+        <parameter ref="ReportEndTime" requirement="readOnly"/>
+        <parameter ref="SampleSeconds" requirement="readOnly"/>
+        <parameter ref="ParameterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.PeriodicStatistics.SampleSet.{i}.Parameter.{i}." requirement="createDelete">
+        <parameter ref="Reference" requirement="readWrite"/>
+        <parameter ref="SampleSeconds" requirement="readOnly"/>
+        <parameter ref="SuspectData" requirement="readOnly"/>
+        <parameter ref="Values" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="_Baseline:1" dmr:version="2.0">
+      <object ref="Device." requirement="present">
+        <parameter ref="InterfaceStackNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DeviceInfo." requirement="present">
+        <parameter ref="Manufacturer" requirement="readOnly"/>
+        <parameter ref="ManufacturerOUI" requirement="readOnly"/>
+        <parameter ref="ModelName" requirement="readOnly"/>
+        <parameter ref="Description" requirement="readOnly"/>
+        <parameter ref="SerialNumber" requirement="readOnly"/>
+        <parameter ref="HardwareVersion" requirement="readOnly"/>
+        <parameter ref="SoftwareVersion" requirement="readOnly"/>
+        <parameter ref="ProvisioningCode" requirement="readWrite"/>
+        <parameter ref="UpTime" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LANConfigSecurity." requirement="present">
+        <parameter ref="ConfigPassword" requirement="readWrite"/>
+      </object>
+      <object ref="Device.DNS." requirement="present"/>
+      <object ref="Device.DNS.Client." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="ServerNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DNS.Client.Server.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="DNSServer" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="Type" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="_Baseline:2" base="_Baseline:1" dmr:version="2.2">
+      <object ref="Device.InterfaceStack.{i}." requirement="present">
+        <parameter ref="HigherLayer" requirement="readOnly"/>
+        <parameter ref="LowerLayer" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DNS." requirement="present">
+        <parameter ref="SupportedRecordTypes" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="_Baseline:3" base="_Baseline:2" dmr:version="2.4">
+      <object ref="Device." requirement="present">
+        <parameter ref="RootDataModelVersion" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Optical:1" dmr:version="2.4">
+      <object ref="Device.Optical." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Optical.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="OpticalSignalLevel" requirement="readOnly"/>
+        <parameter ref="TransmitOpticalLevel" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Optical.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"/>
+      </object>
+    </profile>
+    <profile name="EthernetRMONStats:1" dmr:version="2.4">
+      <object ref="Device.Ethernet." requirement="present">
+        <parameter ref="RMONStatsNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Ethernet.RMONStats.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readOnly"/>
+        <parameter ref="Bytes" requirement="readOnly"/>
+        <parameter ref="Packets" requirement="readOnly"/>
+        <parameter ref="CRCErroredPackets" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Ghn:1" dmr:version="2.4">
+      <object ref="Device.Ghn." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Ghn.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="FirmwareVersion" requirement="readOnly"/>
+        <parameter ref="TargetDomainNames" requirement="readWrite"/>
+        <parameter ref="DomainName" requirement="readOnly"/>
+        <parameter ref="DomainNameIdentifier" requirement="readOnly"/>
+        <parameter ref="DomainId" requirement="readOnly"/>
+        <parameter ref="DeviceId" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="NodeTypeDMCapable" requirement="readOnly"/>
+        <parameter ref="NodeTypeSCCapable" requirement="readOnly"/>
+        <parameter ref="NodeTypeDMConfig" requirement="readOnly"/>
+        <parameter ref="NodeTypeDMStatus" requirement="readOnly"/>
+        <parameter ref="NodeTypeSCStatus" requirement="readOnly"/>
+        <parameter ref="AssociatedDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Ghn.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"/>
+      </object>
+      <object ref="Device.Ghn.Interface.{i}.AssociatedDevice.{i}." requirement="present">
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="DeviceId" requirement="readOnly"/>
+        <parameter ref="TxPhyRate" requirement="readOnly"/>
+        <parameter ref="RxPhyRate" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DNSRelay:1" dmr:version="2.0">
+      <object ref="Device.DNS." requirement="present"/>
+      <object ref="Device.DNS.Relay." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="ForwardNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DNS.Relay.Forwarding.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="DNSServer" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="Type" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Routing:1" dmr:version="2.0">
+      <object ref="Device.Routing." requirement="present">
+        <parameter ref="RouterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.RIP." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="SupportedModes" requirement="readOnly"/>
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.RIP.InterfaceSetting.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AcceptRA" requirement="readWrite"/>
+        <parameter ref="SendRA" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Routing.Router.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="IPv4ForwardingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.Router.{i}.IPv4Forwarding.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="DestIPAddress" requirement="readWrite"/>
+        <parameter ref="DestSubnetMask" requirement="readWrite"/>
+        <parameter ref="GatewayIPAddress" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="ForwardingMetric" requirement="readWrite"/>
+        <parameter ref="StaticRoute" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Routing:2" base="Routing:1" dmr:version="2.2">
+      <object ref="Device.Routing.Router.{i}.IPv4Forwarding.{i}." requirement="createDelete">
+        <parameter ref="Origin" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IPv6Routing:1" dmr:version="2.2">
+      <object ref="Device.Routing." requirement="present">
+        <parameter ref="RouterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.RIP." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="SupportedModes" requirement="readOnly"/>
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.RIP.InterfaceSetting.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AcceptRA" requirement="readWrite"/>
+        <parameter ref="SendRA" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Routing.RouteInformation." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.RouteInformation.InterfaceSetting.{i}." requirement="present">
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readOnly"/>
+        <parameter ref="SourceRouter" requirement="readOnly"/>
+        <parameter ref="PreferredRouteFlag" requirement="readOnly"/>
+        <parameter ref="Prefix" requirement="readOnly"/>
+        <parameter ref="RouteLifetime" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.Router.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="IPv6ForwardingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Routing.Router.{i}.IPv6Forwarding.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="DestIPPrefix" requirement="readWrite"/>
+        <parameter ref="NextHop" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="ForwardingMetric" requirement="readWrite"/>
+        <parameter ref="Origin" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IPInterface:1" dmr:version="2.0">
+      <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="readWrite"/>
+        <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="VLANTermination:1" dmr:version="2.0">
+      <object ref="Device.Ethernet." requirement="present">
+        <parameter ref="VLANTerminationNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Ethernet.VLANTermination.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="VLANID" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Ethernet.VLANTermination.{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="EthernetLink:1" dmr:version="2.0">
+      <object ref="Device.Ethernet." requirement="present">
+        <parameter ref="LinkNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Ethernet.Link.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Ethernet.Link.{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="Bridge:1" dmr:version="2.0">
+      <object ref="Device.Bridging." requirement="present">
+        <parameter ref="MaxBridgeEntries" requirement="readOnly"/>
+        <parameter ref="MaxDBridgeEntries" requirement="readOnly"/>
+        <parameter ref="BridgeNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="PortNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}.Port.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="ManagementPort" requirement="readWrite"/>
+        <parameter ref="PortState" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}.Port.{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="VLANBridge:1" dmr:version="2.0">
+      <object ref="Device.Bridging." requirement="present">
+        <parameter ref="MaxBridgeEntries" requirement="readOnly"/>
+        <parameter ref="MaxDBridgeEntries" requirement="readOnly"/>
+        <parameter ref="MaxQBridgeEntries" requirement="readOnly"/>
+        <parameter ref="MaxVLANEntries" requirement="readOnly"/>
+        <parameter ref="BridgeNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Standard" requirement="readWrite"/>
+        <parameter ref="PortNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="VLANNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="VLANPortNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}.Port.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="ManagementPort" requirement="readWrite"/>
+        <parameter ref="DefaultUserPriority" requirement="readWrite"/>
+        <parameter ref="PriorityRegeneration" requirement="readWrite"/>
+        <parameter ref="PortState" requirement="readOnly"/>
+        <parameter ref="PVID" requirement="readWrite"/>
+        <parameter ref="AcceptableFrameTypes" requirement="readWrite"/>
+        <parameter ref="IngressFiltering" requirement="readWrite"/>
+        <parameter ref="PriorityTagging" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}.Port.{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>
+      <object ref="Device.Bridging.Bridge.{i}.VLAN.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="VLANID" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}.VLANPort.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="VLAN" requirement="readWrite"/>
+        <parameter ref="Port" requirement="readWrite"/>
+        <parameter ref="Untagged" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BridgeFilter:1" dmr:version="2.0">
+      <object ref="Device.Bridging." requirement="present">
+        <parameter ref="MaxFilterEntries" requirement="readOnly"/>
+        <parameter ref="FilterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Bridging.Filter.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Bridge" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="VLANIDFilter" requirement="readWrite"/>
+        <parameter ref="EthertypeFilterList" requirement="readWrite"/>
+        <parameter ref="EthertypeFilterExclude" requirement="readWrite"/>
+        <parameter ref="SourceMACAddressFilterList" requirement="readWrite"/>
+        <parameter ref="SourceMACAddressFilterExclude" requirement="readWrite"/>
+        <parameter ref="DestMACAddressFilterList" requirement="readWrite"/>
+        <parameter ref="DestMACAddressFilterExclude" requirement="readWrite"/>
+        <parameter ref="SourceMACFromVendorClassIDFilter" requirement="readWrite"/>
+        <parameter ref="SourceMACFromVendorClassIDFilterExclude" requirement="readWrite"/>
+        <parameter ref="SourceMACFromVendorClassIDMode" requirement="readWrite"/>
+        <parameter ref="DestMACFromVendorClassIDFilter" requirement="readWrite"/>
+        <parameter ref="DestMACFromVendorClassIDFilterExclude" requirement="readWrite"/>
+        <parameter ref="DestMACFromVendorClassIDMode" requirement="readWrite"/>
+        <parameter ref="SourceMACFromClientIDFilter" requirement="readWrite"/>
+        <parameter ref="SourceMACFromClientIDFilterExclude" requirement="readWrite"/>
+        <parameter ref="DestMACFromClientIDFilter" requirement="readWrite"/>
+        <parameter ref="DestMACFromClientIDFilterExclude" requirement="readWrite"/>
+        <parameter ref="SourceMACFromUserClassIDFilter" requirement="readWrite"/>
+        <parameter ref="SourceMACFromUserClassIDFilterExclude" requirement="readWrite"/>
+        <parameter ref="DestMACFromUserClassIDFilter" requirement="readWrite"/>
+        <parameter ref="DestMACFromUserClassIDFilterExclude" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BridgeFilter:2" base="BridgeFilter:1" dmr:version="2.2">
+      <object ref="Device.Bridging.Filter.{i}." requirement="createDelete">
+        <parameter ref="DHCPType" requirement="readWrite"/>
+        <parameter ref="SourceMACFromVendorClassIDFilter" requirement="readWrite">
+          <description>
+            REQUIRED only for IPv4 capable devices.
+          </description>
+        </parameter>
+        <parameter ref="DestMACFromVendorClassIDFilter" requirement="readWrite">
+          <description>
+            REQUIRED only for IPv4 capable devices.
+          </description>
+        </parameter>
+        <parameter ref="SourceMACFromVendorClassIDFilterv6" requirement="readWrite">
+          <description>
+            REQUIRED only for IPv6 capable devices.
+          </description>
+        </parameter>
+        <parameter ref="DestMACFromVendorClassIDFilterv6" requirement="readWrite">
+          <description>
+            REQUIRED only for IPv6 capable devices.
+          </description>
+        </parameter>
+      </object>
+    </profile>
+    <profile name="BridgeL3L4Filter:1" extends="BridgeFilter:2" dmr:version="2.6">
+      <object ref="Device.Bridging.Filter.{i}." requirement="createDelete">
+        <parameter ref="DestIP" requirement="readWrite"/>
+        <parameter ref="DestMask" requirement="readWrite"/>
+        <parameter ref="DestIPExclude" requirement="readWrite"/>
+        <parameter ref="SourcePort" requirement="readWrite"/>
+        <parameter ref="SourcePortRangeMax" requirement="readWrite"/>
+        <parameter ref="SourceIP" requirement="readWrite"/>
+        <parameter ref="SourceMask" requirement="readWrite"/>
+        <parameter ref="SourceIPExclude" requirement="readWrite"/>
+        <parameter ref="SourcePortExclude" requirement="readWrite"/>
+        <parameter ref="Protocol" requirement="readWrite"/>
+        <parameter ref="ProtocolExclude" requirement="readWrite"/>
+        <parameter ref="DestPort" requirement="readWrite"/>
+        <parameter ref="DestPortExclude" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="ATMLink:1" dmr:version="2.0">
+      <object ref="Device.ATM." requirement="present">
+        <parameter ref="LinkNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ATM.Link.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="LinkType" requirement="readWrite"/>
+        <parameter ref="DestinationAddress" requirement="readWrite"/>
+        <parameter ref="Encapsulation" requirement="readWrite"/>
+        <parameter ref="FCSPreserved" requirement="readWrite"/>
+        <parameter ref="VCSearchList" requirement="readWrite"/>
+        <parameter ref="AAL" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ATM.Link.{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"/>
+        <parameter ref="TransmittedBlocks" requirement="readOnly"/>
+        <parameter ref="ReceivedBlocks" requirement="readOnly"/>
+        <parameter ref="CRCErrors" requirement="readOnly"/>
+        <parameter ref="HECErrors" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="PTMLink:1" dmr:version="2.0">
+      <object ref="Device.PTM." requirement="present">
+        <parameter ref="LinkNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.PTM.Link.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+      </object>
+      <object ref="Device.PTM.Link.{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="EthernetInterface:1" dmr:version="2.0">
+      <object ref="Device.Ethernet." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Ethernet.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readWrite"/>
+        <parameter ref="DuplexMode" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Ethernet.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="EthernetInterface:2" base="EthernetInterface:1" dmr:version="2.7">
+      <object ref="Device.Ethernet.Interface.{i}." requirement="present">
+        <parameter ref="CurrentBitRate" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ProviderBridge:1" dmr:version="2.7">
+      <object ref="Device.Bridging." requirement="present">
+        <parameter ref="MaxProviderBridgeEntries" requirement="readOnly"/>
+        <parameter ref="ProviderBridgeNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}.Port.{i}." requirement="createDelete">
+        <parameter ref="ServiceAccessPrioritySelection" requirement="readWrite"/>
+        <parameter ref="ServiceAccessPriorityTranslation" requirement="readWrite"/>
+        <parameter ref="Type" requirement="readWrite"/>
+        <parameter ref="TPID" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Bridging.Bridge.{i}.Port.{i}.PriorityCodePoint." requirement="present">
+        <parameter ref="PCPSelection" requirement="readWrite"/>
+        <parameter ref="UseDEI" requirement="readWrite"/>
+        <parameter ref="RequireDropEncoding" requirement="readWrite"/>
+        <parameter ref="PCPEncoding" requirement="readWrite"/>
+        <parameter ref="PCPDecoding" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Bridging.ProviderBridge.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Type" requirement="readWrite"/>
+        <parameter ref="SVLANcomponent" requirement="readWrite"/>
+        <parameter ref="CVLANcomponents" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Ethernet.VLANTermination.{i}." requirement="createDelete">
+        <parameter ref="TPID" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="ProviderBridgeQoS:1" dmr:version="2.7">
+      <object ref="Device.QoS." requirement="present">
+        <parameter ref="DefaultInnerEthernetPriorityMark" requirement="readWrite"/>
+      </object>
+      <object ref="Device.QoS.Classification.{i}." requirement="createDelete">
+        <parameter ref="InnerEthernetPriorityCheck" requirement="readWrite"/>
+        <parameter ref="InnerEthernetPriorityExclude" requirement="readWrite"/>
+        <parameter ref="InnerEthernetPriorityMark" requirement="readWrite"/>
+        <parameter ref="EthernetDEICheck" requirement="readWrite"/>
+        <parameter ref="EthernetDEIExclude" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="ADSL:1" dmr:version="2.0">
+      <description>
+        Note: This profile is valid for G.992.1 modems.
+      </description>
+      <object ref="Device.DSL." requirement="present">
+        <parameter ref="LineNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ChannelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="UpstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="DownstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="UpstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="DownstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="UpstreamAttenuation" requirement="readOnly"/>
+        <parameter ref="DownstreamAttenuation" requirement="readOnly"/>
+        <parameter ref="UpstreamPower" requirement="readOnly"/>
+        <parameter ref="DownstreamPower" requirement="readOnly"/>
+        <parameter ref="XTURVendor" requirement="readOnly"/>
+        <parameter ref="XTURCountry" requirement="readOnly"/>
+        <parameter ref="XTUCVendor" requirement="readOnly"/>
+        <parameter ref="XTUCCountry" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{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="TotalStart" requirement="readOnly"/>
+        <parameter ref="ShowtimeStart" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{i}.Stats.Total." requirement="present">
+        <parameter ref="ErroredSecs" requirement="readOnly"/>
+        <parameter ref="SeverelyErroredSecs" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{i}.Stats.Showtime." requirement="present">
+        <parameter ref="ErroredSecs" requirement="readOnly"/>
+        <parameter ref="SeverelyErroredSecs" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="UpstreamCurrRate" requirement="readOnly"/>
+        <parameter ref="DownstreamCurrRate" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{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="TotalStart" requirement="readOnly"/>
+        <parameter ref="ShowtimeStart" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{i}.Stats.Total." requirement="present">
+        <parameter ref="XTURFECErrors" requirement="readOnly"/>
+        <parameter ref="XTUCFECErrors" requirement="readOnly"/>
+        <parameter ref="XTURHECErrors" requirement="readOnly"/>
+        <parameter ref="XTUCHECErrors" requirement="readOnly"/>
+        <parameter ref="XTURCRCErrors" requirement="readOnly"/>
+        <parameter ref="XTUCCRCErrors" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{i}.Stats.Showtime." requirement="present">
+        <parameter ref="XTURFECErrors" requirement="readOnly"/>
+        <parameter ref="XTUCFECErrors" requirement="readOnly"/>
+        <parameter ref="XTURHECErrors" requirement="readOnly"/>
+        <parameter ref="XTUCHECErrors" requirement="readOnly"/>
+        <parameter ref="XTURCRCErrors" requirement="readOnly"/>
+        <parameter ref="XTUCCRCErrors" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ADSL2:1" dmr:version="2.0">
+      <description>
+        Note: This profile is valid for G.992.3 and G.992.5 modems.
+      </description>
+      <object ref="Device.DSL." requirement="present">
+        <parameter ref="LineNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ChannelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="StandardsSupported" requirement="readOnly"/>
+        <parameter ref="StandardUsed" requirement="readOnly"/>
+        <parameter ref="UpstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="DownstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="UpstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="DownstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="UpstreamPower" requirement="readOnly"/>
+        <parameter ref="DownstreamPower" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{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"/>
+      </object>
+      <object ref="Device.DSL.Line.{i}.TestParams." requirement="present">
+        <parameter ref="HLOGpsds" requirement="readOnly"/>
+        <parameter ref="HLOGpsus" requirement="readOnly"/>
+        <parameter ref="HLOGMTds" requirement="readOnly"/>
+        <parameter ref="HLOGMTus" requirement="readOnly"/>
+        <parameter ref="QLNpsds" requirement="readOnly"/>
+        <parameter ref="QLNpsus" requirement="readOnly"/>
+        <parameter ref="QLNMTds" requirement="readOnly"/>
+        <parameter ref="QLNMTus" requirement="readOnly"/>
+        <parameter ref="SNRpsds" requirement="readOnly"/>
+        <parameter ref="SNRpsus" requirement="readOnly"/>
+        <parameter ref="SNRMTds" requirement="readOnly"/>
+        <parameter ref="SNRMTus" requirement="readOnly"/>
+        <parameter ref="LATNds" requirement="readOnly"/>
+        <parameter ref="LATNus" requirement="readOnly"/>
+        <parameter ref="SATNds" requirement="readOnly"/>
+        <parameter ref="SATNus" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LinkEncapsulationSupported" requirement="readOnly"/>
+        <parameter ref="LinkEncapsulationUsed" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{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="TotalStart" requirement="readOnly"/>
+        <parameter ref="ShowtimeStart" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ADSL2:2" base="ADSL2:1" dmr:version="2.8">
+      <object ref="Device.DSL.Line.{i}." requirement="present">
+        <parameter ref="XTSE" requirement="readOnly"/>
+        <parameter ref="XTSUsed" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{i}." requirement="present">
+        <parameter ref="ACTNDR" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="VDSL2:1" dmr:version="2.0">
+      <object ref="Device.DSL." requirement="present">
+        <parameter ref="LineNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ChannelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="StandardsSupported" requirement="readOnly"/>
+        <parameter ref="StandardUsed" requirement="readOnly"/>
+        <parameter ref="AllowedProfiles" requirement="readOnly"/>
+        <parameter ref="CurrentProfile" requirement="readOnly"/>
+        <parameter ref="UPBOKLE" requirement="readOnly"/>
+        <parameter ref="UpstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="DownstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="UpstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="DownstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="UpstreamAttenuation" requirement="readOnly"/>
+        <parameter ref="DownstreamAttenuation" requirement="readOnly"/>
+        <parameter ref="UpstreamPower" requirement="readOnly"/>
+        <parameter ref="DownstreamPower" requirement="readOnly"/>
+        <parameter ref="TRELLISds" requirement="readOnly"/>
+        <parameter ref="TRELLISus" requirement="readOnly"/>
+        <parameter ref="ACTSNRMODEds" requirement="readOnly"/>
+        <parameter ref="ACTSNRMODEus" requirement="readOnly"/>
+        <parameter ref="ACTUALCE" requirement="readOnly"/>
+        <parameter ref="SNRMpbds" requirement="readOnly"/>
+        <parameter ref="SNRMpbus" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Line.{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"/>
+      </object>
+      <object ref="Device.DSL.Line.{i}.TestParams." requirement="present">
+        <parameter ref="HLOGGds" requirement="readOnly"/>
+        <parameter ref="HLOGGus" requirement="readOnly"/>
+        <parameter ref="HLOGpsds" requirement="readOnly"/>
+        <parameter ref="HLOGpsus" requirement="readOnly"/>
+        <parameter ref="HLOGMTds" requirement="readOnly"/>
+        <parameter ref="HLOGMTus" requirement="readOnly"/>
+        <parameter ref="QLNGds" requirement="readOnly"/>
+        <parameter ref="QLNGus" requirement="readOnly"/>
+        <parameter ref="QLNpsds" requirement="readOnly"/>
+        <parameter ref="QLNpsus" requirement="readOnly"/>
+        <parameter ref="QLNMTds" requirement="readOnly"/>
+        <parameter ref="QLNMTus" requirement="readOnly"/>
+        <parameter ref="SNRGds" requirement="readOnly"/>
+        <parameter ref="SNRGus" requirement="readOnly"/>
+        <parameter ref="SNRpsds" requirement="readOnly"/>
+        <parameter ref="SNRpsus" requirement="readOnly"/>
+        <parameter ref="SNRMTds" requirement="readOnly"/>
+        <parameter ref="SNRMTus" requirement="readOnly"/>
+        <parameter ref="LATNds" requirement="readOnly"/>
+        <parameter ref="LATNus" requirement="readOnly"/>
+        <parameter ref="SATNds" requirement="readOnly"/>
+        <parameter ref="SATNus" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LinkEncapsulationSupported" requirement="readOnly"/>
+        <parameter ref="LinkEncapsulationUsed" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{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="TotalStart" requirement="readOnly"/>
+        <parameter ref="ShowtimeStart" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="VDSL2:2" base="VDSL2:1" dmr:version="2.8">
+      <object ref="Device.DSL.Line.{i}." requirement="present">
+        <parameter ref="XTSE" requirement="readOnly"/>
+        <parameter ref="XTSUsed" requirement="readOnly"/>
+        <parameter ref="UPBOKLEPb" requirement="readOnly"/>
+        <parameter ref="UPBOKLERPb" requirement="readOnly"/>
+        <parameter ref="ACTRAMODEds" requirement="readOnly"/>
+        <parameter ref="ACTRAMODEus" requirement="readOnly"/>
+        <parameter ref="ACTINPROCds" requirement="readOnly"/>
+        <parameter ref="ACTINPROCus" requirement="readOnly"/>
+        <parameter ref="SNRMROCds" requirement="readOnly"/>
+        <parameter ref="SNRMROCus" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.Channel.{i}." requirement="present">
+        <parameter ref="ACTNDR" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="VDSL2:3" base="VDSL2:2" dmr:version="2.12">
+      <object ref="Device.DSL.Line.{i}." requirement="present">
+        <parameter ref="UpstreamAttenuation" status="deleted" requirement="readOnly"/>
+        <parameter ref="DownstreamAttenuation" status="deleted" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="CellularInterfaceBase:1" dmr:version="2.8">
+      <object ref="Device.Cellular." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="AccessPointNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Cellular.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="NetworkInUse" requirement="readOnly"/>
+        <parameter ref="CurrentAccessTechnology" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Cellular.Interface.{i}.USIM." requirement="present">
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="MSISDN" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Cellular.AccessPoint.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="APN" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="CellularInterfaceExtended:1" extends="CellularInterfaceBase:1" dmr:version="2.8">
+      <object ref="Device.Cellular." requirement="present">
+        <parameter ref="RoamingEnabled" requirement="readWrite"/>
+        <parameter ref="RoamingStatus" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Cellular.Interface.{i}." requirement="present">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="IMEI" requirement="readOnly"/>
+        <parameter ref="SupportedAccessTechnologies" requirement="readOnly"/>
+        <parameter ref="PreferredAccessTechnology" requirement="readWrite"/>
+        <parameter ref="NetworkRequested" requirement="readOnly"/>
+        <parameter ref="AvailableNetworks" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Cellular.Interface.{i}.USIM." requirement="present">
+        <parameter ref="IMSI" requirement="readOnly"/>
+        <parameter ref="ICCID" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="CellularInterfaceStats:1" dmr:version="2.8">
+      <object ref="Device.Cellular.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"/>
+      </object>
+    </profile>
+    <profile name="LLDPBaseline:1" dmr:version="2.8">
+      <object ref="Device.LLDP." requirement="present"/>
+      <object ref="Device.LLDP.Discovery." requirement="present">
+        <parameter ref="DeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LLDP.Discovery.Device.{i}." requirement="present">
+        <parameter ref="Interface" requirement="readOnly"/>
+        <parameter ref="ChassisIDSubtype" requirement="readOnly"/>
+        <parameter ref="ChassisID" requirement="readOnly"/>
+        <parameter ref="Host" requirement="readOnly"/>
+        <parameter ref="PortNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LLDP.Discovery.Device.{i}.Port.{i}." requirement="present">
+        <parameter ref="PortIDSubtype" requirement="readOnly"/>
+        <parameter ref="PortID" requirement="readOnly"/>
+        <parameter ref="TTL" requirement="readOnly"/>
+        <parameter ref="PortDescription" requirement="readOnly"/>
+        <parameter ref="LastUpdate" requirement="readOnly"/>
+        <parameter ref="MACAddressList" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="LLDPRemOrgDefInfo:1" dmr:version="2.8">
+      <object ref="Device.LLDP.Discovery.Device.{i}.Port.{i}.LinkInformation." requirement="present">
+        <parameter ref="InterfaceType" requirement="readOnly"/>
+        <parameter ref="MACForwardingTable" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LLDP.Discovery.Device.{i}.DeviceInformation." requirement="present">
+        <parameter ref="DeviceCategory" requirement="readOnly"/>
+        <parameter ref="ManufacturerOUI" requirement="readOnly"/>
+        <parameter ref="ModelName" requirement="readOnly"/>
+        <parameter ref="ModelNumber" requirement="readOnly"/>
+        <parameter ref="VendorSpecificNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LLDP.Discovery.Device.{i}.DeviceInformation.VendorSpecific.{i}." requirement="present">
+        <parameter ref="OrganizationCode" requirement="readOnly"/>
+        <parameter ref="InformationType" requirement="readOnly"/>
+        <parameter ref="Information" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="GREBasic:1" dmr:version="2.8">
+      <object ref="Device.GRE." requirement="present">
+        <parameter ref="TunnelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.GRE.Tunnel.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="RemoteEndpoints" requirement="readWrite"/>
+        <parameter ref="KeepAlivePolicy" requirement="readWrite"/>
+        <parameter ref="KeepAliveTimeout" requirement="readWrite"/>
+        <parameter ref="KeepAliveThreshold" requirement="readWrite"/>
+        <parameter ref="DeliveryHeaderProtocol" requirement="readWrite"/>
+        <parameter ref="ConnectedRemoteEndpoint" requirement="readOnly"/>
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.GRE.Tunnel.{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"/>
+      </object>
+      <object ref="Device.GRE.Tunnel.{i}.Interface.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readOnly"/>
+        <parameter ref="ProtocolIdOverride" requirement="readWrite"/>
+        <parameter ref="UseChecksum" requirement="readWrite"/>
+      </object>
+      <object ref="Device.GRE.Tunnel.{i}.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"/>
+      </object>
+    </profile>
+    <profile name="GREAdv:1" extends="GREBasic:1" dmr:version="2.8">
+      <object ref="Device.GRE." requirement="present">
+        <parameter ref="FilterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.GRE.Tunnel.{i}.Stats." requirement="present">
+        <parameter ref="KeepAliveSent" requirement="readOnly"/>
+        <parameter ref="KeepAliveReceived" requirement="readOnly"/>
+      </object>
+      <object ref="Device.GRE.Tunnel.{i}.Interface.{i}." requirement="createDelete">
+        <parameter ref="KeyIdentifierGenerationPolicy" requirement="readWrite"/>
+        <parameter ref="KeyIdentifier" requirement="readWrite"/>
+        <parameter ref="UseSequenceNumber" requirement="readWrite"/>
+      </object>
+      <object ref="Device.GRE.Tunnel.{i}.Interface.{i}.Stats." requirement="present">
+        <parameter ref="DiscardChecksumReceived" requirement="readOnly"/>
+        <parameter ref="DiscardSequenceNumberReceived" requirement="readOnly"/>
+      </object>
+      <object ref="Device.GRE.Filter.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AllInterfaces" requirement="readWrite"/>
+        <parameter ref="VLANIDCheck" requirement="readWrite"/>
+        <parameter ref="VLANIDExclude" requirement="readWrite"/>
+        <parameter ref="DSCPMarkPolicy" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="MAPBasic:1" dmr:version="2.8">
+      <object ref="Device.MAP." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="DomainNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MAP.Domain.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="TransportMode" requirement="readOnly"/>
+        <parameter ref="WANInterface" requirement="readOnly"/>
+        <parameter ref="IPv6Prefix" requirement="readWrite"/>
+        <parameter ref="BRIPv6Prefix" requirement="readWrite"/>
+        <parameter ref="RuleNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MAP.Domain.{i}.Rule.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="IPv6Prefix" requirement="readWrite"/>
+        <parameter ref="IPv4Prefix" requirement="readWrite"/>
+        <parameter ref="IsFMR" requirement="readWrite"/>
+      </object>
+      <object ref="Device.MAP.Domain.{i}.Interface." requirement="present"/>
+    </profile>
+    <profile name="MAPAdv:1" extends="MAPBasic:1" dmr:version="2.8">
+      <object ref="Device.MAP.Domain.{i}." requirement="present">
+        <parameter ref="PSIDOffset" requirement="readWrite"/>
+        <parameter ref="PSIDLength" requirement="readWrite"/>
+        <parameter ref="PSID" requirement="readWrite"/>
+        <parameter ref="IncludeSystemPorts" requirement="readWrite"/>
+      </object>
+      <object ref="Device.MAP.Domain.{i}.Rule.{i}." requirement="createDelete">
+        <parameter ref="EABitsLength" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BondedDSL:1" dmr:version="2.0">
+      <object ref="Device.DSL." requirement="present">
+        <parameter ref="BondingGroupNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readOnly"/>
+        <parameter ref="GroupStatus" requirement="readOnly"/>
+        <parameter ref="BondScheme" requirement="readOnly"/>
+        <parameter ref="GroupCapacity" requirement="readOnly"/>
+        <parameter ref="RunningTime" requirement="readOnly"/>
+        <parameter ref="BondedChannelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{i}.BondedChannel.{i}." requirement="present">
+        <parameter ref="Channel" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{i}.BondedChannel.{i}.Ethernet." requirement="present"/>
+      <object ref="Device.DSL.BondingGroup.{i}.BondedChannel.{i}.Ethernet.Stats." requirement="present">
+        <parameter ref="UnderflowErrorsSent" requirement="readOnly"/>
+        <parameter ref="CRCErrorsReceived" requirement="readOnly"/>
+        <parameter ref="AlignmentErrorsReceived" requirement="readOnly"/>
+        <parameter ref="ShortPacketsReceived" requirement="readOnly"/>
+        <parameter ref="LongPacketsReceived" requirement="readOnly"/>
+        <parameter ref="OverflowErrorsReceived" requirement="readOnly"/>
+        <parameter ref="PauseFramesReceived" requirement="readOnly"/>
+        <parameter ref="FramesDropped" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{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="TotalStart" requirement="readOnly"/>
+        <parameter ref="CurrentDayStart" requirement="readOnly"/>
+        <parameter ref="QuarterHourStart" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{i}.Stats.Total." requirement="present">
+        <parameter ref="FailureReasons" requirement="readOnly"/>
+        <parameter ref="UpstreamRate" requirement="readOnly"/>
+        <parameter ref="DownstreamRate" requirement="readOnly"/>
+        <parameter ref="UpstreamPacketLoss" requirement="readOnly"/>
+        <parameter ref="DownstreamPacketLoss" requirement="readOnly"/>
+        <parameter ref="FailureCount" requirement="readOnly"/>
+        <parameter ref="ErroredSeconds" requirement="readOnly"/>
+        <parameter ref="SeverelyErroredSeconds" requirement="readOnly"/>
+        <parameter ref="UnavailableSeconds" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{i}.Stats.CurrentDay." requirement="present">
+        <parameter ref="FailureReasons" requirement="readOnly"/>
+        <parameter ref="UpstreamRate" requirement="readOnly"/>
+        <parameter ref="DownstreamRate" requirement="readOnly"/>
+        <parameter ref="UpstreamPacketLoss" requirement="readOnly"/>
+        <parameter ref="DownstreamPacketLoss" requirement="readOnly"/>
+        <parameter ref="FailureCount" requirement="readOnly"/>
+        <parameter ref="ErroredSeconds" requirement="readOnly"/>
+        <parameter ref="SeverelyErroredSeconds" requirement="readOnly"/>
+        <parameter ref="UnavailableSeconds" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{i}.Stats.QuarterHour." requirement="present">
+        <parameter ref="FailureReasons" requirement="readOnly"/>
+        <parameter ref="UpstreamRate" requirement="readOnly"/>
+        <parameter ref="DownstreamRate" requirement="readOnly"/>
+        <parameter ref="UpstreamPacketLoss" requirement="readOnly"/>
+        <parameter ref="DownstreamPacketLoss" requirement="readOnly"/>
+        <parameter ref="FailureCount" requirement="readOnly"/>
+        <parameter ref="ErroredSeconds" requirement="readOnly"/>
+        <parameter ref="SeverelyErroredSeconds" requirement="readOnly"/>
+        <parameter ref="UnavailableSeconds" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSL.BondingGroup.{i}.Ethernet." requirement="present"/>
+      <object ref="Device.DSL.BondingGroup.{i}.Ethernet.Stats." requirement="present">
+        <parameter ref="PAFErrors" requirement="readOnly"/>
+        <parameter ref="PAFSmallFragments" requirement="readOnly"/>
+        <parameter ref="PAFLargeFragments" requirement="readOnly"/>
+        <parameter ref="PAFBadFragments" requirement="readOnly"/>
+        <parameter ref="PAFLostFragments" requirement="readOnly"/>
+        <parameter ref="PAFLateFragments" requirement="readOnly"/>
+        <parameter ref="PAFLostStarts" requirement="readOnly"/>
+        <parameter ref="PAFLostEnds" requirement="readOnly"/>
+        <parameter ref="PAFOverflows" requirement="readOnly"/>
+        <parameter ref="PauseFramesSent" requirement="readOnly"/>
+        <parameter ref="CRCErrorsReceived" requirement="readOnly"/>
+        <parameter ref="AlignmentErrorsReceived" requirement="readOnly"/>
+        <parameter ref="ShortPacketsReceived" requirement="readOnly"/>
+        <parameter ref="LongPacketsReceived" requirement="readOnly"/>
+        <parameter ref="OverflowErrorsReceived" requirement="readOnly"/>
+        <parameter ref="FramesDropped" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="HPNA:1" dmr:version="2.0">
+      <object ref="Device.HPNA." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HPNA.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="FirmwareVersion" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="NetworkUtilization" requirement="readOnly"/>
+        <parameter ref="PossibleConnectionTypes" requirement="readOnly"/>
+        <parameter ref="ConnectionType" requirement="readOnly"/>
+        <parameter ref="PossibleSpectralModes" requirement="readOnly"/>
+        <parameter ref="SpectralMode" requirement="readOnly"/>
+        <parameter ref="MTU" requirement="readOnly"/>
+        <parameter ref="NoiseMargin" requirement="readOnly"/>
+        <parameter ref="MinMulticastRate" requirement="readOnly"/>
+        <parameter ref="NegMulticastRate" requirement="readOnly"/>
+        <parameter ref="MasterSelectionMode" requirement="readOnly"/>
+        <parameter ref="AssociatedDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HPNA.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"/>
+      </object>
+      <object ref="Device.HPNA.Interface.{i}.AssociatedDevice.{i}." requirement="present">
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="NodeID" requirement="readOnly"/>
+        <parameter ref="IsMaster" requirement="readOnly"/>
+        <parameter ref="Synced" requirement="readOnly"/>
+        <parameter ref="TotalSyncTime" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="PHYDiagnosticsEnable" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="HPNAQoS:1" dmr:version="2.0">
+      <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>
+    <profile name="HomePlug:1" dmr:version="2.0">
+      <object ref="Device.HomePlug." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HomePlug.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="LogicalNetwork" requirement="readWrite"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="FirmwareVersion" requirement="readOnly"/>
+        <parameter ref="ForceCCo" requirement="readWrite"/>
+        <parameter ref="NetworkPassword" requirement="readWrite"/>
+        <parameter ref="OtherNetworksPresent" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="AssociatedDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HomePlug.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="MPDUTxAck" requirement="readOnly"/>
+        <parameter ref="MPDUTxCol" requirement="readOnly"/>
+        <parameter ref="MPDUTxFailed" requirement="readOnly"/>
+        <parameter ref="MPDURxAck" requirement="readOnly"/>
+        <parameter ref="MPDURxFailed" requirement="readOnly"/>
+      </object>
+      <object ref="Device.HomePlug.Interface.{i}.AssociatedDevice.{i}." requirement="present">
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="TxPhyRate" requirement="readOnly"/>
+        <parameter ref="RxPhyRate" requirement="readOnly"/>
+        <parameter ref="SNRPerTone" requirement="readOnly"/>
+        <parameter ref="AvgAttenuation" requirement="readOnly"/>
+        <parameter ref="EndStationMACs" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="MoCA:1" dmr:version="2.0">
+      <object ref="Device.MoCA." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MoCA.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="FirmwareVersion" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="HighestVersion" requirement="readOnly"/>
+        <parameter ref="CurrentVersion" requirement="readOnly"/>
+        <parameter ref="NetworkCoordinator" requirement="readOnly"/>
+        <parameter ref="PrivacyEnabledSetting" requirement="readWrite"/>
+        <parameter ref="PrivacyEnabled" requirement="readOnly"/>
+        <parameter ref="FreqCapabilityMask" requirement="readOnly"/>
+        <parameter ref="FreqCurrentMaskSetting" requirement="readWrite"/>
+        <parameter ref="FreqCurrentMask" requirement="readOnly"/>
+        <parameter ref="CurrentOperFreq" requirement="readOnly"/>
+        <parameter ref="KeyPassphrase" requirement="readWrite"/>
+        <parameter ref="NodeID" requirement="readOnly"/>
+        <parameter ref="AssociatedDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MoCA.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"/>
+      </object>
+    </profile>
+    <profile name="UPA:1" dmr:version="2.0">
+      <object ref="Device.UPA." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.UPA.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="FirmwareVersion" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="NodeType" requirement="readWrite"/>
+        <parameter ref="LogicalNetwork" requirement="readWrite"/>
+        <parameter ref="EncryptionMethod" requirement="readWrite"/>
+        <parameter ref="EncryptionKey" requirement="readWrite"/>
+        <parameter ref="EstApplicationThroughput" requirement="readOnly"/>
+        <parameter ref="ActiveNotchEnable" requirement="readWrite"/>
+        <parameter ref="ActiveNotchNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="AssociatedDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.UPA.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"/>
+      </object>
+      <object ref="Device.UPA.Interface.{i}.ActiveNotch.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="StartFreq" requirement="readWrite"/>
+        <parameter ref="StopFreq" requirement="readWrite"/>
+        <parameter ref="Depth" requirement="readWrite"/>
+      </object>
+      <object ref="Device.UPA.Interface.{i}.AssociatedDevice.{i}." requirement="present">
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="Port" requirement="readOnly"/>
+        <parameter ref="LogicalNetwork" requirement="readOnly"/>
+        <parameter ref="PhyTxThroughput" requirement="readOnly"/>
+        <parameter ref="PhyRxThroughput" requirement="readOnly"/>
+        <parameter ref="RealPhyRxThroughput" requirement="readOnly"/>
+        <parameter ref="EstimatedPLR" requirement="readOnly"/>
+        <parameter ref="MeanEstimatedAtt" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="WiFiRadio:1" dmr:version="2.0">
+      <object ref="Device.WiFi." requirement="present">
+        <parameter ref="RadioNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.Radio.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="SupportedFrequencyBands" requirement="readOnly"/>
+        <parameter ref="OperatingFrequencyBand" requirement="readWrite"/>
+        <parameter ref="SupportedStandards" requirement="readOnly"/>
+        <parameter ref="OperatingStandards" requirement="readWrite"/>
+        <parameter ref="RegulatoryDomain" requirement="readWrite"/>
+        <parameter ref="PossibleChannels" requirement="readOnly"/>
+        <parameter ref="Channel" requirement="readWrite"/>
+        <parameter ref="AutoChannelSupported" requirement="readOnly"/>
+        <parameter ref="AutoChannelEnable" requirement="readWrite"/>
+        <parameter ref="TransmitPowerSupported" requirement="readOnly"/>
+        <parameter ref="TransmitPower" requirement="readWrite"/>
+        <parameter ref="ExtensionChannel" requirement="readWrite"/>
+        <parameter ref="GuardInterval" requirement="readWrite"/>
+        <parameter ref="MCS" requirement="readWrite"/>
+        <parameter ref="IEEE80211hSupported" requirement="readOnly"/>
+        <parameter ref="IEEE80211hEnabled" requirement="readWrite"/>
+        <parameter ref="ChannelsInUse" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.Radio.{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"/>
+      </object>
+    </profile>
+    <profile name="WiFiSSID:1" dmr:version="2.0">
+      <object ref="Device.WiFi." requirement="present">
+        <parameter ref="SSIDNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.SSID.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="BSSID" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="SSID" requirement="readWrite"/>
+      </object>
+      <object ref="Device.WiFi.SSID.{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"/>
+      </object>
+    </profile>
+    <profile name="WiFiAccessPoint:1" dmr:version="2.0">
+      <object ref="Device.WiFi." requirement="present">
+        <parameter ref="AccessPointNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.AccessPoint.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="SSIDReference" requirement="readWrite"/>
+        <parameter ref="SSIDAdvertisementEnabled" requirement="readWrite"/>
+        <parameter ref="WMMCapability" requirement="readOnly"/>
+        <parameter ref="UAPSDCapability" requirement="readOnly"/>
+        <parameter ref="WMMEnable" requirement="readWrite"/>
+        <parameter ref="UAPSDEnable" requirement="readWrite"/>
+        <parameter ref="AssociatedDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.AccessPoint.{i}.Security." requirement="present">
+        <parameter ref="ModesSupported" requirement="readOnly"/>
+        <parameter ref="ModeEnabled" requirement="readWrite"/>
+        <parameter ref="WEPKey" requirement="readWrite"/>
+        <parameter ref="PreSharedKey" requirement="readWrite"/>
+        <parameter ref="KeyPassphrase" requirement="readWrite"/>
+        <parameter ref="RekeyingInterval" requirement="readWrite"/>
+        <parameter ref="RadiusServerIPAddr" requirement="readWrite"/>
+        <parameter ref="RadiusServerPort" requirement="readWrite"/>
+        <parameter ref="RadiusSecret" requirement="readWrite"/>
+      </object>
+      <object ref="Device.WiFi.AccessPoint.{i}.WPS." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="ConfigMethodsSupported" requirement="readOnly"/>
+        <parameter ref="ConfigMethodsEnabled" requirement="readWrite"/>
+      </object>
+      <object ref="Device.WiFi.AccessPoint.{i}.AssociatedDevice.{i}." requirement="createDelete">
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="AuthenticationState" requirement="readOnly"/>
+        <parameter ref="LastDataDownlinkRate" requirement="readOnly"/>
+        <parameter ref="LastDataUplinkRate" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="WiFiAccessPoint:2" base="WiFiAccessPoint:1" dmr:version="2.9">
+      <object ref="Device.WiFi.AccessPoint.{i}." requirement="present">
+        <parameter ref="MACAddressControlEnabled" requirement="readWrite"/>
+        <parameter ref="AllowedMACAddress" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="WiFiEndPoint:1" dmr:version="2.0">
+      <object ref="Device.WiFi." requirement="present">
+        <parameter ref="EndPointNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.EndPoint.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="ProfileReference" requirement="readWrite"/>
+        <parameter ref="SSIDReference" requirement="readOnly"/>
+        <parameter ref="ProfileNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.EndPoint.{i}.Stats." requirement="present">
+        <parameter ref="LastDataDownlinkRate" requirement="readOnly"/>
+        <parameter ref="LastDataUplinkRate" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.EndPoint.{i}.Security." requirement="present">
+        <parameter ref="ModesSupported" requirement="readOnly"/>
+      </object>
+      <object ref="Device.WiFi.EndPoint.{i}.Profile.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="SSID" requirement="readWrite"/>
+        <parameter ref="Location" requirement="readWrite"/>
+        <parameter ref="Priority" requirement="readWrite"/>
+      </object>
+      <object ref="Device.WiFi.EndPoint.{i}.Profile.{i}.Security." requirement="present">
+        <parameter ref="ModeEnabled" requirement="readWrite"/>
+        <parameter ref="WEPKey" requirement="readWrite"/>
+        <parameter ref="PreSharedKey" requirement="readWrite"/>
+        <parameter ref="KeyPassphrase" requirement="readWrite"/>
+      </object>
+      <object ref="Device.WiFi.EndPoint.{i}.WPS." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="ConfigMethodsSupported" requirement="readOnly"/>
+        <parameter ref="ConfigMethodsEnabled" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="USBInterface:1" dmr:version="2.0">
+      <object ref="Device.USB." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.USB.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="MaxBitRate" requirement="readOnly"/>
+        <parameter ref="Port" requirement="readOnly"/>
+      </object>
+      <object ref="Device.USB.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="USBPort:1" dmr:version="2.0">
+      <object ref="Device.USB." requirement="present">
+        <parameter ref="PortNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.USB.Port.{i}." requirement="present">
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Standard" requirement="readOnly"/>
+        <parameter ref="Type" requirement="readOnly"/>
+        <parameter ref="Receptacle" requirement="readOnly"/>
+        <parameter ref="Rate" requirement="readOnly"/>
+        <parameter ref="Power" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="NAT:1" dmr:version="2.0">
+      <object ref="Device.NAT." requirement="createDelete">
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="PortMappingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.NAT.InterfaceSetting.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+      </object>
+      <object ref="Device.NAT.PortMapping.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AllInterfaces" requirement="readWrite"/>
+        <parameter ref="LeaseDuration" requirement="readOnly"/>
+        <parameter ref="RemoteHost" requirement="readWrite"/>
+        <parameter ref="ExternalPort" requirement="readWrite"/>
+        <parameter ref="InternalPort" requirement="readWrite"/>
+        <parameter ref="Protocol" requirement="readWrite"/>
+        <parameter ref="InternalClient" requirement="readWrite"/>
+        <parameter ref="Description" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="QoS:1" dmr:version="2.0">
+      <object ref="Device.QoS." requirement="present">
+        <parameter ref="MaxClassificationEntries" requirement="readOnly"/>
+        <parameter ref="ClassificationNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="MaxAppEntries" requirement="readOnly"/>
+        <parameter ref="AppNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="MaxFlowEntries" requirement="readOnly"/>
+        <parameter ref="FlowNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="MaxPolicerEntries" requirement="readOnly"/>
+        <parameter ref="PolicerNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="MaxQueueEntries" requirement="readOnly"/>
+        <parameter ref="QueueNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ShaperNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="DefaultForwardingPolicy" requirement="readWrite"/>
+        <parameter ref="DefaultPolicer" requirement="readWrite"/>
+        <parameter ref="DefaultQueue" requirement="readWrite"/>
+        <parameter ref="DefaultDSCPMark" requirement="readWrite"/>
+        <parameter ref="DefaultEthernetPriorityMark" requirement="readWrite"/>
+        <parameter ref="AvailableAppList" requirement="readOnly"/>
+        <parameter ref="DefaultTrafficClass" requirement="readWrite"/>
+      </object>
+      <object ref="Device.QoS.Classification.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AllInterfaces" requirement="readWrite"/>
+        <parameter ref="DestIP" requirement="readWrite"/>
+        <parameter ref="DestMask" requirement="readWrite"/>
+        <parameter ref="DestIPExclude" requirement="readWrite"/>
+        <parameter ref="SourceIP" requirement="readWrite"/>
+        <parameter ref="SourceMask" requirement="readWrite"/>
+        <parameter ref="SourceIPExclude" requirement="readWrite"/>
+        <parameter ref="Protocol" requirement="readWrite"/>
+        <parameter ref="ProtocolExclude" requirement="readWrite"/>
+        <parameter ref="DestPort" requirement="readWrite"/>
+        <parameter ref="DestPortRangeMax" requirement="readWrite"/>
+        <parameter ref="DestPortExclude" requirement="readWrite"/>
+        <parameter ref="SourcePort" requirement="readWrite"/>
+        <parameter ref="SourcePortRangeMax" requirement="readWrite"/>
+        <parameter ref="SourcePortExclude" requirement="readWrite"/>
+        <parameter ref="SourceMACAddress" requirement="readWrite"/>
+        <parameter ref="SourceMACExclude" requirement="readWrite"/>
+        <parameter ref="DestMACAddress" requirement="readWrite"/>
+        <parameter ref="DestMACExclude" requirement="readWrite"/>
+        <parameter ref="DSCPCheck" requirement="readWrite"/>
+        <parameter ref="DSCPExclude" requirement="readWrite"/>
+        <parameter ref="DSCPMark" requirement="readWrite"/>
+        <parameter ref="EthernetPriorityCheck" requirement="readWrite"/>
+        <parameter ref="EthernetPriorityExclude" requirement="readWrite"/>
+        <parameter ref="EthernetPriorityMark" requirement="readWrite"/>
+        <parameter ref="VLANIDCheck" requirement="readWrite"/>
+        <parameter ref="VLANIDExclude" requirement="readWrite"/>
+        <parameter ref="ForwardingPolicy" requirement="readWrite"/>
+        <parameter ref="Policer" requirement="readWrite"/>
+        <parameter ref="TrafficClass" requirement="readWrite"/>
+      </object>
+      <object ref="Device.QoS.Policer.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="CommittedRate" requirement="readWrite"/>
+        <parameter ref="CommittedBurstSize" requirement="readWrite"/>
+        <parameter ref="MeterType" requirement="readWrite"/>
+        <parameter ref="PossibleMeterTypes" requirement="readOnly"/>
+        <parameter ref="ConformingAction" requirement="readWrite"/>
+        <parameter ref="NonConformingAction" requirement="readWrite"/>
+        <parameter ref="TotalCountedPackets" requirement="readOnly"/>
+        <parameter ref="TotalCountedBytes" requirement="readOnly"/>
+        <parameter ref="ExcessBurstSize" requirement="readWrite"/>
+        <parameter ref="PeakRate" requirement="readWrite"/>
+        <parameter ref="PeakBurstSize" requirement="readWrite"/>
+        <parameter ref="PartialConformingAction" requirement="readWrite"/>
+      </object>
+      <object ref="Device.QoS.Queue.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AllInterfaces" requirement="readWrite"/>
+        <parameter ref="BufferLength" requirement="readOnly"/>
+        <parameter ref="Weight" requirement="readWrite"/>
+        <parameter ref="Precedence" requirement="readWrite"/>
+        <parameter ref="REDThreshold" requirement="readWrite"/>
+        <parameter ref="REDPercentage" requirement="readWrite"/>
+        <parameter ref="DropAlgorithm" requirement="readWrite"/>
+        <parameter ref="SchedulerAlgorithm" requirement="readWrite"/>
+        <parameter ref="ShapingRate" requirement="readWrite"/>
+        <parameter ref="ShapingBurstSize" requirement="readWrite"/>
+        <parameter ref="TrafficClasses" requirement="readWrite"/>
+      </object>
+      <object ref="Device.QoS.Shaper.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="ShapingRate" requirement="readWrite"/>
+        <parameter ref="ShapingBurstSize" requirement="readWrite"/>
+      </object>
+      <object ref="Device.Routing.Router.{i}.IPv4Forwarding.{i}." requirement="notSpecified">
+        <parameter ref="ForwardingPolicy" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="QoS:2" base="QoS:1" dmr:version="2.2">
+      <object ref="Device.Routing.Router.{i}.IPv4Forwarding.{i}." requirement="notSpecified">
+        <description>
+          REQUIRED only for IPv4 capable devices.
+        </description>
+      </object>
+      <object ref="Device.Routing.Router.{i}.IPv6Forwarding.{i}." requirement="notSpecified">
+        <description>
+          REQUIRED only for IPv6 capable devices.
+        </description>
+        <parameter ref="ForwardingPolicy" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="QoSDynamicFlow:1" dmr:version="2.0">
+      <object ref="Device.QoS.App.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="ProtocolIdentifier" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="DefaultForwardingPolicy" requirement="readWrite"/>
+        <parameter ref="DefaultPolicer" requirement="readWrite"/>
+        <parameter ref="DefaultDSCPMark" requirement="readWrite"/>
+        <parameter ref="DefaultEthernetPriorityMark" requirement="readWrite"/>
+        <parameter ref="DefaultTrafficClass" requirement="readWrite"/>
+      </object>
+      <object ref="Device.QoS.Flow.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Type" requirement="readWrite"/>
+        <parameter ref="TypeParameters" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="App" requirement="readWrite"/>
+        <parameter ref="ForwardingPolicy" requirement="readWrite"/>
+        <parameter ref="Policer" requirement="readWrite"/>
+        <parameter ref="DSCPMark" requirement="readWrite"/>
+        <parameter ref="EthernetPriorityMark" requirement="readWrite"/>
+        <parameter ref="TrafficClass" requirement="readWrite"/>
+      </object>
+      <object ref="Device.QoS.Classification.{i}." requirement="notSpecified">
+        <parameter ref="App" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="QoSStats:1" dmr:version="2.0">
+      <object ref="Device.QoS." requirement="present">
+        <parameter ref="QueueStatsNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.QoS.Policer.{i}." requirement="notSpecified">
+        <parameter ref="TotalCountedPackets" requirement="readOnly"/>
+        <parameter ref="TotalCountedBytes" requirement="readOnly"/>
+        <parameter ref="ConformingCountedPackets" requirement="readOnly"/>
+        <parameter ref="ConformingCountedBytes" requirement="readOnly"/>
+        <parameter ref="NonConformingCountedPackets" requirement="readOnly"/>
+        <parameter ref="NonConformingCountedBytes" requirement="readOnly"/>
+      </object>
+      <object ref="Device.QoS.QueueStats.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Queue" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="OutputPackets" requirement="readOnly"/>
+        <parameter ref="OutputBytes" requirement="readOnly"/>
+        <parameter ref="DroppedPackets" requirement="readOnly"/>
+        <parameter ref="DroppedBytes" requirement="readOnly"/>
+        <parameter ref="QueueOccupancyPackets" requirement="readOnly"/>
+        <parameter ref="QueueOccupancyPercentage" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="NeighborDiscovery:1" dmr:version="2.2">
+      <object ref="Device.NeighborDiscovery." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.NeighborDiscovery.InterfaceSetting.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="RetransTimer" requirement="readWrite"/>
+        <parameter ref="RtrSolicitationInterval" requirement="readWrite"/>
+        <parameter ref="MaxRtrSolicitations" requirement="readWrite"/>
+        <parameter ref="NUDEnable" requirement="readWrite"/>
+        <parameter ref="RSEnable" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="RouterAdvertisement:1" dmr:version="2.2">
+      <object ref="Device.RouterAdvertisement." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.RouterAdvertisement.InterfaceSetting.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="MaxRtrAdvInterval" requirement="readWrite"/>
+        <parameter ref="MinRtrAdvInterval" requirement="readWrite"/>
+        <parameter ref="AdvDefaultLifetime" requirement="readWrite"/>
+        <parameter ref="AdvManagedFlag" requirement="readWrite"/>
+        <parameter ref="AdvOtherConfigFlag" requirement="readWrite"/>
+        <parameter ref="AdvMobileAgentFlag" requirement="readWrite"/>
+        <parameter ref="AdvPreferredRouterFlag" requirement="readWrite"/>
+        <parameter ref="AdvNDProxyFlag" requirement="readWrite"/>
+        <parameter ref="AdvLinkMTU" requirement="readWrite"/>
+        <parameter ref="AdvReachableTime" requirement="readWrite"/>
+        <parameter ref="AdvRetransTimer" requirement="readWrite"/>
+        <parameter ref="AdvCurHopLimit" requirement="readWrite"/>
+        <parameter ref="OptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.RouterAdvertisement.InterfaceSetting.{i}.Option.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Tag" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="IPv6rd:1" dmr:version="2.2">
+      <object ref="Device.IPv6rd." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPv6rd.InterfaceSetting.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="BorderRelayIPv4Addresses" requirement="readWrite"/>
+        <parameter ref="AllTrafficToBorderRelay" requirement="readWrite"/>
+        <parameter ref="SPIPv6Prefix" requirement="readWrite"/>
+        <parameter ref="IPv4MaskLength" requirement="readWrite"/>
+        <parameter ref="AddressSource" requirement="readWrite"/>
+        <parameter ref="TunnelInterface" requirement="readOnly"/>
+        <parameter ref="TunneledInterface" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DSLite:1" dmr:version="2.2">
+      <object ref="Device.DSLite." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="InterfaceSettingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DSLite.InterfaceSetting.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="EndpointAssignmentPrecedence" requirement="readWrite"/>
+        <parameter ref="EndpointName" requirement="readWrite"/>
+        <parameter ref="EndpointAddress" requirement="readWrite"/>
+        <parameter ref="Origin" requirement="readOnly"/>
+        <parameter ref="TunnelInterface" requirement="readOnly"/>
+        <parameter ref="TunneledInterface" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DSLite:2" base="DSLite:1" dmr:version="2.5">
+      <object ref="Device.DSLite.InterfaceSetting.{i}." requirement="present">
+        <parameter ref="EndpointAddressTypePrecedence" requirement="readWrite"/>
+        <parameter ref="EndpointAddressInUse" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Hosts:1" dmr:version="2.0">
+      <object ref="Device.Hosts." requirement="present">
+        <parameter ref="HostNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Hosts.Host.{i}." requirement="present">
+        <parameter ref="IPAddress" requirement="readOnly"/>
+        <parameter ref="AddressSource" requirement="readOnly"/>
+        <parameter ref="LeaseTimeRemaining" requirement="readOnly"/>
+        <parameter ref="PhysAddress" requirement="readOnly"/>
+        <parameter ref="HostName" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+        <parameter ref="Layer1Interface" requirement="readOnly"/>
+        <parameter ref="Layer3Interface" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Hosts:2" base="Hosts:1" dmr:version="2.2">
+      <object ref="Device.Hosts.Host.{i}." requirement="present">
+        <parameter ref="DHCPClient" requirement="readOnly"/>
+        <parameter ref="AssociatedDevice" requirement="readOnly"/>
+        <parameter ref="IPv4AddressNumberOfEntries" requirement="readOnly">
+          <description>
+            REQUIRED only for IPv4 capable devices.
+          </description>
+        </parameter>
+        <parameter ref="IPv6AddressNumberOfEntries" requirement="readOnly">
+          <description>
+            REQUIRED only for IPv6 capable devices.
+          </description>
+        </parameter>
+      </object>
+      <object ref="Device.Hosts.Host.{i}.IPv4Address.{i}." requirement="present">
+        <description>
+          REQUIRED only for IPv4 capable devices.
+        </description>
+        <parameter ref="IPAddress" requirement="readOnly"/>
+      </object>
+      <object ref="Device.Hosts.Host.{i}.IPv6Address.{i}." requirement="present">
+        <description>
+          REQUIRED only for IPv6 capable devices.
+        </description>
+        <parameter ref="IPAddress" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="CaptivePortal:1" dmr:version="2.0">
+      <object ref="Device.CaptivePortal." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="AllowedList" requirement="readWrite"/>
+        <parameter ref="URL" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="Time:1" dmr:version="2.0">
+      <object ref="Device.Time." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="NTPServer1" requirement="readWrite"/>
+        <parameter ref="NTPServer2" requirement="readWrite"/>
+        <parameter ref="CurrentLocalTime" requirement="readOnly"/>
+        <parameter ref="LocalTimeZone" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="IEEE8021xAuthentication:1" dmr:version="2.0">
+      <object ref="Device.IEEE8021x." requirement="present">
+        <parameter ref="SupplicantNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE8021x.Supplicant.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="PAEState" requirement="readOnly"/>
+        <parameter ref="EAPIdentity" requirement="readWrite"/>
+        <parameter ref="MaxStart" requirement="readWrite"/>
+        <parameter ref="StartPeriod" requirement="readWrite"/>
+        <parameter ref="HeldPeriod" requirement="readWrite"/>
+        <parameter ref="AuthPeriod" requirement="readWrite"/>
+        <parameter ref="AuthenticationCapabilities" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE8021x.Supplicant.{i}.Stats." requirement="present">
+        <parameter ref="ReceivedFrames" requirement="readOnly"/>
+        <parameter ref="TransmittedFrames" requirement="readOnly"/>
+        <parameter ref="TransmittedStartFrames" requirement="readOnly"/>
+        <parameter ref="TransmittedLogoffFrames" requirement="readOnly"/>
+        <parameter ref="TransmittedResponseIdFrames" requirement="readOnly"/>
+        <parameter ref="TransmittedResponseFrames" requirement="readOnly"/>
+        <parameter ref="ReceivedRequestIdFrames" requirement="readOnly"/>
+        <parameter ref="ReceivedRequestFrames" requirement="readOnly"/>
+        <parameter ref="ReceivedInvalidFrames" requirement="readOnly"/>
+        <parameter ref="ReceivedLengthErrorFrames" requirement="readOnly"/>
+        <parameter ref="LastFrameVersion" requirement="readOnly"/>
+        <parameter ref="LastFrameSourceMACAddress" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE8021x.Supplicant.{i}.EAPMD5." requirement="present">
+        <description>
+          802.1x Authentication provisioning information used for MD5 shared secret exchange. This object will not exist  if EAP-MD5 is not a supported authentication type.
+        </description>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="SharedSecret" requirement="readWrite"/>
+      </object>
+      <object ref="Device.IEEE8021x.Supplicant.{i}.EAPTLS." requirement="present">
+        <description>
+          802.1x Authentication provisioning information used for TLS certificate authentication. This object will not  exist if the EAP-TLS is not a supported authentication type.
+        </description>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="MutualAuthenticationEnable" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="IEEE8021xAuthentication:2" base="IEEE8021xAuthentication:1" dmr:version="2.7">
+      <object ref="Device.IEEE8021x.Supplicant.{i}." requirement="present">
+        <parameter ref="Interface" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="DHCPv4Client:1" dmr:version="2.0">
+      <object ref="Device.DHCPv4." requirement="present">
+        <parameter ref="ClientNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Client.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <command ref="Renew()"/>
+        <parameter ref="IPAddress" requirement="readOnly"/>
+        <parameter ref="SubnetMask" requirement="readOnly"/>
+        <parameter ref="IPRouters" requirement="readOnly"/>
+        <parameter ref="DNSServers" requirement="readOnly"/>
+        <parameter ref="LeaseTimeRemaining" requirement="readOnly"/>
+        <parameter ref="DHCPServer" requirement="readOnly"/>
+        <parameter ref="SentOptionNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ReqOptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Client.{i}.SentOption.{i}." requirement="createDelete">
+        <description>
+          This table is REQUIRED to support sending of option 60 (Vendor Class Identifier) and option 77 (User Class Identifier) values.
+        </description>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Tag" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readWrite"/>
+      </object>
+      <object ref="Device.DHCPv4.Client.{i}.ReqOption.{i}." requirement="createDelete">
+        <description>
+          This table is REQUIRED to support requesting of option 60 (Vendor Class Identifier), option 61 (Client Identifier) and option 77 (User Class Identifier) values.
+        </description>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Tag" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DHCPv4Server:1" dmr:version="2.0">
+      <object ref="Device.DHCPv4." requirement="present"/>
+      <object ref="Device.DHCPv4.Server." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="PoolNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Server.Pool.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="MinAddress" requirement="readWrite"/>
+        <parameter ref="MaxAddress" requirement="readWrite"/>
+        <parameter ref="ReservedAddresses" requirement="readWrite"/>
+        <parameter ref="SubnetMask" requirement="readWrite"/>
+        <parameter ref="DNSServers" requirement="readWrite"/>
+        <parameter ref="DomainName" requirement="readWrite"/>
+        <parameter ref="IPRouters" requirement="readWrite"/>
+        <parameter ref="LeaseTime" requirement="readWrite"/>
+        <parameter ref="OptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Server.Pool.{i}.Option.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Tag" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="DHCPv4CondServing:1" extends="DHCPv4Server:1" dmr:version="2.0">
+      <object ref="Device.DHCPv4.Server.Pool.{i}." requirement="createDelete">
+        <parameter ref="VendorClassID" requirement="readWrite"/>
+        <parameter ref="ClientID" requirement="readWrite"/>
+        <parameter ref="UserClassID" requirement="readWrite"/>
+        <parameter ref="Chaddr" requirement="readWrite"/>
+        <parameter ref="ChaddrMask" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="DHCPv4Relay:1" dmr:version="2.0">
+      <object ref="Device.DHCPv4." requirement="present"/>
+      <object ref="Device.DHCPv4.Relay." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="ForwardingNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Relay.Forwarding.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="LocallyServed" requirement="readWrite"/>
+        <parameter ref="DHCPServerIPAddress" requirement="readWrite"/>
+        <parameter ref="VendorClassID" requirement="readWrite"/>
+        <parameter ref="ClientID" requirement="readWrite"/>
+        <parameter ref="UserClassID" requirement="readWrite"/>
+        <parameter ref="Chaddr" requirement="readWrite"/>
+        <parameter ref="ChaddrMask" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="DHCPv4ServerClientInfo:1" dmr:version="2.2">
+      <object ref="Device.DHCPv4.Server.Pool.{i}." requirement="createDelete">
+        <parameter ref="ClientNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Server.Pool.{i}.Client.{i}." requirement="present">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Chaddr" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+        <parameter ref="IPv4AddressNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="OptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Server.Pool.{i}.Client.{i}.IPv4Address.{i}." requirement="present">
+        <parameter ref="IPAddress" requirement="readOnly"/>
+        <parameter ref="LeaseTimeRemaining" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv4.Server.Pool.{i}.Client.{i}.Option.{i}." requirement="present">
+        <parameter ref="Tag" requirement="readOnly"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DHCPv6Client:1" dmr:version="2.2">
+      <object ref="Device.DHCPv6." requirement="present">
+        <parameter ref="ClientNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Client.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="DUID" requirement="readOnly"/>
+        <parameter ref="RequestAddresses" requirement="readWrite"/>
+        <parameter ref="RequestPrefixes" requirement="readWrite"/>
+        <parameter ref="RapidCommit" requirement="readWrite"/>
+        <command ref="Renew()"/>
+        <parameter ref="SuggestedT1" requirement="readWrite"/>
+        <parameter ref="SuggestedT2" requirement="readWrite"/>
+        <parameter ref="SupportedOptions" requirement="readOnly"/>
+        <parameter ref="RequestedOptions" requirement="readWrite"/>
+        <parameter ref="SentOptionNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ReceivedOptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Client.{i}.SentOption.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Tag" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readWrite"/>
+      </object>
+      <object ref="Device.DHCPv6.Client.{i}.ReceivedOption.{i}." requirement="present">
+        <parameter ref="Tag" requirement="readOnly"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DHCPv6Server:1" dmr:version="2.2">
+      <object ref="Device.DHCPv6." requirement="present"/>
+      <object ref="Device.DHCPv6.Server." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="PoolNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Server.Pool.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="IANAEnable" requirement="readWrite"/>
+        <parameter ref="IAPDEnable" requirement="readWrite"/>
+        <parameter ref="IANAPrefixes" requirement="readOnly"/>
+        <parameter ref="IAPDAddLength" requirement="readWrite"/>
+        <parameter ref="OptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Server.Pool.{i}.Option.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Tag" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="DHCPv6ServerAdv:1" extends="DHCPv6Server:1" dmr:version="2.2">
+      <object ref="Device.DHCPv6.Server.Pool.{i}." requirement="createDelete">
+        <parameter ref="DUID" requirement="readWrite"/>
+        <parameter ref="VendorClassID" requirement="readWrite"/>
+        <parameter ref="UserClassID" requirement="readWrite"/>
+        <parameter ref="SourceAddress" requirement="readWrite"/>
+        <parameter ref="SourceAddressMask" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="DHCPv6ServerClientInfo:1" dmr:version="2.2">
+      <object ref="Device.DHCPv6.Server.Pool.{i}." requirement="createDelete">
+        <parameter ref="ClientNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Server.Pool.{i}.Client.{i}." requirement="present">
+        <parameter ref="SourceAddress" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+        <parameter ref="IPv6AddressNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="IPv6PrefixNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="OptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Server.Pool.{i}.Client.{i}.IPv6Address.{i}." requirement="present">
+        <parameter ref="IPAddress" requirement="readOnly"/>
+        <parameter ref="PreferredLifetime" requirement="readOnly"/>
+        <parameter ref="ValidLifetime" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Server.Pool.{i}.Client.{i}.IPv6Prefix.{i}." requirement="present">
+        <parameter ref="Prefix" requirement="readOnly"/>
+        <parameter ref="PreferredLifetime" requirement="readOnly"/>
+        <parameter ref="ValidLifetime" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Server.Pool.{i}.Client.{i}.Option.{i}." requirement="present">
+        <parameter ref="Tag" requirement="readOnly"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Processors:1" dmr:version="2.1">
+      <object ref="Device.DeviceInfo.Processor.{i}." requirement="present">
+        <parameter ref="Architecture" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="VendorLogFiles:1" dmr:version="2.1">
+      <object ref="Device.DeviceInfo.VendorLogFile.{i}." requirement="present">
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="MaximumSize" requirement="readOnly"/>
+        <parameter ref="Persistent" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Location:1" dmr:version="2.4">
+      <object ref="Device.DeviceInfo." requirement="present">
+        <parameter ref="LocationNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DeviceInfo.Location.{i}." requirement="createDelete">
+        <parameter ref="Source" requirement="readOnly"/>
+        <parameter ref="AcquiredTime" requirement="readOnly"/>
+        <parameter ref="ExternalSource" requirement="readOnly"/>
+        <parameter ref="ExternalProtocol" requirement="readOnly"/>
+        <parameter ref="DataObject" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="FaultMgmtSupportedAlarms:1" dmr:version="2.4">
+      <object ref="Device.FaultMgmt." requirement="present">
+        <parameter ref="SupportedAlarmNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FaultMgmt.SupportedAlarm.{i}." requirement="present">
+        <parameter ref="EventType" requirement="readOnly"/>
+        <parameter ref="ProbableCause" requirement="readOnly"/>
+        <parameter ref="SpecificProblem" requirement="readOnly"/>
+        <parameter ref="PerceivedSeverity" requirement="readOnly"/>
+        <parameter ref="ReportingMechanism" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="FaultMgmtActive:1 " dmr:version="2.4">
+      <object ref="Device.FaultMgmt." requirement="present">
+        <parameter ref="CurrentAlarmNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FaultMgmt.CurrentAlarm.{i}." requirement="present">
+        <parameter ref="AlarmIdentifier" requirement="readOnly"/>
+        <parameter ref="AlarmRaisedTime" requirement="readOnly"/>
+        <parameter ref="AlarmChangedTime" requirement="readOnly"/>
+        <parameter ref="EventType" requirement="readOnly"/>
+        <parameter ref="ProbableCause" requirement="readOnly"/>
+        <parameter ref="PerceivedSeverity" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="FaultMgmtHistory:1" dmr:version="2.4">
+      <object ref="Device.FaultMgmt." requirement="present">
+        <parameter ref="HistoryEventNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FaultMgmt.HistoryEvent.{i}." requirement="present">
+        <parameter ref="EventTime" requirement="readOnly"/>
+        <parameter ref="AlarmIdentifier" requirement="readOnly"/>
+        <parameter ref="NotificationType" requirement="readOnly"/>
+        <parameter ref="EventType" requirement="readOnly"/>
+        <parameter ref="ProbableCause" requirement="readOnly"/>
+        <parameter ref="PerceivedSeverity" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="FaultMgmtExpedited:1" dmr:version="2.4">
+      <object ref="Device.FaultMgmt." requirement="present">
+        <parameter ref="ExpeditedEventNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FaultMgmt.ExpeditedEvent.{i}." requirement="present">
+        <parameter ref="EventTime" requirement="readOnly"/>
+        <parameter ref="AlarmIdentifier" requirement="readOnly"/>
+        <parameter ref="NotificationType" requirement="readOnly"/>
+        <parameter ref="EventType" requirement="readOnly"/>
+        <parameter ref="ProbableCause" requirement="readOnly"/>
+        <parameter ref="PerceivedSeverity" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="FaultMgmtQueued:1" dmr:version="2.4">
+      <object ref="Device.FaultMgmt." requirement="present">
+        <parameter ref="QueuedEventNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FaultMgmt.QueuedEvent.{i}." requirement="present">
+        <parameter ref="EventTime" requirement="readOnly"/>
+        <parameter ref="AlarmIdentifier" requirement="readOnly"/>
+        <parameter ref="NotificationType" requirement="readOnly"/>
+        <parameter ref="EventType" requirement="readOnly"/>
+        <parameter ref="ProbableCause" requirement="readOnly"/>
+        <parameter ref="PerceivedSeverity" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="FAP_GPS:1" dmr:version="2.4">
+      <object ref="Device.FAP.GPS." requirement="present">
+        <parameter ref="ScanOnBoot" requirement="readWrite"/>
+        <parameter ref="ScanPeriodically" requirement="readWrite"/>
+        <parameter ref="PeriodicInterval" requirement="readWrite"/>
+        <parameter ref="PeriodicTime" requirement="readWrite"/>
+        <parameter ref="ContinuousGPS" requirement="readWrite"/>
+        <parameter ref="ScanTimeout" requirement="readWrite"/>
+        <parameter ref="ScanStatus" requirement="readOnly"/>
+        <parameter ref="ErrorDetails" requirement="readOnly"/>
+        <parameter ref="LastScanTime" requirement="readOnly"/>
+        <parameter ref="LastSuccessfulScanTime" requirement="readOnly"/>
+        <parameter ref="LockedLatitude" requirement="readOnly"/>
+        <parameter ref="LockedLongitude" requirement="readOnly"/>
+        <parameter ref="NumberOfSatellites" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="FAP_PerfMgmt:1" dmr:version="2.4">
+      <object ref="Device.FAP.PerfMgmt." requirement="present">
+        <parameter ref="ConfigNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FAP.PerfMgmt.Config.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="URL" requirement="readWrite"/>
+        <parameter ref="Username" requirement="readWrite"/>
+        <parameter ref="Password" requirement="readWrite"/>
+        <parameter ref="PeriodicUploadInterval" requirement="readWrite"/>
+        <parameter ref="PeriodicUploadTime" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="FAP_ApplicationPlatform:1" dmr:version="2.4">
+      <object ref="Device.FAP.ApplicationPlatform." requirement="present">
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="MaxNumberOfApplications" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FAP.ApplicationPlatform.Control." requirement="present">
+        <parameter ref="AuthenticationMethod" requirement="readWrite"/>
+      </object>
+      <object ref="Device.FAP.ApplicationPlatform.Control.FemtoAwareness." requirement="present">
+        <parameter ref="APIEnable" requirement="readWrite"/>
+        <parameter ref="MaxAPIUsersNumber" requirement="readWrite"/>
+        <parameter ref="FemtozoneID" requirement="readWrite"/>
+      </object>
+      <object ref="Device.FAP.ApplicationPlatform.Control.SMS." requirement="present">
+        <parameter ref="APIEnable" requirement="readWrite"/>
+        <parameter ref="MaxAPIUsersNumber" requirement="readWrite"/>
+        <parameter ref="MinSendSMSTimeInterval" requirement="readWrite"/>
+      </object>
+      <object ref="Device.FAP.ApplicationPlatform.Control.MMS." requirement="present">
+        <parameter ref="APIEnable" requirement="readWrite"/>
+        <parameter ref="MaxAPIUsersNumber" requirement="readWrite"/>
+        <parameter ref="MinSendMMSTimeInterval" requirement="readWrite"/>
+      </object>
+      <object ref="Device.FAP.ApplicationPlatform.Control.TerminalLocation." requirement="present">
+        <parameter ref="APIEnable" requirement="readWrite"/>
+        <parameter ref="MaxAPIUsersNumber" requirement="readWrite"/>
+        <parameter ref="QueryMobileLocationResponseAddress" requirement="readWrite"/>
+        <parameter ref="QueryMobileLocationResponseLongitudeLatitude" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BulkDataColl:1" dmr:version="2.5">
+      <object ref="Device.BulkData." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="MinReportingInterval" requirement="readOnly"/>
+        <parameter ref="Protocols" requirement="readOnly"/>
+        <parameter ref="EncodingTypes" requirement="readOnly"/>
+        <parameter ref="ProfileNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.BulkData.Profile.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Protocol" requirement="readWrite"/>
+        <parameter ref="EncodingType" requirement="readWrite"/>
+        <parameter ref="ReportingInterval" requirement="readWrite"/>
+        <parameter ref="TimeReference" requirement="readWrite"/>
+        <parameter ref="ParameterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.BulkData.Profile.{i}.Parameter.{i}." requirement="createDelete">
+        <parameter ref="Reference" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BulkDataReports:1" extends="BulkDataColl:1" dmr:version="2.10">
+      <object ref="Device.BulkData." requirement="present">
+        <parameter ref="ParameterWildCardSupported" requirement="readOnly"/>
+      </object>
+      <object ref="Device.BulkData.Profile.{i}." requirement="createDelete">
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="NumberOfRetainedFailedReports" requirement="readWrite"/>
+      </object>
+      <object ref="Device.BulkData.Profile.{i}.Parameter.{i}." requirement="createDelete">
+        <parameter ref="Name" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BulkDataJSONEncoding:1" extends="BulkDataColl:1" dmr:version="2.10">
+      <object ref="Device.BulkData.Profile.{i}.JSONEncoding." requirement="present">
+        <parameter ref="ReportFormat" requirement="readWrite"/>
+        <parameter ref="ReportTimestamp" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BulkDataCSVEncoding:1" extends="BulkDataColl:1" dmr:version="2.10">
+      <object ref="Device.BulkData.Profile.{i}.CSVEncoding." requirement="present">
+        <parameter ref="FieldSeparator" requirement="readWrite"/>
+        <parameter ref="RowSeparator" requirement="readWrite"/>
+        <parameter ref="EscapeCharacter" requirement="readWrite"/>
+        <parameter ref="ReportFormat" requirement="readWrite"/>
+        <parameter ref="RowTimestamp" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BulkDataHTTP:1" extends="BulkDataColl:1" dmr:version="2.10">
+      <object ref="Device.BulkData.Profile.{i}.HTTP." requirement="present">
+        <parameter ref="URL" requirement="readWrite"/>
+        <parameter ref="Username" requirement="readWrite"/>
+        <parameter ref="Password" requirement="readWrite"/>
+        <parameter ref="CompressionsSupported" requirement="readOnly"/>
+        <parameter ref="Compression" requirement="readWrite"/>
+        <parameter ref="MethodsSupported" requirement="readOnly"/>
+        <parameter ref="Method" requirement="readWrite"/>
+        <parameter ref="UseDateHeader" requirement="readWrite"/>
+        <parameter ref="RetryEnable" requirement="readWrite"/>
+        <parameter ref="RetryMinimumWaitInterval" requirement="readWrite"/>
+        <parameter ref="RetryIntervalMultiplier" requirement="readWrite"/>
+        <parameter ref="RequestURIParameterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.BulkData.Profile.{i}.HTTP.RequestURIParameter.{i}." requirement="createDelete">
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Reference" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BulkDataFileTransfer:1" extends="BulkDataColl:1" dmr:version="2.5">
+      <object ref="Device.BulkData.Profile.{i}." requirement="createDelete">
+        <parameter ref="FileTransferURL" requirement="readWrite"/>
+        <parameter ref="FileTransferUsername" requirement="readWrite"/>
+        <parameter ref="FileTransferPassword" requirement="readWrite"/>
+        <parameter ref="ControlFileFormat" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="BulkDataStreaming:1" extends="BulkDataColl:1" dmr:version="2.5">
+      <object ref="Device.BulkData.Profile.{i}." requirement="createDelete">
+        <parameter ref="StreamingHost" requirement="readWrite"/>
+        <parameter ref="StreamingPort" requirement="readWrite"/>
+        <parameter ref="StreamingSessionID" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="IPsec:1" dmr:version="2.5">
+      <object ref="Device.IPsec." requirement="present">
+        <parameter ref="AHSupported" requirement="readOnly"/>
+        <parameter ref="IKEv2SupportedEncryptionAlgorithms" requirement="readOnly"/>
+        <parameter ref="ESPSupportedEncryptionAlgorithms" requirement="readOnly"/>
+        <parameter ref="IKEv2SupportedPseudoRandomFunctions" requirement="readOnly"/>
+        <parameter ref="SupportedIntegrityAlgorithms" requirement="readOnly"/>
+        <parameter ref="SupportedDiffieHellmanGroupTransforms" requirement="readOnly"/>
+        <parameter ref="MaxFilterEntries" requirement="readOnly"/>
+        <parameter ref="MaxProfileEntries" requirement="readOnly"/>
+        <parameter ref="FilterNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ProfileNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="TunnelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPsec.Stats." requirement="present">
+        <parameter ref="NegotiationFailures" requirement="readOnly"/>
+        <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="UnknownSPIErrors" requirement="readOnly"/>
+        <parameter ref="DecryptionErrors" requirement="readOnly"/>
+        <parameter ref="IntegrityErrors" requirement="readOnly"/>
+        <parameter ref="OtherReceiveErrors" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPsec.Filter.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AllInterfaces" requirement="readWrite"/>
+        <parameter ref="DestIP" requirement="readWrite"/>
+        <parameter ref="DestMask" requirement="readWrite"/>
+        <parameter ref="DestIPExclude" requirement="readWrite"/>
+        <parameter ref="SourceIP" requirement="readWrite"/>
+        <parameter ref="SourceMask" requirement="readWrite"/>
+        <parameter ref="SourceIPExclude" requirement="readWrite"/>
+        <parameter ref="Protocol" requirement="readWrite"/>
+        <parameter ref="ProtocolExclude" requirement="readWrite"/>
+        <parameter ref="DestPort" requirement="readWrite"/>
+        <parameter ref="DestPortRangeMax" requirement="readWrite"/>
+        <parameter ref="DestPortExclude" requirement="readWrite"/>
+        <parameter ref="SourcePort" requirement="readWrite"/>
+        <parameter ref="SourcePortRangeMax" requirement="readWrite"/>
+        <parameter ref="SourcePortExclude" requirement="readWrite"/>
+        <parameter ref="ProcessingChoice" requirement="readWrite"/>
+        <parameter ref="Profile" requirement="readWrite"/>
+      </object>
+      <object ref="Device.IPsec.Profile.{i}." requirement="createDelete">
+        <parameter ref="MaxChildSAs" requirement="readWrite"/>
+        <parameter ref="RemoteEndpoints" requirement="readWrite"/>
+        <parameter ref="ForwardingPolicy" requirement="readWrite"/>
+        <parameter ref="Protocol" requirement="readWrite"/>
+        <parameter ref="IKEv2AuthenticationMethod" requirement="readWrite"/>
+        <parameter ref="IKEv2AllowedEncryptionAlgorithms" requirement="readWrite"/>
+        <parameter ref="ESPAllowedEncryptionAlgorithms" requirement="readWrite"/>
+        <parameter ref="IKEv2AllowedPseudoRandomFunctions" requirement="readWrite"/>
+        <parameter ref="IKEv2AllowedIntegrityAlgorithms" requirement="readWrite"/>
+        <parameter ref="ESPAllowedIntegrityAlgorithms" requirement="readWrite"/>
+        <parameter ref="IKEv2AllowedDiffieHellmanGroupTransforms" requirement="readWrite"/>
+      </object>
+      <object ref="Device.IPsec.Tunnel.{i}." requirement="present">
+        <parameter ref="TunnelInterface" requirement="readOnly"/>
+        <parameter ref="TunneledInterface" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPsec.Tunnel.{i}.Stats." requirement="present">
+        <parameter ref="DecryptionErrors" requirement="readOnly"/>
+        <parameter ref="IntegrityErrors" requirement="readOnly"/>
+        <parameter ref="OtherReceiveErrors" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IPsecAdv:1" extends="IPsec:1" dmr:version="2.5">
+      <object ref="Device.IPsec." requirement="present">
+        <parameter ref="IKEv2SANumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPsec.IKEv2SA.{i}." requirement="present">
+        <parameter ref="Tunnel" requirement="readOnly"/>
+        <parameter ref="LocalAddress" requirement="readOnly"/>
+        <parameter ref="RemoteAddress" requirement="readOnly"/>
+        <parameter ref="CreationTime" requirement="readOnly"/>
+        <parameter ref="ChildSANumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPsec.IKEv2SA.{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="DecryptionErrors" requirement="readOnly"/>
+        <parameter ref="IntegrityErrors" requirement="readOnly"/>
+        <parameter ref="OtherReceiveErrors" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPsec.IKEv2SA.{i}.ChildSA.{i}." requirement="present">
+        <parameter ref="InboundSPI" requirement="readOnly"/>
+        <parameter ref="OutboundSPI" requirement="readOnly"/>
+        <parameter ref="CreationTime" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IPsec.IKEv2SA.{i}.ChildSA.{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="DecryptionErrors" requirement="readOnly"/>
+        <parameter ref="IntegrityErrors" requirement="readOnly"/>
+        <parameter ref="OtherReceiveErrors" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DNS_SD:1" dmr:version="2.6">
+      <object ref="Device.DNS.SD." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="ServiceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DNS.SD.Service.{i}." requirement="present">
+        <parameter ref="InstanceName" requirement="readOnly"/>
+        <parameter ref="ApplicationProtocol" requirement="readOnly"/>
+        <parameter ref="TransportProtocol" requirement="readOnly"/>
+        <parameter ref="Domain" requirement="readOnly"/>
+        <parameter ref="Port" requirement="readOnly"/>
+        <parameter ref="Target" requirement="readOnly"/>
+        <parameter ref="Priority" requirement="readOnly"/>
+        <parameter ref="Weight" requirement="readOnly"/>
+        <parameter ref="TimeToLive" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="LastUpdate" requirement="readOnly"/>
+        <parameter ref="Host" requirement="readOnly"/>
+        <parameter ref="TextRecordNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DNS.SD.Service.{i}.TextRecord.{i}." requirement="present">
+        <parameter ref="Key" requirement="readOnly"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="XMPPBasic:1" dmr:version="2.7">
+      <object ref="Device.XMPP." requirement="present">
+        <parameter ref="ConnectionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.XMPP.Connection.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Username" requirement="readWrite"/>
+        <parameter ref="Password" requirement="readWrite"/>
+        <parameter ref="Domain" requirement="readWrite"/>
+        <parameter ref="Resource" requirement="readWrite"/>
+        <parameter ref="JabberID" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="LastChangeDate" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="XMPPAdvanced:1" extends="XMPPBasic:1" dmr:version="2.7">
+      <object ref="Device.XMPP.Connection.{i}." requirement="createDelete">
+        <parameter ref="ServerConnectAlgorithm" requirement="readWrite"/>
+        <parameter ref="KeepAliveInterval" requirement="readWrite"/>
+        <parameter ref="ServerNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="UseTLS" requirement="readWrite"/>
+        <parameter ref="TLSEstablished" requirement="readOnly"/>
+      </object>
+      <object ref="Device.XMPP.Connection.{i}.Server.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Priority" requirement="readWrite"/>
+        <parameter ref="Weight" requirement="readWrite"/>
+        <parameter ref="ServerAddress" requirement="readWrite"/>
+        <parameter ref="Port" requirement="readWrite"/>
+      </object>
+      <object ref="Device.XMPP.Connection.{i}.Stats." requirement="present">
+        <parameter ref="ReceivedMessages" requirement="readOnly"/>
+        <parameter ref="TransmittedMessages" requirement="readOnly"/>
+        <parameter ref="ReceivedErrorMessages" requirement="readOnly"/>
+        <parameter ref="TransmittedErrorMessages" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="XMPPReconnect:1" dmr:version="2.7">
+      <object ref="Device.XMPP.Connection.{i}." requirement="createDelete">
+        <parameter ref="ServerConnectAttempts" requirement="readWrite"/>
+        <parameter ref="ServerRetryInitialInterval" requirement="readWrite"/>
+        <parameter ref="ServerRetryIntervalMultiplier" requirement="readWrite"/>
+        <parameter ref="ServerRetryMaxInterval" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905." requirement="present">
+        <parameter ref="Version" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL." requirement="present">
+        <parameter ref="IEEE1905Id" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.Interface.{i}." requirement="present">
+        <parameter ref="InterfaceId" requirement="readOnly"/>
+        <parameter ref="MediaType" requirement="readOnly"/>
+        <parameter ref="GenericPhyOUI" requirement="readOnly"/>
+        <parameter ref="GenericPhyVariant" requirement="readOnly"/>
+        <parameter ref="GenericPhyURL" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.Security." requirement="present">
+        <parameter ref="SetupMethod" requirement="readWrite"/>
+        <parameter ref="Password" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905TopologyMetric:1" extends="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905.AL.NetworkTopology." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="IEEE1905DeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}." requirement="present">
+        <parameter ref="IEEE1905Id" requirement="readOnly"/>
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="IEEE1905NeighborNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}." requirement="present">
+        <parameter ref="LocalInterface" requirement="readOnly"/>
+        <parameter ref="NeighborDeviceId" requirement="readOnly"/>
+        <parameter ref="MetricNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}.Metric.{i}." requirement="present">
+        <parameter ref="NeighborMACAddress" requirement="readOnly"/>
+        <parameter ref="IEEE802dot1Bridge" requirement="readOnly"/>
+        <parameter ref="PacketErrors" requirement="readOnly"/>
+        <parameter ref="PacketErrorsReceived" requirement="readOnly"/>
+        <parameter ref="TransmittedPackets" requirement="readOnly"/>
+        <parameter ref="PacketsReceived" requirement="readOnly"/>
+        <parameter ref="MACThroughputCapacity" requirement="readOnly"/>
+        <parameter ref="LinkAvailability" requirement="readOnly"/>
+        <parameter ref="PHYRate" requirement="readOnly"/>
+        <parameter ref="RSSI" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905TopologyNeighbor:1" extends="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905.AL.NetworkTopology." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="IEEE1905DeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}." requirement="present">
+        <parameter ref="IEEE1905Id" requirement="readOnly"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="NonIEEE1905NeighborNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="IEEE1905NeighborNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="L2NeighborNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}." requirement="present">
+        <parameter ref="LocalInterface" requirement="readOnly"/>
+        <parameter ref="NeighborDeviceId" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.Interface.{i}." requirement="present">
+        <parameter ref="InterfaceId" requirement="readOnly"/>
+        <parameter ref="MediaType" requirement="readOnly"/>
+        <parameter ref="PowerState" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.NonIEEE1905Neighbor.{i}." requirement="present">
+        <parameter ref="LocalInterface" requirement="readOnly"/>
+        <parameter ref="NeighborInterfaceId" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.L2Neighbor.{i}." requirement="present">
+        <parameter ref="LocalInterface" requirement="readOnly"/>
+        <parameter ref="NeighborInterfaceId" requirement="readOnly"/>
+        <parameter ref="BehindInterfaceIds" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905TopologyHigherLayer:1" extends="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905.AL.NetworkTopology." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="IEEE1905DeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}." requirement="present">
+        <parameter ref="IEEE1905Id" requirement="readOnly"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="FriendlyName" requirement="readOnly"/>
+        <parameter ref="ManufacturerName" requirement="readOnly"/>
+        <parameter ref="ManufacturerModel" requirement="readOnly"/>
+        <parameter ref="ControlURL" requirement="readOnly"/>
+        <parameter ref="IPv4AddressNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="IPv6AddressNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IPv4Address.{i}." requirement="present">
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="IPv4Address" requirement="readOnly"/>
+        <parameter ref="IPv4AddressType" requirement="readOnly"/>
+        <parameter ref="DHCPServer" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IPv6Address.{i}." requirement="present">
+        <parameter ref="MACAddress" requirement="readOnly"/>
+        <parameter ref="IPv6Address" requirement="readOnly"/>
+        <parameter ref="IPv6AddressType" requirement="readOnly"/>
+        <parameter ref="IPv6AddressOrigin" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905Power:1" extends="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905.AL.Interface.{i}." requirement="present">
+        <parameter ref="SetIntfPowerStateEnabled" requirement="readWrite"/>
+        <parameter ref="PowerState" requirement="readWrite"/>
+        <parameter ref="VendorPropertiesNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.Interface.{i}.VendorProperties.{i}." requirement="present">
+        <parameter ref="OUI" requirement="readOnly"/>
+        <parameter ref="Information" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905InterfaceSelection:1" extends="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905.AL.Interface.{i}." requirement="present">
+        <parameter ref="SetIntfPowerStateEnabled" requirement="readWrite"/>
+        <parameter ref="PowerState" requirement="readWrite"/>
+        <parameter ref="VendorPropertiesNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.Interface.{i}.VendorProperties.{i}." requirement="present">
+        <parameter ref="OUI" requirement="readOnly"/>
+        <parameter ref="Information" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.ForwardingTable." requirement="present">
+        <parameter ref="SetForwardingEnabled" requirement="readOnly"/>
+        <parameter ref="ForwardingRuleNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.ForwardingTable.ForwardingRule.{i}." requirement="createDelete">
+        <parameter ref="InterfaceList" requirement="readWrite"/>
+        <parameter ref="MACDestinationAddress" requirement="readWrite"/>
+        <parameter ref="MACDestinationAddressFlag" requirement="readWrite"/>
+        <parameter ref="MACSourceAddress" requirement="readWrite"/>
+        <parameter ref="MACSourceAddressFlag" requirement="readWrite"/>
+        <parameter ref="EtherType" requirement="readWrite"/>
+        <parameter ref="EtherTypeFlag" requirement="readWrite"/>
+        <parameter ref="Vid" requirement="readWrite"/>
+        <parameter ref="VidFlag" requirement="readWrite"/>
+        <parameter ref="PCP" requirement="readWrite"/>
+        <parameter ref="PCPFlag" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905LinkMetric:1" extends="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905.AL.Interface.{i}." requirement="present">
+        <parameter ref="SetIntfPowerStateEnabled" requirement="readWrite"/>
+        <parameter ref="PowerState" requirement="readWrite"/>
+        <parameter ref="LinkNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="VendorPropertiesNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.Interface.{i}.VendorProperties.{i}." requirement="present">
+        <parameter ref="OUI" requirement="readOnly"/>
+        <parameter ref="Information" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.Interface.{i}.Link.{i}." requirement="present">
+        <parameter ref="InterfaceId" requirement="readOnly"/>
+        <parameter ref="IEEE1905Id" requirement="readOnly"/>
+        <parameter ref="MediaType" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.Interface.{i}.Link.{i}.Metric." requirement="present">
+        <parameter ref="PacketErrors" requirement="readOnly"/>
+        <parameter ref="PacketErrorsReceived" requirement="readOnly"/>
+        <parameter ref="TransmittedPackets" requirement="readOnly"/>
+        <parameter ref="PacketsReceived" requirement="readOnly"/>
+        <parameter ref="MACThroughputCapacity" requirement="readOnly"/>
+        <parameter ref="LinkAvailability" requirement="readOnly"/>
+        <parameter ref="PHYRate" requirement="readOnly"/>
+        <parameter ref="RSSI" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="IEEE1905NetworkTopology:1" extends="IEEE1905Device:1" dmr:version="2.9">
+      <object ref="Device.IEEE1905.AL.NetworkTopology." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="MaxChangeLogEntries" requirement="readWrite"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="IEEE1905DeviceNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ChangeLogNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.ChangeLog.{i}." requirement="present">
+        <parameter ref="TimeStamp" requirement="readOnly"/>
+        <parameter ref="EventType" requirement="readOnly"/>
+        <parameter ref="ReporterDeviceId" requirement="readOnly"/>
+        <parameter ref="ReporterInterfaceId" requirement="readOnly"/>
+        <parameter ref="NeighborType" requirement="readOnly"/>
+        <parameter ref="NeighborId" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}." requirement="present">
+        <parameter ref="IEEE1905Id" requirement="readOnly"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="NonIEEE1905NeighborNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="IEEE1905NeighborNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="BridgingTupleNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.BridgingTuple.{i}." requirement="present">
+        <parameter ref="InterfaceList" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.IEEE1905Neighbor.{i}." requirement="present">
+        <parameter ref="LocalInterface" requirement="readOnly"/>
+        <parameter ref="NeighborDeviceId" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.Interface.{i}." requirement="present">
+        <parameter ref="InterfaceId" requirement="readOnly"/>
+        <parameter ref="MediaType" requirement="readOnly"/>
+        <parameter ref="PowerState" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IEEE1905.AL.NetworkTopology.IEEE1905Device.{i}.NonIEEE1905Neighbor.{i}." requirement="present">
+        <parameter ref="LocalInterface" requirement="readOnly"/>
+        <parameter ref="NeighborInterfaceId" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="MQTTClientBase:1" dmr:version="2.10">
+      <description>
+        Provides basic MQTT client control and statistics
+      </description>
+      <object ref="Device.MQTT." requirement="present">
+        <parameter ref="ClientNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MQTT.Client.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="BrokerAddress" requirement="readWrite"/>
+        <parameter ref="BrokerPort" requirement="readWrite"/>
+        <parameter ref="CleanSession" requirement="readWrite"/>
+        <parameter ref="KeepAliveTime" requirement="readWrite"/>
+        <parameter ref="SubscriptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MQTT.Client.{i}.Stats." requirement="present">
+        <parameter ref="BrokerConnectionEstablished" requirement="readOnly"/>
+        <parameter ref="MQTTMessagesSent" requirement="readOnly"/>
+        <parameter ref="MQTTMessagesReceived" requirement="readOnly"/>
+        <parameter ref="ConnectionErrors" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="MQTTClientSubscribe:1" base="MQTTClientBase:1" dmr:version="2.10">
+      <description>
+        Adds client subscription control and access to received topics
+      </description>
+      <object ref="Device.MQTT.Client.{i}.Subscription.{i}." requirement="present">
+        <parameter ref="Topic" requirement="readWrite"/>
+        <parameter ref="QoS" requirement="readOnly"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="MQTTBrokerBase:1" dmr:version="2.10">
+      <description>
+        Provides basic MQTT broker control and statistics
+      </description>
+      <object ref="Device.MQTT." requirement="present">
+        <parameter ref="BrokerNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MQTT.Broker.{i}." requirement="present">
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="Port" requirement="readWrite"/>
+      </object>
+      <object ref="Device.MQTT.Broker.{i}.Stats." requirement="present">
+        <parameter ref="TotalNumberOfClients" requirement="readOnly"/>
+        <parameter ref="NumberOfActiveClients" requirement="readOnly"/>
+        <parameter ref="MQTTMessagesSent" requirement="readOnly"/>
+        <parameter ref="MQTTMessagesReceived" requirement="readOnly"/>
+        <parameter ref="ConnectionErrors" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="MQTTBrokerBridgeBase:1" base="MQTTBrokerBase:1" dmr:version="2.10">
+      <description>
+        Adds parameters for MQTT network interconnection with Bridges
+      </description>
+      <object ref="Device.MQTT.Broker.{i}." requirement="present">
+        <parameter ref="BridgeNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MQTT.Broker.{i}.Bridge.{i}." requirement="present">
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="ServerConnection" requirement="readOnly"/>
+        <parameter ref="ServerNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="SubscriptionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.MQTT.Broker.{i}.Bridge.{i}.Server.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Priority" requirement="readWrite"/>
+        <parameter ref="Address" requirement="readWrite"/>
+        <parameter ref="Port" requirement="readWrite"/>
+      </object>
+      <object ref="Device.MQTT.Broker.{i}.Bridge.{i}.Subscription.{i}." requirement="present">
+        <parameter ref="Topic" requirement="readWrite"/>
+        <parameter ref="Direction" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="QoS" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="MQTTBrokerExtended:1" base="MQTTBrokerBase:1" dmr:version="2.10">
+      <description>
+        Adds client authentication and extends statistics
+      </description>
+      <object ref="Device.MQTT.Broker.{i}." requirement="present">
+        <parameter ref="Username" requirement="readWrite"/>
+        <parameter ref="Password" requirement="readWrite"/>
+      </object>
+      <object ref="Device.MQTT.Broker.{i}.Stats." requirement="present">
+        <parameter ref="NumberOfInactiveClients" requirement="readOnly"/>
+        <parameter ref="PublishSent" requirement="readOnly"/>
+        <parameter ref="PublishReceived" requirement="readOnly"/>
+        <parameter ref="PublishErrors" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ZigBeeInterface:1" dmr:version="2.10">
+      <object ref="Device.ZigBee." requirement="present">
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.Interface.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readWrite"/>
+        <parameter ref="IEEEAddress" requirement="readOnly"/>
+        <parameter ref="NetworkAddress" requirement="readOnly"/>
+        <parameter ref="ZDOReference" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ZigBeeAssociatedDevices:1" extends="ZigBeeInterface:1" dmr:version="2.10">
+      <object ref="Device.ZigBee.Interface.{i}." requirement="present">
+        <parameter ref="AssociatedDeviceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.Interface.{i}.AssociatedDevice.{i}." requirement="present">
+        <parameter ref="IEEEAddress" requirement="readOnly"/>
+        <parameter ref="NetworkAddress" requirement="readOnly"/>
+        <parameter ref="Active" requirement="readOnly"/>
+        <parameter ref="ZDOReference" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ZigBeeDisc:1" dmr:version="2.10">
+      <object ref="Device.ZigBee.Discovery." requirement="present">
+        <parameter ref="AreaNetworkNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.Discovery.AreaNetwork.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="LastUpdate" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Coordinator" requirement="readWrite"/>
+        <parameter ref="ZDOReference" requirement="readOnly"/>
+        <parameter ref="ZDOList" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ZDOBasic:1" dmr:version="2.10">
+      <object ref="Device.ZigBee." requirement="present">
+        <parameter ref="ZDONumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}." requirement="present">
+        <parameter ref="IEEEAddress" requirement="readOnly"/>
+        <parameter ref="NetworkAddress" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.NodeDescriptor." requirement="present">
+        <parameter ref="LogicalType" requirement="readOnly"/>
+        <parameter ref="ComplexDescriptorSupported" requirement="readOnly"/>
+        <parameter ref="UserDescriptorSupported" requirement="readOnly"/>
+        <parameter ref="FrequencyBand" requirement="readOnly"/>
+        <parameter ref="MACCapability" requirement="readOnly"/>
+        <parameter ref="ManufactureCode" requirement="readOnly"/>
+        <parameter ref="MaximumBufferSize" requirement="readOnly"/>
+        <parameter ref="MaximumIncomingTransferSize" requirement="readOnly"/>
+        <parameter ref="MaximumOutgoingTransferSize" requirement="readOnly"/>
+        <parameter ref="ServerMask" requirement="readOnly"/>
+        <parameter ref="DescriptorCapability" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.PowerDescriptor." requirement="present">
+        <parameter ref="CurrentPowerMode" requirement="readOnly"/>
+        <parameter ref="AvailablePowerSource" requirement="readOnly"/>
+        <parameter ref="CurrentPowerSource" requirement="readOnly"/>
+        <parameter ref="CurrentPowerSourceLevel" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="ZDOAdv:1" extends="ZDOBasic:1" dmr:version="2.10">
+      <object ref="Device.ZigBee.ZDO.{i}." requirement="present">
+        <parameter ref="BindingTableNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="GroupNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ApplicationEndpointNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.UserDescriptor." requirement="present">
+        <parameter ref="DescriptorAvailable" requirement="readOnly"/>
+        <parameter ref="Description" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.ComplexDescriptor." requirement="present">
+        <parameter ref="DescriptorAvailable" requirement="readOnly"/>
+        <parameter ref="Language" requirement="readOnly"/>
+        <parameter ref="CharacterSet" requirement="readOnly"/>
+        <parameter ref="ManufacturerName" requirement="readOnly"/>
+        <parameter ref="ModelName" requirement="readOnly"/>
+        <parameter ref="SerialNumber" requirement="readOnly"/>
+        <parameter ref="DeviceURL" requirement="readOnly"/>
+        <parameter ref="Icon" requirement="readOnly"/>
+        <parameter ref="IconURL" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.Security." requirement="present">
+        <parameter ref="TrustCenterAddress" requirement="readOnly"/>
+        <parameter ref="SecurityLevel" requirement="readOnly"/>
+        <parameter ref="TimeOutPeriod" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.Network." requirement="present">
+        <parameter ref="NeighborNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.Network.Neighbor.{i}." requirement="present">
+        <parameter ref="Neighbor" requirement="readOnly"/>
+        <parameter ref="LQI" requirement="readOnly"/>
+        <parameter ref="Relationship" requirement="readOnly"/>
+        <parameter ref="PermitJoin" requirement="readOnly"/>
+        <parameter ref="Depth" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.NodeManager." requirement="present">
+        <parameter ref="RoutingTableNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.NodeManager.RoutingTable.{i}." requirement="present">
+        <parameter ref="DestinationAddress" requirement="readOnly"/>
+        <parameter ref="NextHopAddress" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="MemoryConstrained" requirement="readOnly"/>
+        <parameter ref="ManyToOne" requirement="readOnly"/>
+        <parameter ref="RouteRecordRequired" requirement="readOnly"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.Binding.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="SourceEndpoint" requirement="readWrite"/>
+        <parameter ref="SourceAddress" requirement="readWrite"/>
+        <parameter ref="ClusterId" requirement="readWrite"/>
+        <parameter ref="DestinationAddressMode" requirement="readWrite"/>
+        <parameter ref="DestinationEndpoint" requirement="readWrite"/>
+        <parameter ref="IEEEDestinationAddress" requirement="readWrite"/>
+        <parameter ref="GroupDestinationAddress" requirement="readWrite"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.Group.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="GroupId" requirement="readWrite"/>
+        <parameter ref="EndpointList" requirement="readWrite"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.ApplicationEndpoint.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="EndpointId" requirement="readWrite"/>
+      </object>
+      <object ref="Device.ZigBee.ZDO.{i}.ApplicationEndpoint.{i}.SimpleDescriptor." requirement="present">
+        <parameter ref="ProfileId" requirement="readWrite"/>
+        <parameter ref="DeviceId" requirement="readOnly"/>
+        <parameter ref="DeviceVersion" requirement="readOnly"/>
+        <parameter ref="InputClusterList" requirement="readWrite"/>
+        <parameter ref="OutputClusterList" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="ZigBeeStats:1" extends="ZigBeeInterface:1" dmr:version="2.10">
+      <object ref="Device.ZigBee.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="UnknownPacketsReceived" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="LEDBasic:1" dmr:version="2.11">
+      <object ref="Device.LEDs." requirement="present">
+        <parameter ref="LEDNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LEDs.LED.{i}." requirement="present">
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Reason" requirement="readOnly"/>
+        <parameter ref="CyclePeriodRepetitions" requirement="readOnly"/>
+        <parameter ref="Location" requirement="readOnly"/>
+        <parameter ref="RelativeXPosition" requirement="readOnly"/>
+        <parameter ref="RelativeYPosition" requirement="readOnly"/>
+        <parameter ref="CycleElementNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LEDs.LED.{i}.CycleElement.{i}." requirement="present">
+        <parameter ref="Order" requirement="readOnly"/>
+        <parameter ref="Color" requirement="readOnly"/>
+        <parameter ref="Duration" requirement="readOnly"/>
+        <parameter ref="FadeInterval" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LEDs.LED.{i}.CurrentCycleElement." requirement="present">
+        <parameter ref="CycleElementReference" requirement="readOnly"/>
+        <parameter ref="Color" requirement="readOnly"/>
+        <parameter ref="Duration" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="LEDAdv:1" dmr:version="2.11">
+      <object ref="Device.LEDs." requirement="present">
+        <parameter ref="LEDNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LEDs.LED.{i}." requirement="present">
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Reason" requirement="readOnly"/>
+        <parameter ref="CyclePeriodRepetitions" requirement="readOnly"/>
+        <parameter ref="Location" requirement="readOnly"/>
+        <parameter ref="RelativeXPosition" requirement="readOnly"/>
+        <parameter ref="RelativeYPosition" requirement="readOnly"/>
+        <parameter ref="CycleElementNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LEDs.LED.{i}.CycleElement.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Color" requirement="readWrite"/>
+        <parameter ref="Duration" requirement="readWrite"/>
+        <parameter ref="FadeInterval" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LEDs.LED.{i}.CurrentCycleElement." requirement="present">
+        <parameter ref="CycleElementReference" requirement="readOnly"/>
+        <parameter ref="Color" requirement="readOnly"/>
+        <parameter ref="Duration" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="DeviceImage:1" dmr:version="2.11">
+      <object ref="Device.DeviceInfo." requirement="present">
+        <parameter ref="DeviceImageNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DeviceInfo.DeviceImageFile.{i}." requirement="present">
+        <parameter ref="Location" requirement="readOnly"/>
+        <parameter ref="Image" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="FAST:1" dmr:version="2.11">
+      <description>
+        Note: This profile is valid for G.9701 modems.
+      </description>
+      <object ref="Device.FAST." requirement="present">
+        <parameter ref="LineNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FAST.Line.{i}." requirement="present">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="Upstream" requirement="readOnly"/>
+        <parameter ref="AllowedProfiles" requirement="readOnly"/>
+        <parameter ref="CurrentProfile" requirement="readOnly"/>
+        <parameter ref="UPBOKLE" requirement="readOnly"/>
+        <parameter ref="UpstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="DownstreamMaxBitRate" requirement="readOnly"/>
+        <parameter ref="UpstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="DownstreamNoiseMargin" requirement="readOnly"/>
+        <parameter ref="UpstreamAttenuation" requirement="readOnly"/>
+        <parameter ref="DownstreamAttenuation" requirement="readOnly"/>
+        <parameter ref="UpstreamPower" requirement="readOnly"/>
+        <parameter ref="DownstreamPower" requirement="readOnly"/>
+        <parameter ref="SNRMRMCds" requirement="readOnly"/>
+        <parameter ref="SNRMRMCus" requirement="readOnly"/>
+        <parameter ref="FEXTCANCELds" requirement="readOnly"/>
+        <parameter ref="FEXTCANCELus" requirement="readOnly"/>
+        <parameter ref="ETRds" requirement="readOnly"/>
+        <parameter ref="ETRus" requirement="readOnly"/>
+        <parameter ref="ATTETRds" requirement="readOnly"/>
+        <parameter ref="ATTETRus" requirement="readOnly"/>
+        <parameter ref="MINEFTR" requirement="readOnly"/>
+      </object>
+      <object ref="Device.FAST.Line.{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"/>
+      </object>
+      <object ref="Device.FAST.Line.{i}.TestParams." requirement="present">
+        <parameter ref="SNRGds" requirement="readOnly"/>
+        <parameter ref="SNRGus" requirement="readOnly"/>
+        <parameter ref="SNRpsds" requirement="readOnly"/>
+        <parameter ref="SNRpsus" requirement="readOnly"/>
+        <parameter ref="SNRMTds" requirement="readOnly"/>
+        <parameter ref="SNRMTus" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="UserInformationBasic:1" dmr:version="2.11">
+      <object ref="Device.UserInterface.Messages." requirement="present">
+        <parameter ref="Title" requirement="readWrite"/>
+        <parameter ref="SubTitle" requirement="readWrite"/>
+        <parameter ref="Text" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="UserInformationExtended:1" dmr:version="2.11">
+      <object ref="Device.UserInterface.Messages." requirement="present">
+        <parameter ref="Title" requirement="readWrite"/>
+        <parameter ref="SubTitle" requirement="readWrite"/>
+        <parameter ref="Text" requirement="readWrite"/>
+        <parameter ref="IconType" requirement="readWrite"/>
+        <parameter ref="MessageColor" requirement="readWrite"/>
+        <parameter ref="BackgroundColor" requirement="readWrite"/>
+        <parameter ref="TitleColor" requirement="readWrite"/>
+        <parameter ref="SubTitleColor" requirement="readWrite"/>
+        <parameter ref="RequestedNumberOfRepetitions" requirement="readWrite"/>
+        <parameter ref="ExecutedNumberOfRepetitions" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="L2TPv3Basic:1" dmr:version="2.12">
+      <object ref="Device.L2TPv3." requirement="present">
+        <parameter ref="TunnelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="RemoteEndpoints" requirement="readWrite"/>
+        <parameter ref="KeepAlivePolicy" requirement="readWrite"/>
+        <parameter ref="KeepAliveTimeout" requirement="readWrite"/>
+        <parameter ref="KeepAliveThreshold" requirement="readWrite"/>
+        <parameter ref="DeliveryHeaderProtocol" requirement="readWrite"/>
+        <parameter ref="TunnelEncapsulation" requirement="readWrite"/>
+        <parameter ref="ConnectedRemoteEndpoint" requirement="readOnly"/>
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{i}.UDP." requirement="present">
+        <parameter ref="SourcePort" requirement="readWrite"/>
+        <parameter ref="RemotePort" requirement="readWrite"/>
+        <parameter ref="EnableChecksum" requirement="readWrite"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{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"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{i}.Interface.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readOnly"/>
+        <parameter ref="SessionID" requirement="readWrite"/>
+        <parameter ref="CookiePolicy" requirement="readWrite"/>
+        <parameter ref="Cookie" requirement="readWrite"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{i}.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"/>
+      </object>
+    </profile>
+    <profile name="L2TPv3Adv:1" extends="L2TPv3Basic:1" dmr:version="2.12">
+      <object ref="Device.L2TPv3." requirement="present">
+        <parameter ref="FilterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{i}." requirement="createDelete">
+        <parameter ref="DefaultDSCPMark" requirement="readWrite"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{i}.Stats." requirement="present">
+        <parameter ref="KeepAliveSent" requirement="readOnly"/>
+        <parameter ref="KeepAliveReceived" requirement="readOnly"/>
+      </object>
+      <object ref="Device.L2TPv3.Tunnel.{i}.Interface.{i}.Stats." requirement="present">
+        <parameter ref="DiscardChecksumReceived" requirement="readOnly"/>
+        <parameter ref="DiscardSequenceNumberReceived" requirement="readOnly"/>
+      </object>
+      <object ref="Device.L2TPv3.Filter.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AllInterfaces" requirement="readWrite"/>
+        <parameter ref="VLANIDCheck" requirement="readWrite"/>
+        <parameter ref="VLANIDExclude" requirement="readWrite"/>
+        <parameter ref="DSCPMarkPolicy" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="VXLANBasic:1" dmr:version="2.12">
+      <object ref="Device.VXLAN." requirement="present">
+        <parameter ref="TunnelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.VXLAN.Tunnel.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="RemoteEndpoints" requirement="readWrite"/>
+        <parameter ref="KeepAlivePolicy" requirement="readWrite"/>
+        <parameter ref="KeepAliveTimeout" requirement="readWrite"/>
+        <parameter ref="KeepAliveThreshold" requirement="readWrite"/>
+        <parameter ref="DeliveryHeaderProtocol" requirement="readWrite"/>
+        <parameter ref="ConnectedRemoteEndpoint" requirement="readOnly"/>
+        <parameter ref="InterfaceNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="SourcePort" requirement="readWrite"/>
+        <parameter ref="RemotePort" requirement="readWrite"/>
+      </object>
+      <object ref="Device.VXLAN.Tunnel.{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"/>
+      </object>
+      <object ref="Device.VXLAN.Tunnel.{i}.Interface.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="LowerLayers" requirement="readOnly"/>
+        <parameter ref="VNI" requirement="readWrite"/>
+      </object>
+      <object ref="Device.VXLAN.Tunnel.{i}.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"/>
+      </object>
+    </profile>
+    <profile name="VXLANAdv:1" extends="VXLANBasic:1" dmr:version="2.12">
+      <object ref="Device.VXLAN." requirement="present">
+        <parameter ref="FilterNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.VXLAN.Tunnel.{i}." requirement="createDelete">
+        <parameter ref="DefaultDSCPMark" requirement="readWrite"/>
+      </object>
+      <object ref="Device.VXLAN.Tunnel.{i}.Stats." requirement="present">
+        <parameter ref="KeepAliveSent" requirement="readOnly"/>
+        <parameter ref="KeepAliveReceived" requirement="readOnly"/>
+      </object>
+      <object ref="Device.VXLAN.Tunnel.{i}.Interface.{i}.Stats." requirement="present">
+        <parameter ref="DiscardChecksumReceived" requirement="readOnly"/>
+        <parameter ref="DiscardSequenceNumberReceived" requirement="readOnly"/>
+      </object>
+      <object ref="Device.VXLAN.Filter.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+        <parameter ref="AllInterfaces" requirement="readWrite"/>
+        <parameter ref="VLANIDCheck" requirement="readWrite"/>
+        <parameter ref="VLANIDExclude" requirement="readWrite"/>
+        <parameter ref="DSCPMarkPolicy" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="LMAPPreconfiguration:1" dmr:version="2.12">
+      <object ref="Device.LMAP." requirement="present">
+        <parameter ref="MeasurementAgentNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="CapabilityTags" requirement="readOnly"/>
+        <parameter ref="Identifier" requirement="readWrite"/>
+        <parameter ref="PublicCredential" requirement="readWrite"/>
+        <parameter ref="PrivateCredential" requirement="readWrite"/>
+        <parameter ref="EventLog" requirement="readOnly"/>
+        <parameter ref="TaskCapabilityNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ScheduleNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="TaskNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="CommunicationChannelNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Controller." requirement="present">
+        <parameter ref="ControllerTimeout" requirement="readWrite"/>
+        <parameter ref="ControlSchedules" requirement="readWrite"/>
+        <parameter ref="ControlTasks" requirement="readWrite"/>
+        <parameter ref="ControlChannels" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.TaskCapability.{i}." requirement="present">
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Version" requirement="readOnly"/>
+        <parameter ref="TaskCapabilityRegistryNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.TaskCapability.{i}.Registry.{i}." requirement="present">
+        <parameter ref="RegistryEntry" requirement="readOnly"/>
+        <parameter ref="Roles" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Start" requirement="readWrite"/>
+        <parameter ref="End" requirement="readWrite"/>
+        <parameter ref="Duration" requirement="readWrite"/>
+        <parameter ref="Tags" requirement="readWrite"/>
+        <parameter ref="SuppressionTags" requirement="readWrite"/>
+        <parameter ref="ExecutionMode" requirement="readWrite"/>
+        <parameter ref="ActionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Task" requirement="readWrite"/>
+        <parameter ref="SuppressionTags" requirement="readWrite"/>
+        <parameter ref="Tags" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}.Option.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Task.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Tags" requirement="readWrite"/>
+        <parameter ref="OptionNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="RegistryNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Task.{i}.Registry.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="RegistryEntry" requirement="readWrite"/>
+        <parameter ref="Roles" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Task.{i}.Option.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Order" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.CommunicationChannel.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="UseBulkDataProfile" requirement="readWrite"/>
+        <parameter ref="Target" requirement="readWrite"/>
+        <parameter ref="TargetPublicCredential" requirement="readWrite"/>
+        <parameter ref="Interface" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.Event.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="Type" requirement="readWrite"/>
+        <parameter ref="RandomnessSpread" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.Event.{i}.PeriodicTimer." requirement="present">
+        <parameter ref="StartTime" requirement="readWrite"/>
+        <parameter ref="EndTime" requirement="readWrite"/>
+        <parameter ref="Interval" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.Event.{i}.CalendarTimer." requirement="present">
+        <parameter ref="StartTime" requirement="readWrite"/>
+        <parameter ref="EndTime" requirement="readWrite"/>
+        <parameter ref="ScheduleMonths" requirement="readWrite"/>
+        <parameter ref="ScheduleDaysOfMonth" requirement="readWrite"/>
+        <parameter ref="ScheduleDaysOfWeek" requirement="readWrite"/>
+        <parameter ref="ScheduleHoursOfDay" requirement="readWrite"/>
+        <parameter ref="ScheduleMinutesOfHour" requirement="readWrite"/>
+        <parameter ref="ScheduleSecondsOfMinute" requirement="readWrite"/>
+        <parameter ref="EnableScheduleTimezoneOffset" requirement="readWrite"/>
+        <parameter ref="ScheduleTimezoneOffset" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.Event.{i}.OneOff." requirement="present">
+        <parameter ref="StartTime" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="LMAPController:1" extends="LMAPPreconfiguration:1" dmr:version="2.12">
+      <object ref="Device.LMAP.MeasurementAgent.{i}." requirement="createDelete">
+        <parameter ref="LastStarted" requirement="readOnly"/>
+        <parameter ref="GroupIdentifier" requirement="readWrite"/>
+        <parameter ref="MeasurementPoint" requirement="readWrite"/>
+        <parameter ref="UseAgentIdentifierInReports" requirement="readWrite"/>
+        <parameter ref="UseGroupIdentifierInReports" requirement="readWrite"/>
+        <parameter ref="UseMeasurementPointInReports" requirement="readWrite"/>
+        <parameter ref="InstructionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Controller." requirement="present">
+        <parameter ref="ControllerTimeout" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}." requirement="createDelete">
+        <parameter ref="State" requirement="readOnly"/>
+        <parameter ref="LastInvocation" requirement="readOnly"/>
+        <parameter ref="Storage" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Stats." requirement="present">
+        <parameter ref="Invocations" requirement="readOnly"/>
+        <parameter ref="Suppressions" requirement="readOnly"/>
+        <parameter ref="Overlaps" requirement="readOnly"/>
+        <parameter ref="Failures" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}." requirement="createDelete">
+        <parameter ref="State" requirement="readOnly"/>
+        <parameter ref="LastInvocation" requirement="readOnly"/>
+        <parameter ref="Storage" requirement="readOnly"/>
+        <parameter ref="LastSuccessfulCompletion" requirement="readOnly"/>
+        <parameter ref="LastSuccessfulStatusCode" requirement="readOnly"/>
+        <parameter ref="LastSuccessfulMessage" requirement="readOnly"/>
+        <parameter ref="LastFailedCompletion" requirement="readOnly"/>
+        <parameter ref="LastFailedStatusCode" requirement="readOnly"/>
+        <parameter ref="LastFailedMessage" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Schedule.{i}.Action.{i}.Stats." requirement="present">
+        <parameter ref="Invocations" requirement="readOnly"/>
+        <parameter ref="Suppressions" requirement="readOnly"/>
+        <parameter ref="Overlaps" requirement="readOnly"/>
+        <parameter ref="Failures" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Instruction.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="LastChange" requirement="readOnly"/>
+        <parameter ref="InstructionSchedules" requirement="readWrite"/>
+        <parameter ref="InstructionTasks" requirement="readWrite"/>
+        <parameter ref="ReportChannels" requirement="readWrite"/>
+        <parameter ref="MeasurementSuppressionNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.MeasurementAgent.{i}.Instruction.{i}.MeasurementSuppression.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Name" requirement="readWrite"/>
+        <parameter ref="State" requirement="readOnly"/>
+        <parameter ref="StopRunning" requirement="readWrite"/>
+        <parameter ref="Start" requirement="readWrite"/>
+        <parameter ref="End" requirement="readWrite"/>
+        <parameter ref="SuppressionMatch" requirement="readWrite"/>
+      </object>
+      <object ref="Device.LMAP.Event.{i}." requirement="createDelete">
+        <parameter ref="CycleInterval" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="LMAPCollector:1" dmr:version="2.12">
+      <object ref="Device.LMAP.Report.{i}." requirement="present">
+        <parameter ref="ReportDate" requirement="readOnly"/>
+        <parameter ref="AgentIdentifier" requirement="readOnly"/>
+        <parameter ref="GroupIdentifier" requirement="readOnly"/>
+        <parameter ref="MeasurementPoint" requirement="readOnly"/>
+        <parameter ref="ResultNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.Report.{i}.Result.{i}." requirement="present">
+        <parameter ref="TaskName" requirement="readOnly"/>
+        <parameter ref="ScheduleName" requirement="readOnly"/>
+        <parameter ref="ActionName" requirement="readOnly"/>
+        <parameter ref="EventTime" requirement="readOnly"/>
+        <parameter ref="CycleNumber" requirement="readOnly"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Tags" requirement="readOnly"/>
+        <parameter ref="OptionNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ResultConflictNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="ResultReportTableNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.Report.{i}.Result.{i}.Option.{i}." requirement="present">
+        <parameter ref="Order" requirement="readOnly"/>
+        <parameter ref="Name" requirement="readOnly"/>
+        <parameter ref="Value" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.Report.{i}.Result.{i}.Conflict.{i}." requirement="present">
+        <parameter ref="TaskName" requirement="readOnly"/>
+        <parameter ref="ScheduleName" requirement="readOnly"/>
+        <parameter ref="ActionName" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.Report.{i}.Result.{i}.ReportTable.{i}." requirement="present">
+        <parameter ref="ColumnLabels" requirement="readOnly"/>
+        <parameter ref="ResultReportRowNumberOfEntries" requirement="readOnly"/>
+        <parameter ref="RegistryNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.Report.{i}.Result.{i}.ReportTable.{i}.ResultRow.{i}." requirement="present">
+        <parameter ref="Values" requirement="readOnly"/>
+      </object>
+      <object ref="Device.LMAP.Report.{i}.Result.{i}.ReportTable.{i}.Registry.{i}." requirement="present">
+        <parameter ref="RegistryEntry" requirement="readOnly"/>
+        <parameter ref="Roles" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="BASAPM:1" dmr:version="2.12">
+      <object ref="Device.BASAPM." requirement="present">
+        <parameter ref="MeasurementEndpointNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.BASAPM.MeasurementEndpoint.{i}." requirement="createDelete">
+        <parameter ref="Alias" requirement="readWrite"/>
+        <parameter ref="MeasurementAgent" requirement="readWrite"/>
+        <parameter ref="DeviceOwnership" requirement="readWrite"/>
+        <parameter ref="OperationalDomain" requirement="readWrite"/>
+        <parameter ref="InternetDomain" requirement="readWrite"/>
+        <parameter ref="UseMeasurementEndpointInReports" requirement="readWrite"/>
+      </object>
+      <object ref="Device.BASAPM.MeasurementEndpoint.{i}.ISPDevice." requirement="present">
+        <parameter ref="ReferencePoint" requirement="readWrite"/>
+        <parameter ref="GeographicalLocation" requirement="readWrite"/>
+      </object>
+      <object ref="Device.BASAPM.MeasurementEndpoint.{i}.CustomerDevice." requirement="present">
+        <parameter ref="EquipmentIdentifier" requirement="readWrite"/>
+        <parameter ref="CustomerIdentifier" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="TWAMPReflectorBasic:1" dmr:version="2.12">
+      <object ref="Device.IP.Interface.{i}." requirement="createDelete">
+        <parameter ref="TWAMPReflectorNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.IP.Interface.{i}.TWAMPReflector.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <parameter ref="Port" requirement="readWrite"/>
+        <parameter ref="MaximumTTL" requirement="readWrite"/>
+        <parameter ref="IPAllowedList" requirement="readWrite"/>
+        <parameter ref="PortAllowedList" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="Download:1" dmr:version="2.0">
+      <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="ROMTime"/>
+            <parameter ref="BOMTime"/>
+            <parameter ref="EOMTime"/>
+            <parameter ref="TestBytesReceived"/>
+            <parameter ref="TotalBytesReceived"/>
+          </output>
+        </command>
+      </object>
+    </profile>
+    <profile name="DownloadTCP:1" dmr:version="2.0">
+      <object ref="Device.IP.Diagnostics." requirement="present">
+        <command ref="DownloadDiagnostics()">
+          <output>
+            <parameter ref="TCPOpenRequestTime"/>
+            <parameter ref="TCPOpenResponseTime"/>
+          </output>
+        </command>
+      </object>
+    </profile>
+    <profile name="Upload:1" dmr:version="2.0">
+      <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="ROMTime"/>
+            <parameter ref="BOMTime"/>
+            <parameter ref="EOMTime"/>
+            <parameter ref="TestFileLength"/>
+            <parameter ref="TotalBytesSent"/>
+          </output>
+        </command>
+      </object>
+    </profile>
+    <profile name="UploadTCP:1" dmr:version="2.0">
+      <object ref="Device.IP.Diagnostics." requirement="present">
+        <command ref="UploadDiagnostics()">
+          <output>
+            <parameter ref="TCPOpenRequestTime"/>
+            <parameter ref="TCPOpenResponseTime"/>
+          </output>
+        </command>
+      </object>
+    </profile>
+    <profile name="SelfTestDiag:1" dmr:version="2.0">
+      <object ref="Device." requirement="present">
+        <command ref="SelfTestDiagnostics()">
+          <output>
+            <parameter ref="Results"/>
+          </output>
+        </command>
+      </object>
+    </profile>
+    <profile name="NSLookupDiag:1" dmr:version="2.0">
+      <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="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" dmr:version="2.0"/>
+    <profile name="Baseline:2" base="Baseline:1" extends="_Baseline:2" dmr:version="2.2"/>
+    <profile name="Baseline:3" base="Baseline:2" extends="_Baseline:3" dmr:version="2.4"/>
+    <profile name="IPPingDetailed:1" dmr:version="2.7">
+      <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="SuccessCount"/>
+            <parameter ref="FailureCount"/>
+            <parameter ref="AverageResponseTimeDetailed"/>
+            <parameter ref="MinimumResponseTimeDetailed"/>
+            <parameter ref="MaximumResponseTimeDetailed"/>
+          </output>
+        </command>
+      </object>
+    </profile>
+    <profile name="IPPing:1" dmr:version="2.0">
+      <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="SuccessCount"/>
+            <parameter ref="FailureCount"/>
+            <parameter ref="AverageResponseTime"/>
+            <parameter ref="MinimumResponseTime"/>
+            <parameter ref="MaximumResponseTime"/>
+          </output>
+        </command>
+      </object>
+    </profile>
+    <profile name="TraceRoute:1" dmr:version="2.0">
+      <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="ResponseTime"/>
+            <object ref="RouteHops.{i}.">
+              <parameter ref="Host"/>
+              <parameter ref="HostAddress"/>
+              <parameter ref="ErrorCode"/>
+              <parameter ref="RTTimes"/>
+            </object>
+          </output>
+        </command>
+      </object>
+    </profile>
+    <profile name="ATMLoopback:1" dmr:version="2.0">
+      <object ref="Device.ATM.Diagnostics." requirement="present">
+        <command ref="F5Loopback()">
+          <input>
+            <parameter ref="Interface"/>
+            <parameter ref="NumberOfRepetitions"/>
+            <parameter ref="Timeout"/>
+          </input>
+          <output>
+            <parameter ref="SuccessCount"/>
+            <parameter ref="FailureCount"/>
+            <parameter ref="AverageResponseTime"/>
+            <parameter ref="MinimumResponseTime"/>
+            <parameter ref="MaximumResponseTime"/>
+          </output>
+        </command>
+      </object>
+    </profile>
+    <profile name="DSLDiagnostics:1" dmr:version="2.0">
+      <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="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" dmr:version="2.0">
+      <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="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" dmr:version="2.0">
+      <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="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="HPNADiagnostics:1" dmr:version="2.0">
+      <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>
+            <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" dmr:version="2.0">
+      <object ref="Device.UPA.Diagnostics." requirement="present">
+        <command ref="InterfaceMeasurement()">
+          <input>
+            <parameter ref="Type"/>
+            <parameter ref="Interface"/>
+            <parameter ref="Port"/>
+          </input>
+          <output>
+            <parameter ref="Measurements"/>
+            <parameter ref="RxGain"/>
+          </output>
+        </command>
+      </object>
+    </profile>
+    <profile name="UDPEchoDiag:1" dmr:version="2.9">
+      <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="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="ServerSelectionDiag:1" dmr:version="2.9">
+      <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="FastestHost"/>
+            <parameter ref="AverageResponseTime"/>
+          </output>
+        </command>
+      </object>
+    </profile>
+    <profile name="STOMPConn:1" dmr: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="readWrite"/>
+        <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" dmr: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>
+    <profile name="STOMPAgent:1" dmr: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="STOMPController:1" dmr: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="TempStatusAdv:1" extends="TempStatus:1" dmr:version="2.0">
+      <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: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" dmr:version="2.0">
+      <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" dmr:version="2.0">
+      <object ref="Device.PeriodicStatistics.SampleSet.{i}." requirement="createDelete">
+        <parameter ref="Enable" requirement="readWrite"/>
+        <parameter ref="Status" requirement="readOnly"/>
+        <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="IPInterface:2" base="IPInterface:1" dmr: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: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="readWrite"/>
+        <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" dmr:version="2.0">
+      <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="readWrite"/>
+        <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: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="DHCPv6ClientServerIdentity:1" extends="DHCPv6Client:1" dmr:version="2.2">
+      <object ref="Device.DHCPv6.Client.{i}." requirement="createDelete">
+        <parameter ref="ServerNumberOfEntries" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Client.{i}.Server.{i}." requirement="present">
+        <parameter ref="SourceAddress" requirement="readOnly"/>
+        <parameter ref="DUID" requirement="readOnly"/>
+        <parameter ref="InformationRefreshTime" requirement="readOnly"/>
+      </object>
+      <object ref="Device.DHCPv6.Client.{i}.ReceivedOption.{i}." requirement="present">
+        <parameter ref="Server" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="MQTTClientExtended:1" base="MQTTClientBase:1" dmr: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="DeviceInfo:1" dmr: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="Reboot:1" dmr: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" dmr: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="readWrite"/>
+        <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" dmr: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>
+      <object ref="Device.LocalAgent.MTP.{i}.CoAP." requirement="present">
+        <parameter ref="Port" requirement="readOnly"/>
+        <parameter ref="Path" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Controllers:1" dmr: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>
+      <object ref="Device.LocalAgent.Controller.{i}.MTP.{i}.CoAP." requirement="present">
+        <parameter ref="Host" requirement="readOnly"/>
+        <parameter ref="Port" requirement="readOnly"/>
+        <parameter ref="Path" requirement="readOnly"/>
+      </object>
+    </profile>
+    <profile name="Subscriptions:1" dmr:version="2.12">
+      <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="readWrite"/>
+        <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"/>
+        <parameter ref="TimeToLive" requirement="readWrite"/>
+      </object>
+    </profile>
+    <profile name="Challenge:1" dmr: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="USPAgent:1" extends="DeviceInfo:1 Reboot:1 Firmware:1 LocalAgent:1 Controllers:1 Subscriptions:1 Challenge:1" dmr:version="2.12"/>
+  </model>
+</dm:document>
diff --git a/ubus/ubus.py b/ubus/ubus.py
new file mode 100755
index 0000000000000000000000000000000000000000..d67ff2c75000c5bbc807c9d2bf66ee6938be7385
--- /dev/null
+++ b/ubus/ubus.py
@@ -0,0 +1,338 @@
+#!/usr/bin/python
+
+#      This program is free software: you can redistribute it and/or modify
+#      it under the terms of the GNU General Public License as published by
+#      the Free Software Foundation, either version 2 of the License, or
+#      (at your option) any later version.
+#
+#      Copyright (C) 2019 iopsys Software Solutions AB
+#		Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
+
+import os, re, sys, time, json, getopt, getpass
+from collections import OrderedDict
+from pexpect import pxssh
+from shutil import copyfile
+
+def removefile( filename ):
+	try:
+		os.remove(filename)
+	except OSError:
+		pass
+
+def securemkdir( folder ):
+	try:
+		os.mkdir(folder)
+	except:
+		pass
+
+def printopenobj( obj ):
+	fp = open('./.ubus_tmp', 'a')
+	print >> fp, "\"%s\" : {" % obj
+	fp.close()
+
+def printopenfile():
+	fp = open('./.ubus_tmp', 'a')
+	print >> fp, "{"
+	fp.close()
+
+def printclosefile():
+	fp = open('./.ubus_tmp', 'a')
+	print >> fp, "}"
+	fp.close()
+
+def removelastline():
+	file_r = open("./.ubus_tmp")
+	lines = file_r.readlines()
+	lines = lines[:-1]
+	file_r.close()
+	file_w = open("./.ubus_tmp",'w')
+	file_w.writelines(lines)
+	file_w.close()
+	printclosefile ()
+
+def copy_data_in_file( data):
+	file_r = open("./.tmp.json", 'a')
+	print >> file_r, "%s" % data
+	file_r.close()
+
+def replace_data_in_file( data_in, data_out ):
+	file_r = open("./.ubus_tmp", "rt")
+	file_w = open("./.ubus_tmp_1", "wt")
+	text = ''.join(file_r).replace(data_in, data_out)
+	file_w.write(text)
+	file_r.close()
+	file_w.close()
+	copyfile("./.ubus_tmp_1", "./.ubus_tmp")
+	removefile("./.ubus_tmp_1")
+
+def updatejsontmpfile():
+	replace_data_in_file ("}\n", "},\n")
+	replace_data_in_file ("},\n},", "}\n},")
+	replace_data_in_file ("}\n},\n},", "}\n}\n},")
+	replace_data_in_file ("}\n},\n}\n},", "}\n}\n}\n},")
+	replace_data_in_file ("}\n},\n}\n}\n},", "}\n}\n}\n}\n},")
+	replace_data_in_file ("}\n}\n}\n},\n}\n},", "}\n}\n}\n}\n}\n},")
+	replace_data_in_file ("}\n}\n}\n}\n}\n}\n},", "}\n}\n}\n}\n}\n}\n},")
+	replace_data_in_file ("}\n}\n}\n},\n}\n}\n}\n},", "}\n}\n}\n}\n}\n}\n}\n}")
+
+def get_type_field( data ):
+	if isinstance(data,bool):
+		return "boolean"
+	elif isinstance(data,(float, int)):
+		return "integer"
+	elif isinstance(data,list):
+		return "array"
+	else:
+		return "string"
+
+def read_json( data, parse ):
+	for x in data:
+		if isinstance(data[x],dict):
+			if parse == 0:
+				read_json (data[x], 1)
+				break
+			else:
+				printopenobj(x)
+				read_json (data[x], 1)
+				printclosefile()
+		elif isinstance(data[x],list):
+			for element in data[x]:
+				if isinstance(element,dict):
+					printopenobj(x)
+					read_json (element, 1)
+					printclosefile()
+				else:
+					type_field = get_type_field(element)
+					printopenobj(x)
+					fp = open('./.ubus_tmp', 'a')
+					print >> fp,  "\"description\": \"TODO\","
+					print >> fp,  "\"list\": \"true\","
+					print >> fp,  "\"type\": \"%s\"" % type_field
+					fp.close()
+					printclosefile()
+				break
+		else:
+			type_field = get_type_field(data[x])
+			printopenobj(x)
+			fp = open('./.ubus_tmp', 'a')
+			print >> fp,  "\"description\": \"TODO\","
+			print >> fp,  "\"type\": \"%s\"" % type_field
+			fp.close()
+			printclosefile()
+
+
+def generate_output( data, parse ):
+	removefile("./.tmp.json")
+	copy_data_in_file(data)
+
+	file = open("./.tmp.json")
+	data = json.loads(file.read(), object_pairs_hook=OrderedDict)
+	file.close()	
+
+	read_json (data, parse)
+
+def generate_in_out_put( root_object, obj, line ):
+	fp = open('./.ubus_tmp', 'a')
+	print >> fp,  "\"description\": \"TODO\","
+	in_args = re.search('{(.+?)}', line)
+	if in_args:
+		found = in_args.group(1)
+		lst = found.split(",")
+		stringcount = len(lst)
+		print >> fp,  "\"input\": {"
+		for idx, value in enumerate(lst):
+			in_arg = value.split(":")
+			print >> fp,  "%s: {" % in_arg[0]
+			print >> fp,  "\"description\": \"TODO\","
+			print >> fp,  "\"type\": %s" % in_arg[1].lower()
+			print >> fp,  "}"
+		print >> fp,  "}"
+	else:
+		print >> fp,  "\"input\": {},"
+
+	if root_object == "system" and obj == "reboot" or \
+	   root_object == "juci.system" and (obj == "reboot" or obj == "defaultreset" or obj == "report") or \
+	   root_object == "router.dropbear" and obj == "get_ssh_keys" or \
+	   root_object == "network.wireless" or \
+	   root_object == "network.device" and (obj == "set_alias" or obj == "set_state") or \
+	   root_object == "session" and obj == "list" or \
+	   root_object == "network.interface" and (obj == "up" or obj == "down" or obj == "renew" or obj == "prepare" or obj == "notify_proto" or obj == "remove" or obj == "set_data"):
+		print >> fp,  "\"output\": {}"
+		fp.close()
+	else:
+		if ((root_object == "router.wireless" or root_object == "wifix") and obj == "status") or \
+		   ((root_object == "router.wireless" or root_object == "wifix") and obj == "assoclist") or \
+		   ((root_object == "router.wireless" or root_object == "wifix") and obj == "stas") or \
+		   ((root_object == "router.wireless" or root_object == "wifix") and obj == "stations"):
+			command1 = "uci get wireless.@wifi-iface[0].device"
+			s.sendline (command1)
+			s.prompt()
+			device = s.before.split('\n',1)[1];
+			device_name = device.translate(None, ' \n\t\r')
+			command = "ubus call %s %s \'{\"vif\":\"%s\"}\'" % (root_object, obj, device_name)
+		elif root_object == "network.interface":
+			command = "ubus call %s.lan %s" % (root_object, obj)				
+		else:
+			command = "ubus call %s %s" % (root_object, obj)
+		s.sendline (command)
+		s.prompt()
+		data = s.before.split('\n',1)[1];
+		print "****************************************************************************"
+		print "command = %s" % command
+		print "data = %s" % data
+		print "****************************************************************************"
+		parse = 1
+		if root_object == "network.device" and obj == "status" or \
+		   root_object == "router.graph" and obj == "iface_traffic" or \
+		   root_object == "router.port" and obj == "status" or \
+		   root_object == "router.network" and obj == "clients" or \
+		   root_object == "router.network" and obj == "dump" or \
+		   (root_object == "router.wireless" or root_object == "wifix") and obj == "temperature" or \
+		   (root_object == "router.wireless" or root_object == "wifix") and obj == "stas" or \
+		   (root_object == "router.wireless" or root_object == "wifix") and obj == "radios":
+			parse = 0
+		if ("Command failed" in data.split("\n", 1)[0]) or (data == ""):
+			print >> fp,  "\"output\": {}"
+			fp.close()
+		else:
+			print >> fp,  "\"output\": {"
+			fp.close()
+			generate_output(data, parse)
+			printclosefile()
+
+def convert_object( line ):
+	found = ""
+	m = re.search('\'(.+?)\'', line)
+	if m:
+		found = m.group(1)
+		if "network.interface." in found:
+			return found
+		else:
+			printopenobj(found)
+
+	return found	
+
+def convert_param( root_object, line ):
+	m = re.search('\"(.+?)\":{', line)
+	if m:
+		obj = m.group(1)
+		printopenobj(obj)
+		generate_in_out_put(root_object, obj, line)
+		printclosefile()
+
+def removetmpfiles():
+	removefile("./.ubus_tmp")
+	removefile("./.tmp.json")
+
+def generatejsonfromdata( data, gendir ):
+	first_object = 0
+	root_object = ""
+
+	securemkdir(gendir)
+	removetmpfiles()
+	printopenfile()
+
+	lines = data.split ('\n')
+	for line in lines :
+		if "@" in line:
+			if first_object != 0:
+				printclosefile()
+			root_object = convert_object(line)
+			if "network.interface." in root_object:
+				first_object = 0
+			else:
+				first_object = 1
+			continue
+		else:
+			if "network.interface." in root_object:
+				continue
+			convert_param(root_object, line)
+
+	printclosefile()
+	printclosefile()
+	updatejsontmpfile ()
+	removelastline ()
+
+	file_r = open("./.ubus_tmp", "r")
+	obj = json.load(file_r, object_pairs_hook=OrderedDict)
+	dump = json.dumps(obj, indent=2)
+	file_r.close()
+
+	try:
+		json_file = open(gendir + "/ubus.json", "a")
+		print >> json_file, "%s" % dump
+		json_file.close()
+	except:
+		pass
+
+	removetmpfiles()
+
+def printusage():
+	print "Usage:"
+	print ""
+	print sys.argv[0] + " -h{hostname} -u{user} -p{password}"
+	print "Example:"
+	print sys.argv[0] + " -h 192.168.1.1 -u root -p 10pD3v"
+	print ""
+	print "Or you can run the tool directly using " + sys.argv[0]
+	print "then enter your Hostname, Username and Password"
+	print "Example:"
+	print sys.argv[0]
+	print "Enter your Hostname: 192.168.1.1"
+	print "Enter your Username: root"
+	print "Enter your Password: 10pD3v"
+
+### main ###
+try:
+	optlist, args = getopt.getopt(sys.argv[1:], 'h:u:p:', ['help','?'])
+except Exception, e:
+	print str(e)
+	printusage()
+	exit(1)
+
+options = dict(optlist)
+if len(args) > 1:
+	printusage()
+	exit(1)
+
+if [elem for elem in options if elem in ['-?','--?','--help']]:
+        printusage()
+	exit(1)
+
+if '-h' in options:
+	host = options['-h']
+else:
+	host = raw_input('Enter your Hostname: ')
+if '-u' in options:
+	user = options['-u']
+else:
+	user = raw_input('Enter your Username: ')
+if '-p' in options:
+	password = options['-p']
+else:
+	password = getpass.getpass('Enter your Password: ')
+
+## Login via SSH
+try:
+	s = pxssh.pxssh()
+	s.login (host, user, password)
+	print "SSH session login successful"
+	command = "ubus -v list"
+	s.sendline (command)
+	s.prompt()
+	data = s.before.split("\n",1)[1];
+	gendir = "source_" + time.strftime("%Y-%m-%d_%H-%M-%S")
+	print "Start Generation of JSON file"
+	print "Please wait..."
+	generatejsonfromdata(data, gendir)
+	s.logout()
+
+except pxssh.ExceptionPxssh as e:
+	print("SSH session failed on login.")
+	print(e)
+
+if (os.path.isdir(gendir)):
+	print "JSON file generated under \"./%s\"" % gendir
+else:
+	print "No JSON file generated!"
+
diff --git a/wepkey.c b/wepkey.c
new file mode 100644
index 0000000000000000000000000000000000000000..b1d2909c679725c2a875ea04ee9b4d28b1b037ce
--- /dev/null
+++ b/wepkey.c
@@ -0,0 +1,50 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "wepkey.h"
+
+void wepkey64(char *passphrase, char strk64[4][11])
+{
+	unsigned char k64[4][5];
+	unsigned char pseed[4] = {0};
+    unsigned int randNumber, tmp;
+    int i, j;
+
+    for(i = 0; i < strlen(passphrase); i++)
+    {
+        pseed[i%4] ^= (unsigned char) passphrase[i];
+    }
+
+    randNumber = pseed[0] | (pseed[1] << 8) | (pseed[2] << 16) | (pseed[3] << 24);
+
+    for (i = 0; i < 4; i++)
+    {
+        for (j = 0; j < 5; j++)
+        {
+            randNumber = (randNumber * 0x343fd + 0x269ec3) & 0xffffffff;
+            tmp = (randNumber >> 16) & 0xff;
+            k64[i][j] = (unsigned char) tmp;
+        }
+		sprintf(strk64[i], "%02X%02X%02X%02X%02X", k64[i][0], k64[i][1], k64[i][2], k64[i][3], k64[i][4]);
+    }
+}
+
+void wepkey128(char *passphrase, char strk128[27])
+{
+    int i=0;
+	char dup[65] = {0};
+	unsigned char out[MD5_DIGEST_SIZE];
+	struct MD5Context c;
+
+	while (i<64) {
+		strncpy(dup + i, passphrase, 64 - i);
+    	i = strlen(dup);
+	}
+
+	MD5Init(&c);
+	MD5Update(&c, dup, 64);
+	MD5Final(out, &c);
+	for(i=0; i<13; i++)
+		sprintf(strk128 + 2 * i, "%02X", out[i]);
+}
+
diff --git a/wepkey.h b/wepkey.h
new file mode 100644
index 0000000000000000000000000000000000000000..81513bc296b7f23c9e46af11fded7f51f174569a
--- /dev/null
+++ b/wepkey.h
@@ -0,0 +1,6 @@
+#ifndef __WEPKEY_H__
+#define __WEPKEY_H__
+#include "md5.h"
+void wepkey64(char *passphrase, char strk64[4][11]);
+void wepkey128(char *passphrase, char strk128[27]);
+#endif /*__WEPKEY_H__*/